1. Polynomen (x) axj . Die Zahlen a j heißen Koeffizienten. Ein Polynom Ein Polynom ist eine Funktion A(x ) in dieser Form: A j 0 j A(x ) hat Grad k wenn ak der höchste Koeffizient mit einem Wert ungleich 0 ist. Jede ganze Zahl großer als der Grad n 1 eines Polynoms wird die Länge des Polynoms genannt. Das heißt, der Grad eines Polynoms der Länge ganze Zahl zwischen 0 und n-1 inklusive sein. kann jede 1.1. Addition von Polynomen n 1 (x) bxj zwei Polynome der Länge n. Die Summe von ihnen ist ein Polynom Seien A( x ) a j x j und B j 0 j j 0 n 1 n 1 C ( x ) j 0 c j x j auch mit Länge , so dass C(x) = A(x) + B(x), wobei c j a j b j . Zum Beispiel: 8 x 4 3x 3 12 x 5 ( 5x 3 2 x 2 3x 2) 8 x 4 2 x 3 2 x 2 9 x 3 . 1.2. Multiplikation von Polynomen 2 n 2 (x) bxj dann A (x ) cxj mit (x) axj und B j (x )B (x )C (x )wobei C Seien A j 0 j j 0 j j 0 j c j K 0 a k b j k . n 1 n 1 2 Länge(C) = Länge(A) + Länge(B) und die Laufzeit dieses Verfahren lautet ( n ) . Die Multiplikation kann so durchgeführt werden, dass man jede Klausel in A(x) bei jeder Klausel in B(x) multipliziert, und das ganze zusammen addiert. Zum Beispiel: 3 2 3 ( 6 x 7 x 10 x 9 )( 2 x 4 x 5 ) 3 2 4 3 2 6 5 4 3 30 x 35 x 50 x 45 24 x 28 x 40 x 36 x 12 x 14 x 20 x 18 x 6 5 4 3 2 12 x 14 x 44 x 20 x 75 x 86 x 45 2. Darstellung von Polynomen Polynome könne in zwei Formen dargestellt werden: Koeffizienten und Point-Value Darstellung. Diese beiden sind eigentlich äquivalent. Das heißt, jedes Polynom in Point-Value Darstellung hat ein eindeutiges äquivalent in Koeffizienten Darstellung. In diesem Abschnitt werden diese beiden Darstellungen beschreiben. 2.1. Koeffizienten-Darstellung Die Koeffizienten-Darstellung eines Polynoms A( x ) n 1 j 0 a j x j der Länge ist ein Vektor von Koeffizienten a ( a0, a1 ,..., a n 1 ) . Addition von Polynomen a (a0 , a1 ,..., an 1 ) und b (b0 , b1 ,..., bn 1 ) in Koeffizienten-Darstellung kostet (n ) . Dafür muss man einfach die zwei Vektoren zusammen addieren. Die (a ,a ,..., a )und b(b ,..., b )in Koeffizienten-Darstellung ist in Multiplikation von zwei Polynomen a 0 1 n 1 0,b 1 n 1 2 ( n ) möglich. Dazu benutzt man das Verfahren, das unter Abschnitt 1.2 beschrieben ist. 2.2. Point-Value-Darstellung Die Point-Value-Darstellung eines Polynoms A( x ) n 1 j 0 a j x j der Länge n ist eine Menge von Punkten {( x0 , y0 ), ( x1 , y1 ),..., ( xn1 , yn1 )} , sodass alle x k disjunkt sind und es gilt y k A( xk ) für alle k 0,1,..., n 1 . Auswertung der Punkte ist durch Horne-Schema in (n ) einfach zu berechnen: A( x0 ) a0 x0 (a1 x0 (a2 ... x0 (an2 x0 (an1 ))...)) Theorem 1: Eindeutigkeit von Interpolation der Polynomen Für jede Menge {( x0 , y0 ), ( x1 , y1 ),..., ( xn1 , yn1 )} von n Punkten, mit x k disjunkt, gibt es ein eindeutiges Polynom A(x) der Länge n, so dass y k A( xk ) für alle k 0,1,..., n 1 . Nun betrachten wir die Addition und Multiplikation zweier Polynome A und B in Point-Value-Darstellung: A : {( x0 , y0 ), ( x1 , y1 ),..., ( xn1 , yn1 )} und B: {( x0 , y0 ), ( x1 , y1 ),..., ( xn1 , yn 1 )} Polynome und FFT, Mohsen Taheri, FU Berlin, SoSe 12 Seite 1 Zwei Polynome in dieser Darstellung zu addieren ist ganz einfach und hat die Laufzeit C A B {( x0 , y0 y0 ), ( x1 , y1 y1 ),..., ( xn1 , yn1 yn 1 )} : Für die Multiplikation kann man auch das gleiche Verfahren übernehmen. Es gibt allerdings ein kleines Problem. Die Multiplikation von zwei Polynomen Länge n hat die Länge 2n. Für eine eindeutige Interpolation von einem Polynom der Länge 2n brauchen wir 2n Punkte (nach Theorem 1). Das bedeutet, dass man für das Polynom C zwei Mal so viel Punkte brauchen wird. Die Lösung ist dennoch ganz einfach. Man nutzt die sogenannte Extended Point-Value Darstellung. Diese sind jeweils: A : {( x0 , y0 ), ( x1 , y1 ),..., ( x2 n1 , y2 n 1 )} und B: {( x0 , y0 ), ( x1 , y1 ),..., ( x2 n1 , y2 n 1 )} Man wird also 2n Punkte für die Polynome A und B auswählen. Dann multipliziert man diese und berechnet das Polynom C folgendermaßen: C: {( x0 , y0 y0 ), ( x1 , y1 y1 ),..., ( x2 n1 , y2 n1 y2 n1 )} Wichtig hier zu beachten ist, dass man diese Multiplikation in (n ) ausführen kann. 3. Evaluation und Interpolation Die Auswertung eines Polynoms unter einen bestimmten Wert von x nennt man Evaluation. Wie unter Abschnitt 2.2 erwähnt, kann man dafür das Horne-Schema benutzen und diese in (n 2 ) durchführen. Das umgekehrte Verfahren, nämlich das Herausfinden von Koeffizienten-Vektor eines Polynoms in Point-ValueDarstellung heißt Interpolation. Interpolation kann mit Lagranges Formel berechnet werden: n 1 Lagrange Formel: A( x ) y k ( ( x x j ) / ( xk x j )) k 0 j k j k Es gibt aber effizientere Methoden, die die Evaluation und Interpolation von Polynomen in ( n lg n ) berechnen. Dafür muss man die xk schlau auswählen. Folgende Abschnitte beschäftigen sich mit diesen Methoden. 4. DFT Das Ziel ist also Punkte auszuwählen und das Polynom A( x ) n 1 j 0 a j x j in diesen Punkten auszuwerten. Die Eingabe ist in Koeffizienten-Vektor a (a0 , a1 ,..., an 1 ) vorzustellen. Wenn man die komplexe n-te Einheitswurzeln (eng.: complex nth roots of unity) (siehe 3.1.) als die xk auswählt, und die yk jeweils berechnet, bekommt man einen Vektor y ( y0 , y1 ,..., yn1 ) und diesen nennt man diskrete Fourier Transform oder kurz DFT. Man schreibt also y DFTn (a ) . 4.1. Komplexe Einheitswurzeln Eine komplexe Einheitswurzel ist eine komplexe Zahl , wobei n 1 . Es gibt genau n komplexe n-te Einheitswurzeln: e 2ik / n für k=0,1, … , n-1. Die Zahl n e 2ik / n ist die primitive n-te Einheitswurzel und alle anderen Zahlen sind die Potenzen dieser Zahl. Also die n komplexe n-te Einheitswurzeln sind n , n , n ,..., n Nun betrachten wir die Eigenschaften diese Zahlen. 0 Additive Gruppe: Die n Zahlen n , n , n ,..., n 0 1 2 n 1 1 2 n 1 . haben die gleiche Struktur wie die additive Gruppe ( n ,) mod n . Weil nn n0 1 impliziert, dass njnk nj k nj k mod n . dk nk . Cancellation Lemma: Für jede ganze Zahl n 0, k 0 und d 0 gilt: dn dk Beweis: dn ( e 2ik / dn ) dk ( e 2ik / n ) k nk . Korollar: Für alle ganze Zahlen gilt: nn / 2 2 1 . Halving Lemma: Wenn n>0 eine gerade Zahl ist, dann sind die Quadrate der n komplexen n -te Einheitswurzeln die n/2 komplexe (n/2)-te Einheitswurzeln: {(n0 ) 2 , (n1 ) 2 ,..., (nn 1 ) 2 } {n0/ 2 , n1 / 2 ,..., nn//221} Beweis: Da n gerade ist, nehmen wir an n=2m Zu zeigen: {(20m ) 2 , (21m ) 2 ,..., (22mm1 ) 2 } {m0 , m1 ,..., mm1} Nach Cancellation Lemma: {(20m ) 2 , (21m ) 2 ,..., (22mm 1 ) 2 } {m0 , m1 ,..., m2 m 1} Polynome und FFT, Mohsen Taheri, FU Berlin, SoSe 12 Seite 2 {m0 , m1 ,..., m2 m1} {m0 , m1 ,..., mm1 , mm , mm1 ,..., m2 m1} da mm 1 , ist dann mm j mj , also {m0 , m1 ,..., mm1 , mm , mm1 ,..., m2 m1} {m0 , m1 ,..., mm1 , m0 , m1 ,..., mm1} {m0 , m1 ,..., mm1} . □ Summation Lemma: Für jede ganze Zahl n≥1 und für k≠0 und nicht dividierbar durch n, gilt n 1 (nk ) j 0 j 0 5. FFT und der Algorithmus dafür Unter Verwendung der Eigenschaften der Einheitswurzeln werden wir einen Algorithmus vorstellen, der die Evaluation eines Polynoms in ( n lg n ) ausführen kann. Diese Methode heißt Fast Fourier Transform(FFT). Wir nehmen an, dass n eine Potenz von 2 ist. Für die anderen Fälle gibt es einige Methoden, die allerdings nicht das Thema dieses Dokuments sind. Die FFT-Methode benutzt eine Divide-and-Conquer Strategie, und teilt das Polynom A(x ) in gerade und ungerade indizierte Koeffizienten. Damit werden zwei neue Polynome, A[ 0] ( x ), A[1] ( x ) mit Länge n/2 erzeugt. A[ 0 ] ( x ) a 0 a 2 x a 4 x 2 ... a n 2 x n / 21 , A[1] ( x ) a1 a 3 x a5 x 2 ... a n 1 x n / 21 Das Polynom A(x ) ist also: A( x ) A[ 0] ( x 2 ) xA[1] ( x 2 ) . Damit ist das Problem von Auswerten des Polynoms A(x ) in n Punkten ( 0 , 1 ,..., n1 ) reduziert zu: n n n ( ( 1. zwei Polynome A[ 0] ( x ), A[1] ( x ) der Länge n/2 in den Punkten ( n), n),..., n )auswerten. 02 12 n 12 2. das Resultat mit Hilfe der Abgleichung A( x ) A[ 0] ( x 2 ) xA[1] ( x 2 ) zusammen addieren. Wenn man das Halving Lemma anwendet, dann ist die Anzahl der Elemente der Liste der Zahlen [0] [1] 0 1 n 1 (n ) 2 , (n ) 2 ,..., (n ) 2 nicht n, sondern n/2. Deswegen können wir, die zwei Polynome A (x),A (x)in n/2 komplexe Zahlen (n/2)-te Einheitswurzeln berechnen. Diese zwei Subprobleme haben genau die gleiche Struktur wie das ursprüngliche Problem und sind halb so groß. Diese Teilung ist die Basis des folgenden Algorithmus RecursiveFFT, der ein Vektor a (a0 , a1 ,..., an 1 ) als Eingabe bekommt, und die y DFTn (a ) berechnet. RECURSIVE-FFT(a) 1 2 3 4 5 n = a.length() if n==1 return a // n ist ein Potenz von 2 n e2i / n 1 6 [0 ] a ( a ,a ,..., a ) 0 2 n 2 7 [ 1 ] a (a ,a ,..., a ) 1 3 n 1 8 9 10 11 12 13 14 [ 0 ] [ 0 ] y RECURSIVE FFT ( a ) [ 1 ] [ 1 ] y RECURSIVE FFT ( a ) for k=0 to n/2-1 [0] [1 ] yk yk yk [0 ] [ 1 ] y y y k (n /2 ) k k n return y // y ist als einen Spaltenvektor zu betrachten Zeilen 2-3 repräsentieren die Rekursionsbasis: DFT von einem Vektor mit einem Element ist das Element selbst. [0] weil: y 0 a0 .10 a0 .1 a0 . Zeilen 6-7 definieren die Koeffizienten-Vektoren der Polynome A und A .Die [1] Zeilen 4,5 und 13 sorgen dafür, dass stets den Wert nk hat. Die Zeilen 8-9 führen die rekursive Berechnung y DFTn / 2 für k=0,1,…,n/2-1: y k[ 0 ] A[ 0 ] (nk / 2 ) und y k[1] A[1] (nk / 2 ) oder, weil durch Cancellation Lemma nk / 2 n2 k , ist dann y k[ 0 ] A[ 0 ] (n2 k ) und y k[1] A[1] (n2 k ) . Zeilen 11-12 kombinieren das Ergebnis der Polynome und FFT, Mohsen Taheri, FU Berlin, SoSe 12 Seite 3 rekursiven Berechnung DFTn / 2 . Für y0 , y1 ,... yn / 21 berechnet die Zeile 11: y k y k[ 0 ] nk y k[1] A[ 0 ] (n2 k ) nk A[1] (n2 k ) A(nk ) . Für yn / 2 , yn / 21 ,... yn 1 und k=0,1,…,n/2-1 berechnet die Zeile 12: yk ( n / 2) yk[0] nk yk[1] yk[0] nk n / 2 yk[1] A[0] (n2k ) nk ( n / 2) A[1] (n2k ) A[ 0] (n2 k n ) nk ( n / 2 ) A[1] (n2 k n ) A(nk ( n / 2 ) ) Deswegen ist der Vektor , der bei dem Algorithmus zurück gegeben wird, ist tatsächlich der DFT(a) . Um die Laufzeit zu berechnen, betrachten wir dass jeder rekursiver Aufruf (n ) Zeit kostet, wobei n die Länge des Vektors a ist. Die Laufzeit berechnet sich: T (n ) 2T (n / 2) (n ) ( n lg n ) . 6. Interpolation in komplexen Einheitswurzeln Nun beschäftigen wir uns mit umgekehrtem Verfahren, also ein Polynom von dem Point-Value Darstellung zurück zu Koeffizienten-Darstellung transformieren( a DFT 1 ( y ) ). Man kann die Berechnung von DTF als eine Matrizenmultiplikation vorstellen: 1 y 0 1 1 n2 y1 1 n y 1 2 n4 n DFT (a ) 2 3 n6 y 3 1 n y 1 n 1 2( n ) n n n 1 1 3 n 6 n 9 n 3( n 1) n 1 a 0 n 1 n a1 n2 ( n 1) a 2 n3( n 1) a 3 n( n 1)( n 1) a n 1 Die Matrix heißt Vandermonde-Matrix und wird als Vn bezeichnet. Damit man von dem Vektor a den Vektor y nachrechnet, braucht man Vn1 , die Inverse-Matrix von Vn . Theorem: Für j,k=0,1,…,n-1 sind die (j,k)Einträge von Vn1 die Zahlen n kj / n . Beweis: Zu zeigen: Vn1Vn I n , wobei I n die n×n Identitätsmatrix ist. Betrachte die (j,j' )Einträge von Vn1Vn : [Vn1Vn ] jj' k 0 (n kj / n)(nkj ' ) k 0 (n k ( j j ') / n) n 1 n 1 Beweise: Falls j=j' ist diese Summe gleich 1. Im Falle j≠j'gilt: Da -(n-1)≤j-j'≤n-1 , ist j-j' sicherlich nicht durch n dividierbar. Deswegen kann man das Summation Lemma anwenden, und somit ist die Summe in diesem Fall immer gleich 0. □ 1 Nun, dass wir Vn berechnet haben: I) y DFT ( a ) Vn .a Vn1 . y Vn1 .Vn .a I n .a a a Vn1 . y II) (j,k)Einträge der Vn1 sind: [Vn1 ] jk n kj / n I II a j 1 n 1 yk nkj n k 0 Vergleicht man diese Formel mit der von einem Polynom in Einheitswurzeln( yk n 1 k 0 ak nk ) sieht man, dass mit einer leichten Modifikation in Recursive-FFT, man die Interpolation berechnen kann. Die Modifikation ist wie folgt. Tausche a und y, ersetze n durch n , und dividiere jedes Element durch n. Also ist die Interpolation auch in (n lgn) berechenbar. 1 7. Zusammenfassung Wir haben gezeigt, dass mit Hilfe vom Recursive-FFT man die Evaluation und Interpolation eines Polynoms in (n lgn) durchführen kann. Damit man zwei Polynome in Koeffizienten-Form in (n lgn) multipliziert, wird man sie zunächst in Point-Value-Form umwandeln. Diese Transformation ist in (n lgn) machbar. Die Multiplikation in PointValue-Form kostet nun (n ) Zeit. Nachher wird man das Ergebnis der Multiplikation in (n lgn) zurück in Koeffizienten-Form umwandeln. Somit kann man diese Multiplikation insgesamt in (n lgn) durchführen. Polynome und FFT, Mohsen Taheri, FU Berlin, SoSe 12 Seite 4