Angenommen , wir haben Polynome vom Grad höchstens n , n > m , so dass die Gesamtzahl von Nicht - Null - Koeffizienten n ( das heißt, sind die Polynome sparse). Ich interessiere mich für einen effizienten Algorithmus zur Berechnung des Polynoms:
Da dieses Polynom einen Grad von höchstens , ist sowohl die Eingangs- als auch die Ausgangsgröße O ( n ) . Im Fall m = 1 können wir das Ergebnis mit der FFT in der Zeit O ( n log n ) berechnen . Kann dies für jedes m < n durchgeführt werden ? Wenn es einen Unterschied macht, interessiert mich der Sonderfall, bei dem die Koeffizienten 0 und 1 sind und die Berechnung über die ganzen Zahlen erfolgen sollte.
Aktualisieren. Ich erkannte, dass eine schnelle Lösung für das oben Genannte Fortschritte in der schnellen Matrixmultiplikation implizieren würde. Insbesondere wenn , dann können wir abgelesen eine i k b k j als der Koeffizient von x i + n j in p k ( x ) . Somit Berechnen p k ( x ) 2 entsprichtBerechnen eines äußeren Produkt aus zwei Vektoren, und Berechnen der Summe Σ k p k ( x ) 2 entspricht einem Matrixproduktberechnen. Wenn es eine Lösung unter VerwendungZeit ist , f ( n , m ) zum Berechnen von Σ k p k ( x ) 2 , dann können wir zwei Multiplizier n -by- n Matrizen inZeit f ( n 2 , n , was bedeutet, dass f ( n , m ) = O ( n log n ) für m ≤ n einen größeren Durchbruch erfordern würde. Aber f ( n , m ) = n & ohgr; / 2 , wobei & ohgr ; der aktuelle Exponent der Matrixmultiplikation ist, könnte möglich sein. Ideen, irgendjemand?
quelle
Antworten:
Quadriert ein Polynom mit von Null verschiedenen Koeffizienten braucht Zeit O ( x 2 i ) unter Verwendung üblichen Begriff-by-Begriff Multiplikation, so sollte dies für die Polynome die FFT bevorzugt werden , wo x i < √xi O(x2i) . WennΣixi=n,die Anzahl von Polynomen mitxigrößer als √xi<nlogn−−−−−√ ∑ixi=n xi istO( √nlogn−−−−−√ , und diese werden ZeitO(n 3 / 2 (logn) 1 / 2 )um Platz und verbinden (wie die übrigen Polynome). Dies ist eine Verbesserung gegenüber der offensichtlichenO(mnlogn)gebundenwennmistΘ( √O(n/logn−−−−−−√) O(n3/2(logn)1/2) O(mnlogn) m .Θ(n/logn−−−−−−√)
quelle
Keine vollständige Antwort, aber vielleicht hilfreich.
Vorsichtsmaßnahme: Es funktioniert nur gut, wenn die Stützen des klein sind.p2i
Für ein Polynom sei S q = { i ∣ a i ≠ 0 } seine Unterstützung und s q = | S q | sei die Größe der Unterstützung. Der größte Teil des p i wird spärlich sein, dh eine kleine Unterstützung haben.q=a0+a1x+⋯+anxn Sq={i∣ai≠0} sq=|Sq| pi
Es gibt Algorithmen, um spärliche Polynome und b in quasi-linearer Zeit in der Größe der Unterstützung des Produkts a b zu multiplizieren , siehe z. B. http://arxiv.org/abs/0901.4323a b ab
The support ofab is (contained in) Sa+Sb , where the sum of two sets S and T is defined as S+T:={s+t∣s∈S,t∈T} . If the supports of all products are small, say, linear in n in total, then one can just compute the products and add up all monomials.
It is however very easy to find polynomialsa and b such that the size of the support of ab is quadratic in the sizes of the support of a and b .
In this particular application, we are squaring polynomials. So the question is how much larger S+S compared to S .
The usual measure for this is the doubling number |S+S|/|S| .
There are sets with unbounded doubling number.
But if you can exclude sets with large doubling number as supports of the pi , then you can get a fast algorithm for your problem.
quelle
Just wanted to note the natural approximation algorithm. This doesn't take advantage of sparsity though.
You could use a random sequence(σi)i∈[n]
Taking X=∑iσipi(x) we can compute X2 in nlogn time using FFT.
Then EX2=∑ipi(x)2=S and VX2−−−−√=O(S) .
So you can get a 1+ε approximation in time O(ε−2nlogn) .
quelle