Définissez les polynômes, où deg(A) = q
et deg(B) = p
. Le deg(C) = q + p
.
Dans ce cas deg(C) = 1 + 2 = 3
,.
A=3+xB=2x2+2C=A∗B=?
On peut facilement trouver C en temps O(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:
- Convertissez la représentation du coefficient de A et B en sa représentation de valeur. Ce processus est appelé évaluation . L'exécution de Divide-and-Conquer (D&C) pour cela prendrait O(nlog(n)) temps.
- Multipliez les polynômes par composants dans leur représentation des valeurs. Cela renvoie la représentation de la valeur de C = A * B. Cela prend du temps O(n) .
- Inversez C en utilisant la FFT inverse pour obtenir C dans sa représentation de coefficient. Ce processus est appelé interpolation et prend également O(nlog(n)) temps.
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.
A=3+x+0x2+0x3⇒B=2+0x+2x+0x3⇒a⃗ =[3,1,0,0]b⃗ =[2,0,2,0]
Soit A′,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
A′=Ma→B′=Mb→
We define M=Mn(ω) where ω is complex roots nth complex roots of unity. Notice n = 4
, in this example. Also notice that the entry in the jth row and kth column is ωjkn . See more about the DFT matrix here
M4(w)=⎡⎣⎢⎢⎢⎢⎢⎢111...11ω1ω2...ωn−11ω2ω4...ω2(n−1).........ωjk...1ωn−1......ω(n−1)(n−1)⎤⎦⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢11111ωω2ω31ω2ω4ω61ω3ω6ω9⎤⎦⎥⎥⎥⎥
Given the ω4=4th roots of unity, we have the ordered set equality:
{ω0,ω1,ω2,ω3,ω4,ω5,...}={1,i,−1,−i,1,i,...}
This can be visualized as iterating thru roots of the unit circle in the counter-clockwise direction.
Also, notice the mod n
nature, i.e. ω6=ω6modn=ω2=−1 and −i=ω3=ω3+n
To complete step 1 (evaluation) we find A′,B′ by performing
A′=M∗a⃗ =⎡⎣⎢⎢⎢⎢11111ωω2ω31ω2ω4ω61ω3ω6ω9⎤⎦⎥⎥⎥⎥⎡⎣⎢⎢⎢3100⎤⎦⎥⎥⎥=⎡⎣⎢⎢⎢⎢3+13+1ω3+ω23+ω3⎤⎦⎥⎥⎥⎥=⎡⎣⎢⎢⎢43+i23−i⎤⎦⎥⎥⎥B′=M∗b⃗ =⎡⎣⎢⎢⎢⎢11111ωω2ω31ω2ω4ω61ω3ω6ω9⎤⎦⎥⎥⎥⎥⎡⎣⎢⎢⎢2020⎤⎦⎥⎥⎥=⎡⎣⎢⎢⎢⎢2+22+2ω22+2ω42+2ω6⎤⎦⎥⎥⎥⎥=⎡⎣⎢⎢⎢4040⎤⎦⎥⎥⎥
This step can be achieved using D&C algorithms (beyond the scope of this answer).
Multiply A′∗B′ component-wise (step 2)
A′∗B′=⎡⎣⎢⎢⎢43+i23−i⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢4040⎤⎦⎥⎥⎥=⎡⎣⎢⎢⎢16080⎤⎦⎥⎥⎥=C′
Finally, the last step is to represent C' into coefficients. Notice
C′=Mc⃗ ⇒M−1C′=M−1Mc⃗ ⇒c⃗ =M−1C′
Notice M−1n=1nMn(ω−1)1 and ωj=−ωn/2+j.
M−1n=14⎡⎣⎢⎢⎢⎢11111ω−1ω−2ω−31ω−2ω−4ω−61ω−3ω−6ω−9⎤⎦⎥⎥⎥⎥=14⎡⎣⎢⎢⎢11111−i−1i1−11−11i−1−i⎤⎦⎥⎥⎥
ω−j can be visualized as iterating thru roots of the unit circle in the clockwise direction.
{ω0,ω−1,ω−2,ω−3,ω−4,ω−5,...}={1,−i,−1,i,1,−i,...}
Also, it is true that, given the nth 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 polynomial C=A∗B=6+2x+6x2+2x3
1: Inversion Formula pg 73, Algorithms by Dasgupta et. al. (C) 2006