0.1 Diskrete Fouriertransformation

Werbung
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.
Herunterladen