Mostra come fare FFT a mano


27

Diciamo che sono due polinomi: e .3+x2x2+2

Sto cercando di capire come FFT ci aiuta a moltiplicare questi due polinomi. Tuttavia, non riesco a trovare alcun esempio elaborato. Qualcuno può mostrarmi come l'algoritmo FFT moltiplicherebbe questi due polinomi. (Nota: non c'è niente di speciale in questi polinomi, ma volevo renderlo semplice per renderlo più facile da seguire.)

Ho esaminato gli algoritmi in pseudocodice, ma tutti sembrano avere problemi (non specificare quale dovrebbe essere l'input, variabili non definite). E sorprendentemente, non riesco a trovare dove qualcuno abbia effettivamente attraversato (a mano) un esempio di moltiplicare i polinomi usando FFT.


2
Wikipedia mantiene questa bella immagine per la moltiplicazione di numeri interi tramite FFT, ma penso che un passo ancora più esplicito potrebbe essere utile.
Realz Slaw,

Risposte:


27

Supponiamo di utilizzare quarta radici dell'unità, che corrisponde a sostituire per . Nell'algoritmo FFT utilizziamo anche la decimazione in tempo piuttosto che la decimazione in frequenza. (Applichiamo anche un'operazione di inversione di bit senza interruzioni.)1,i,1,ix

Per calcolare la trasformazione del primo polinomio, iniziamo scrivendo i coefficienti: La trasformata di Fourier dei coefficienti pari è e dei coefficienti dispari è . (Questa trasformazione è solo .) Pertanto la trasformazione del primo polinomio è Questo si ottiene usando , . (Dal calcolo del fattore twiddle).

3,1,0,0.
3,03,31,01,1a,ba+b,ab
4,3+i,2,3i.
X0,2=E0±O0X1,3=E1iO1

Facciamo lo stesso per il secondo polinomio. I coefficienti sono I coefficienti pari trasformano in e i coefficienti dispari trasformano in . Pertanto la trasformazione del secondo polinomio è

2,0,2,0.
2,24,00,00,0
4,0,4,0.

Otteniamo la trasformata di Fourier del polinomio del prodotto moltiplicando le due trasformate di Fourier in modo puntuale: Resta da calcolare la trasformata inversa di Fourier. I coefficienti pari trasformano inversa in e i coefficienti dispari trasformano inversa in . (La trasformazione inversa è ). Pertanto la trasformazione del polinomio del prodotto è Questo si ottiene usando , . Abbiamo ottenuto la risposta desiderata

16,0,8,0.
16,8, 3 = ( E 1i O 1 ) / 2 ( 3 + x ) ( 2 + 2 x 2 ) = 6 + 2 x + 6 x12,40,00,0x,y(x+y)/2,(xy)/2
6,2,6,2.
X0,2=(E0±O0)/2X1,3=(E1iO1)/2
(3+x)(2+2x2)=6+2x+6x2+2x3.


come sei arrivato a 6,2 6, 2?
Lars

Ho dato le formule: , , dove ( ) è l'inverso trasformazione dei coefficienti pari (dispari), ottenuta attraverso la formula . Per favore, guarda di nuovo la risposta: tutti i calcoli ci sono. X 1 , 3 = ( E 1i O 1 ) / 2 E 0 , E 1 O 1 , O 2 x , y ( x + y ) / 2 , ( x - y ) / 2X0,2=(E0±O2)/2X1,3=(E1iO1)/2E0,E1O1,O2x,y(x+y)/2,(xy)/2
Yuval Filmus,

Perché usi i coefficienti pari due volte? 3,3 -> 3,3,3,3. -> 3 + 1, 3-i, 3 + -1,3 - i?
Aage Torleif,

In che modo queste formule per e estendono a gradi più alti? I segni più / meno continuano a girare? Ad esempio quale sarebbe per ? X 1 , 3 X 0 , 2 , 4X0,2X1,3X0,2,4
Bobby Lee,

@BobbyLee Ti incoraggio a leggere un po 'di letteratura su FFT.
Yuval Filmus,

7

Definire i polinomi, dove deg(A) = qe deg(B) = p. Il deg(C) = q + p.

In questo caso deg(C) = 1 + 2 = 3,.

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

Possiamo facilmente trovare C in tempo moltiplicando la forza bruta dei coefficienti. Applicando FFT (e FFT inversa), potremmo raggiungere questo obiettivo in tempo . esplicitamente:O(n2)O(nlog(n))

  1. Converti la rappresentazione del coefficiente di A e B nella sua rappresentazione del valore. Questo processo si chiama valutazione . L'esecuzione di Divide-and-Conquer (D&C) per questo richiederebbe tempo .O(nlog(n))
  2. Moltiplica per componente i polinomi nella loro rappresentazione del valore. Ciò restituisce la rappresentazione del valore di C = A * B. Questa operazione richiede tempo.O(n)
  3. Invertire C usando FFT inversa per ottenere C nella sua rappresentazione del coefficiente. Questo processo si chiama interpolazione e richiede anche tempo .O(nlog(n))

Continuando, rappresentiamo ogni polinomio come un vettore il cui valore sono i suoi coefficienti. Riempiamo il vettore con 0 fino alla potenza più piccola di due, . Quindi . Scegliere una potenza di due ci fornisce un modo per applicare ricorsivamente il nostro algoritmo di divisione e conquista.n=2k,ndeg(C)n=4

A=3+x+0x2+0x3a=[3,1,0,0]B=2+0x+2x+0x3b=[2,0,2,0]

Sia la rappresentazione del valore di A e B, rispettivamente. Si noti che FFT (Fast Fourier Transform ) è una trasformazione lineare ( mappa lineare ) e può essere rappresentato come una matrice, . cosìA,BM

A=MaB=Mb

Definiamo dove è radici complesse radici complesse di unità. Notare , in questo esempio. Si noti inoltre che la voce nella riga e è . Scopri di più sulla matrice DFT quiM=Mn(ω)ωnthn = 4jthkthωnjk

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]

Date le di unità, abbiamo l'eguaglianza ordinata impostata:ω4=4th

{ω0,ω1,ω2,ω3,ω4,ω5,...}={1,i,1,i,1,i,...}

Questo può essere visualizzato come iterando attraverso le radici del cerchio dell'unità in senso antiorario.

Inoltre, nota la mod nnatura, ovvero eω6=ω6modn=ω2=1i=ω3=ω3+n

Per completare il passaggio 1 ( valutazione ) troviamo eseguendoA,B

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]

Questo passaggio può essere realizzato utilizzando algoritmi D&C (oltre lo scopo di questa risposta).

Moltiplica componenti (passaggio 2)AB

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

Infine, l'ultimo passo è rappresentare C 'in coefficienti. Avviso

C=McM1C=M1Mcc=M1C

Si noti 1 e .Mn1=1nMn(ω1)ωj=ωn/2+j

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

ωj può essere visualizzato come iterando attraverso le radici del cerchio dell'unità in senso orario .

{ω0,ω1,ω2,ω3,ω4,ω5,...}={1,i,1,i,1,i,...}

Inoltre, è vero che, data la radice dell'unità, vale l'uguaglianza . (Vedi perché?)nthωj=ωnj

Quindi,

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

Quindi, otteniamo il polinomio 1 : Inversion Formula pg 73, Algorithms di Dasgupta et. al. (C) 2006

C=AB=6+2x+6x2+2x3

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.