Предположим , что мы имеем полиномы степени не более n , n > m , так что общее число ненулевых коэффициентов равно n (т. е. многочлены редки). Меня интересует эффективный алгоритм вычисления полинома:
Поскольку этот многочлен имеет степень не более , размер входных и выходных данных равен O ( n ) . В случае m = 1 мы можем вычислить результат, используя БПФ за время O ( n log n ) . Можно ли это сделать для любого m < n ? Если это имеет какое-то значение, меня интересует особый случай, когда коэффициенты равны 0 и 1, и вычисление должно выполняться по целым числам.
Обновить. Я понял, что быстрое решение для вышеупомянутого будет означать достижения в быстром умножении матриц. В частности, если , то можно считывать с я к б K J как коэффициент х я + n j в p k ( x ) . Таким образом, вычисление р К ( х ) 2 соответствует вычислению внешнего произведения двух векторов, и вычислению суммы Е к р К ( х ) 2 соответствует вычислению матрицы продукта. Если есть решениеиспользованием времени п ( п , м ) для вычисления Е к р К ( х ) 2 то мы можем умножить два п матрицаразмерностью N матриц в время F ( п 2 , п , что означает, что f ( n , m ) = O ( n log n ) для m ≤ n потребует серьезного прорыва. Но возможно, что f ( n , m ) = n ω / 2 , где ω - текущий показатель умножения матриц. Идеи, кто-нибудь?
источник
Ответы:
Возведение в квадрат многочлена с ненулевыми коэффициентами требует времени O ( x 2 i ), используя обычное умножение на член, поэтому это должно быть предпочтительнее, чем FFT для тех многочленов, где x i < √xi O(x2i) . Если∑ixi=n, то число полиномов сxiбольше √xi<nlogn−−−−−√ ∑ixi=n xi являетсяO( √nlogn−−−−−√ , и это потребуется времяO(N 3 / 2 (логп) 1 / 2 )к площади и объединить (как будет остальные полиномы). Это улучшение по сравнению с очевиднойграницейO(mnlogn),когдаmравноΘ( √O(n/logn−−−−−−√) O(n3/2(logn)1/2) O(mnlogn) m .Θ(n/logn−−−−−−√)
источник
Не полный ответ, но может быть полезным.
Предостережение: это работает только в том случае, если поддержка мала.p2i
Для многочлена пусть S q = { i ∣ a i ≠ 0 } будет его опорой, а s q = | S q | быть размером поддержки. Большая часть р я будет разреженным, то есть, будет иметь небольшую поддержку.q=a0+a1x+⋯+anxn Sq={i∣ai≠0} sq=|Sq| pi
Существуют алгоритмы умножения разреженных многочленов и b за квазилинейное время на величину поддержки продукта a b , см., Например, http://arxiv.org/abs/0901.4323a b ab
Носителем является (содержится в) S a + S b , где сумма двух множеств S и T определяется как S + T : = { s + t ∣ s ∈ S , t ∈ T } . Если опоры всех продуктов малы, скажем, линейны по n , то можно просто вычислить продукты и сложить все одночлены.ab Sa+Sb S T S+T:={s+t∣s∈S,t∈T} n
Однако очень легко найти многочлены и b такие, что размер носителя a b является квадратичным по размерам носителя a и b . В этом конкретном приложении мы возводим в квадрат многочлены. Таким образом, вопрос в том , насколько больше S + S по сравнению с S . Обычной мерой для этого является удвоение числа | S + S | / | S | , Существуют множества с неограниченным удваивающим числом. Но если вы можете исключить множества с большим удваивающим числом в качестве поддержки p ia b ab a b S+S S |S+S|/|S| pi , тогда вы можете получить быстрый алгоритм для вашей проблемы.
источник
Просто хотел отметить алгоритм естественного приближения. Это не использует разреженность хотя.
Вы можете использовать случайную последовательность(σi)i∈[n]
Взяв X=∑iσipi(x) мы можем вычислить X2 за nlogn раз, используя FFT. Тогда EX2=∑ipi(x)2=S и VX2−−−−√=O(S) . Таким образом, вы можете получитьприближение1+ε во времениO(ε−2nlogn) .
источник