Die schnelle Fouriertransformation Die stetige Fouriertransformation ˆf : Z C eines Signals f : [0, π] C ist gegeben durch ˆf(k) = π 0 f(t)e kt dt Die folgende Umkehrformel drückt dann f als Fourierreihe aus: f(t) = 1 ˆf(k)e ikt π k Z Die Zahlen β k = 1 ˆf(k) heißen Fourierkoeffizienten. Die Funktionen π t ˆf(k)e ikt = F(t) sind periodisch mit kleinster Periode T = π : F(t) = k F(t + T). T heißt auch Wellenlänge. k = T heißt Frequenz. Die Frequenzen sind verantwortlich für die Farbe eines optischen Signals und die π Tonhöhe eines akustischen Signals. ˆf(k) heißt Amplitude von F(t), und ist verantwortlich für Lautstärke eines akustischen Signals, sowie Leuchtkraft eines optischen. Die Bedeutung der Fouriertransformation in der Technik liegt vor allem darin, daß sie vom Zeitbereich t in den Frequenzbereich k(als Definitionsbereich des Signals) wechselt. ˆf(k) ist der Beitrag der frequenz k zum Wert f(t) des Signals zur Zeit t. Da das menschliche Ohr, oder Auge ikt hohe Frequenzen kaum wahrnimmt, kann man die entsprechenden ˆf(k)e weglassen, ohne die Empfangsqualität zu beeinträchtigen, und erreicht damit Datenkompression.Wenn man die ˆf(k) übertragen will, man denke an Fernsehbilder, dann ist es offenbar wichtig, ˆf schnell berechnen zu können, möglichst in realtime. Wenn ein stetiges Sinal an diskreten Stellen ausgewertet wird, erhält man ein diskretes Signal. Wenn man z.b. ein stetiges π - periodisches Signal an den Stellen πn, 0 n < N abgreift, erhält man ein diskretes Signal N f : Z C mit Periode N. Dessen diskrete Fouriertransformation ist definiert durch ˆf(k) = f(n)e πnk N = f(n)ω kn 0 n<n 1 0 n<n
mit der primitiven N ten Einheitswurzel ω = e πi N. Man kann ˆf(k) auffassen als f(ω k ) für das Polynom f = f 0 +f 1 X +...+f N 1 X N 1. Im folgenden verallgemeinern wir C zu einem konmmutativen Ring R mit 1, und zeigen, daß man die diskrete Fouriertransformation (DFT) rekursiv, d.h. schnell berechnen kann. Das Verfahren heißt schnelle Fouriertransformation(FFT).Es gilt nach dem schnellen Sortieren als der zweitwichtigste Algorithmus. Als Anwendung ergibt sich eine schnelle Berechnung der Polynommultiplikation: f g = (f 0 +...f n 1 X n 1 )(g 0 +... g n 1 X n 1 ) = ( f i g j )X k k i+j=k d.h. der Koeffizienten von f g. Mit einem Trick kann man dies Verfahren auf Ringen simulieren, in denen gar keine primitiven N ten Einheitswurzeln existieren, wie z.b. in Z. Dies führt zu dem berühmten Algorithmus von Schönhage und Strassen, welcher Zahlen der Wortlänge n mit O(nlognloglogn) arithmetischen Operationen multipliziert, statt mit O(n ). Näheres in v.z.gathen, Gerhard: Modern Computer Algebra. Wir werden der DFT in der Kodierungstheorie wieder begegnen. Definition 0.1 Sei R ein kommutativer Ring mit 1, 1 n N, ω R. Wir bezeichnen die 1 in R, n mal zu sich selbst addiert ebenfalls mit n. ω heist n te Einheitswurzel, wenn ω n = 1.ω heißt primitive, n te Einheitswurzel, wenn ω n = 1, n R, und für jeden Primteiler t von n ω n/t 1 kein Nullteiler in R. Beispiele 0.1 ω = e πi n C ist primitive n te Einheitswurzel. Die Potenzen von ω sind n gleich auf dem Einheitskreis verteilte Punkte. ist 4 te Einheitwurzel in Z 15, jedoch nicht primitiv, da 4/ 1 = 3 Nullteiler. 3 ist primitive 16 te Einheitswurzel in Z 17. Definition 0. Sei f = (f 0, f 1,..., f n 1 ) R n. Man setzt f(x) = f i x i ; DFT ω f = (f(1), f(ω),...f(ω n 1 )). i=0 DFT ω : R n R n heißt diskrete Fouriertransformation. Es ist nützlich, f = (f 0, f 1,...f n 1 ) wahlweise als Element von R n oder als Element von R[x]/(X n 1) (zwei isomorphe R Moduln,) aufzufassen. Wir führen nun auf R n zwei verschiedene Multiplikationen ein, d.h. wir machen
R n auf zwei verschiedene Weisen zu einer Algebra, derart, daß DFT ein Algebrenhomomorphismus ist: Für f = (f 0, f 1,..., f n 1 ), g = (g 0, g 1,..., g n 1 ) R n setzt man f g = (f 0 g 0,...f n 1 g n 1 ); f n g = (h 0,...h n 1 ) wobei h k = f i g j + f i g j = f i g j i+j=k i+j=n+k i+j k(modn) Bei Auffassung von f, g als Elemente von R[X]/(X n 1) ist f n g einfach das Produkt im Ring R[X]/(X n 1), denn fg = ( k=0 i+j=k x k ( f i g j + k=0 n f i g j )X k + x n ( f i g j )X k i+j=k k=n i+j=n+k Division mit Rest von fg durch X n 1 ergibt i+j=k f i g j )(mod(x n 1) fg = q(x n 1) + f n g; q R[X] Für eine n te Einheitswurzel ω ist daher und daher Satz 0.1 f n g(ω i ) = f(ω i )g(ω i ) DFT w (f n g) = (DFT ω f) (DFT ω g) Die Operation n wird auch zyklische Faltung genannt. Da jedes der f i mit jedem der g j multipliziert wird, erfordert diese Operation, so, wie sie dasteht O(n ) Multiplikationen in R. Die Operation jedoch nur n. Vorausgesetzt, die DFT kann schnell berechnet werden, liefert die im Satz formulierte Eigenschaft also eine Methode das Polynomprodukt schneller zu berechnen: zuerst DFT, dann Produkt, dann inverse DFT. Bei der Durchführung dieses Programms verwendet man den folgenden Satz Satz 0. Seien l, n natürliche Zahlen, 1 < l < n, ω R primitive nte Einheitswurzel. Dann gilt 3
1. ω l 1 ist kein Nullteiler in R ;. 0 j<n ωlj = 0; 3. ω 1 ist primitive n te Einheitswurzel und 1 n DFT ω 1 = (DFT ω) 1 ; 4. Ist n gerade, so ist ω n/ -te primitive Einheitswurzel. Beweis: Wir benützen (c 1) 0 j<m c j = c m 1 Sei g = ggt(l, n) = sl + rn. Da g < n, gibt es einen Primteiler t von n so daß g n t. Mit m = n tg folgt (ω g 1)a = (ω g ) n tg 1 = ω n t 1 Aus b(ω g 1) = 0 folgt b(ω n t 1) = 0, also b = 0. Also ist ω g 1 kein Nullteiler. Es ist aber ω g = ω sl. Aus (ω l 1)a = (ω l ) s 1 = ω g 1 folgt daher, daß ω l 1 kein Nullteiler ist. Aus (ω l ) n 1 j=0 ωlj = ω ln 1 = 0 folgt daher, daß 0 j<n ωjl = 0. Ferner ist (ω 1 ) n = ω n = ω n ω n ω 0 = 1, und ω 1 = ω j für ein gewisses j it 0 < j < n. Sei nun t ein Primteiler von n. Division mit Rest ergibt: jn 1 = qn + r mit 0 r < n. Also ist (ω 1 ) n 1 1 = ω jn 1 1 = ω r 1 und dies ist kein Nullteiler, wie eben gezeigt. Die Matrix von DFT ω ist die van der Monde Matrix 1 1..., 1 1 ω... ω n 1 V ω = V DM(1, ω, ω,...ω n 1 ) = 1 ω... ω (n 1)...... 1 ω n 1... ω (n 1) Es gilt (V ω V ω 1 ) ij = j ω ij ω jk = 0 j<n (ω i k ) j = { n falls i = k 0 sonst Beispiele 0. i ist primitive 4 - te Einheitswurzel in C, ebenso wie i = ( i) 1. Die von i erzeugte Einheitengruppe ist {1, i, 1, i}. Man hat 1 1 1 1 1 1 1 1 V i = 1 i 1 i 1 1 1 1 ; V i = 1 i 1 i 1 1 1 1 1 i 1 i 1 i 1 i Prüfe V i V i = 4id nach. 4
Man kann, wenn n = k eine Zweierpotenz ist, DFT ω f rekursiv berechnen: dazu dividieren wir f mit Rest durch x n 1 res. x n + 1 : Es gilt dann f = q 0 (x n 1) + r0 = q 1 (x n + 1) + r1 ; degr i < n f(ω j ) = q 0 (ω nj 1) + r 0 (ω j ) = r 0 ((ω ) j ); f(ω j+1 ) = q 1 (ω (j+1) n + 1) + r1 (ω j+1 ) = r 1 (ωω j ) = r 1 ((ω ) j ) weil nämlich nach obigem Satz: 0 = ω n 1 = (ω n + 1)(ω n 1), und ω n 1 kein Nullteiler, ist ω n +1 = 0. Ferner ist ω n primitive n te Einheitswurzel. Damit ist die Berechnung von DFT ω f für ein Polynom vom Grad < n auf die Berechnung von DFT ω r 0, DFT ω r 1 mit Grad r 0, r 1 < n zurückgefuhrt. Wir analysieren jetzt die zur Reduktion erforderliche Anzahl von Rechenoperationen: es ist (r 0 ) j = r 0 (f) j = f j + f n +j ; (r 1 ) j = r 1 (f) j = f j f n +j ; (0 j < n ) Schließlich ist (r 1 ) j = (r 1 ) j ω j ; (0 j < n Die Reduktion erfordert also n Additionen bez. Subtraktionen, und n Multiplikationen in R. Ist S(n) die zur Berechnung von DFT ω f mit Gradf < n benötigte Anzahl Additionen, bez. Subtraktionen, und T(n) die Anzahl der Multiplikationen, so erhält man die folgenden Rekursionsformeln: S(n) = S( n ) + n; T(n) = T(n ) + n Mit S(1) = T(1) = 0, n = k, ergibt sich (Übung): damit haben wir den folgenden S(n) = nlog n; T(n) = n log n. Satz 0.3 Für n = k und eine primitive n te Einheitswurzel ω kann DFT ω f = (f(1), f(ω), f(ω )..., f(ω n 1 ) - bei gegebenen 1, ω, ω,..., ω n 1 mit nlogn Additionen, und n logn Multiplikationtn, also 3n Ringoperationen berechnet werden. 5
Bei gegebener n ter Einheitswurzel ω R kann man die zyklische Konvolution h = f n g R[x]/(X n 1) zweier Polynome f, g vom Grad < n = k wie folgt berechnen: zuerst berechnet man die Potenzen ω,..., ω n 1, dann α = DFT ω f β = DFT ω g, sowie (koordinatenweise) α β = γ, und schließlich: h = DFT ω 1γ. Korollar 0.1 Bei gegebener n = k ter Einheitswurzel in R kann die Konvolution in R[x]/(X n 1) sowie das Produkt in R[x] zweier Polynome f, g R[x] mit deg(fg) < n mit 3nlogn Aadditionen in R, 3 nlogn+n Mutiplikationen mit ω - Potenzen in R und n Divisionen in R, also insgesamt nlogn arithmetischen Operationen in R berechnet werden. 9 6