0.1. Diskrete Fouriertransformation 1 0.1 Diskrete Fouriertransformation Die diskrete Fouriertransformation dient der schnellen Multiplikation von Polynomen. Es sei R ein kommutativer Ring mit Eins und b ≥ 1 eine natürliche Zahl, die in R invertierbar ist. Es gibt damit b−1 ∈ R. Dies gilt immer, wenn R ein Körper der Charakteristik Null ist wie etwa C. Es gilt für Körper der Charakteristik p mit ggT(b, p) = 1. Es gilt auch, wenn b = 2r eine Zweierpotenz und R = Z/N Z ist, falls N ungerade ist. Dies ist der Fall, der für die schnelle Multiplikation großer Zahlen relevant ist. Man beachte, dass Z/N Z diverse Nullteiler haben kann. Für das direkte Produkt Rb gibt es zwei natürliche Multiplikationen. Wir können komponentenweise multiplizieren: [u0 , . . . , ub−1 ] · [v0 , . . . , vb−1 ] = [u0 v0 , . . . , ub−1 vb−1 ] P oder wir fassen einen Vektor [u0 , . . . , ub−1 ] als ein Polynom i ui X i auf und multiplizieren Polynome in dem Restklassenring R[X]/(X b − 1). Die Konvention ist ui = 0 für alle i < 0 und alle b ≤ i. Dies erspart die Mitführung expliziter Summationsgrenzen. In diesem Ring gilt X b = 1 und wir erhalten ! X X X X ( ui X i )( vi X i ) = uj vi−j X i . i i i j Sei jetzt ω ∈ R eine b-te Einheitswurzel, also ein Element mit ω b = 1. Dann können wir f (X) ∈ R[X]/(X b − 1) bei Potenzen ω i auswerten und f (X) 7→ [f (1), f (ω), f (ω 2 ), . . . , f (ω b−1 )] definiert einen Ringhomomorphismus von R[X]/(X b − 1) nach Rb . Eine primitive b-te Einheitswurzel ist definiert als ein Element ω ∈ R, welches den folgenden beiden Bedingungen genügt: • ω b = 1, Pb−1 ki • i=0 ω = 0 für alle 1 ≤ k < b. Man beachte, ist ω eine primitive b-te Einheitswurzel so auch ω −1 . Ist 1 ≤ c und c ein Teiler von b, so ist ω c eine primitive b/c-te Einheitswurzel in R. Die diskrete Fouriertransformation ist in Ringen R mit b−1 ∈ R möglich, die eine primitive b-te Einheitswurzel besitzen. Für diese Ringe sind R[X]/(X b − 1) und Rb isomorph. 0.1. Diskrete Fouriertransformation 2 Koeffizientenfolgen für f und g Koeffizientenfolge für das Produkt f g Auswertung Folgen f (ω i ), g(ω i ) Interpolation punktweise Multiplikation Folge f (ω i )g(ω i ) Abbildung 0.1: Das Schema der diskrete Fouriertransformation 1 1 [a0 , . . . , ab−1 ] · 1 .. . 1 ω1 ω2 .. . 1 ω2 ω4 .. . ··· ··· ··· 1 ω b−1 ω 2(b−1) · · · 1 ω b−1 ω 2(b−1) = [f (1), f (ω), f (ω 2 ), . . . , f (ω b−1 )] .. . ω (b−1) 2 Abbildung 0.2: Matrixdarstellung der Fouriertransformation Die Isomorphie lässt sich durch Matrixmultiplikationen erklären. Betrachte hierfür die {0, . . . , b − 1} × {0, . . . , b − 1}-Matrizen F = (ω ij ) und F = (ω −ij ), dann gilt die Beziehung: ! ! b−1 b−1 X X ω ik−kj = ω k(i−j) . F · F = (ω ij ) · (ω −ij ) = k=0 k=0 Da ω und ω −1 primitive b-te Einheitswurzeln sind, ist F · F die Diagonalmatrix mit dem Wert b in der Diagonalen. Insbesondere sind die Matrizen F und F invertierbar und F · F · b−1 ist die Identität. P kj Nun gilt [a0 , . . . , ab−1 ] · F = und [a0 , . . . , ab−1 ] · F · F · b−1 = [a0 , . . . , ab−1 ]. k ak ω Also erhalten wir den folgenden Ringisomorhismus: F : R[X]/(X b − 1) → Rb X f (X) = ai X i 7→ [a0 , . . . , ab−1 ] · F = [f (1), f (ω), f (ω 2 ), . . . , f (ω b−1 )]. i Die Abbildung F (f (X)) heißt die diskrete Fouriertransformation und wird also durch eine Multiplikation eines Vektors mit einer Matrix einer sehr speziellen Struktur realisiert. Für die Umkehrabbildung ersetzt man die Matrix F durch F und multpliziert am Ende das Ergebnis noch skalar mit b−1 . Die Berechnung des Vektors F (f (X)) durch eine Matrixmultiplikation findet sich in Abbildung 0.2. 0.2. Primitive Einheitswurzeln Die Strategie die Koeffizienten zi in f (X) · g(X) = entsprechend der Abbildung 0.1 wie folgt: 3 P i zi X i zu berechnen ergibt sich (a) Berechne F (f (X)) und F (g(X)), also f (ω i ) und g(ω i ). (b) Bilde die b Produkte hi = f (ω i ) · g(ω i ) in R. (c) Berechne [h0 , . . . , hb−1 ] · F · b−1 = [z0 , . . . , zb−1 ]. Dann gilt f (X)g(X) = [F (f (X)) · F (g(X))] · F · b−1 . Wir betrachten jetzt den Spezialfall, dass b eine Zweierpotenz ist, also b = 2r für ein r ≥ 1. Dann lässt sich die Berechnung F (f (X)) mittels der Teile-und-Beherrsche Strategie effizient durchführen. Dies führt auf den schnelle Fouriertransformation (FFT: Fast Fourier Transform) wie folgt. Wir schreiben Polynome f (X) vom Grad kleiner als b in der Form: f (X) = fb0 (X 2 ) + X fb1 (X 2 ) Die Polynome fbj haben den Grad kleiner als b/2 und ω 2 ist eine primitive b/2-te Einheitswurzel. Es ergibt sich f (ω i ) = fb0 (ω 2i ) + ω i fb1 (ω 2i ). Die Additionen in R und Multiplikationen mit ω i sowie b−1 nennen wir elementare arithmetische Operationen. Dann genügt die Zahl t(b) der elementaren arithmetischen Operationen, um die Fourier-Transformation F (f (X)) zu berechnen, der Rekursionsgleichung t(b) ≤ 2t(b/2) + O(b). Also gilt t(b) ∈ O(b log b). Um das Produkt f (X)g(X) zweier Polynome vom Grad kleiner als d zu berechnen, können wir b als kleinste Zweierpotenz wählen, die b ≥ 2d erfüllt. Dann benötigen wie noch zusätzlich die Zeit, um b Produkte in R auszurechnen. 0.2 Primitive Einheitswurzeln Sie zunächst R ein Körper der Charakteristik Null oder ein Körper der Charakteristik p mit ggT(b, p) = 1. Dann ist b in R invertierbar. Außerdem berechnet sich die formale Ableitung des Polynoms X b − 1 zu bX b−1 . Hieraus folgt, dass das Polynom X b − 1 keine mehrfachen Nullstellen hat. In einem Körpererweiterung von K zerfällt X b − 1 in Linearfaktoren und in diesem sind die b Nullstellen paarweise verschieden. Hieraus folgt, dass die Gruppe der b-ten Einheitswurzeln zyklisch ist. Sie wird erzeugt von einem Element ω. Es gilt also ω b = 1 und ω k 6= 1 für alle 1 ≤ k < b. 0.3. Schnelle Multiplikation von Zahlen nach Schönhage und Strassen 4 P ki bk Hieraus folgt (1 − ω k ) b−1 = 0 für alle 1 ≤ k < b. Also ist das erzeugende i=0 ω = 1 − ω 2πi Element ω eine primitive b-te Einheitswurzel. Für R = C können wir etwa ω = e b wählen. Im Allgemeinen hat R jedoch Nullteiler und damit ist die Aussage “ω b = 1 und ω k 6= 1 Pb−1 für alle 1 ≤ k < b” nicht hinreichend, um i=0 ω ki zu folgern. Der Rest dieses Abschnitts ist dem folgenden Satz gewidmet, der für die schnelle Multiplikation großer Zahlen nach nach Schönhage und Strassen von entscheidender Bedeutung ist. Satz 0.1 Es sei b = 2r und b | m sowie N = 2m + 1. Setze ψ = 2m/b und ω = ψ 2 . Dann gelten in dem Ring R = Z/N Z die folgenden Aussagen: (a) b−1 = −2m−r . (b) ψ b = −1. (c) ω ist eine primitive b-te Einheitswurzel. −1 Beweis: Es gilt 2m = −1 ∈ R. Die Aussagen −2m−r , ψ b = −1 sowie ω b = Pbb−1 = ki = 0 für alle 1 ≤ k < b gilt. 1 sind daher trivial. Zu zeigen ist nur, dass i=0 ω r Hierfür benutzen wir, dass b = 2 eine Zweierpotenz ist. Daher gilt mit Induktion nach r zunächst: b/2−1 b−1 r−1 X X Y p ki k 2 ki (1 + ω 2 k ). ω = (1 + ω ) (ω ) = i=0 i=0 p=0 Wir schreiben jetzt k = 2j q wobei q ungerade sei. Klar ist 0 ≤ j < r, also gibt es ein 0 ≤ p < r mit j + p = r − 1. Hieraus folgt, dass ein Faktor in dem Produkt die Form r−1 r−1 r−1 r 1 + ω 2 q hat. Nun ist ω 2 = ψ 22 = ψ 2 = ψ b = −1 und q ist ungerade, also ist r−1 1 + ω 2 q = 1 + (−1)q = 1 − 1 = 0. 2 0.3 Schnelle Multiplikation von Zahlen nach Schönhage und Strassen Die Multiplikation von zwei Zahlen mit jeweils n-Bits erfordert nach der Schulmethode n2 elementare Rechenopererationen. Erst 1960 entdeckte der Russe Anatolij Alexejewitsch Karatsuba, dass es mit einem erstaunlich einfachen Teile-und-Beherrsche Ansatz auch schneller geht und zeigte, dass asymptotisch weniger als n1,6 Rechenopererationen ausreichen. 0.3. Schnelle Multiplikation von Zahlen nach Schönhage und Strassen 5 Ein entscheidender Durchbruch gelang dann 1971 den deutschen Mathematikern Arnold Schönhage und Volker Strassen, die eine quasi-lineare Zahl von Rechenopererationen zeigten. Genauer zeigten sie, dass die Multiplikation von zwei Zahlen mit jeweils n-Bits in der Zeit O(n log n log log n) auf einer Mehrband-Turingmaschine realisiert werden kann. Erst 35 Jahre später konnte der in den USA lehrende schweizer Forscher Martin Fürer ∗ die Zeitschranke auf O(n log n 2log n ) drücken. Dies bedeutet, die Schranke liegt bei O(n log n) für alle in diesem Universum vorstellbaren Eingaben. Wir zeigen hier das Resultat von Schönhage-Strassen. Satz 0.2 Die Multiplikation von zwei n-Bit-Zahlen lässt sich mit O(n log n log log n) Bit-Operationen realisieren. Die Eingabe besteht aus zwei natürlichen Zahlen u und v, wir können annehmen, dass die Binärdarstellung von uv höchstens n Bits erfordert und dass n = 2s eine Zweierpotenz ist. Es reicht uv modulo 2n + 1 zu berechnen und wir können 2n = −1 setzen. Wir definieren b = 2ds/2e und ` = 2bs/2c . Merkregel: • 2n + 1 ist groß und ungerade. • n = 2s ist die Eingabegröße und eine Zweierpotenz. • s ∈ N ist eine kleine Zahl (s = small ). • b = 2ds/2e , ` = 2bs/2c , n = b`, b | 2` und ` ≤ √ n ≤ b ≤ 2`. P `i Wir P zerlegen die Eingabe in b Blöcke der Länge ` und schreiben u = und i ui 2 `i l v = i vi 2 , wobei 0 ≤ ui , vi < 2 für alle i ist. Die Konvention ist ferner, dass ui = vi = 0 für alle i < 0 und für alle b < i gilt. Damit können bei Bedarf die jeweiligen Summationsgrenzen angegeben werden. Es gilt wegen 2b` = −1: ! ! b−1 i b−1 X X X X X uv = uj vi−j 2`i = uj vi−j − uj vb+i−j 2`i . i Setze wi = denn es gilt Pi j=0 j uj vi−j − i=0 Pb−1 j=i+1 j=0 j=i+1 uj vb+i−j . Es reicht jetzt, alle wi ∈ Z zu bestimmen, uv = b−1 X wi 2`i . i=0 Wir wissen, dass wi aus der Addition von b Termen entsteht die jeweils einen Betrag kleiner als 22` haben. Ferner gilt wi < (i + 1)22` . Daher reicht es, die wi modulo b(22` + 1) zu bestimmen. Ab sofort meint daher wi eine Zahl wi modulo b(22` + 1). 0.3. Schnelle Multiplikation von Zahlen nach Schönhage und Strassen 6 Sei jetzt wi0 ≡ wi mod b und wi00 ≡ wi mod 22` + 1. Dann gilt: wi ≡ (22` + 1)(wi0 − wi00 mod b) + wi00 mod b(22` + 1). (0.1) Dies ist klar, denn b teilt 22` , also ist 22` ≡ 0 mod b und damit ist (22` + 1)(wi0 − wi00 mod b) + wi00 ≡ wi0 ≡ wi mod b und außerdem (22` + 1)(wi0 − wi00 mod b) + wi00 ≡ wi00 ≡ wi mod (22` + 1). Da b und 22` + 1 teilerfremd sind folgt Gleichung 0.1 mit dem chinesischen Restsatz. Die Bestimmung der wi0 erfordert wenig Aufwand, da b nur logarithmisch in 2n ist. Allerdings müssen b Werte wi0 bestimmt werden, daher bedarf es auch hier eines Kunstgriffs. 0 0 Zunächst berechnen P wir alle ui ≡ ui mod b und vi ≡ vi mod b. Das 3Ziel ist die Bestimmung der yi = j uj vi−j mod b für 0 ≤ i ≤ 2b − 2. Es gilt 0 ≤ yi < b also reichen 23 log b P P Bits für die yi . Setze u b = i u0i 2(3 log b)i und vb = i vi0 2(3 log b)i . Dann gilt: ! X X X 0 u b · vb = u0j vi−j 2(3 log b)i = yi 2(3 log b)i . i j i Die Binärlängen von u b und vb sind durch 3b log b begrenzt, also können wir mit der Methode von Karatsuba das Produkt u b · vb in der Zeit O((b log b)1,6 ) ⊆ o(b2 ) ⊆ o(n) exakt berechnen. Die Werte aller yi können hieraus direkt abgelesen werden, da sich die entsprechenden Bereiche nicht überlappen. Hieraus berechnen sich unmittelbar die wi0 = yi − yb+i für 0 ≤ i ≤ b − 1. Es verbleibt die Bestimmung der wi00 ≡ wi mod 22` + 1. Wir setzen N = 22` + 1 und rechnen ab sofort in dem Ring R = Z/N Z. Insbesondere gilt 22` = −1. Man beachte, √ dass N ∼ 22 n + 1 gilt, wobei für gerade s sogar Gleichheit gilt. Die Zahl N ist groß, aber wesentlich kleiner als 2n . Definiere ψ = 22`/b . Wir rechnen jetzt in dem Polynomring R[X]/(X b − 1). Dieser Ring ist isomorph zu dem direkten Produkt Rb . Damit kann die Multiplikation von Polynomen auf die punktweise Multiplikation in R reduziert werden. Dies wurde in dem Abschnitt 0.1 gezeigt. Wir betrachten jetzt die beiden folgenden beiden Polynome. X X f (X) = ui ψ i X i , g(X) = vi ψ i X i . i i 0.3. Schnelle Multiplikation von Zahlen nach Schönhage und Strassen 7 Dann gilt wegen ψ b = −1 und X b = 1 die folgende Beziehung: ! ! b−1 i b−1 X X X X X f (X)g(X) = uj vi−j ψ i X i = uj vi−j − uj vb+i−j ψ i X i . i j i=0 j=0 j=i+1 Setze h(X) = f (X)g(X) ∈ R[X]/(X b − 1) und schreibe h(X) = können wir die wi00 wie folgt berechnen: Pb−1 i=0 zi X i . Dann wi00 ≡ zi ψ −i mod 22` + 1. Es verbleibt zu zeigen, wie man die zi berechnet. Hierfür verwenden wir die diskrete Fouriertransformation. Außerdem müssen effizient Multiplikationen der zi mit Potenzen ψ j durchführt werden. Hierfür reicht die Zeitschranke O(`): Elemente in R = Z/N Z repräsentieren wir durch Zahlen z in dem Bereich 0 ≤ z ≤ 22` und behandeln −1 = 22` als Sonderfall. Klar ist, dass wir effizient mit −1 mutiplizieren können. Ferner ist ψ −j = −ψ b−j , daher müssen Multiplikationen mit ψ j nur für 0 < j < b durchgeführt werden. Nun ist ψ j = 22`j/b = 2k für 0 < k < 2`. Für z = −1 ergibt sich zψ j = −2k unmittelbar. Für 0 ≤ z ≤ 22` −1 ist z2k ein Shift um k Bits und wir schreiben z2k = z 0 + z 00 22` mit 0 ≤ z 0 , z 00 ≤ 22` − 1 und erhalten z2k ≡ z 0 − z 00 mod 22` + 1. 0.3.1 Laufzeitanalyse Die Berechnung von F (f (X)), F (g(X)) und [h0 , . . . , hb−1 ] · F · b−1 benötigt O(b log b) elementare Operationen, die jeweils mit O(`) Bit-Operationen durchgeführt werden können. Dies ergibt O(`·b log b) = O(n log n) Schritte. Rekursiv müssen noch b Produkte hi = f (ω i ) · g(ω i ) modulo 22` + 1 berechnet werden. Sei M (n) die Zahl der Bit-Operationen, um zwei n-Bitzahlen zu multiplizieren. Dann ergibt sich die Rekursionsgleichung M (n) ∈ O(n log n) + b · M (2`). Also M (n)/n ∈ 2b · M (2`) + O(log n). 2b` Für n = 2s und t(s) = 2−s M (2s ) ergibt sich t(s) ≤ 2t(s/2 + 1) + O(s). Hieraus ergibt sich t(s) ∈ s log s und damit M (n) ∈ n log n log log n.