3.5 Schnelle Fouriertransformation (FFT, DFT) 3.5.1 Grundlagen
Ein Polynom P = P
i a i x i ∈ C[x] vom Grad ≤ n ist eindeutig durch seine Koeffizienten a i bestimmt, d.h. man hat eine Bijektion
{Polynome ∈ C[x] vom Grad ≤ n} → C n+1 P ~ a =
n
X
i=0
a i x i 7→ ~a = (a 0 , . . . , a n ).
Problem: P ~ a · P ~b = P ~ c mit ~ c = (c 0 , . . . , c 2n ), c k = P
i a k−i b i , und die naive Berechnung von ~ c ben¨ otigt Θ(n 2 ) Operationen.
Bemerkung: ~ c = ~a ∗ ~b mit c k = P
i a k−i b i ist die Faltung von ~a und ~b.
Es gibt noch eine weitere eindeutige Darstellung eines Polynoms.
Lemma 144 Seien P = P n
i=0 a i x i und Q = P n
j=0 b j x j Polynome (∈ C [x]) vom Grad ≤ n und seien ω 0 , . . . , ω n ∈ C paarweise verschiedene Elemente. Dann gilt:
P = Q ⇐⇒ P (ω i ) = Q(ω i ) f¨ ur alle i = 0, . . . , n.
Beweis:
” ⇒“: Klar.
” ⇐“: Es gelte P (ω i ) = Q(ω i ) f¨ ur i = 0, . . . , n. Dann ist jedes ω i eine Nullstelle des
Polynoms P − Q. Da grad(P − Q) ≤ n gilt, folgt P − Q = 0 aus Satz 139.
Man kann leicht zeigen, dass es zu jedem Tupel (b 0 , . . . , b n ) ∈ C n+1 (genau) ein Polynom f ∈ C [x] vom Grad ≤ n gibt, mit f (ω i ) = b i f¨ ur i = 0, . . . , n (z.B. das Newtonsche Interpolationspolynom, benannt nach Sir Isaac Newton (1643–1727)).
Somit erhalten wir eine weitere Bijektion:
{Polynome ∈ C [x] vom Grad ≤ n} → C n+1
P 7→ (P (ω 0 ), . . . , P (ω n ))
Vorteil:
P × Q 7→ (P (ω 0 )Q(ω 0 ), . . . , P (ω n )Q(ω n )) =
(P (ω 0 ), . . . , P (ω n )) · (Q(ω 0 ), . . . , Q(ω n )).
Multiplikation ben¨ otigt nur O(n) Operationen.
” · “ auf der rechten Seite bezeichnet
hier das komponentenweise (Hadamard) Vektorprodukt (Jacques S. Hadamard
(1865–1963)).
Problem: Bijektion i.a. zu komplex.
Definition 145
Ein ω ∈ C heißt primitive n-te Einheitswurzel, wenn ω k 6= 1 f¨ ur alle k = 1, . . . , n − 1 und ω n = 1 gilt, d.h. ord(ω) = n in C ∗ = C \ 0.
Bemerkung: Es ist ω = e 2iπ/n eine primitive n-te Einheitswurzel.
Definition 146
Sei ω ∈ C eine primitive n-te Einheitswurzel, n ∈ N . Die Abbildung F n,ω : C n → C n ,
~a = (a 0 , . . . , a n−1 ) 7→ (P ~ a (1), P ~ a (ω), . . . , P ~ a (ω n−1 ))
heißt diskrete Fouriertransformation; wir schreiben auch kurz F f¨ ur F n,ω .
Die Fouriertransformation ist nach Jean Baptiste Joseph Fourier (1768–1830) benannt.
Bemerkung: F is nach Lemma 144 und anschließender Bemerkung eine Bijektion.
Lemma 147
Seien ~a,~b ∈ C n so, dass auch ~a ∗ ~b ∈ C n . Dann gilt F (~a ∗ ~b) = F(~a) · F ( ~b).
Beweis:
Es gilt
F(~a) · F ( ~b) = (P ~ a (1)P ~b (1), P ~ a (ω)P ~b (ω), . . . , P ~ a (ω n−1 )P ~b (ω n−1 ))
= (P ~ c (1), P ~ c (ω), . . . , P ~ c (ω n−1 ))
= F (~ c), mit ~ c = ~a ∗ ~b.
Idee: Berechne ~a ∗ ~b verm¨ oge F −1 (F(~a) · F ( ~b)). Die komponentenweise Multiplikation F(~a) · F ( ~b) ben¨ otigt nur O(n) Operationen.
Jedoch: F ist eine lineare Abbildung F(~a) = Ω · ~a, mit Ω = (ω kl ) 0≤l,k≤n−1 . Die Matrixmultiplikation ben¨ otigt aber Ω(n 2 ) Operationen (also keine offensichtliche Verbesserung im Vergleich zur klassischen Polynom-Multiplikation)!
Ausweg: ”Divide and Conquer”!!!
3.5.2 Berechnung der diskreten Fouriertransformation (FFT) Sei n = 2 k eine 2er-Potenz. Zerlege ~a = (a 0 , . . . , a n−1 ) in einen
geraden Anteil ~a g = (a 0 , a 2 , . . . , a n−2 ) und einen ungeraden Anteil ~a u = (a 1 , a 3 , . . . , a n−1 )
Dann gilt:
P ~ a (x) = P ~ ag(x 2 ) + xP ~ au(x 2 ) .
(x 2 ) .
Beispiel 148
Sei ~a = (1, 2, 4, 8), also P ~ a (x) = 1 + 2x + 4x 2 + 8x 3 . Damit ist ~a g = (1, 4) und
~a u = (2, 8), also
P ~ ag(x 2 ) + xP ~ au(x 2 )
(x 2 )
= 1 · (x 2 ) 0 + 4 · (x 2 ) 1 + x · (2 · (x 2 ) 0 + 8 · (x 2 ) 1 )
= 1 + 2 · x + 4 · x 2 + 8 · x 3
Lemma 149 Ist F
n2
,ω
2(~a g ) = (c 0 , . . . , c
n2
−1 ) und Fn
2
,ω
2(~a u ) = (d 0 , . . . , d
n2
−1 ), so gilt F n,ω (~a) = (e 0 , . . . , e n−1 ) mit
e i = P ~ a (ω i )
= P ~ ag(ω 2i ) + ω i P ~ au(ω 2i )
(ω 2i )
= c i + ω i d i
e
n2
+i = P ~ a (ωn2+i )
= P ~ ag(ω 2(n2+i) ) + ω
n2+i P ~ a
u(ω 2(n2+i) )
+i) ) + ω
+i) )
= c i + ω
n2+i d i
f¨ ur i = 0, . . . , n 2 − 1.
Bem.: ω 2 ist primitive n 2 -te Einheitswurzel. Nat¨ urlich ist ω 2n2 = 1.
Dies liefert folgenden Divide-and-Conquer-Algorithmus:
DFT(~a,ω)
Eingabe: ~a = (a 0 , . . . , a n−1 ), n = 2 k , ω Ausgabe: F n,ω (~a) = (e 0 , . . . , e n−1 )
if n = 1 then e 0 := a 0
else
~a g := (a 0 , a 2 , . . . , a n−2 )
~a u := (a 1 , a 3 , . . . , a n−1 ) (c 0 , . . . , c
n2
−1 ) :=DFT( ~a g , ω 2 ) (d 0 , . . . , d
n2
−1 ) :=DFT(~a u , ω 2 ) for i = 0 to n 2 − 1 do
e i := c i + ω i d i
e
n2