Załóżmy, że masz dwa wielomiany: i .
Próbuję zrozumieć, w jaki sposób FFT pomaga nam pomnożyć te dwa wielomiany. Nie mogę jednak znaleźć żadnych wypracowanych przykładów. Czy ktoś może mi pokazać, jak algorytm FFT pomnożyłby te dwa wielomiany. (Uwaga: nie ma nic specjalnego w tych wielomianach, ale chciałem, aby było to proste, aby ułatwić śledzenie.)
Patrzyłem na algorytmy w pseudokodzie, ale wszystkie wydają się mieć problemy (nie określaj, jakie powinny być dane wejściowe, niezdefiniowane zmienne). I, co zaskakujące, nie mogę znaleźć, gdzie ktoś faktycznie przeszedł (ręcznie), przykładu pomnożenia wielomianów za pomocą FFT.
Odpowiedzi:
Załóżmy, że używamy czwartego pierwiastka jedności, co odpowiada podstawieniu1,i,−1,−i na x . W algorytmie FFT używamy również decymacji w czasie, a nie decymacji w częstotliwości. (Bezproblemowo stosujemy również operację odwracania bitów.)
Aby obliczyć transformację pierwszego wielomianu, zaczynamy od wpisania współczynników:3,1,0,0.
Przekształcenie Fouriera parzystych współczynników 3,0 wynosi 3,3 , a nieparzystych współczynników 1,0 wynosi 1 , 1 . (Ta transformacja jest po prostu a,b↦a+b,a−b .) Dlatego transformacja pierwszego wielomianu wynosi
4,3+i,2,3−i.
Uzyskuje się to, stosującX0,2=E0±O0 ,X1,3=E1∓iO1 . (Z obliczenia współczynnika twiddle).
Zróbmy to samo dla drugiego wielomianu. Współczynniki wynoszą2,0,2,0.
Parzyste współczynniki 2,2 przekształcają się na 4,0 , a nieparzyste współczynniki 0,0 przekształcają się na 0,0 . Dlatego transformacja drugiego wielomianu wynosi
4,0,4,0.
Otrzymujemy transformatę Fouriera wielomianu iloczynu przez pomnożenie dwóch transformat Fouriera punktowo:16,0,8,0.
Pozostaje obliczyć odwrotną transformatę Fouriera. Współczynniki parzyste 16,8 odwrotnej transformacji do 12,4 , a nieparzyste współczynniki 0,0 odwrotnej transformacji do 0,0 . (Odwrotna transformata to x,y↦(x+y)/2,(x−y)/2 ) Zatem transformacja wielomianu produktu wynosi
6 , 2 , 6 , 2.
Jest to uzyskiwane przy użyciuX0 , 2= ( E0± O0) / 2 ,X1,3=(E1∓iO1)/2 . Otrzymaliśmy pożądaną odpowiedź
(3+x)(2+2x2)=6+2x+6x2+2x3.
źródło
Zdefiniuj wielomiany, gdzie
deg(A) = q
ideg(B) = p
. Thedeg(C) = q + p
.W tym wypadku
deg(C) = 1 + 2 = 3
.Możemy łatwo znaleźć C w czasieO(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:
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.
NiechA′,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
DefiniujemyM=Mn(ω) gdzie ω jest złożonymi pierwiastkami nth złożonymi pierwiastkami jedności. Zauważ jth i kolumnie kth to ωjkn . Zobacz więcej o matrycy DFT tutaj
n = 4
, w tym przykładzie. Zauważ również, że wpis w wierszuBiorąc pod uwagęω4=4th pierwiastków jedności, mamy uporządkowany zbiór równości:
Można to wizualizować jako iterację przez pierwiastki koła jednostkowego w kierunku przeciwnym do ruchu wskazówek zegara .
Zwróć też uwagę naω6=ω6modn=ω2=−1 and −i=ω3=ω3+n
mod n
naturę, tj.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
źródło