Supposons que vous ayez deux polynômes: et .
J'essaie de comprendre comment la FFT nous aide à multiplier ces deux polynômes. Cependant, je ne trouve aucun exemple élaboré. Quelqu'un peut-il me montrer comment l'algorithme FFT multiplierait ces deux polynômes. (Remarque: ces polynômes n'ont rien de spécial, mais je voulais rester simple pour le rendre plus facile à suivre.)
J'ai regardé les algorithmes en pseudocode, mais tous semblent avoir des problèmes (ne spécifiez pas ce que l'entrée devrait être, variables non définies). Et étonnamment, je ne trouve pas où quelqu'un a réellement parcouru (à la main) un exemple de multiplication de polynômes en utilisant la FFT.
Réponses:
Supposons que nous utilisons les quatrièmes racines de l'unité, ce qui correspond à substituer1,i,−1,−i à x . Nous utilisons également la décimation en temps plutôt que la décimation en fréquence dans l'algorithme FFT. (Nous appliquons également une opération d'inversion de bits de manière transparente.)
Afin de calculer la transformée du premier polynôme, nous commençons par écrire les coefficients:3,1,0,0.
La transformée de Fourier des coefficients pairs 3,0 est 3,3 et des coefficients impairs 1,0 est 1,1 . (Cette transformée est juste a,b↦a+b,a−b .) Par conséquent, la transformée du premier polynôme est
4,3+i,2,3−i.
Ceci est obtenu en utilisantX0,2=E0±O0 ,X1,3=E1∓iO1 . (D'après le calcul du facteur twiddle).
Faisons de même pour le deuxième polynôme. Les coefficients sont2,0,2,0.
Les coefficients pairs 2,2 transforment en 4,0 et les coefficients impairs 0,0 transforment en 0,0 . Par conséquent, la transformée du deuxième polynôme est
4,0,4,0.
On obtient la transformée de Fourier du polynôme produit en multipliant les deux transformées de Fourier ponctuellement:16,0,8,0.
Il reste à calculer la transformée de Fourier inverse. Les coefficients pairs 16,8 transforment en inverse à 12,4 et les coefficients impairs 0,0 transforment en inverse à 0,0 . (La transformée inverse est x,y↦(x+y)/2,(x−y)/2 ) Par conséquent, la transformée du polynôme produit est
6,2,6,2.
Elle est obtenue en utilisantX0,2=(E0±O0)/2 ,X1,3=(E1∓iO1)/2 . Nous avons obtenu la réponse souhaitée
(3+x)(2+2x2)=6+2x+6x2+2x3.
la source
Définissez les polynômes, où
deg(A) = q
etdeg(B) = p
. Ledeg(C) = q + p
.Dans ce cas
deg(C) = 1 + 2 = 3
,.On peut facilement trouver C en tempsO(n2) par multiplication par force brute des coefficients. En appliquant la FFT (et la FFT inverse), nous pourrions y parvenir en temps O(nlog(n)) . Explicitement:
En continuant, nous représentons chaque polynôme comme un vecteur dont la valeur est ses coefficients. Nous remplissons le vecteur avec des 0 jusqu'à la plus petite puissance de deux,n=2k,n≥deg(C) . Ainsi n=4 . Choisir une puissance de deux nous offre un moyen d'appliquer récursivement notre algorithme de division et de conquête.
SoitA′,B′ la représentation de la valeur de A et B, respectivement. Notez que la FFT (Fast transformée de Fourier ) est une transformation linéaire ( plan linéaire ) et peut être représenté comme une matrice, M . Ainsi
We defineM=Mn(ω) where ω is complex roots nth complex roots of unity. Notice jth row and kth column is ωjkn . See more about the DFT matrix here
n = 4
, in this example. Also notice that the entry in theGiven theω4=4th roots of unity, we have the ordered set equality:
This can be visualized as iterating thru roots of the unit circle in the counter-clockwise direction.
Also, notice theω6=ω6modn=ω2=−1 and −i=ω3=ω3+n
mod n
nature, i.e.To complete step 1 (evaluation) we findA′,B′ by performing
This step can be achieved using D&C algorithms (beyond the scope of this answer).
MultiplyA′∗B′ component-wise (step 2)
Finally, the last step is to represent C' into coefficients. Notice
NoticeM−1n=1nMn(ω−1) 1 and ωj=−ωn/2+j .
Also, it is true that, given thenth root of unity, the equality ω−j=ωn−j holds. (Do you see why?)
Then,c⃗ =M−1C′=1nMn(w−1)=14⎡⎣⎢⎢⎢11111−i−1i1−11−11i−1−i⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢16080⎤⎦⎥⎥⎥=⎡⎣⎢⎢⎢⎢(16+8)/4(16−8)/4(16+8)/4(16−8)/4⎤⎦⎥⎥⎥⎥=⎡⎣⎢⎢⎢6262⎤⎦⎥⎥⎥
Thus, we get the polynomialC=A∗B=6+2x+6x2+2x3
1: Inversion Formula pg 73, Algorithms by Dasgupta et. al. (C) 2006
la source