Zdefiniuj wielomiany, gdzie deg(A) = q
i deg(B) = p
. The deg(C) = q + p
.
W tym wypadku deg(C) = 1 + 2 = 3
.
A=3+xB=2x2+2C=A∗B=?
Możemy łatwo znaleźć C w czasie O(n2) poprzez pomnożenie współczynników przez brutalną siłę. Stosując FFT (i odwrotne FFT), moglibyśmy to osiągnąć w czasie O(nlog(n)) . Wyraźnie:
- Konwertuj reprezentację współczynników A i B na jej reprezentację wartości. Ten proces nazywa się oceną . Wykonanie w tym celu podziału i zdobycia zajęłoby O(nlog(n)) czasu.
- Pomnóż składowe wielomianów w ich reprezentacji wartości. Zwraca reprezentację wartości C = A * B. To zajmuje O(n) czas.
- Odwróć C za pomocą odwrotnego FFT, aby uzyskać C w jego reprezentacji współczynnika. Ten proces nazywa się interpolacją i zajmuje również czas O(nlog(n)) .
Kontynuując, reprezentujemy każdy wielomian jako wektor, którego wartością są jego współczynniki. Wypełniamy wektor zerami do najmniejszej potęgi dwóch, n=2k,n≥deg(C) . Zatem n=4 . Wybór potęgi dwóch daje nam sposób na rekurencyjne zastosowanie naszego algorytmu dziel i zwyciężaj.
A=3+x+0x2+0x3⇒B=2+0x+2x+0x3⇒a⃗ =[3,1,0,0]b⃗ =[2,0,2,0]
Niech A′,B′ będzie reprezentacją wartości odpowiednio A i B. Należy zauważyć, że FFT (fast Fourier Transform ) jest transformacja liniowa ( liniową mapą ) i może być przedstawiony jako matrycy, M . A zatem
A′=Ma→B′=Mb→
Definiujemy M=Mn(ω) gdzie ω jest złożonymi pierwiastkami nth złożonymi pierwiastkami jedności. Zauważ n = 4
, w tym przykładzie. Zauważ również, że wpis w wierszu jth i kolumnie kth to ωjkn . Zobacz więcej o matrycy DFT tutaj
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⎤⎦⎥⎥⎥⎥
Biorąc pod uwagę ω4=4th pierwiastków jedności, mamy uporządkowany zbiór równości:
{ω0,ω1,ω2,ω3,ω4,ω5,...}={1,i,−1,−i,1,i,...}
Można to wizualizować jako iterację przez pierwiastki koła jednostkowego w kierunku przeciwnym do ruchu wskazówek zegara .
Zwróć też uwagę na mod n
naturę, tj. ω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