Pokaż, jak wykonać FFT ręcznie

27

Załóżmy, że masz dwa wielomiany: 3+x i .2x2+2

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.

lars
źródło
2
Wikipedia zachowuje ten ładny obraz do mnożenia liczb całkowitych za pomocą FFT, ale myślę, że nawet bardziej szczegółowy krok po kroku może być pomocny.
Realz Slaw

Odpowiedzi:

27

Załóżmy, że używamy czwartego pierwiastka jedności, co odpowiada podstawieniu 1,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,ba+b,ab .) Dlatego transformacja pierwszego wielomianu wynosi
4,3)+ja,2),3)-ja.
Uzyskuje się to, stosującX0,2=E0±O0 ,X1,3=E1iO1 . (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,(xy)/2 ) Zatem transformacja wielomianu produktu wynosi
6,2,6,2)
Jest to uzyskiwane przy użyciuX0,2)=(mi0±O0)/2) ,X1,3=(E1iO1)/2 . Otrzymaliśmy pożądaną odpowiedź
(3+x)(2+2x2)=6+2x+6x2+2x3.

Yuval Filmus
źródło
jak doszedłeś do 6,2 6, 2?
lars
Podałem wzory: , X 1 , 3 = ( E 1i O 1 ) / 2 , gdzie E 0 , E 1 ( O 1 , O 2 ) wynosi odwrotna transformacja parzystych (nieparzystych) współczynników, uzyskana ze wzoru x , y ( x + y )X0,2=(E0±O2)/2X1,3=(E1iO1)/2E0,E1O1,O2 . Proszę spojrzeć ponownie na odpowiedź - wszystkie obliczenia są dostępne. x,y(x+y)/2,(xy)/2
Yuval Filmus
Dlaczego dwa razy używasz parzystych współczynników? 3,3 -> 3,3,3,3. -> 3 + 1, 3-i, 3 + -1,3 - i?
Aage Torleif,
Jak te formuły dla i X 1 , 3 rozciągają się na wyższe stopnie? Czy znaki plus / minus po prostu przewracają się? Na przykład, co by to było dla X 0 , 2 , 4 ? X0,2X1,3X0,2,4
Bobby Lee,
@BobbyLee Zachęcam do przeczytania literatury na temat FFT.
Yuval Filmus
7

Zdefiniuj wielomiany, gdzie deg(A) = qi deg(B) = p. The deg(C) = q + p.

W tym wypadku deg(C) = 1 + 2 = 3.

A=3+xB=2x2+2C=AB=?

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:

  1. 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.
  2. Pomnóż składowe wielomianów w ich reprezentacji wartości. Zwraca reprezentację wartości C = A * B. To zajmuje O(n) czas.
  3. 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,ndeg(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+0x3a=[3,1,0,0]B=2+0x+2x+0x3b=[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=MaB=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 ωnjk . Zobacz więcej o matrycy DFT tutaj

M4(w)=[111...11ω1ω2...ωn11ω2ω4...............ωjk...1ωn1ω2(n1)...ω(n1)(n1)]=[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 nnaturę, tj. ω6=ω6modn=ω2=1 and i=ω3=ω3+n

To complete step 1 (evaluation) we find A,B by performing

A=Ma=[11111ωω2ω31ω2ω4ω61ω3ω6ω9][3100]=[3+13+1ω3+ω23+ω3]=[43+i23i]B=Mb=[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 AB component-wise (step 2)

AB=[43+i23i][4040]=[16080]=C

Finally, the last step is to represent C' into coefficients. Notice

C=McM1C=M1Mcc=M1C

Notice Mn1=1nMn(ω1)1 and ωj=ωn/2+j.

Mn1=14[11111ω1ω2ω31ω2ω4ω61ω3ω6ω9]=14[11111i1i11111i1i]

ω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=ωnj holds. (Do you see why?)

Then,

c=M1C=1nMn(w1)=14[11111i1i11111i1i][16080]=[(16+8)/4(168)/4(16+8)/4(168)/4]=[6262]

Thus, we get the polynomial

C=AB=6+2x+6x2+2x3
1: Inversion Formula pg 73, Algorithms by Dasgupta et. al. (C) 2006

j__gt
źródło