Theoretische Informatik 3 – WS 2007/08 Inhaltsverzeichnis

Werbung
Notizen zur Vorlesung
Version vom 28. Mai 2009
Theoretische Informatik 3 – WS 2007/08
c Volker Strehl, Department Informatik, FAU
Inhaltsverzeichnis
1 Syntax und Semantik
5
1.1 Beispiele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2 Definitionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.3 Multiplikationsalgorithmen für ganze Zahlen . . . . . . . . . . . . . . . . . 10
2 Was versteht man unter “Multiplikation”?
2.1 Multiplikation im engeren Sinne . . . . . . . . . . . . . . . . . . . . . . . .
2.1.1 Multiplikation im römischen Zahlsystem . . . . . . . . . . . . . . .
2.1.2 Multiplikation ganzer Zahlen mittels Faktorisierung . . . . . . . .
2.1.3 Multiplikation komplexer Zahlen . . . . . . . . . . . . . . . . . . .
2.1.4 Polynome . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.1.5 Multiplikation von Polynomen mittels Faktorisierung . . . . . . . .
2.1.6 Multplikation von Polynomen mittels Interpolation . . . . . . . . .
2.1.7 Faltung von Funktionen und Fouriertransformation . . . . . . . . .
2.2 Multiplikation im weiteren Sinne (I): Mengen, Wörter und Sprachen . . .
2.2.1 Mengen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.2 Wörter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.3 Sprachen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3 Multiplikation im weiteren Sinne (II): Transformationen und Permutationen
2.3.1 Transformationen . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3.2 Bäume . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3.3 Permutationen . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3.4 Zyklische Permutationen . . . . . . . . . . . . . . . . . . . . . . . .
2.3.5 Darstellungen von Permutationen als Produkte . . . . . . . . . . .
2.3.6 Gerade und ungerade Permutationen . . . . . . . . . . . . . . . . .
2.3.7 Inversionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.4 Multiplikation im weiteren Sinne (III): Gruppen . . . . . . . . . . . . . .
2.5 Grundsätzliche Fragestellungen . . . . . . . . . . . . . . . . . . . . . . . .
14
14
14
14
15
16
17
17
18
19
19
19
20
20
20
21
22
22
23
25
26
27
32
3 Assoziative Operationen und binäre Bäume
3.1 Binäre Bäume . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2 Binäre Operationen . . . . . . . . . . . . . . . . . . . . . . .
3.3 Ein wichtiger Sonderfall: Exponentiation . . . . . . . . . . .
3.3.1 Exponentiation durch Quadrieren und Multiplizieren
3.3.2 Schnelle Berechnung der Fibonacci-Zahlen . . . . .
33
33
36
42
42
42
1
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3.3.3
3.3.4
3.3.5
3.3.6
3.3.7
3.3.8
3.3.9
Iteration von Transformationen: “cycle detection”
Das Geburtstagsparadoxon . . . . . . . . . . . . .
Pollards ρ-Methode . . . . . . . . . . . . . . . . .
Exkurs: Fermatzahlen . . . . . . . . . . . . . . . .
Exponentiation in Gruppen: Ordnung muss sein! .
Diskreter Logarithmus . . . . . . . . . . . . . . . .
Primzahlen und Komplexität – einige Hinweise . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
57
59
61
64
65
72
72
4 Divide-and-Conquer-Multiplikation
75
4.1 Karatsuba-Multiplikation für Polynome (und Zahlen) . . . . . . . . . . . . 75
4.2 Strasssens schnelle Matrix-Multiplikation . . . . . . . . . . . . . . . . . . 75
4.3 Das Master-Theorem für Rekursionsgleichungen . . . . . . . . . . . . . . . 80
5 Natürliche Zahlen: abstrakt und konkret
5.1 Exkurs: primitiv-rekursive und rekursive Funktionen
5.1.1 Nachfolgerstrukturen . . . . . . . . . . . . . .
5.1.2 Primitiv-rekursive und rekursive Funktionen .
5.2 Divisionseigenschaft . . . . . . . . . . . . . . . . . .
5.3 Zahldarstellungen . . . . . . . . . . . . . . . . . . . .
5.3.1 Basis-b-Darstellung . . . . . . . . . . . . . . .
5.3.2 Faktorielle Darstellung . . . . . . . . . . . . .
5.3.3 Fibonacci-Darstellung . . . . . . . . . . . . .
5.3.4 Binomialdarstellung . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
86
86
86
86
89
92
92
93
94
95
6 Der Ring Z und seine Restklassenringe Zn
6.1 Grundlegende Eigenschaften . . . . . . . . . . . . . . . . . . . . . . . .
6.2 Euklids Algorithmus . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.2.1 Rekursive und interativer Version des euklidischen Algorithmus
6.2.2 Komplexität im uniformen und logarithmischen Kostenmodell .
6.2.3 Der erweiterte euklidische Algorithmus . . . . . . . . . . . . . .
6.2.4 Lösen ganzzahliger lineare Gleichungen . . . . . . . . . . . . .
6.2.5 Der binäre euklidische Algorithmus . . . . . . . . . . . . . . . .
6.3 Fibonacci-Zahlen und Lamés Theorem . . . . . . . . . . . . . . . . . .
6.4 Exkurs: Kettenbrüche . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.4.1 Historisches . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.4.2 Der euklidische Algorithmus in Kettenbruchform . . . . . . . .
6.4.3 Der Kettenbruchalgorithmus . . . . . . . . . . . . . . . . . . .
6.4.4 Anwendungen und Ausblicke . . . . . . . . . . . . . . . . . . .
6.5 Die Restklassenringe und ihre Einheitengruppen . . . . . . . . . . . .
6.5.1 Die Restklassenringe der ganzen Zahlen . . . . . . . . . . . . .
6.5.2 Einheiten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.5.3 Eulers φ-Funktion . . . . . . . . . . . . . . . . . . . . . . . . .
6.5.4 Exkurs: Möbius-Inversion . . . . . . . . . . . . . . . . . . . . .
6.5.5 Gruppentheoretisches, insbes. zyklische Gruppen . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
97
97
97
97
97
97
97
97
112
114
114
115
116
117
121
122
122
122
122
122
2
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
6.6
6.5.6 Die Sätze von Lagrange, Fermat und Euler . . . . . . . . . .
6.5.7 Ordnung und Faktorisierung . . . . . . . . . . . . . . . . . . . . .
Chinesischer Restesatz und modulare Arithmetik . . . . . . . . . . . . . .
6.6.1 Das Homomorphieprinzip für Ringe . . . . . . . . . . . . . . . . .
6.6.2 Chinesischer Restesatz – einfachste Form . . . . . . . . . . . . . .
6.6.3 Chinesischer Restesatz – allgemeine Form für teilerfremde Moduln
6.6.4 Das Prinzip der primitiven Idempoteten und analoge Situationen .
6.6.5 Die algebraische Version des chinesischen Restesatzes . . . . . . . .
6.6.6 Modulare Arithmetik . . . . . . . . . . . . . . . . . . . . . . . . .
6.6.7 Partialbruchdarstellung für rationale Zahlen und Polynome . . . .
6.6.8 Der Miller-Rabin-Test als Beispiel . . . . . . . . . . . . . . . . . .
6.6.9 Der chinesische Restesatz für nicht-teilerfremde Moduln . . . . . .
122
122
135
135
135
135
135
135
135
135
135
135
7 Primzahlen, Faktorisierung und Kryptografie
7.1 Primzahlen . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.1.1 Historisches . . . . . . . . . . . . . . . . . . . . . . .
7.1.2 Verifizieren vs. Entscheiden . . . . . . . . . . . . . .
7.1.3 Körper und Ordnungen . . . . . . . . . . . . . . . .
7.1.4 Das Ordnungskriterium für Primzahlen . . . . . . .
7.1.5 Zertifikate für Primzahlen . . . . . . . . . . . . . . .
7.1.6 Primes ∈ N P . . . . . . . . . . . . . . . . . . . . .
7.1.7 Primes ∈ P . . . . . . . . . . . . . . . . . . . . . .
7.2 Probabilistische Primzahltests . . . . . . . . . . . . . . . . .
7.2.1 Teilbarkeitstest, Euklid-Test, Fermat-Test, SPP-Test
7.2.2 Der SPP-Test von Miller-Rabin im Detail . . . . . .
7.2.3 Komplexitätsaussagen . . . . . . . . . . . . . . . . .
7.3 Probabilistische Komplexitätsklassen . . . . . . . . . . . . .
7.3.1 Probabilistische Algorithmen . . . . . . . . . . . . .
7.3.2 Bernoulli-Experimente . . . . . . . . . . . . . . . . .
7.3.3 Probabilistische Komplexitätsklassen . . . . . . . . .
7.4 Public-key Kryptografie . . . . . . . . . . . . . . . . . . . .
7.4.1 Verschlüsselung durch Exponentiation . . . . . . . .
7.4.2 Public-key Verschlüsselung und Signaturen . . . . .
7.4.3 Das RSA-Verfahren . . . . . . . . . . . . . . . . . .
7.4.4 Weitere Anwendungen der Exponentiation . . . . . .
7.4.5 Einwegfunktionen . . . . . . . . . . . . . . . . . . .
7.4.6 RSA und Komplexität . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
150
150
150
150
150
150
150
150
150
150
150
150
150
175
175
177
180
183
183
183
183
183
193
197
8 Schnelle Fouriertransformation
8.1 Zur Person: Joseph Fourier . . . . . .
8.1.1 Sein Leben . . . . . . . . . . .
8.1.2 Seine Leistungen . . . . . . . .
8.2 Klassische Fouriertransformation . . .
8.3 Diskrete Fouriertransformation (DFT)
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
200
200
200
202
205
205
3
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
8.4
8.5
8.6
8.7
Schnelle Fouriertransformation (FFT) . . . . . . . . . . . . . . . .
Schnelle Multiplikation von Polynomen . . . . . . . . . . . . . . . .
Beispiele in Maple . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.6.1 Modulare Polynomarithmetik: Evaluation und Interpolation
8.6.2 Komplexe FFT in Maple . . . . . . . . . . . . . . . . . . .
8.6.3 Beispiel zur Schnellen Fouriertransformation . . . . . . . .
FFT-basierte Multiplikation von sehr großen ganzen Zahlen . . . .
8.7.1 Vorbemerkungen . . . . . . . . . . . . . . . . . . . . . . . .
8.7.2 DFT über Zp . . . . . . . . . . . . . . . . . . . . . . . . . .
8.7.3 Der “three primes”-Algorithmus . . . . . . . . . . . . . . .
4
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
205
205
205
205
205
205
235
235
236
239
1
Syntax und Semantik
• Gegenstände der Mathematik (und somit auch der Theoretischen Informatik) lassen sich in verschiedenen Formalismen beschreiben. Mathematische Objekte (Zahlen, Funktionen, Sprachen, . . . ), lassen sich in verschiedensten Formalismen (Syntax) “spezifizieren” oder “codieren”. Die Bedeutung, die ihnen unabhängig vom
jeweiligen Formalismus zukommt, ist die Sematik des jeweiligen Formalismus.
• Uns interessieren nur Objekte, die algorithmisch erfasst und manipuliert werden
können. Syntax und Semantik müssen also mit konstruktiven, “finiten” Mitteln
beschrieben werden. Das hat seine Grenzen: schon mit so alltäglichen Dingen, wie
den reellen oder komplexen Zahlen, kann man man nicht wirklich “effektiv” umgehen. Trotzdem sind Beispiele, die reelle oder komplexe Zahlen oder Funktionen
beinhalten, zur Illustration nüzlich.
1.1
Beispiele
1. Natürliche und ganze Zahlen lassen sich in den verschiedensten Zahl/Ziffernsystemen
beschreiben und verarbeiten. Neben den geläufigen Darstellungen im Binärsystem, Dezimalsystem, Hexadezimalsystem, allgemein Positionsdarstellung zur Basis b ≥ 2, d.h. a ↔ (a0 , a1 , a2 , . . .) mit
X
a = a0 + a1 b + a2 b2 + . . . =
ak bk wobei 0 ≤ ak < b,
k≥0
gibt es mehr oder weniger “exotische” Systeme wie
– das römische Zahlsystem
– die Darstellung mittels Primfaktorisierung (s.u.)
– die faktorielle Zahldarstellung a ↔ (a1 , a2 , a3 , . . .) mit
a = a1 1! + a2 2! + a3 3! + · · · + an n! + · · ·
mit 0 ≤ an ≤ n
– die Binomialsummendarstellung a ↔ (a1 , a2 , a3 , . . . , ak )
a1
a2
a3
ak
a=
+
+
+ ··· +
mit 0 ≤ a1 < a2 < a3 < · · · < ak
1
2
3
k
– die Fibonacci-Darstellung a ↔ (a1 , a2 , a3 . . .) (mit er Folge der FibonacciZahlen (F0 , F1 , F2 , F3 , . . .) = (1, 1, 2, 3, 5, . . .))
(
ak ∈ {0, 1}
a = a1 F1 + a2 F2 + a3 F3 + · · · wobei
(k ≥ 1)
ak · ak+1 = 0
5
und andere mehr. Die genannten Systeme (siehe hierzu Abschnitt 5.3) haben alle
eine praktische (!) Bedeutung, die aber nicht im Bereich des üblichen Rechnens
liegen. Mittels dieser Zahldarstellungen direkt zu Addieren, oder zu Multiplizieren
dürfte mindestens so unangenehm sein, wie das Rechnen im Römische Zahlsystem.
2. Rationale Zahlen kann man als Brüche (=Paare) von (teilerfremden) ganzen Zahlen schreiben, aber auch als periodische Dezimalbrüche. Eine weitere interessante
Darstellung liefert das Prinzip der Partialbruchzerlegung. Dies beruht auf der Tatsache, dass sich das Reziproke 1/(a · b) eines Produkts zweier teilerfremder ganzer
Zahlen a und b schreiben lässt in der Form
1
t
s
= +
a·b
a b
mit s, t ∈ Z.
Das hat etwas mit dem euklidischen Algorithmus zu tun und darauf wird später
noch eingegangen (siehe Abschnitt 6.2).
3. Reelle Zahlen stellt man sich meist als unendliche Dezimal- oder Dualbrüche vor.
Es gibt aber auch so interessante Darstellung wie die der Kettenbrüche, a ↔
ha0 ; a1 , a2 , a3 , . . .i mit
1
a = a0 +
1
a1 +
1
a2 +
.
a3 + . .
wobei a0 ∈ Z, a1 , a2 , . . . ∈ N≥1 .
Beispielweise gilt
√
1+ 5
=1+
2
1
↔ h1; 1, 1, 1, 1, . . .i
1
1+
1+
1
.
1 + ..
1
e=2+
↔ h2; 1, 2, 1, 1, 4, 1, 1, 6, 1, 1, 8, . . .i
1
1+
1
2+
1
1+
1+
1
.
4 + ..
6
1
π =3+
↔ h3; 7, 15, 1, 292, 1, 1, 1, 2, 1, . . .i
1
7+
1
15 +
1
1+
292 +
1
.
1 + ..
Auch das hat etwas mit dem euklidischen Algorithmus zu tun! (siehe hierzu Abschnitt 6.4)
Die Kettenbruchdarstellung reeller Zahlen hat höchst interressante Eigenschaften,
wenn es darum geht, reelle Zahlen optimal mittels rationaler Zahlen zu approximieren. Man muss allerdings zugeben, dass sich Kettenbruchdarstellungen nicht
zur Realisierung artihmetischen Operationen eignen.
4. Komplexe Zahlen schreibt man entweder als Paare reeller Zahlen (cartesische Form)
oder in der Polarform.
x + i y ↔ r · eiφ
Je nachdem hat man verschiedene Realisierungen der Addition und der Multiplikation. Beispielsweise schreibt sich die Multiplikation in cartesischer Form
(x1 + i y1 ) · (x2 + i y2 ) = (x1 x2 − y1 y2 ) + i (x1 y2 + y1 x2 )
und in Polarform
r1 · ei φ1
· r2 · ei φ2 = (r1 r2 ) · ei (φ1 +φ2 ) .
5. Polynome kann man mittels ihrer Koeffizienten beschreiben, das ist die übliche
Form, aber ebenso geht es mittels Interpolation.
6. Unterräume eines Vektorraumes kann man mit Hilfe einer Basis spezifizieren (“Generatorsicht”), oder aber mittels eines homogenen linearen Gleichungssystems (“Kontrollsicht”).
7. Lineare Transformationen werden mittels Matrizen beschrieben, wobei die konkrete Matrix von der Wahl der Basen im Definitionsraum und Zeilraum abhängt.
8. Boolesche Funktionen, also Abbildungen f : {0, 1, }n → {0, 1}, wobei die Symbole 0 bzw. 1 für die Wahrheitswerte true bzw. false stehen, lassen sich auf verschiedenste Weise beschreiben: Tabellen, aussagenlogische Formeln, Schaltkreise,
Entscheidungsdiagramme . . . .
9. Berechenbare Funktionen lassen sich mit Hilfe vieler verschiedener, aber gleichwertiger Formalismen beschreiben: Turingmaschinen, Programme irgendeiner Programmiersprache, Terme des λ-Kalküls u.v.a.m.
7
10. Semi-entscheidbare Mengen (alias Typ-0-Sprachen) lassen sich mittels Generatoren (Grammatiken, partiell-rekursive Funktionen) oder aber mittels Akzeptoren
(partielle Entscheidungsverfahren) beschreiben.
11. Für reguläre Sprachen (alias Typ-3-Sprachen) gibt es ein reichhaltiges Arsenal an
Beschreibungsmöglichkeiten:
– Akzeptoren: endliche Automaten (deterministisch, nichtdeterministisch),
– Generatoren: Typ-3-Grammatiken,
– reguläre Ausdrücke
– syntaktische Relationen
– lineare Gleichungssysteme für Sprachen
12. Reelle oder komplexe Funktionen, wenn sie nur hinreichend “gutartig” sind, können
durch ihre Taylorreihe dargestellt werden. Viel andere Möglichkeiten sind bekannt,
z.B. Differentialgleichungen,. . . .
13. Periodische (reelle oder komplexe) Funktionen lassen sich durch die Koeffizienten
ihrer Fourierreihe repräsentieren.
14. In der Nachrichtentechnik spricht man davon, eine (hinreichend gutartige) Funktion, eine “Signal im “Ortsbereich”, mittels Fouriertransformation im “Frequenzbereich” zu repräsentieren.
15. Das letzte Beispiel stammt aus der Physik: die Quantentheorie zeigt, dass physikalische Objekt eine Doppelnatur besitzen: je nachdem, wie man sie untersucht,
zeigen sie “Teilchennatur” oder “Wellennatur”, man sieht sie im “Ortsraum” oder
im “Impulsraum”. Zwischen beiden Ansichten vermittelt wieder die Fouriertransformation.
Fazit: mathematische (und physikalische!) Bereiche/Objekte sind “ideale Objekte”, die
in verschiedenster Weise konkret repräsentiert sein können. Diese verschiedenen Repräsentationen sind äquivalent, was den rein mathematischen Gehalt angeht. Wenn es
aber darum geht, Operationen auf diesen Objekten zu definieren und algorithmisch zu
realisieren, so zeigen sich u.U. grosse Unterschiede bezüglich der Effizienz.
1.2
Definitionen
Multiplikation als binäre Operation tritt vielfach gemeinsam mit einer weiteren, als Addition bezeichneten binären Operation auf, wobei diese beiden Operationen nicht etwa
ohne Beziehung nebeneinander stehen, sondern durch die Distributionseigenschaft miteinander verbunden sind. Der am meisten verbreitete algebraische Rahmen, um dies zu
formulieren, ist das Konzept des Ringes. In diesem Kontext soll von einer Multiplikation
8
im engeren Sinne gesprochen werden. Hat man es dagegen nur mit einer einzelnen assoziativen Operation zu tun, so soll das mit Multiplikation im weiteren Sinne zu tun.
Zunächst sei an die relevanten algebraischen Konzepte erinnert:
Definition 1. A sei eine Menge und ◦ : A × A → A eine zweistellige Operation.
1. (A; ◦) heisst Halbgruppe, falls ◦ assoziativ ist.
2. Ein Element e ∈ A heisst neutral bezüglich ◦, wenn a ◦ e = e ◦ a = a für alle a ∈ A.
3. (A; ◦, e) heisst Monoid, wenn (A; ◦) eine Halbgruppe ist und e neutral bezüglich ◦).
4. Ein Element b ∈ A heisst invers zu a ∈ A (bezüglich ◦ und neutralem Element e),
falls a ◦ b = b ◦ a = e.
5. (A; ◦, e) heisst Gruppe, wenn jedes a ∈ A ein inverses Element bezüglich ◦ und e
hat.
Definition 2. A sei eine Menge ist mit Elementen 0, 1 ∈ A und 0 6= 1; + : A2 → A (genannt Addition)und ∗ : A2 → A (genannt Multiplikation) seien zweistellige Operationen
auf A.
1. R = (A; +, ∗, 0, 1) ist ein Ring (mit Einselement), falls
(a) (A; +, 0) eine kommutative Gruppe ist;
(b) (A; ∗, 1) ein Monoid ist;
(c) Addition und Multiplikation dem Distributivgesetz genügen:
∀a, b, c ∈ A : a ∗ (b + c) = (a ∗ b) + (a ∗ c)
(a + b) ∗ c = (a ∗ c) + (b ∗ c)
2. Ist zudem auch (A0 ; ∗, 1) (wobei A0 = A \ {0}) eine Gruppe, so wird der Ring R
als Körper bezeichnet.
Beispiel 1. Beispiele für Ringe sind
1. Der Ring (Z; +, ∗, 0, 1) der ganzen Zahlen mit der üblichen Addition und Multiplikation, kurz einfach mit Z notiert.
2. Die Ringe Q der rationalen Zahlen, R der reellen Zahlen, C der komplexen Zahlen
(mit den üblichen Operationen) sind sogar Körper.
3. Ist A eine Menge und P(A) ihre Potenzmenge, so ist (P(A); ∆, ∩, ∅, A) ein Ring,
der boolesche Ring über der Grundmenge A.
4. Zu jedem Ring R kann man den Polynomring R[X] über R in der Variablen X
betrachten (siehe unten).
5. Zu jedem Ring R und jedem N ≥ 1 kann man den Ring Mn (R) der (n × n)Matrizen mit Koeffizienten in R betrachten (siehe unten).
9
1.3
Multiplikationsalgorithmen für ganze Zahlen
10
Die “Schulmethode” der Multiplikation am Beispiel 981 × 1234
1
9 × 1234
1
8 × 1234
1 × 1234
981 × 1234
1
2
1
0
6
9
8
7
2
1
2
3
4
0
5
5
4
1
Komplexität der Schulmethode
Die Multiplikation von zwei n-stelligen (dezimal oder binäre oder andere
Basis) Zahlen erfordert n × n = n2 Multiplikationen von Ziffern
(zuzüglich ca. n2 Additionen von Ziffern)
1
Die sog. “Russische Bauernmultiplikation”
981
×
1234
=
?
981
1234
1234
490
2468
245
4936
122
9872
61
19744
30
39488
15
78976
78976
7
157952
157952
3
315904
315904
1
631808
631808
4936
19744
1210554
2
traditionelle Multiplikation, rekursiv betrachtet
981 × 1234
=
(9 × 102 + 81) × (12 × 102 + 34)
=
9 × 12 × 104
+ (9 × 34 + 81 × 12) × 102
+ 81 × 34 × 100
=
108 × 104 + 1278 × 102 + 2754
=
1080000 + 127800 + 2754
=
1210554
3
Karatsubas Multiplikationsidee (1962)
981 × 1234
=
(9 × 102 + 81) × (12 × 102 + 34)
=
(9 × 12) × 104
+ ((9 + 81) × (12 + 34) − 9 × 12 − 81 × 34) × 102
+ (81 × 34) × 100
9 × 12 × 104
=
+ (90 × 46 − 9 × 12 − 81 × 34) × 102
+ 81 × 34 × 100
=
108 × 104 + 1278 × 102 + 2754
=
1080000 + 127800 + 2754
=
1210554
4
Schema für die Multiplikation von zwei 2n-stelligen Zahlen
(a × 10n + b) × (c × 10n + d) =
a × c × 102n + (a × d + b × c) × 10n + b × d =
a × c × 102n + (a + b) × (c + d) − a × c − b × d × 10n + b × d
wobei a, b, c, d n-stellige Zahlen sind
Beobachtung:
zwei 2n-stellige Zahlen können multipliziert werden, indem man 3 (statt
4 (!!)) Multiplikationen von n-stelligen Zahlen ausführt
Folgerung (mittels Iteration dieses divide-and-conquer-Schemas):
zwei 2n -stellige Zahlen können mittels
3n (statt 4n (!!)) Multiplikationen von Ziffern miteinander multipliziert
werden.
5
Die schnellste bislange bekannte Multiplikationemethode von
Schönhage/Strassen (1971)
beruht auf der
“schnellen Fourier-Transformation” (FFT)
und benötigt eine Anzahl von Ziffernoperationen proportional zu
n log n log log n
für die Multiplikation zweier n-stelligen Zahlen
6
Vergleich der Komplexität von verschiedenen Multiplikationsalgorithmen
n = Anzahl der Ziffern
c1 · n2
“Schulmethode”
Karatsuba (1962)
Schönhage/Strassen (1971)
c2 · nlog2 3
c3 · n · log n · log log n
7
n
n2
nlog2 3
n log n log log n
101
102
102
104
38.46 × 100
19.20 × 100
103
106
104
108
56.83 × 103
13.35 × 103
105
1010
106
1012
107
1014
108
1016
109
1018
1010
1020
14.79 × 102
21.87 × 105
84.10 × 106
32.34 × 108
12.43 × 1010
47.83 × 1011
18.39 × 1013
70.73 × 1014
8
70.33 × 101
20.44 × 104
28.13 × 105
36.27 × 106
44.80 × 107
53.66 × 108
62.81 × 109
72.22 × 1010
2
Was versteht man unter “Multiplikation”?
2.1
2.1.1
Multiplikation im engeren Sinne
Multiplikation im römischen Zahlsystem
Bekanntlich haben die Römer mit ihrem Zahlsystem kein sehr rechenfreundliches System erschaffen. Bereits die Grundrechenarten der Addition und der Multiplikation sind
alles andere als “benutzerfreundlich”. Hier bietet das und von den Arabern tradierte
“indische” Stellenwertsystem ein effiziente Alternative – man kann hier sogar von einem
evolutionären Wettbewerbsvorteil sprechen. Wie kann man sich behelfen?
Bezeichen wir (provisorisch) mit R die Menge natürlichen Zahlen in römischer Notation,
mit A die Menge natürlichen Zahlen in arabischer Notation, mit ρ : R → A die (bijektive)
Abbildung, die einer römisch geschriebenen Zahl das arabisch geschrieben Äquivalent
zuordnet. Dann kann man sich so vorgehen:
ρ
ρ
a, b −−−−→ ρ(a), ρ(b)




·
y
y
R × R −−−−→ A × A




·y
y
R
ρ−1
←−−−−
ρ−1
a · b ←−−−− ρ(a) · ρ(b)
A
Als Beispiel für diesen “Umweg”:
ρ
−−−−→ 78, 87


·y
LXXV III, LXXXV II


y
ρ−1
M M M M M M DCCLXXXV I ←−−−− 6786
2.1.2
Multiplikation ganzer Zahlen mittels Faktorisierung
Es bezeichne D die Menge der positiven natürlichen Zahlen in Dezimaldarstellung:
X
a = (. . . ak+1 ak ak−1 . . . a2 a1 a0 )10 =
ak 10k
k≥0
mit Ziffern ak ∈ {0, 1, 2, . . . , 9}.
Bekanntlich lässt sich jede positive natürliche Zahl eindeutig als Produkt von Primzahlpotenzen schreiben. Dazu sei (2, 3, 5, 7, 11, . . .) = (p1 , p2 , p3 , . . .) die Folge der Primzahlen. Dann gibt es eindeutig bestimmte natürliche Zahlen α1 , α2 , α3 . . . mit
Y α
a = 2α1 3α2 5α3 · · · =
pk k .
k≥1
14
Bezeichnet P die Menge aller Folgen (α1 , α2 , α3 . . .) natürlicher Zahlen, bei denen nur
endlich-viele der αk 6= 0 sind, dann definiert die Primfaktorisierung eine bijektive Abbildung
π : D → P : a 7→ (α1 , α2 , α3 , . . .)
Bezüglich der Multiplikation von positiven natürlichen Zahlen hat man folgende Situation:
π
D × D −−−−→ P × P



+
·y
y
π −1
←−−−−
D
P
π
a, b −−−−→ π(a) = (α1 , α2 , . . .), π(b) = (β1 , β2 , . . .)



+
·y
,
y
π −1
π(a · b) = (α1 + β1 , α2 + β2 , . . .)
a · b ←−−−−
d.h. die Multiplikation wird durch Vektoraddition “simuliert”. Als Beispiel:
π(168) = (3, 1, 0, 1, 0, 0, 0, . . .)
π(990) = (1, 2, 1, 0, 1, 0, 0, . . .)

+
y
π
168, 990 −−−−→


·y
π −1
16632 ←−−−− π(16632) = (4, 3, 1, 1, 1, 0, 0, . . .)
Ganz analog kann ma grösste gemeinsame Teiler auf diesem “Umweg” berechnen:
π
a, b


gcdy
D × D −−−−→ P × P




gcdy
ymin
D
π −1
←−−−−
π
π(a) = (α1 , α2 , . . .), π(b) = (β1 , β2 , . . .)


ymin
−−−−→
π −1
gcd(a, b) ←−−−− π(gcd(a, b)) = (max(α1 , β1 ), max(α2 , β2 ), . . .)
P
Im vorigen Beispiel:
π(168) = (3, 1, 0, 1, 0, 0, 0, . . .)
π
168, 990 −−−−→
π(990) = (1, 2, 1, 0, 1, 0, 0, . . .)




gcdy
ymin
6
π −1
←−−−−
π(6) = (1, 1, 0, 0, 0, 0, 0, . . .)
Kommentar 1. Kommentar: das beschriebene Verfahren ist korrekt! Aber man weiss bis
heute nicht, ob man es effizient realisieren kann: es ist bislang kein effizientes Verfahren
zur Herstellung der Primfaktorisierung einer natürlichen Zahl bekannt. Diese Tatsache
wird sogar als entscheidendes Sicherheitsmerkmal für eine grosse Zahl von Systemen der
kryptografischen Verschlüsselung angesehen!
2.1.3
Multiplikation komplexer Zahlen
Komplexe Zahlen fasst man als Paare reeller Zahlen auf: Realteil und Imaginärteil.
α = a + i b ↔ (a, b) : a = <(α), b = =(α) ∈ R
15
Die Muliplikation von zwei komplexen Zahlen α = a + i b, β = c + i d wird wegen i2 = −1
durch
α · β = (a · c − b · d) + i (a · d + b · d)
beschrieben. Auf den ersten Blick scheint es, als ob die Multiplikation von zwei komplexen
Zahlen vier Multiplikationen von reellen Zahlen erfordert, nämlich die Produkte a · c, b ·
d, a · d, b · d. Tatsc̈hlich kann man es aber auch mit nur drei Multiplikationen von reellen
Zahlen erreichen, denn es ist
a · d + b · c = (a + b) · (c + d) − a · c − b · d,
d.h., man muss nur die drei Produkte a·c, b·d und (a+b)·(c+d) berechnen. Sicher, man
braucht nun mehr Additionen/Subtraktionen, aber da Multiplikationen “teurer” sind,
ist das eine interessante Alternative. Dieser “Trick” wird im Zusammenhang mit der
Karatsuba-Multiplikation von ganzen Zahlen und von Polynomen noch eine wichtige
Rolle spielen.
2.1.4
Polynome
Ist R ein Ring, so bezeichnet R[X] den Ring der Polynome in der Variablen X mit
Koeffizienten in R. Polynome werden geschrieben als Summen von Monomen der Form
ai X i mit ai ∈ R, nach aufteigenden Potenzen von X geordnet:
X
(∗) a(X) = a0 + a1 X + a2 X 2 + · · · + am X m =
ai X i .
0≤i≤m
Der Grad eines Polynoms, das nicht das Nullpolynom ist (alle Koeffizienten =0) ist
deg a = max{k; ak 6= 0}. Das entsprechende ak heisst Leitkoeffizient von a(X). Die
Schreibweise (∗) bedeutet also lediglich deg a ≤ m. R[X]≤m bezeichnet die Menge der
Polynome vom Grad ≤ m. Der Grad des Nullpolynoms ist deg 0 = −∞. Auf offensichtliche Weise gilt
R[X]−∞ ⊂ R[X]≤0 ⊂ R[X]≤1 ⊂ R[X]≤2 ⊂ · · · R[X]≤m ⊂ R[X]≤m+1 ⊂ · · · ⊂ R[X]
Insbesondere ist R−∞ = {0}, R≤0 = R. R[X]m = R[X]≤m+1 \R[X]≤m sind die Polynome
vom Grad m (exakt) und R[X]<m = R[X]≤m−1 die Polynome von echt kleinerem Grad
als m.
Die Addition von Polynomen erfolgt koeffizientenweise, also wir Vektoraddition. In der
Tat: ist R ein Körper so ist R[X] ein Vektorraum (abzählbar) unendlicher Dimension
über R. R[X]m ist ein Vektorraum der Dimension m über R. {1, X, X 2 , . . . , X m−1 } ist
eine Basis von R[X]m . (Es gibt aber viele andere interessante Basen!). Entsprechend
ist {1, X, X 2 , . . .} eine Basis von R[X]. Offensichtlich gilt bei der Addition von zwei
Polynomen a(X) und b(X) bezüglich ihrer Grade deg(a + b) ≤ max{deg a, deg b}.
16
P
P
Die Multiplikation von Polynomen a(X) = 0≤i≤m ai X i , b(X) = 0≤j≤n bj X j , auch
Cauchy-Multiplikation oder Faltung genannt, ist definiert durch


X
X

(a ∗ b)(X) =
ai · bj  X k ,
0≤k≤m+n
i+j=k
also
(a ∗ b)(X) = a0 b0 + (a0 b1 + a1 b0 )X + (a0 b2 + a1 b1 + a2 b0 )X 2 + · · · + am bn X m+n
Bezüglich der Grade gilt deg a ∗ b ≤ deg a + deg b, wobei Gleichheit gilt, falls das Produkt
der beiden Leitkoeffizienten 6= 0 ist, also z.B. immer dann, wenn der Ring R keine
Nullteiler hat.
Bezüglich der Komplexität der Multiplikation ist zu notieren, dass – wenn man die
Formeln der Definition direkt auswertet – für die Multiplikation (deg a + 1) · (deg b +
1) Multiplikationen im Ring R benötigt (jeder Koeffizient von a(C) wird mit jedem
Koeffizienten von b(X) multipliziert. Das ist O(n2 ), falls deg a = deg b = n. Das ist
ein Verfahren von quadratischer Komplexität. Es ist aber nicht gesagt, dass man es so
machen muss und dass es nicht besser geht!. Tatsächlich geht es besser!
2.1.5
Multiplikation von Polynomen mittels Faktorisierung
P
m
Nach dem Fundamentalsatz der Algebra hat ein Polynom m-ten Grades a(X) = m
j=0 am X ,
also mit am 6= 0, genau m komplexe Nullstellen α1 , α2 , . . . , αm , d.h. man hat die Faktorisierung in Linearfaktoren
a(X) = am (X − α1 )(X − α2 ) · · · (X − αm ) = am · Πm
i=0 (X − αi ).
Sind nun a(X) und b(X) zwei Polynome mit deg a = m, deg b = n, so gilt offensichtlich
a(X), b(X) −−−−→ am · Π1≤i≤m (X − αi ), bn · Π1≤j≤n (X − βj )




·y
∗y
(a ∗ b)(X) ←−−−− am bn · Π1≤i≤m (X − αi ) · Π1≤j≤n (X − βj )
Dabei bedeutet → das Zerlegen eines Polynoms in Linearfaktoren, ← das schlichte Ausmultiplizieren und Zusammenfassen der Beiträge gleichen Grades.
2.1.6
Multplikation von Polynomen mittels Interpolation
Jedes Polynom a(X) mit deg a = m ist durch seine Werte an m+1 verschiedenen Stellen
(komplexen Zahlen) ξ0 , ξ1 , . . . , ξm eindeutig bestimmt. Diese Tatsache kann man ausnutzen um Polynome zu multiplizieren. Das simultane Auswerten von a(X) mit deg a = m
an den Stellen ξ0 , ξ1 , . . . , ξm wird dazu mit
a(X) → ha(ξ0 ), a(ξ1 ), . . . , a(ξm )i
17
notiert. Die Umkehrung
a(X) ← ha(ξ0 ), a(ξ1 ), . . . , a(ξm )i
wird als Interpolation bezeichnet. Ein gängiges Verfahren hierfür ist die Interpolationsformel von Lagrange:
a(X) =
X
a(ξi )
0≤i≤m
Y X − ξj
.
ξi − ξj
0≤j≤m
j6=i
Mit gleichen Bezeichnungen für a(X), b(X) wie vorher seien ξ0 , ξ1 , . . . , ξm+n m + n + 1
verschiedene komplexe Zahlen (beachte: aus deg a = m und deg b = n folgt deg a ∗ b =
m + n)
a(X), b(X) −−−−→ ha(ξ0 ), . . . , a(ξm+n )i, hb(ξ0 ), . . . , b(ξm+n )i



·
∗y
y
(a ∗ b)(X) ←−−−−
ha(ξ0 ) · b(ξ0 ), . . . , a(ξm+n ) · b(ξm+n )i
Das ist sicher ein korrektes Verfahren, aber es ist nicht klar, “ob das etwas bringt”.
Schaut man sich den Aufwand für die Lagrange-Interpolation genau an, so sieht man,
dass das in dieser allgemeinen Form noch keinen Vorteil bringt. Wie man diese Idee doch
nutzbringend einsetzen kann, wird später unter dem Stichwort Diskrete Fouriertransformation behandelt.
2.1.7
Faltung von Funktionen und Fouriertransformation
Die Faltung von Funktionen ist ein kontinuierliches Analogon zur Polynommultiplikation, die ja auch oft so bezeichnet wird. Faltungsoperationen spielen eine herausragende
Rolle in Bereichen wie Nachrichtentechnik und Bildverarbeitung, wo Filterungsoperationen mittels Faltungen realisiert werden. Es ist von unschätzbarer Tragweite, dass man
solche aufwendigen Faltungs-Multiplikationen (im “Orts- oder Zeitbereich”, wie man
sagt) durch “punktweise” Multiplikationen im “Frequenzbereich” realisieren kann. Hier
ist das Szenario:
Ist a : R → C eine (hinreichend gutartige) Funktion, so kann man mittels Integration
eine weitere Funktion b
a : R → C definieren, die sog. Fourier-Transformierte von a:
Z ∞
F(a) = b
a : s 7→
a(x) e−2πisx dx
−∞
In gutartigen Fällen (die hier nicht weiter spezifiziert werden sollen) lässt sich diese
Abbildung umkehren:
Z ∞
−1
F (b
a) = a : x 7→
b
a(s) e2πisx ds.
−∞
18
Als Faltung von zwei Funktionen a, b : R → C bezeichnet man die Konstruktion einer
Funktion a ∗ b : R → C mittels
Z ∞
f (t) g(x − t) dt.
(a ∗ b) : x 7→
−∞
Das folgende Faltungstheorem ist der Dreh-und Angelpunkt aller Anwendungen der
Fourier-Transformation:
F(a ∗ b) = F(a) · F(b),
und somit auch
a ∗ b = F −1 (F(a) · F(b)).
Die Faltungsoperation (im “Ortsbereich”) wird mittels einer punktweisen Produktbildung (im “Frequenzbereich”) vermöge des folgenden Schemas realisiert:
F
a(x), b(x) −−−−→ b
a(s), bb(s)



·
∗y
y
−1
2.2
2.2.1
F
(a ∗ b)(x) ←−−−− b
a(s) · bb(s)
Multiplikation im weiteren Sinne (I): Mengen, Wörter und Sprachen
Mengen
Ist A irgendeine Menge, so sind die Operationen der Vereinigung, des Durchschnitts und
der symmetrischen Differenz assoziative Operation auf der Potenzmenge P(A). Man
hat also kommutative Monoide (P(A); ∪, ∅), (P(A); ∩, A) und (P(A); ∆, ∅). wie schon
erwähnt, ist (P(A); ∆, ∩, ∅, A) sogar ein Ring.
2.2.2
Wörter
Eine wichtige assoziative Operation ist die Konkatenation von Wörtern. Ist Σ ein endliches Alphabet, so bezeichnet Σ∗ die Menge der Wörter über diesem Alphabet. Koonkatenation ist dann einfach das “Hintereinanderschreiben” der Operanden. Meist wird
dafür garkein Operationszeichen verwendet. Soll die Konkatenation als Operation dennoch explizit angesprochen werden, so geschieht dies mit ·. Mit ε wird das leere Wort
bezeichnet, das neutrale Element bezüglich der Konkatenation. Man bezeichnet (Σ∗ ; ·, ε)
als das freie Monoid über dem Alphabet A. “Freiheit” bedeutet, anschaulich gesprochen,
dass ausser des Assoziativität “keine weiteren Gesetze gelten”. (Dafür gibt es auch eine
präzise algebraische Formulierung, die aber hier (noch) nicht interessiert.)
19
2.2.3
Sprachen
Teilmengen von Σ∗ , also Elemente der Potenzmenge P(Σ∗ ), bezeichnet man als (formale)
Sprachen. Die Operation der Konkatenation überträgt sich auf Sprachen: für K, L ⊆ Σ∗
ist
K · L = {u · v ; u ∈ K, v ∈ L}.
diese Operation ist auch wieder assoziativ und {ε} ist das neutrale Element. Auf diese
Weise wird (P(Σ∗ ), ·, {ε}) zum Monoid.
Teilmengen von Σ∗ sind unendliche Objekte und somit im allgemeinen nicht algorithmisch zu handhaben. Das geht nur für spezielle Klassen, also z.B: solche, die durch
Akzeptoren (Automaten eines gewissen Typs) oder Generatoren (Grammatiken eines
gewissen Typs) oder sonst effektiv beschrieben werden können. Die effektive oder gar
effiziente Realisierung von Operationen ist dann nicht immer offensichtlich, aber oft von
grossem praktischen Interesse – siehe das folgende Beispiel.
Beispiel 2. Die Menge der regulären Sprachen über einem Alphabet A ist bekanntlich
unter den booleschen Operationen ∪, ∩, c abgeschlossen. Das effektiv zu realisieren ist
aber nicht ganz offensichtlich: sind L1 , L2 ⊆ A∗ zwei reguläre Sprache, die durch Typ-3Grammatiken G1 bzw. G2 definiert sind, so ist nicht ganz klar, wie man aus diesen Daten
direkt (?) eine Typ-3-Grammatik für L1 ∩L2 erhält. Ein Umweg über endliche Automaten
hilft: man konstruiert vollständige und deterministische endliche Automaten A1 bzw. A2 ,
die L1 bzw. L2 akzeptieren, und dann daraus den Produktautomaten A1 ×A2 , der L1 ∩L2
akzeptiert. Dann übersetzt man diesen Automaten wieder in eine Typ-3-Grammatik:
L1 = L(G1 ), L2 = L(G2 ) −−−−→ L1 = L(A1 ), L2 = L(A2 )




y
y
L1 ∩ L2 = L(G0 )
2.3
2.3.1
←−−−− L1 ∩ L2 = L(A1 ) × L(A2 )
Multiplikation im weiteren Sinne (II): Transformationen und Permutationen
Transformationen
Ist A eine Menge, so ist die Menge
T (A) = {f : A → A}
bezüglich der Komposition (Hintereinanderausführung) ◦ als Operation und der identischen Abbildung id als neutralem Element ein Monoid (T (A); ◦, id), kurz mit T (A)
bezeichnet
Beachte: ◦ ist nicht kommutativ!
20
Es wird vereinbart, dass
(f ◦ g)(a) = f (g(a))
gilt, d.h. die Hintereinanderausführung wird von rechts nach links gelesen.
Für die iterierte Hintereinanderausführung derselben Transformation wird geschrieben
f (n) = f ◦ f ◦ · · · ◦ f , also f (i+j) = f (i) ◦ f (j) .
|
{z
}
n Faktoren
Wenn keine Verwechlungen zu befürchten sind, wird auch einfach f n an Stelle von f (n)
geschrieben.
Notation: sind a, b ganze Zahlen, so ist [a, b] = {a, a + 1, a + 2, . . . , b} für a ≤ b das
Intervall der ganzen Zahlen zwischen a und b (einschliesslich). Für a > b ist dies die
leere Menge.
Ist A eine total geordnete, endliche Menge, etwa A = [1, 2] = {1, 2, . . . , n}, so kann ein
f ∈ T (A) in Listenform dargestellt werden:
f ↔ [f (1), f (2), . . . , f (n)].
Offensichtlich ist in diesem endlichen Fall mit ]A = n für die Mächtigkeit
]T (A) = nn .
Beispiel 3. Transformationen in Listendarstellung
(Hier und in den folgenden Beispielen ist A = [1, 6] = {1, 2, 3, 4, 5, 6} die Grundmenge).
f
g
f ◦g
g◦f
f2
f3
f4
f5
g2
g3
2.3.2
:
:
:
:
:
:
:
:
:
:
[4, 6, 1, 3, 4, 6]
[2, 3, 3, 1, 2, 3]
[6, 1, 1, 4, 6, 1]
[1, 3, 2, 3, 1, 3]
[3, 6, 4, 1, 3, 6]
[1, 6, 3, 4, 1, 6]
[4, 6, 1, 3, 4, 6]
[3, 6, 4, 1, 3, 6] = f 2
[3, 3, 3, 2, 3, 3]
[3, 3, 3, 3, 3, 3]
Bäume
A sei eine endliche Menge. Eine Transformation f ∈ T (A) ist baumartig, kurz: ein Baum,
wenn es ein m ∈ N gibt, für das f m eine konstante Abbildung ist, d.h. es gibt ein r ∈ A
mit f m (a) = r für alle a ∈ A. Das Element r wird dann als die Wurzel (root) des Baumes
f bezeichnet.
21
Beispiel 4. Im Beispiel zum vorigen Absatz ist f ist Baum, g ist ein Baum.
Die Anzahl der Bäume auf einer n-elementigen Menge ist nn−1 .
Bemerkung 1. Nach dieser Terminologie sind Bäume gerichtete Graphen (Kanten zur
wurzel hin gerichtet). Betrachtet man (wie in der Graphentheorie üblich), Bäume als
zusammenhängende und kreisfreie ungerichtete Graphen und zeichnet keinen Knoten
als Wurzel aus, so gibt es auf einer n-Menge genau nn−2 Bäume dieser Art (Formel von
Cayley).
2.3.3
Permutationen
Die Menge
S(A) = {f ∈ T (A); f bijektiv}
der Permutationen von A ist bezüglich ◦ und id sogar eine Gruppe, die symmetrische
Gruppe von A. Im endlichen Fall, ]A = n, gilt bekanntlich
]S(A) = n!
und die Elemente s ∈ S(A) können in wie oben Listenform geschrieben werden
s ↔ [s(1), s(2), . . . , s(n)],
wobei die s(i) paarweise verschieden sind.
2.3.4
Zyklische Permutationen
Spezielle Permutationen sind die Zyklen oder zyklischen Permutationen:
Ist a1 , a2 , . . . , ak mit k ≥ 2 eine Folge von paarweise verschiedenen Elementen aus A, so
ist c = (a1 , a2 , . . . , ak ) die durch
(
ai 7→ ai+1 mod k für 1 ≤ i ≤ k
c:
a 7→ a
falls a ∈
/ {a1 , a2 , . . . , ak }
bestimmte Permutation von A, ein Zyklus der Länge k und mit der Trägermenge |c| =
{a1 , a2 , . . . , ak }.
Offensichtlich definiert die Folge a2 , a3 , . . . , ak , a1 die gleiche zyklische Permutation wie
die Folge a1 , a2 , . . . , ak . Oft ist es zweckmässig, unter den k verschiedenen Folgen, die eine
zyklische Permutation der Länge k definieren, diejenige als Repräsentanten auszuwählen,
für die a1 maximal ist (bezüglich einer totalen Ordnung auf A), d.h.
a1 = max ai = max |c|.
1≤i≤k
22
Bemerkung 2.
– Auf einer k-elementigen Trägermenge gibt es genau (k − 1)! verschiedene zyklische Permutationen.
– Sind c1 , c2 zyklische Permutationen mit disjunktem Träger, d.h. |c1 | ∩ |c2 | = ∅, so
kommutieren sie als Permutationen:
c1 ◦ c2 = c2 ◦ c1 .
– Ist c = (a1 , a2 , . . . , ak ) ein Zyklus der Länge k, so ist der k-Zyklus
c−1 = (ak , ak−1 , . . . , a1 )
die dazu inverse Permutation.
– Ist m ∈ N und d = ggT(m, k), so ist cm das Produkt von d disjunkten Zyklen der
Länge k/d: (Indices immer modulo k genommen)
cm = (a1 , a1+m , a1+2m , . . .)(a2 , a2+m , a2+2m , . . .) · · · (ad , ad+m , ad+2m , . . .)
Insbesondere gilt c(m) = id ⇔ k | m.
Beispiel 5. Potenzen eines Zyklus
Die in Listendarstellung als [2, 6, 4, 1, 3, 5] gegebene Permutation c ist eine zyklische
Permutation.
c = (6, 5, 3, 4, 1, 2)
c2 = (6, 3, 1)(5, 4, 2)
c3 = (6, 4)(5, 1)(3, 2)
c4 = (6, 1, 3)(5, 2, 4)
c5 = (6, 2, 1, 4, 3, 5) = c−1
c6 = (6)(5)(4)(3)(2)(1) = c0
2.3.5
Darstellungen von Permutationen als Produkte
Satz 1. Jede Permutation s ∈ S(A) lässt sich als Produkt von disjunkten Zyklen schreiben, d.h.
s = c1 ◦ c2 ◦ · · · ◦ cr , mit |ci | ∩ |cj | = ∅ (i 6= j)
und zwar eindeutig, wenn man max |c1 | < | max c2 | < . . . < max |cr | fordert.
Das Inverse von s = c1 ◦ c2 ◦ · · · ◦ cr ist natürlich
−1
−1
−1
−1
−1
s−1 = (c1 ◦ c2 ◦ · · · ◦ cr )−1 = c−1
r ◦ cr−1 ◦ . . . ◦ c1 = c1 ◦ c2 ◦ . . . ◦ cr
(Kommutierende Faktoren wegen Disjunktheit!)
Ein Zyklus c = (a, b) der Länge 2 wird auch als Transposition bezeichnet.
23
Beispiel 6. Permutationen in Listen- und Zyklendarstellung
s
s0
s ◦ s0
s0 ◦ s
:
:
:
:
[4, 6, 1, 3, 5, 2]
[6, 4, 3, 2, 5, 1]
[2, 3, 1, 6, 5, 4]
[2, 1, 6, 3, 5, 4]
:
:
:
:
(4, 3, 1)(5)(6, 2)
(3)(4, 2)(5)(6, 1)
(3, 1, 2)(5)(6, 4)
(2, 1)(5)(6, 4, 3)
:
:
:
:
cyc(s) = 3
cyc(s0 ) = 4
cyc(s ◦ s0 ) = 3
cyc(s ◦ s0 ) = 3
Jeder Zyklus c = (a1 , a2 , . . . , ak ) der Länge k lässt sich als Produkt von k − 1 (aber nicht
weniger!) Transpositionen (dann natürlich nicht disjunkten!) schreiben, z.B.:
(a1 , a2 , . . . , ak ) = (a1 , ak ) ◦ (a1 , ak−1 ) ◦ . . . ◦ (a1 , a3 ) ◦ (a1 , a2 )
(Dies ist nur eine von vielen Möglichkeiten). Daher gilt:
Satz 2. Jede Permutation lässt sich als Produkt von Transpositionen schreiben:
s = t1 ◦ t2 ◦ · · · ◦ tp .
(Dafür gibt es viele verschiedene Möglichkeiten). Die (exakte !) minimale Anzahl der
Faktoren ist dabei n − cyc(s), wobei cyc(s) die Anzahl der Zyklen von s (inklusive der
Fixpunkte als Zyklen der Länge 1) ist.
Beispiel 7. Permutationen als Produkte von Transpositionen
s
s0
u = s ◦ s0
v = s0 ◦ s
:
:
:
:
[4, 6, 1, 3, 5, 2]
[6, 4, 3, 2, 5, 1]
[2, 3, 1, 6, 5, 4]
[2, 1, 6, 3, 5, 4]
: (4, 1)(4, 3)(6, 2)
:
(4, 2)(6, 1)
: (3, 2)(3, 1)(6, 4)
: (2, 1)(6, 3)(6, 4)
Ist A = [1, n] = {1, 2, . . . , n], so bezeichnet man die speziellen Transpositionen τj =
(j, j + 1) als Transpositionen benachbarter Elemente. Jede Transposition t = (j, k) mit
j < k lässt sich als Produkt von τi ’s schreiben:
(j, k) = τj ◦ τj+1 ◦ · · · ◦ τk−2 ◦ τk−1 ◦ τk−2 ◦ · · · ◦ τj+1 ◦ τj .
Für die τj untereinander gelten folgende Beziehungen, die sog. Coxeter-Relationen
(1) τj ◦ τj = id
d.h. τj2 = id
1≤j<n
(2) τj ◦ τk = τk ◦ τj
d.h. (τj ◦ τk )2 = id
|j − k| ≥ 2
3
(3) τj ◦ τj+1 ◦ τj = τj+1 ◦ τj ◦ τj+1 d.h. (τj ◦ τj+1 ) = id 1 ≤ j < n
Satz 3. Jede Permutation s ∈ Sn = S([1, n]) lässt sich als Produkt von Transpositionen
benachbarter Elemente schreiben: s = τi1 ◦ τi2 ◦ · · · ◦ τik .
Die (exakte!) minimale Anzahl der Faktoren ist dabei gleich der Anzahl inv(s) der Inversionen von s (siehe weiter unten).
Zwei Produkte τi1 ◦τi2 ◦· · ·◦τik und τj1 ◦τj2 ◦· · ·◦τj` stellen genau dann die gleiche Permutation dar, wenn sie sich durch Anwendung der Regeln (1),(2),(3) ineinander überführen
lassen.
24
Beispiel 8. Permutationen als Produkte von Transpositionen benachbarter Elemente
u = (32)(31)(64) = (23)(12)(23)(12)(45)(56)(45)
= (12)(23)(12)(12)(45)(56)(45) = (12)(23)(45)(56)(45)
v
2.3.6
= (21)(63)(64) = (12)(34)(45)(56)(45)(34)(45)(56)(45)
= (12)(34)(56)(45)(56)(34)(56)(45)(56) = (12)(34)(56)(45)(56)(56)(34)(45)(56)
= (12)(34)(56)(45)(34)(45)(56) = (12)(56)(34)(45)(34)(45)(56)
= (12)(56)(45)(34)(45)(45)(56) = (12)(56)(45)(34)(56)
Gerade und ungerade Permutationen
Satz 4. Folgende Eigenschaften sind für eine Permutation s ∈ S(A) äquivalent:
1. Bei der Darstellung s = c1 ◦ c2 ◦ · · · ◦ cr als Produkt elementfremder Zyklen ist die
Anzahl der Faktoren mit gerader Länge gerade.
2. Jede Darstellung von s als Produkt von Transpositionen s = t1 ◦ t2 ◦ · · · ◦ tp hat
eine gerade Anzahl p von Faktoren.
3. Die Anzahle der Inversionen (siehe folgenden Abschnitt) von s ist gerade.
Permutationen mit den beschriebenen Eigenschaften nennt man gerade Permutationen,
die anderen ungerade Permutationen. Das Signum einer Permutation s ist
(
+1 falls s gerade ist,
sign(s) =
−1 falls s ungerade ist.
Es ist also (mit n = ]A)
sign(s) = (−1)n−cyc(s) = (−1)trans(s) = (−1)inv(s) ,
wobei cyc(s) die Anzahl der Zyklen (inklusive Fixpunkte!) von s bezeichnet, trans(s)
die Anzahl der Transpositionen in (irgendeiner) Darstellung von s als Produkt von Transpositionen, sowie inv(s) die Anzahl der Inversionen von s.
Es sei an die Definition der Determinanten für Matrizen erinnert, bei der das Signum
eine ganz wesentliche Rolle spielt:
X
det [ai,j ]1≤i,j≤n =
sign(s) a1,s(1) a2,s(2) · · · an,s(n)
s∈Sn
Bemerkung 3. Um die Bedeutung des Signums zu illustrieren: die Grösse
X
per [ai,j ]1≤i,j≤n =
a1,s(1) a2,s(2) · · · an,s(n)
s∈Sn
bezeichnet man als die Permanente der Matrix [ai,j ]1≤i,j≤n – sie unterscheidet sich von
der Determinanten “nur” durch das Fehlen des Signums. Festzuhalten ist:
25
1. Während man Determinanten effizient berechnen kann, mit O(n3 ) Operationen im
Koeffizientenbereich, wenn man beispielsweise Gauss-Elimination verwendet, ist
für die Berechnung von Permanenten bis heute kein effizientes Verfahren bekannt!
2. Schlimmer noch: die Berechnung von Permanenten ist schwierigestes (d.h. vollständiges) Problem in der Komplexitätsklasse ]P, in der die Zählprobleme von NPProblemen zusammengefasst werden.
Bemerkung 4.
– Das Produkt s1 ◦s2 zweier Permutationen ist genau dann eine gerade
Permutation, wenn beide Faktoren gerade oder beide Faktoren ungerade sind:
sign(s1 ◦ s2 ) = sign(s1 ) · sign(s2 ).
– Die Inverse eine geraden Permutation ist ebenfalls eine gerade Permutation.
– Es gibt auf einer Menge A mit ]A = n > 1 genausoviele gerade wie ungerade
Permutationen, nämlich n!/2.
– Die geraden Permutationen einer n-elementigen Menge bilden für sich eine Gruppe,
genannt die alternierende Gruppe und mit An bezeichnet.
2.3.7
Inversionen
Ist ` = (`1 , `2 , . . . , `n ) eine Liste von natürlichen Zahlen (oder von Elementen irgendeiner
totalgeordneten Menge), so heisst jedes Indexpaar (j, k) mit 1 ≤ j < k ≤ n eine Inversion
von `, falls `j > `k .
Inversionen spielen eine wichtige Rolle beim Studium von Sortieralgorithmen!
Bemerkung 5.
– Die Anzahl der Inversionen inv(s) einer Permutation s ∈ S(A) in
Listendarstellung ist die minimale Anzahl von Faktoren, die man zur Darstellung
von s als Produkt von Transpositionen benötigt.
– Eine Permutation ist genau dann gerade, wenn die Anzahl der Inversionen in ihrer
Listendarstellung gerade ist.
Ist ` = (`1 , `2 , . . . , `n ) eine Liste von natürlichen Zahlen, so bezeichnet
ivec(`) = (i1 , i2 , . . . , in ), wobei ik = ]{1 ≤ j < k ; `j > `k }
den Inversionsvektor von `. Offenbar ist 0 ≤ ik < k, d.h. ik ∈ [0, k−1] (1 ≤ k ≤ n).
Satz 5. Permutationen sind durch ihre Inversionsvektoren eindeutig bestimmt. Die Abbildung
ivec : S(A) → [0, 0] × [0, 1] × [0, 2] × · · · × [0, n − 1] : s 7→ ivec(s)
ist eine Bijektion.
26
Beispiel 9. Inversionsvektoren und Anzahl der Inversionen
s
s0
u = s ◦ s0
v = s0 ◦ s
2.4
:
:
:
:
[4, 6, 1, 3, 5, 2]
[6, 4, 3, 2, 5, 1]
[2, 3, 1, 6, 5, 4]
[2, 1, 6, 3, 5, 4]
:
:
:
:
ivec(s) = [0, 0, 2, 2, 1, 4]
ivec(s0 ) = [0, 1, 2, 3, 1, 5]
ivec(u) = [0, 0, 2, 0, 1, 2]
ivec(v) = [0, 1, 0, 1, 1, 2]
:
:
:
:
inv(s) = 9
inv(s0 ) = 12
inv(u) = 5
inv(v) = 5
Multiplikation im weiteren Sinne (III): Gruppen
Der Begriff der Gruppe stellt eines der wichtigsten Konzepte der Mathematik überhaupt
dar. Obwohl er in der koonkreten Form der Transformationsgruppen geometrische Objekte implizit schon eine längere Tradition hat, taucht der abstrakte Begriff im Gefolge
der bahnbrechenden Arbeit von Evariste Galois (1830) über die Lösbarkeit von algebraischen Gleichungen durch Radikale (hier bestimmen Permutationen der Wurzels das
Geschehen) auf. Das wurde nicht gleich verstanden und wird erst durch die Bemühungen von Mathematikern wie Camille Jordan, Felix Klein und Sophus Lie ins
allgemeine Bewusstsein gerufen. Erst gegen Ende des 19. Jh. hat sich der abstrakte
Gruppenbegriff durchgesetzt.
Gruppen und ihre Theorie kann man nur verstehen wenn man genügend viele konkrete
Gruppen kennt. Beispiele findet man vor allem von dreierlei Art:
• Permutationsgruppen – das sind Gruppen von Transformationen geometrischer
oder anderer Objekte; in den Beispielen des vorigen Abschnitts wurden ganz einfach die Permutationen einer Punktmenge betrachtet. Weiter unten wird an Beispielen gezeigt, wie man manche Gruppen auch als Transfromationsgruppen geometrischer Objekte erhalten kann.
• Erzeuger und Relationen – dafür ist ein Beispiel die Betrachtung der symmetrischen Gruppe Sn als Erzeugnis der Produktbildung von Transpositionen benachbarter Elemente, wobei die Coxeter-Relationen die “Rechenregeln” definieren;
• Matrizengruppen – das sind Untergruppen von Matrizengruppen, also der Gruppe
der invertierbaren Matrizen aus Mn (R).
27
Darstellungen von Permutationen am Beispiel von S4 = S([1, 4])
Kommentar zur Tabelle:
• Die erste Spalte enthält alle 4! = 24 Vektoren i = i1 i2 i3 i4 ∈ [0, 0] × [0, 1] × [0, 2] ×
[0, 3] in lexicografischer Ordnung, von rechts her gelesen.
• In der zweiten Spalte steht die natürliche Zahl, deren faktorielle Darstellung der
Vektor i ist, d.h. (i)! = i1 0! + i2 1! + i3 2! + i4 3!.
• Die dritte Spalte enthält in Listendarstellung diejenige Permutation s ∈ S([1, 4]),
deren Inversionsvektor der Vektor i ist, d.h. s = ivect(i).
• Die vierte Spalte gibt die Darstellung von s = ivect(i) als Produkt s = c1 ◦ c2 ◦ · · ·
von disjunkten Zyklen (in Standardform, ohne Fixpunkte).
• Die fünfte Spalte gibt die Darstellung von s = ivect(i) als Produkt s = c01 ◦ c02 ◦ · · ·
von disjunkten Zyklen (in Standardform, mit Fixpunkten).
• In der fünften Spalte wird s = ivect(i) als Produkt von Transpositionen dargestellt, d.h. s = t1 ◦ t2 ◦ · · · , wobei die Anzahl der Faktoren minimal ist.
• In der sechsten Spalte wird s = ivect(i) als Produkt von Transpositionen benachbarter Elemente dargestellt, wobei die Anzahl der Faktoren minimal ist.
• In der siebten Spalte wird diejenige Permutation s0 in Listenform dargestellt, die als
Produkt von genesteten Zyklen die Exponenten i hat, d.h. s0 = (12)i2 (123)i3 (1234)i4 .
Beachte:
s ist eine gerade Permutation von[1, n]
⇔
i1 + i2 + i3 + · · · + in gerade
⇔
n − Anzahl der Faktoren c0i ist gerade
⇔
⇔
⇔
28
Anz. der ci gerader Länge ist gerade
Anzahl der ti ist gerade
Anzahl der t0i ist gerade
Das Permutoeder von S4 als Graph bzw. konvexes Polyeder im R3
Das Permutoeder besitzt 24 Knoten, 36 Kanten, 14 Flächen (6 Vierecke und 8
Sechsecke) – man verifiziert Eulers Polyederformel
]Knoten − ]Kanten + ]Flächen = 24 − 36 + 14 = 2
29
30
(i)! =
i2 1! + i3 2! + i4 3!
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
i = i1 i2 i3 i4
0000
0100
0010
0110
0020
0120
0001
0101
0011
0111
0021
0121
0002
0102
0012
0112
0022
0122
0003
0103
0013
0113
0023
0123
1234
2134
1324
3124
2314
3214
1243
2143
1423
4123
2413
4213
1342
3142
1432
4132
3412
4312
2341
3241
2431
4231
3421
4321
s=
ivec−1 (i)
()
(21)
(32)
(321)
(312)
(31)
(43)
(21)(43)
(432)
(4321)
(4312)
(431)
(423)
(4213)
(42)
(421)
(31)(42)
(4231)
(4123)
(413)
(412)
(41)
(4132)
(32)(41)
s=
c1 ◦ c2 ◦ · · ·
(1)(2)(3)(4)
(21)(3)(4)
(1)(32)(4)
(321)(4)
(312)(4)
(2)(31)(4)
(1)(2)(43)
(21)(43)
(1)(432)
(4321)
(4312)
(2)(431)
(1)(423)
(4213)
(1)(3)(42)
(3)(421)
(31)(42)
(4231)
(4123)
(2)(413)
(3)(412)
(2)(3)(41)
(4132)
(32)(41)
s=
c01 ◦ c02 ◦ · · ·
s=
t01 ◦ t02 ◦ · · ·
()
()
(21)
(12)
(32)
(23)
(31)(32)
(23)(12)
(32)(31)
(12)(23)
(31)
(12)(23)(12)
(43)
(34)
(21)(43)
(12)(34)
(42)(43)
(34)(23)
(41)(42)(43)
(12)(23)(34)
(42)(41)(43)
(12)(34)(23)
(41)(43)
(24)(23)(12)(23)
(43)(42)
(23)(34)
(43)(41)(42)
(23)(34)(12)
(42)
(23)(34)(23)
(41)(42)
(34)(23)(34)(12)
(31)(42)
(23)(12)(34)(23)
(41)(43)(42)
(23)(34)(23)(12)(23)
(43)(42)(41)
(12)(23)(34)
(43)(41)
(23)(12)(23)(34)
(42)(41)
(12)(34)(23)(34)
(41)
(12)(34)(23)(12)(34)
(42)(43)(41)
(23)(12)(23)(34)(23)
(32)(41)
(23)(12)(23)(34)(23)(12)
s=
t1 ◦ t2 ◦ · · ·
1234
2134
2314
1324
3124
3214
2341
1342
3142
3241
1243
2143
3412
3421
1423
2413
2431
1432
4123
4213
4231
4132
4312
4321
(12)i2 (123)i3 (1234)i4
Das Permutoeder von S4
3142
3124
3412
1342
1324
3214
3421
1432
4312
3241
1234
4321
2314
1423
2134
2341
1243
4123
4231
2143
2431
4213
2413
3142
3124
3412
1342
1324
3214
3421
1432
4312
3241
4132
1234
4321
2314
1423
2134
2341
1243
4123
4231
2143
2431
4213
2413
• Rote Kanten: Vertauschen der beiden ersten Komponenten (= Mult. mit (12) von
rechts)
• Grüne Kanten: Vertauschen der beiden mittleren Komponenten (= Mult. mit (23)
von rechts)
• Blaue Kanten: Vertauchen der beiden letzten Komponenten (= Mult. mit (34) von
rechts)
31
2.5
Grundsätzliche Fragestellungen
• Wie realisiert man die Multiplikation algorithmisch?
• Was sind die Kosten des Multiplizierens - in Abhngigkeit von Darstellungen der
Operanden und der verwendeten Algorithmen? (obere Schranken)
• Ist es sinnvoll (im Sinn der Effizienz), die Art der Darstellung zu ndern (Domaintransformation)?
• Gibt es prinzipielle untere Schranken für den Aufwand der Multiplikation?
• Wie realisiert man und welchen Aufwand verursacht die Division? (=Berechnung
von Inversen)
• Wie realisiert man und welchen Aufwand verursacht die Umkehroperation: Faktorisierung (→ Kryptografie, Quantencomputing)
32
3
Assoziative Operationen und binäre Bäume
3.1
Binäre Bäume
Definition 3. Die Menge B der Binärbäume ist durch die rekursive Strukturgleichung
definiert, d.h. ein Binärbaum t ist
B = {} + B × B
– entweder der Baum, der nur aus dem Blatt (äusserer Knoten) besteht und keine
inneren Knoten hat, also t = ,
– oder ein Paar (t` , tr ) von Binärbäumen, genannter linker (t` ) und rechter (tr ) Teilbaum von t; kurz t = (t` , tr )
Anschaulich stellt man sich (t` , tr ) als einen Baum vor, der aus einer Wurzel (innerer
Knoten) besteht, an den die beiden Teilbäume t` und tr (in dieser Reihenfolge) angehängt
sind. Daher gilt:
– Die inneren Knoten von t = (t` , tr ) sind die inneren Knoten von t` , die von tr ,
sowie die neue Wurzel
– Die äusseren Knoten (Blätter) von t = (t` , tr ) sind die äusseren Knoten von t` und
die von tr .
Es ist klar, dass ein Binärbaum mit n inneren Knoten genau n + 1 äussere Knoten
hat.
Hinweis: siehe Folien für Beispiele
Definition 4. Für n ≥ 0 wird mit Bn die Menge der Binärbäume mit n inneren Knoten
notiert. bn = ]Bn ist die n-te Catalan-Zahl (auch Euler-Segner-Zahl).
Die Folge (bn )n≥0 = (1, 1, 2, 5, 14, 42, 132, . . .) wächst sehr rasch! Die Anzahlen bn lassen sich rekursiv berechnen, indem man die Strukturgleichung in eine Anzahlgleichung
übersetzt. Es gilt
B0 = {}
Bn+1 = B0 × Bn + B1 × Bn−1 + B2 × Bn−2 + · · · + Bn × B0 =
und das überträgt sich zu
b0 = 1
bn+1 = b0 · bn + b1 · bn+1 + · · · + bn · b0 . =
X
i+j=n
X
i+j=n
Bi × B j
bi · bj
Man kann das Wachstum von (bn )n≥0 sehr präzise angeben. Zunächst gilt exakt:
33
Satz 6.
1
2n
(2n)!
bn =
=
.
n+1 n
(n + 1)! n!
Der Beweis wird weiter unten nachgeholt. Mit Hilfe der Stirling-Formel
n n √
n! ∼
2πn
e
ergibt sich damit
4n
bn ∼ √
,
π n3
also ein exponentielles Wachstum!
WARNUNG!
Beim Programmieren sind Anweisungen der Art
forall b ∈ Bn do . . .
keinesfalls effizient zu handhaben und unbedingt zu vermeiden!
Der Umgang mit Binärbäumen wird erleichtert, wenn man sie sich in linearer Codierung
vornimmt. Das Alphabet, über dem codiert wird, ist B = {0, 1, }.
Definition 5. Die lineare Codierung von Binärbäumen ist die durch
(
7→ 1
code :
(t` , tr ) 7→ 0 · code(t` ) · code(tr )
definierte (injektive) Abbildung von B in B∗ .
Das entspricht der preorder -Traversierung von Binärbäumen, alias polnische Notation.
Innere Knoten werden durch “0” codiert, äussere durch “1”.
Hinweis: siehe Folien für Beispiele
Die formale Sprache L = code(B) (“L” steht hier für Lukasiewicz, polnischer Logiker)
kann folgendermassen charakterisiert werden. Dabei wird für ein Wort w ∈ B∗ mit |w|0
bzw. |w|1 die Anzahl der Vorkommen von 0 bzw. 1 in w notiert, sowie mit δ(w) =
|w|0 − |w|1 der Überschuss der Nullen über die Einsen.
Satz 7. Für w ∈ B∗ gilt
(
δ(w) = −1
∧
w ∈ L ⇐⇒
w = u · v, v 6= ⇒ δ(u) ≥ 0
Offensichtlich hat jedes Wort w ∈ L mit einer 1 ungerade Länge 2n+1 = Gesamtzahl der
Knoten des codierten Binärbaumes, d.h. w = code(t), ud jedes Wort endet mit einer 1.
Streicht man diese obligatorische letzte 1, so erhält man die Dyck-Sprache D, d.h.
D = {w ∈ B∗ ; w · 1 ∈ L} .
34
Deren Charakterisierung ergibt sich unmittelbar aus derjenigen für L:
Satz 8. Für w ∈ B∗ gilt
w∈D
(
δ(w) = 0
w =u·v
⇐⇒
∧
⇒ δ(u) ≥ 0
D kennt man auch als die Sprache der korrekten Klammerungen. Da man mit D beliebig tiefe Schachtelungen von Klammern korrekt darstellen kann, kann diese Sprache
nicht von einiem endlichen Automaten akzeptiert werden. Andererseits ist es leicht, eine
kontextfreie Grammatik für L bzw. D anzugeben. Man beachte, dass im Bezug auf Kellerautomaten die Sprache D das zeitliche Verhalten der Grösse eines Stacks beschreibt.
Es gilt also:
Satz 9. L und D sind kontextfreie Sprachen, sind aber nicht regulär.
DIe Sprache L hat eine interessante, als Zykellemma bezeichnete Eigenschaft:
Lemma 10. Ist w ∈ B∗ und gilt δ(w) = −1, so gibt es genau eine Faktorisierung
w = u · v mit v · u ∈ L.
Wörter w mit der
Das hat eine interessante Konsequenz: in B2n+1 gibt es genau 2n+1
n
Eigenschaft δ(w) = −1. Unter den 2n + 1 Wörtern, die man aus einem solchen w durch
zyklische Permutation gewinnt, d.h. indem man w = u · v faktorisiert und daraus v · u
bildet, gehört genau eines zur Sprache L, daher ist
bn = ]Bn = ] L ∩ B
2n+1
1
2n + 1
1
2n
=
=
.
2n + 1
n
n+1 n
Damit ist die angekündigte Anzahlformel bewiesen.
Bemerkung 6. Man bezeichnet zwei Wörter w, w0 ∈ σ ∗ als konjugiert, wenn sie durch
zyklische Permutation ihrer Buchstaben auseinander hervorgehen, d.h. es gibt u, v ∈ Σ∗
mit w = u · v und w0 = v · u. Die Konjugiertheit ist eine Äquivalenzrelation auf Σ∗ , und
da konjugierte Wörter immer die gleiche Länge haben, auch eine Äquivalenzrelation auf
jedem Σn . Genauer noch: ist Σ = B = {0, 1} und bezeichnet man mit
Bnk = {w ∈ Bn ; |w|1 = k} = {w ∈ Bn ; δ(w) = n − 2k}
die Menge der Bitvektoren der Länge n und mit Hamming-Gewicht k, so ist die Konjugiertheit auch eine Äquivalenzrelation auf Bnk : zyklisches Permutieren der Buchstaben
ändert ja die Anzahl der 1en nicht. Was das Zykellemma also besagt, ist dies:
2n+1
B2n+1
n+1 zerfällt in n+1 /(2n + 1) Konjugations-Äquivalenzklassen der Grösse (2n + 1)
und in jeder Äquivalenzklasse befindet sich genau ein Element aus L.
35
3.2
Binäre Operationen
Jetzt sei zunächst (A; ◦) eine Struktur der Signatur (2), d.h. eine Menge A mit einer
zweistelligen Operation ◦ : A × A → A. Für Binärbäume t ∈ Bn (n ≥ 0) wird eine mit
[t] bezeichnete Abbildung (n + 1)-stellige Abbildung [t] : An+1 → A induktiv definiert
gemäss:
Definition 6.
– Für t = ∈ B0 ist dies die identische Abbildung:
[] : A → A : a 7→ a
– Für t = (t` , tr ) ∈ Bi × Bj
[t] : An+2 → A : (a0 , . . . , ai+j ) 7→ [t` ](a0 , . . . , ai ) ◦ [tr ](ai+1 , . . . , ai+j+1 )
Das entspricht genau der Verwendung des Binärbaumes t als Syntaxbaum, bei dem die
inneren Knoten Operatorknoten für die Verknüpfung ◦ sind, die äusseren Knoten von
links nach rechts mit den Operanden a = 0, a1 , . . . , an beschriftet.
Wenn ◦ irgendeine zweistellige Operation ist, werden verschiedene Bäume (gleicher Knotenzahl) verschiedene Abbildungen definieren. Das Wesen der Assoziativität manifestiert
sich in folgender Aussage:
Theorem 11. Ist ◦ : A × A → A assoziativ, so definieren alle Binärbäume t ∈ Bn die
gleiche (n + 1)-stellige Abbildung t, d.h. [t] = [t0 ] für alle t, t0 ∈ Bn .
→
−
Beweis: Für n ≥ 1 bezeichne tn den Binärbaum mit
→
−
[ tn ](a0 , a1 , a2 , . . . , an−1 , an ) = (a0 ◦ (a1 ◦ (a2 ◦ · · · ◦ (an−1 ◦ an ))).
→
−
Es genügt zu zeigen, dass für alle t ∈ Bn die Gleichheit der Abbildungen [t] = [ tn ] gilt,
d.h.
→
−
∀(a0 , a1 , . . . , an ) ∈ An+1 : [t](a0 , a1 , . . . , an ) = [ tn ](a0 , a1 , . . . , an ).
Für n = 0 und n = 1 ist natürlich nichts zu zeigen.
Als Induktionsannahme sei die Behauptung bereits gezeigt für alle Binärbäume aus Bk
mit k ≤ n. Für den Induktionsschluss sei nun t = (t` , tr ) ∈ Bn+1 . Dabei sei t` ∈ Bm .
Zwei Fälle sind zu unterscheiden:
– m = 0, d.h. t` = .
In diesem Fall ist tr ∈ Bn und es gilt daher
[t](a0 , a1 , . . . , an+1 ) = [](a0 ) ◦ [t0 ](a1 , . . . , an+1 )
→
−
= a0 ◦ [ tn ](a1 , a2 , . . . , an+1 )
= a0 ◦ (a1 ◦ (a2 ◦ . . . ◦ an+1 ))
−−→
= [tn+1 ](a0 , a1 , a2 , . . . , an+1 )
36
– m > 0, also t` = (t0 , t00 ) ∈ Bi × Bj und tr ∈ Bk mit i + j + k + 2 = n + 1.
Dann sei
(a0 , a1 , . . . , an+1 ) = a0 , . . . , ai , ai+1 , . . . , ai+j+1 , ai+j+2 , . . . , an+1 .
| {z } |
{z
} |
{z
}
α
β
γ
Es gilt somit
[t](a0 , a1 , . . . , an+1 ) = [t0 ](α) ◦ [t00 ](β) ◦ [tr ](γ)
= [t0 ](α) ◦ [t00 ](β) ◦ [tr ](γ)
−−−−→
= [t0 ](α) ◦ [tj+k+2 ](β, γ)
−−→
= [tn+1 ](α, β, γ)
Man beachte: von der ersten zur zweiten Zeile benutzt man die Assoziativität von
◦; von der zweiten zur dritten Zeile die Induktionsannahme für Bj+k+2 , von der
dritten zur vierten Zeile eine Induktion innerhalb von Bn+1 über die Grösse des
linken Teilbaums. Die Induktionsverankerung ist dabei die erste Fall.
Wegen Theorem 11 kann man bei assoziativen Produkten mit mehreren Faktoren “die
Klammern weglassen”, ohne dass Mehrdeutigkeiten zu befürchten sind. Das sagt aber
nur die halbe Wahrheit: denn selbst wenn alle Bäume dieselbe Funktion berechnen,
muss dies nicht zu den gleichen Kosten geschehen! Folgendes Beispiel soll zur Warnung
dienen:
Beispiel 10. Multiplikationsketten von Matrizen
Die Multiplikation einer (a × b)-Matrix mit einer (b × c)-Matrix “kostet” bei konventioneller Ausführung der Multiplikation a · b · c Multiplikationen von Koeffizienten. Hat
man nun ein Produkt
M 1 · M2 · · · Mn
von Matrizen zu berechnen, wobei Mj eine (aj−1 × aj )-Matrix ist, so hat man bn−1 verschiedene Möglichkeiten, die auszuführen. Die können drastisch unterschiedlichen Aufwand haben. Ist z.B.
(a0 , a1 , a2 , . . . , a4 ) = (13, 5, 89, 3, 43)
so hat man für die fünf verschiedenen Möglichkeiten:
((M1 · M2 ) · M3 ) · M4
(M1 · (M2 · M3 )) · M4
(M1 · M2 ) · (M3 · M4 )
M1 · ((M2 · M3 ) · M4 )
M1 · (M2 · (M3 · M4 ))
: 13 · 5 · 89 + 13 · 89 · 3 + 13 · 3 · 43
:
5 · 89 · 3 + 13 · 5 · 3 + 13 · 3 · 43
: 13 · 5 · 89 + 89 · 3 · 43 + 13 · 89 · 43
:
5 · 89 · 3 + 5 · 3 · 43 + 13 · 5 · 43
: 89 · 3 · 43 + 5 · 89 · 43 + 13 · 5 · 43
= 10933
= 3207
= 67017
= 4775
= 33411
Damit stellt sich die Frage, wie man denn unter den bn -vielen verschiedenen Möglichkeiten zur Auswertung eines Syntaxbaumes mit n Operatoren diejenige mit minimalem
37
Aufwand findet. Das systematische Ausprobieren aller Möglichkeiten verbietet sich –
siehe die obige Warnung. Allerdings kann man sich mit einer Standardtechnik des algorithmischen Problemlösens behelfen: Dynamische Programmierung.
Betrachten wir als Menge A die Menge der Paare (a, b) von natürlichen (oder auch
positiven reellen) Zahlen, dazu ein “Nullelement” error. Als assoziative Verknüpfung
wird definiert
(
(a, d) falls b = c
(a, b) ∗ (c, d) =
error falls b 6= c
error ∗ (a, b) = (a, b) ∗ error = error
error ∗ error = error
Das definiert eine assoziative Operation. Aber nun geht es um die Kosten: Für die
Verknüpfung wird eine Kostenfunktion cost definiert:
cost((a, b), (b, c)) = a · b · c
In allen übrigen (für uns uninteressanten) Fällen seien die Kosten = ∞.
Die Kosten cost(t; a0 , . . . , an ) für die Auswertung eines (nichttrivialen) Produkts
(a0 , a1 ) ∗ (a1 , a2 ) ∗ (a2 , a3 ) ∗ · · · ∗ (an−1 , an ) ∗ (an , an+1 )
gemäss einem Binärbaum t ∈ Bn sind natürlich induktiv definiert:
cost(; (a0 , a1 )) = 0


cost(t` ; a0 , . . . , ai+1 )



+cost(t ; a , . . . , a
r i+1
i+j+2 )
cost((t` , tr ); a0 , a1 , . . . , ai+j+2 ) =
+ cost((a0 , ai+1 ), (ai+1 , ai+j+2 ))


{z
}

 |
falls t` ∈ Bi , tr ∈ Bj
=a0 ·ai+1 ·ai+j+2
Für ein Produkt aus n Faktoren
(a0 , a1 ) ∗ (a1 , a2 ) ∗ (a2 , a3 ) ∗ · · · ∗ (an−1 , an )
seien nun für Indexpaare (i, j) mit 1 ≤ i ≤ j ≤ n die Minimalkosten für die Berechnung
des Teilproduktes
(ai−1 , ai ) ∗ (ai , ai+1 ) ∗ · · · ∗ (aj−1 , aj )
definiert durch
mincosti,j = min{cost(t; ai−1 , ai , ai+1 , . . . , aj ) ; t ∈ Bj−i }.
Dann gilt (rekursiv zu lesen!)
(
0
mincosti,j =
mini≤k<j (mincosti,k + mincostk+1,j + ai−1 · ak · aj )
38
falls i = j
falls i < j
Nun ist die rekursive Auswertung dieser Beziehung genauso aufwendig wie das Erzeugen
und Durchprobieren aller Binärbäume! Man gewinnt aber etwas, wenn man stattdessen
die Werte mi,j = mincosti,j in “bottom-up”-Manier berechnet. Ein pseudocode könnte
etwa folgendermaßen aussehen:
dynprog := procedure(a)
for 1 ≤ i ≤ n do
mi,i ← 0
end for
for 2 ≤ ` ≤ n do
for 1 ≤ i ≤ n − ` + 1 do
j ←i+`−1
mi,j ← ∞
for i ≤ k < j do
q ← mi,k + mk+1,j + ai−1 · ak · aj
if q < mi,j then
mi,j ← q
si,j ← k
end if
end for
end for
end for
An der dreifachen Schachtelung der for-Schleifen erkennt man, dass dieser Algorithmus
einen Aufwand von O(n3 ) für Produkte von n Faktoren benötigt.
In einem Dreieckschema für die mi,j kann man sich das Produzieren der optimalen
Teillösungen veranschaulichen. m1,n enthält schliesslich die optimalen Kosten für das
gesamte Produkt. Ein analoges Schema für die Parameter si,j , das beimAlgorithmus
mitgeführt wird, erlaubt es, den optimalen Berechnungsbaum selbst abzulesen.
Im obigen Beispiel für die Multiplikation von 4 Matrizen sieht das Schema der Kosten
optimaler Teillösungen mi,j (1 ≤ i ≤ j ≤ 4) folgendermassen aus:
j=1
2
3
4 i=
0 5785 1530 3207
1
0 1335 1980
2
3
0 11481
0
4
39
Beispielsweise ist
m1,2 = 13 · 5 · 89 = 5785
m2,3 = 5 · 89 · 3 = 1335
m1,3 = min{m1,2 + m3,3 + 13 · 89 · 3, m1,1 + m2,3 + 13 · 5 · 3}
= min{9256, 1530} = 1530
Bemerkung 7. Die spezielle Kostenfunktion für das iterierte Multiplizieren von Matrizen
ist natürlich nur ein Fall, wo dieser Ansatz effizient ist. Allgemein kann man für beliebigen
Kostenfunktionen mit nichtnegativen Werten genauso vorgehen. Ist (A; ◦) eine Menge
mit assoziativer Operation ◦ und einer Kostenfunktion cmult : A × A → R≥0 , so sind
die Kosten cost(t; a0 , a1 , . . . , an ) für das Auswerten von a0 ◦ a1 ◦ . . . ◦ an mittels des
Syntaxbaumes t ∈ Bn rekursiv definiert durch
cost(; a0 ) = 0


cost(t` ; a0 , . . . , ai )
cost((t` , tr ); a0 , . . . , ai+j+1 ) = +cost(tr ; ai+1 , . . . , ai+j+1 )


+cmult((a0 ◦ · · · ◦ ai ), (ai+1 ◦ · ◦ ai+j+1 ))
falls t` ∈ Bi , tr ∈ Bj
Alle Überlegungen und der Algorithmus zur Berechnung des optimalen Syntaxbaumes
übertragen sich sinngemäss auf diese allgemeinere Situation.
Bemerkung 8. Warum funktioniert das? Dynamischen Programmieren funktioniert (wie
Greedy-Algorithmen), wenn sich optimale Lösungen eines Problems aus optimalen Lösungen von Teilproblemen zusammensetzen lassen. Das ist hier ganz offensichtlich der Fall.
Dynamisches Programmieren vermeidet zudem, dass optimale Teillösungen immer wieder berechnet werden. Andere Situationen dieser Art treten bei der Syntaxanalyse, Rucksackproblemen u.v.a.m. auf.
Interessant ist es natürlich, von vornherein zu wissen, unter welchen Umständen eine
solche Auswertung eines Produkts auch von den Kosten her unabhängig von der speziellen Wahl des Syntaxbaumes ist. Dazu sei cmult wieder eine Kostenfunktion zweier
Elemente, wie oben, und cost die entsprechende Kostenfunktion für Bäume und die
ihnen zugeordenten Funktionen. Dann gilt:
Lemma 12. Notwendig und hinreichend dafür, dass
∀n ∈ N ∀t, t0 ∈ Bn ∀(a0 , . . . , an ) ∈ An : cost(t; a0 , . . . , an ) = cost(t0 ; a0 , . . . , an )
gilt, ist die Gültigkeit diese Aussage für n = 2:
∀a, b, c ∈ A : cmult(a, b ◦ c) + cmult(b, c) = cmult(a ◦ b, c) + cmult(a, b)
Der Beweis verläuft ganz analog zu dem von Theorem 11 und wird hier nicht ausgeführt.
40
DIe Bedingung für die Situation n = 2 im Fall von Lemma 12 kann man noch suggestiver
so schreiben:
cmult(a, b ◦ c) − cmult(a, b) − cmult(a, c) = cmult(a ◦ b, c) − cmult(a, c) − cmult(b, c)
und daraus wird ersichtlich, dass dies etwas mit Distributivität von links und von rechts
zu tun hat.
Hier sind zwei wichtige Situationen, in denen dies zutrifft:
1. Die Elemente a ∈ A haben eine “Grösse” |a| und für die Verknüpfung ◦ gilt
– ∀a, b ∈ A : |a ◦ b| = |a| + |b|
– ∀a, b ∈ A : cmult(a, b) = |a| · |b|
Als unmittelbare Konsequenz hat man
cmult(a, b ◦ c) = |a| · |b ◦ c| = |a| · (|b| + |c|) = |a||b| + |a||c| = . . . cmult(a ◦ b, c)
und allgemein für alle t ∈ Bn und (a0 , a1 , . . . , an ) ∈ An+1 :
X
cost(t; a0 , a1 , . . . , an ) =
|ai ||aj |.
0≤i<j≤n
Das trifft beispielsweise zu für das sog. logarithmische Kostenmodell beim Multiplizieren ganzer Zahlen: die “Grösse” (auch “Länge”) genannt einer ganzen Zahl
ist die Anzahl der Ziffern in Basis-β-Darstellung, also (in etwa) |a| = dlogβ ae.
Das konventienelle Multiplikationsverfahren bei Multiplikation zweier Zahlen a, b
liefert a · b mit |a · b| = dlogβ ae + dlogβ be = |a| + |b| und hat einen Aufwand
dlogβ ae · dlogβ be = |a| · |b|.
Ganz entsprechend gilt eine solche Aussage für die konventionelle Multiplikation
von Polynomen, wobei der Grad eines Polynoms (im wesentlichen) die “Grösse”
und die Anzahl der Multiplikationen im Koeffizientenbereich als Kosten angesetzt
wird.
2. Wenn es eine Funktion d : A → R gibt mit
∀a, b ∈ A : cmult(a, b) = d(a ◦ b) − d(a) − d(b)
so ist offensichtlich
cmult(a, b◦c)+cmult(b, c) = d(a◦b◦c)−d(a)−d(b)−d(c) = cmult(a◦b, c)+cmult(a, b)
und allgemein für alle t ∈ Bn und (a0 , a1 , . . . , an ) ∈ An+1 :
cost(t; a0 , a1 , . . . , an ) = d(a0 ◦ a1 ◦ · · · ◦ an ) −
X
d(aj ).
0≤j≤n
Ein wichtiger (obgleich trivialer) Sonderfall ist der des uniformen Kostenmaßes:
alle a ∈ A haben die gleiche Grösse und es werden nur Multiplikationen gezählt:
∀a ∈ A : d(a) = −1, also ∀a, b : cmult(a, b) = 1.
41
3.3
Ein wichtiger Sonderfall: Exponentiation
3.3.1
Exponentiation durch Quadrieren und Multiplizieren
3.3.2
Schnelle Berechnung der Fibonacci-Zahlen
siehe separate Folien
42
Exponentiation
Problemstellung
I
Exponentiation: das Problem
I
I
Gegeben:
(multiplikative) Halbgruppe (H, ∗), Element a ∈ H, n ∈ N
Aufgabe: berechne das Element
a∗n = |a ∗ a ∗ a{z∗ · · · ∗ a} ∈ H
n
I
(schreiben ab jetzt an statt a∗n )
Hinweis: der wesentliche “Trick” funktioniert immer, wenn ∗
eine assoziative (aber nicht notwendig kommutative)
Operation ist — also nicht nur für Zahlen, sondern z.B. auch
für Polynome, Matrizen, Funktionen, . . .
Exponentiation
Banale Exponentiationsmethode
I
I
Banale Idee: iterierte Multiplikation
Algorithmus:
Require: a ∈ H, n ∈ N
Ensure: x = an
if n = 0 then
Return(e)
end if
x ←a
for i = 1 to n − 1 do
x ←x ∗a
end for
Return(x)
I
Dies erfordert n − 1 Multiplikationen in H.
Exponentiation
“Schnelle” Exponentiation: die Idee
Bessere Idee:
I
In jeder Halbgruppe (H, ∗) kann man zur Berechnung der
Exponentiation
H × N → H : (a, n) 7→ an
die Binärdarstellung des Exponenten n verwenden
I
Rekursive Struktur:
 n 2
 a2
2
an =
a ∗ a n−1
2
falls n gerade


falls n ungerade 
= an mod 2 · an÷2
2
→ “schnelle” oder “binäre” Exponentiation, Exponentiation
mittels “square-and-multiply”
I
Man kann die Binärdarstellung von n von links nach rechts
(LR) oder von rechts nach links (RL) abarbeiten
Exponentiation
Notation
Notation:
I
(n)2 : Binärdarstellung von n (ohne führende Nullen)
I
`(n) : Länge der Binärdarstellung von n = blog(n)c + 1
I
ν(n) = ]1 (n)2 : Anzahl der Einsen in (n)2
Rekursionen:
I
`(2n) = `(n) + 1
`(2n + 1) = `(n) + 1
`(1) = 1
I
ν(2n) = ν(n)
ν(2n + 1) = ν(n) + 1
ν(1) = 1
Exponentiation
“Schnelle” Exponentiation: LR-Beispiel
Beispiel n = 155 mit (155)2 = 10011011, `(155) = 8, ν(155) = 5
I
LR-Methode
(1)2
(2)2
(4)2
(9)2
(19)2
(38)2
(77)2
(155)2
=
=
=
=
=
=
=
=
1
10
100
1001
10011
100110
1001101
10011011
a1 = a
a2 = (a1 )2
a4 = (a2 )2
a9 = (a4 )2 ∗ a
a19 = (a9 )2 ∗ a
a38 = (a19 )2
a77 = (a38 )2 ∗ a
a155 = (a77 )2 ∗ a
erfordert 7 = `(155) − 1 Quadrierungen und 4 = ν(155) − 1
zusätzliche Multiplikationen, also insgesamt `(155) + ν(n) − 2
Multiplikationen
Exponentiation
“Schnelle” Exponentiation: RL-Beispiel
I
RL-Methode
(1)2
= 1
(3)2
= 11
(11)2
= 1011
(27)2
= 11011
(155)2 = 10011011
a1 = a
a2 = (a1 )2
a3 = a2 ∗ a
a4 = (a2 )2
a8 = (a4 )2
a11 = a8 ∗ a3
a16 = (a8 )2
a27 = a16 ∗ a11
a32 = (a16 )2
a64 = (a32 )2
a128 = (a64 )2
a155 = a128 ∗ a27
erfordert 7 = `(155) − 1 Quadrierungen und 4 = ν(155) − 1
zusätzliche Multiplikationen, also insgesamt `(155) + ν(n) − 2
Multiplikationen
Exponentiation
“Schnelle” Exponentiation: Aufwand
Aufwand:
I
M(n) : Anzahl der Multiplikationen (incl. Quadrierungen) in H zur
Berechung von an mittels LR- bzw. RL-Methode
I
Rekursion:
M(2n) = M(n) + 1
M(2n + 1) = M(n) + 2
I
Folgerung:
I
Beweis (Induktion)
M(1) = 0
M(n) = `(n) + ν(n) − 2
M(1) =0 =
1 + 1 − 2 = `(1) + ν(1) − 2
M(2n) =M(n)+1 = `(n)+ν(n)−1 = `(2n)+ν(2n)−2
M(2n+1) =M(n)+2 =
`(n)+ν(n) = `(2n+1)+ν(2n+1)−2
I
Also gilt insbesondere:
blog nc ≤ M(n) ≤ 2blog nc d.h. M(n) ∈ Θ(log n)
Exponentiation
“Schnelle” Exponentiation: Zitate aus TAOCP
Abbildung: Knuth, TAOCP vol.2, ch. 4.6.3 (LR-Methode)
Exponentiation
“Schnelle” Exponentiation: Zitate aus TAOCP
Abbildung: Knuth, TAOCP vol.2, ch. 4.6.3 (LR vs. RL)
Exponentiation
“Schnelle” Exponentiation: Zitate aus TAOCP
Abbildung: Knuth, TAOCP vol.2, ch. 4.6.3 (RL)
Exponentiation
“Schnelle” Exponentiation: Zitate aus TAOCP
Abbildung: Knuth, TAOCP vol.2, ch. 4.6.3 (RL)
Exponentiation
“Schnelle” Exponentiation: Zitate aus TAOCP
Abbildung: Knuth, TAOCP vol.2, ch. 4.6.3 (RL)
Exponentiation
“Schnelle” Exponentiation: iteratives Programm
Require: a ∈ H, n ∈ N
Ensure: x = an
x ←e
A←a
N←n
while N 6= 0 do
if N is even then
A←A∗A
N ← N/2
else {N is odd}
x ←x ∗A
N ←N −1
end if
end while
Return(x)
Exponentiation
“Schnelle” Exponentiation: rekursives Programm
I
Maple-Programm (rekursiv)
power := proc (a,n::nonnegint)
if n=0 then RETURN(1)
else t := power(a,iquo(n/2))^2;
if odd(e) then t := t*a fi;
RETURN(t)
fi;
end;
(Q)
(M)
Exponentiation
“Schnelle” Exponentiation: Anwendung
Zur Anwendung:
I
Knuth (TAOCP, vol2., ch. 4.6.3) diskutiert, wann man “binäre”
(“schnelle”) Exponentiation verwenden sollte und wann nicht!
I
Zitat: The point of these remarks is that binary methods are nice,
but not a panacea. They are most applicable when the time to
multiply x j · x k is essentially independent of j and k (for example,
when we are doing floting point multiplication, or multiplication
modulo m); in such cases the running time is reduced from order n
to order log n.
I
Vorsicht! wenn der Aufwand für die Multiplikation x j · x k
proportional zu j · k, als ist (Integer- und Polynommultiplikation!),
also quadratisch mit der Anzahl der Ziffern- bzw.
Koeffizientenoperationen wächst, kann der Aufwand für die
“banale” Methode von der gleichen Grössenordnung wir für die
“schnelle” Methode sein — oder sogar schlechter!
Exponentiation
“Schnelle” Exponentiation: Anwendung
I
Anwendungszenario: Exponentiation in Zm
(a, n, m) 7→ an mod m
I
I
Maple-Programm (rekursiv)
modpower := proc (a,n,m)
if n=0 then RETURN(1)
else t := modpower(a,iquo(n/2),m)^2; (Q)
if odd(n) then t := t*a mod m fi;
(M)
RETURN(t mod n)
fi;
end;
benötigt (etwa) log n-maliges Quadrieren und höchstens log n
weitere Multiplikationen von log m-bit Zahlen und log n
Reduktionen modulo m von 2 log m-bit-Zahlen,
also insgesamt
2
einen Aufwand O log n · (log m) gemessen in
bit-Operationen.
Exponentiation
“Schnelle” Exponentiation: Anwendung
I
Umkehrabbildung: diskreter Logarithmus
(a, an mod m, m) 7→ n
I
I
Hierfür ist bis heute kein effizienter Algorithmus bekannt!
Die besten bekannten Algorithmen haben gleiche Komplexität
wie die besten Algorithmen für die Faktorisierung von m
Zahlenbeispiel: a, n, m in der Grössenordnung 10200
I
I
schnelle Exponentiation erfordert etwa 3000 Multiplikationen
von 200-digit-Zahlen und 3000 Reduktionen modulo m von
400-digit-Zahlen
die Berechnung des diskreten Logarithmus “brute-force” würde
etwa 10200 Multiplikationen und Reduktionen modulo m
erfordern
Exponentiation
“Schnelle” Exponentiation: Anwendung
I
I
Anwendungsszenario: schnelle Berechung C-rekursiver Folgen
Kanonisches Beispiel: Fibonacci-Zahlen
I
Idee: mit F =
also
I
I
fn
fn−1
=
1 1
1 0
gilt
fn−1 + fn−2
fn−1
fn
fn−1
=F
=
n−2
1 1
fn−1
fn−1
=F
1 0
fn−2
fn−2
f2
n−2 1
=F
f1
1
Die Berechnung von fn mittels iteriertem Quadrieren der
Matrix F benötigt 13 · blog(n − 2)c + 12 · ν(n − 2) − 10
arithmetische Operationen (Additionen, Subtraktionen,
Multiplikationen, Divisionen durch 2 , siehe Heun, GA)
Dies kann noch etwas verbessert werden, wenn man ausnützt,
dass die Potenzen von F symmetrische Matrizen sind
Exponentiation
“Schnelle” Exponentiation: Anwendung
I
Gofer-Programm zur Berechnung der Fibonacci-Zahlen mittels
schneller Exponentiation von Matrizen (Heun, GA)
I
I
Siehe Materialien zur Vorlesung für Laufzeitanalysen und
gemessene Laufzeiten verschiedener Algorithmen zur
Berechnung von Fibonacci-Zahlen
Die Methode lässt sich generell für C-rekursive Folgen
anwenden und liefert Verfahren logarithmischer (in n)
Komplexität
Exponentiation
Additionsketten
Hinweis:
I Das Problem, an in einer Halbgruppe möglichst effizient zu
berechnen, hat etwas mit dem Problem der sog.
Additionsketten zu tun.
I Eine Additionskette für n ∈ N ist eine Folge
1 = a0 , a1 , a2 , . . . , ar = n
von ganzen Zahlen mit der Eigenschaft
ai = aj + ak wobei j ≤ k < i (1 ≤ i ≤ r )
(straight-line-Programm mit Addition als einziger Operation)
1
2
3
6
12
15
27
39
78
79
Exponentiation
Additionsketten
I
LR-Additionskette für n = 155
1
I
2
4
8
9
18
19
38
76
77
154
155
16
27
32
64
128
155
RL-Additionskette für n = 155
1
2
3
4
8
11
Exponentiation
Additionsketten
I
I
I
Das Problem, die Länge L(n) kürzester Additionsketten für
gegebenes n zu bestimmen, ist sehr schwierig!
LR- und RL-Additionsketten sind nicht immer optimal!
1
2
3
6
7
14
15
1
2
3
4
7
8
15
1
2
3
6
12
15
Berühmte Vermutung (Scholz, Brauer, 1937,1939):
L(2n − 1) ≤ n − 1 + L(n)
I
Mehr darüber in ch. 4.6.3 von TAOCP!
Rekursive Definition der Fibonacci-Zahlen
f0 = 0, f1 = 1, fn = fn−1 + fn−2 (n ≥ 2)
Erste Werte
n 0
1
2
3
4
5
6
7
8
9
10
...
25 . . .
0
1
1
2
3
5
8
13
21
34
55
...
75025 . . .
fn
Exakte Formel (de Moivre, 1718)

ϕ =
ϕn − ϕ̂n
√
fn =
mit
ϕ̂ =
5
√
1+ 5
2
√
1− 5
2
≈ 1.61803 . . . “goldener Schnitt”
≈ −0.61803 . . .
Bemerkung: der “goldene Schnitt” ϕ ist die positive Lösung der Gleichung:
x2 = 1 + x
ϕ̂ = 1 − ϕ ist die negative Lösung dieser Gleichung.
1
Die Folge (fn+1 /fn )n≥1 von Quotienten aufeinanderfolgender Fibonacci-Zahlen
konvergiert und es gilt
fn+1
lim
=ϕ
n→∞ fn
Abschätzung mittels goldenem Schnitt
ϕn−2 ≤ fn ≤ ϕn−1
Alternative Abschätzung (GA:Lemma 1.3)
2b
n−1
2 c
≤ fn ≤ 2n−2 (n > 2)
2
andere interessante Eigenschaften der Fibonacci-Zahlen
• ggT(fm , fn ) = fggT(m,n)
• fn+1 fn−1 − fn2 = (−1)n
• fn+m = fm fn+1 + fm−1 fn
• ϕn = fn+1 − ϕ̂ · fn , ϕn+1 = ϕ · fn+1 + fn
• ϕn + ϕ̂n = 2fn+1 − fn
3
Die Fibonacci-Zahlen treten in der Mathematik und Algorithmik (in der Kunst
und in der Natur...) an vielen verschiedenen Stellen auf. Wichtig ist der
Zusammenhang mit dem Algorithmus von Euklid.
Satz von Lamé (1844):
Sind m, n ∈ N mit m, n ≤ fk , so benötigt der Algorithmus von Euklid
zur Berechnung von ggT(m, n) maximal k + 1 Divisionsschritte.
Dieses Resultat kann man als die (vermutlich) historisch früheste quantitative
Analyse des Laufzeitverhaltens eines Algorithmus ansehen.
4
Rekursive Berechnung der Fibonacci-Zahlen (gofer)
fib1
fib1
fib1
fib1
:: Int -> Int
1 = 1
2 = 1
n = fib1 (n-1) + fib1 (n-2)
Crek (n) = Anzahl der arithmetischen Operationen (Additionen, Subtraktionen,
Mutliplikationen, Divisionen) zur Berechnung von fn mit dem Programm fib1
Crek (1)= Crek (2) = 0
Crek (n)= 3 + Crek (n − 1) + Crek (n − 2)
5
Tatsache (GA Lemma 1.1): Die Rekursion
D(1) = d
D(2) = d
D(n) = D(n − 1) + D(n − 2) (n ≥ 3)
hat die Lösung D(n) = d · fn (n ≥ 3).
Resultat (GA, Korollar 1.2):
Crek (n) = 3 (fn − 1)
Zahlenbeispiel (GA): n = 100 ⇒ Crek (n) ≈ 5 · 1014
6
(n ≥ 3)
Iterative Berechnung der Fibonacci-Zahlen (gofer)
Idee: Iteration der Beziehung (fn , fn−1 ) = (fn−1 + fn−2 , fn−1 )
fib2 n :: Int -> Int
fib2 n = x where (x,y) = g n
g
g
g
g
:: Int -> (Int,Int)
1 = (1,undefined)
2 = (1,1)
n = (x+y,x) where (x,y) = g (n-1)
Citer (n) = Anzahl der arithmetischen Operationen zur Berechnung von fn mit
dem Programm fib2
Citer (1)= Citer (2) = 0
Citer (n)= 2 + Citer (n − 1)
(n ≥ 3)
Lösung der Rekursion (GA, Lemma 1.4): Citer (n) = 2(n − 2) (n ≥ 2)
7
Schnelle Exponentiation - die Idee:
um für eine Zahl a = 3 und einen Exponenten n = 155 die Potenz 3155 zu
berechnen, kann man
• 154 Multiplikationen mit dem Faktor 3 ausführen, oder
• die Binärdarstellung (n)2 = 10011011 geschickt ausnutzen, indem man
– sukzessive
2
2
2
berechnet, sowie
32 , 34 = 32 , 38 = 34 , . . . , 3128 = 364
33 = 3 × 32 , 311 = 33 × 38 , 327 = 311 × 316 , 3155 = 327 × 3128
(macht 7 Quadrierungen und 4 Multiplikationen)
– sukzessive
2
2
2
2
32 , 34 = 32 , 39 = 3 × 34 , 319 = 3 × 39 , 338 = 319 ,
2
2
377 = 3 × 338 , 3155 = 3 × 377 berechnet (macht ebenfalls 7
Quadrierungen und 4 Multiplikationen)
8
Exponentiation mittels iteriertem Quadrieren:
Idee: in jeder Halbgruppe H kann man zur Berechnung von (a, n) 7→ an
für a ∈ H, n ∈ N die Binärdarstellung des Exponenten n verwenden


 a n2 2

falls
n
gerade
2
n−1 2
an =
= an (mod 2) · an÷2
a · a 2

falls n ungerade
Bezeichnungen für n ∈ N:
– (n)2 : Binärdarstellung von n (ohne führende Nullen)
– `(n) : Länge der Binärdarstellung von n = blog(n)c + 1
– ]1 (n)2 : Anzahl der Einsen in (n)2
9
rekursives Programm zur Berechnung von pot : (a, n) 7→ an (gofer)
pot :: Int -> Int -> Int
pot a n | n == 1 = a
| even n = p*p
where p = pot a (n/2)
| odd n = a*p*p where p = pot a (n/2)
Resultat (GA, Theorem 1.7): Die Berechnung von pot(a, n) benötigt
`(n) + ]1 (n)2 − 2 Multiplikationen und `(n) − 1 Divisionen durch 2
10
Berechnung der Fibonacci-Zahlen mittels iteriertem Quadrieren

Idee: mit F = 

1
1

 
fn−1 + fn−2
1

= 
= 
fn−1
fn−1
1
fn


1
 gilt
0




1
fn−1
fn−1

= F 

0
fn−2
fn−2
also ist (Induktion, GA, Lemma 1.5)


 
 
fn
f
1

= F n−2  2 = F n−2  
fn−1
f1
1
11
Folgerung (GA, Theorem 1.8):
Die Berechnung von fn mittels iteriertem Quadrieren der Matrix F benötigt
13blog(n − 2)c + 12]1 (n − 2)2 − 10 arithmetische Operationen (Additionen,
Subtraktionen, Multiplikationen, Divisionen durch 2)
Dies kann noch etwas verbessert werden, wenn man ausnützt, dass die Potenzen
von F symmetrische Matrizen sind
12
h :: Int -> (Int,Int,Int,Int)
h n | n==1
= (1, 1,
1, 0)
| even n = let (a,b,c,d)=h(n/2)
in ((a*a)+(b*c), (a*b)+(b*d),
(c*a)+(d*c), (c*b)+(d*d))
| odd n = let (a,b,c,d)=h(n/2)
in ((a*a)+(b*c)+(a*b)+(b*d), (a*a)+(b*c),
(c*a)+(d*c)+(c*b)+(d*d), (c*a)+(d*c))
fib3 :: Int -> Int
fib3 n | n==1 || n==2 =1
| n>2
= a+c where (a,b,c,d) = h (n-2)
13
Zur Dauer der Berechnung von Fibonacci-Zahlen
Annahme: Dauer einer arithmetischen Operation = 1 Mikrosekunde
Variante/Zeitbedarf
rekursiv
1ms
1s
1m
1h
≈ 14
≈ 28
≈ 37
≈ 45
≈ 500
iterativ
iteriertes Quadrieren
≈ 1012
≈ 5 · 10
5
≈ 1012.000
7
≈ 3 · 10
≈ 10700.000
≈ 2 · 109
≈ 1010
6
Da die beteiligten Operanden sehr schnell wachsen, ist obige Annahmen nicht
realistisch!
14
Laufzeitvergleich für drei Methoden zur Berechnung der Fibonacci-Zahlen
(Quelle: Brassard, Bratley, Algorithmics, Theory and Practice, Prentice-Hall 1988,
Sec. 1.7)
A: Berechnung modulo 7, gemessene Werte, Zeiten > 2 min geschätzt
n
10
20
30
50
102
104
106
108
fib1
8ms
1s
2m
21d
109 y
−
−
−
fib2
1/6ms
1/3ms
1/2ms
3/4ms
3/2ms
150ms
15s
25m
fib3
1/3ms
2/5ms
1/2ms
1/2ms
1/2ms
1ms
3/2ms
2ms
15
B: Laufzeitverhalten
fib1 :
t1 (n)= ϕn−20 sec
fib2 :
t2 (n)= 15 n × 10−6 sec
fib3 :
t3 (n)=
1
log n × 10−3 sec
4
C: gemessene Werte (in Sekunden) für exakte Berechnung (long integer)
n
5
10
15
20
25
100
500
fib1 0.007 0.087 0.941 10.766 118.457
−
−
103 5 · 103
−
−
104
−
fib2 0.005 0.009 0.011
0.017
0.021 0.109 1.177 3.581 76.107 298.892
fib3 0.013 0.017 0.019
0.020
0.021 0.041 0.132 0.348
16
7.664
29.553
3.3.3
Iteration von Transformationen: “cycle detection”
Definition 7. Ist A eine Menge, f ∈ T (A) eine Transformation von A und a ∈ A ein
Element, so bezeichnet man die durch iterierte Anwendung von f entstehende Folge
a, f (a), f (f (a)), . . . = (aj )j∈N mit aj = f j (a) (j ∈ N)
als die Bahn von a unter f . Dabei ist a0 = a und aj+1 = f (aj ).
Ist A eine unendliche Menge, so sind zwei Fälle möglich:
• die Bahnelemente f j (a) (j ∈ N) sind paarweise verschieden – die Bahn hat also
abzählbar unendliche Mächtigkeit;
• es gibt Indices i < j mit ai = aj und folglich ai + k = aj+k für alle k ≥ 0 – die
Bahn ist endlich.
Ist A selbst eine endliche Menge, so kann natürlich nur der zweite Fall eintreten. In
diesem (zweiten) Fall besteht die Bahn aus einer Vorperiode der Länge λ = λf (a) und
einer Periode der Länge µ = µf (a). Es gilt dann:
– die Elemente a0 , a1 , . . . , aλ+µ−1 sind die paarweise verschiedenen Elemente der
Bahn;
– die Elemente a0 , a1 , . . . , aλ−1 bilden die Vorperiode der Bahn;
– die Elemente aλ , aλ+1 , . . . , aλ+µ−1 bolden die Periode der Bahn.
Die Mächtigkeit ρ = λ + µ der Bahn bezeichnet man auch als die ρ-Länge der Bahn.
Die Verwendung des griechischen Buchstabens ρ suggeriert das “Aussehen” der Bahn in
diesem schliesslich-periodischen Fall.
Ein wichtiges Problem besteht darin, zu den gegebenen Daten A, a, f im schliesslichperiodischen Fall
• die Werte λf (a), µf (a) und damit auch ρf (a) zu bestimmen;
• ein Element at der Periode zu bestimmen.
Das geht natürlich mit der stupiden Methode, bei der sukzessiven Generierung der Bahnelemente aj eine Liste der der schon vorhandenen Elemente mitzuführen und jedes neu
erzeugt Element mit dieser Liste zu vergleichen. Diese (sicherlich korrekte) Methode hat
den doppelten Nachteil eines unabsehbaren Speicherbedarfs und eines erheblichen Aufwandes für das Durchsuchen der aktuellen Liste für jedes neu generierte Bahnelement.
Gewünscht ist eine Methode, die das vermeidet.Und das geht in der Tat mit folgendem
Algorithmus des “cycle detection” von Floyd:
57
floydcycle := procedure(f, a)
x, y ← a, t ← 0
repeat
x ← f (x)
y ← f (f (y))
t++
until x = y
return(x, t)
end
Anschaulich: Zwei Punkte durchlaufen die Bahn mit unterschiedlicher Geschwindigkeit.
Sie starten gleichzeitig bei a, der x-Punkt macht einen Schritt pro Zeiteinheit, der yPunkt deren zwei! Beide Punkte werden sich irgendwann in der Periode Periode treffen:
sobald der x-Punkt die Periode betritt und nicht schon zu diesem Zeitpunkt mit dem
y-Punkt (der sich schon eine Weile in der Periode bewegt) zusammentrifft, nimmt der
(endliche) Abstand zwischen beiden Punkten mit jedem Takt um genau 1 ab. Dieses
“Kollisionsereignis” wird detektiert. Genauer kann man sagen:
Satz 13. Der cycle-detection-Algorithmus terminiert und gibt (x, t) zurück. Dabei ist
x = at und t > 0 ist der erste Zeitpunkt, für den at = a2t gilt.
Es ist
t ≤ ρf (a) ≤ 2t
und es gilt
t=
(
µ
d µλ e · µ
falls λ = 0,
falls λ > 0.
Damit gelingt es, mit konstantem Speicher ein Element at = at+λ = . . . = a2t aus der
Periode zu bestimmten. Bleibt noch zu klären, wie man λ, µ und ρ bestimmt.
Dazu hilft folgende einfache Überlegung: aus at = a2t folgt, indem man die Bahn
rückwärts verfolgt
f λ (a0 ) = aλ = at−(t−λ) = a2t−(t−λ) = at+λ = f λ (at ).
Das bedeutet: startet man von (a0 , at ) (bekannt!) ausgehend die Iteration
(x, y) 7→ (f (x), f (y)),
so wird es nach genau λ Schritten (Mitzählen!) zu einer Kollision im Punkt aλ = at+λ
kommen: damit kennt man λ !
Die Bestimmung von µ ist natürlich ganz einfach: man kennt at als Punkt in der Periode
und muss nur von dort ausgehend µ Schritte die Transformation x 7→ f (x) iterieren und
die Wiederkehr nach at feststellen.
58
Bemerkung 9. Die Untersuchung von Kollisionen und Kollisionwahrscheinlichkeiten ist
in vielen Bereichen der Algorithmik von höchstem Interesse! Erwähnt seien:
• Generierung von Pseudo-Zufallszahlen,
• Hashing,
• probabilistische Algorithmen,
• kryptografische Verschlüsselungen...
Die Problematik lässt sich oft auf die Frage reduzieren:
• Wenn man “zufällig” und “mit Zurücklegen” Elemente aus einer Menge A entnimmt, wie lange dauert es dann im Mittel, bis man ein Element zu zweiten Mal
zieht?
Das ist die Frage nach dem Erwartungswert für die Dauer, bis es zu einer Kollision
kommt. Ein grundlegendes Resultat ist unter dem populären Namen “Geburtstagsparadoxon” (birthday paradox ) bekannt. Dieses Resultat (siehe folgenden Abschnitt) bezieht
sich auch auf die Frage, wie es im Mittel um die ρ-Länge bestellt ist, wenn man in einer
endlichen Menge A, ausgehend von einem Startelement a ∈ A mit einer zufälligen Transformation f die Bahn von a unter f erzeugt. Es ist klar, dass bei Gleichverteilung über
alle N N Transformationen einer Menge A mit ]A = N der Mittelwert von ρf (a) nur
von N , nicht aber von der Menge A oder vom Startpunkt a abhängt, dieser Mittelwert
also mit ρ(N bezeichnet werden kann. Aus dem Resultat des folgenden Abschnitts ergibt
sich:
√
Theorem 14. Der Erwartungswert der ρ-Länge wächst proportional zu N , genauer:
r
πN
ρ(N ) ∼
.
2
3.3.4
Das Geburtstagsparadoxon
• Szenario: Aus einer N -elementigen Menge A werden nacheinander Elemente gleichverteilt
gezogen, registriert und zurückgelegt – die geschieht solange, bis eine Kollision auftritt, d.h. ein schon registriertes Element wird gezogen.
59
• Elementare Wahrscheinlichkeiten:
Q(N, k) = Wkeit [a1 , a2 , . . . , ak paarweise verschieden]
1
2
k−1
= 1 · (1 − ) · (1 − ) . . . (1 −
)
N
N
N
N
N!
k · k!
=
=
k
N
(N − k)!N k
P (N, k) = Wkeit [a1 , . . . , ak−1 pw verschieden undak ∈ {a1 , . . . , ak−1 }]
k−1
=
Q(N, k − 1) = Q(N, k − 1) − Q(N, k)
N
• Gesucht ist der Erwartungswert
X
X
k P (N, k) =
k (Q(N, k − 1) − Q(N, k))
k≥1
k≥1
= Q(N, O) +
| {z }
=1
• Man kann zeigen1 , dass
X
k P (N, k) =
k≥1
X
k≥0
X
Q(N, k)
k≥1
Q(N, k) ∼
r
πN
2
+
2
3
gilt. Als Hinweis: mit 1 − x ≤ e−x hat man
Q(N, k) =
Y
1≤`<k
(1 −
1
`
) ≤ e− N
n
P
1≤`<k
`
= e− N (2) ≤ e− N (k−1)
1
k
1
2
Andererseits gilt (Unter- und Obersummen des Integrals)
Z ∞
X
X
2
2
−k2 /N
e
≤
e−x /2N dx ≤
e−k /N
0
k≥1
k≥0
Der Wert des Integrals ist aber bekannt:
Z
∞
e
−x2 /2N
0
dx =
r
πN
2
• Fazit: zieht man aus einer N -elementigen Menge A gleichverteilt und mit Zurücklegen Elep
mente, so tritt im Mittel nach etwa πN/2 Ziehungen eine Kollision auf.
Man kann nun noch die Frage stellen:
• Wieviele Ziehung benötigt man, um eine Kollisionswahrscheinlichkeit auf 50% zu
haben?
1
siehe z.B. R. Sedgewick, Ph. Flajolet, An Introduction to the Analysis of Algorithms, AddisonWesley, 1996. Abschnitte 4.8 und 8.7, 8.8, Stichwort: Ramanujans Q-Funktion.
60
Wann ist also Q(N, k) = W.keit [a1 , a2 , . . . , ak pw. verschieden] ≈ 1/2 ? Es soll
Q(N, k) = (1 −
sein. Das bedeutet
X
1≤j<k
1
2
k−1
)(1 − ) . . . (1 −
) ≈
N
N
N
ln(1 −
j
) ≈
N
1
2
ln(1/2).
Falls k N ist, kann man daraus
X j
k(k − 1)
=
2N
N
1≤j<k
schliessen. Das bedeutet
k ≈
≈
ln 2
√
√
| 2{zln 2} · N .
√
1.2
√
• Interpretation: Für N = 365 ist 2 ln 2 · N etwa 22.9 . . ., d.h. hat man eine
Gesellschaft von ≥ 23 Personen, deren Geburtstage über das Jahr gleichverteilt
sind, so ist die Wahrscheinlichkeit > 50%, dass zwei Personen am gleichen Tag
Geburtstag haben.
Bei ≥ 35 Personen ist die Wahrscheinlichkeit bereits > 80%.
3.3.5
Pollards ρ-Methode
Eine der spektakulärsten Anwendungen des cycle detection-Technik ist ein Verfahren
zur Faktorisierung ganzer Zahlen von J. M. Pollard2 , die 1981 von R. P. Brent3
8
verwendet wurde, um die Fermat-Zahl F8 = 22 + 1 zu faktorisieren – immerhin eine 78stellige Dezimalzahl, deren zwei Primfaktoren 16 bzw. 62 Dezimalstellen haben. Das war
für die damalige Zeit und Technologie eine herausragende Leistung und die ρ-Methode,
zusammen mit der etwa gleichzeitig entwickelten Kettenbruchtechnik von M. A. Morrison und J. A. Brillhart4 , markiert den Beginn der Neuzeit des Faktorisierens. Zum
Einstieg in diesen Problemkreis wird auf Abschnitt 4.5.4 von TAOCP5 verwiesen.
Pollards Idee besteht darin, zum Faktorisieren einer natürlichen Zahl N (von der vorausgesetzt wird, dass sie selbst keine Primzahl ist) ein “geeignetes” Polynom f (X) mit
ganzzahligen Koeffizienten zu nehmen und ausgehend von einem Startwert a ∈ ZN =
{0, 1, 2, . . . , N − 1} die Abbildung
fN : ZN → ZN : x 7→ f (x)
2
mod N
J. M. Pollard, A Monte Carlo Factoring Method, BIT 15 (1975), 331–334.
R. P. Brent und J. M. Pollard, Factorization of the Eighth Fermat Number, Mathematics of Computation 36 (1981), 627–630.
4
M. A. Morrison und J. A. Brillhart, A Method of Factoring and the Factorization of F7 , Mathematics
of Computation 29 (1075), 183–205.
5
D.E. Knuth, The Art of Computer Programming, vol 2. Seminumerical Algorithms, 3. Auflage,
Addison-Wesley (1998).
3
61
zu iterieren. Dies erzeugt eine FN -Bahn
f
f
f
f
N
N
N
N
a = a0 −→
a1 −→
a2 −→
a3 −→
...
√
Ist nun p ein (unbekannter!) Primteiler von N mit p < N , so kann man auch die
fp -Bahn von b = a mod p in Zp in Betracht ziehen, d.h. mit
fp : Zp → Zp : x 7−→ f (x) mod p
wird die Bahn
fp
und es gilt dabei natürlich6
fp
fp
fp
b0 −→ b1 −→ b2 −→ b3 −→ . . .
bk ≡ ak mod p
(k ≥ 0).
Die beiden Folgen (ak )k≥0 in ZN und (bk )k≥0 in Zp sind schliesslich-periodisch und nach
der Heuristik für die ρ-Methode kann man erwarten, dass in der Folge (bk )k≥0 eine
√
Kollision früher auftreten wird – im Mittel nach p = N 1/4 Iterationen – als in der
√
Folge (ak )k≥0 – im Mittel nach N Iterationen. Diese Argument setzt natürlich voraus,
dass sich die Transformationen fp bzw. fN in etwa wie “zufällige” Transformationen
verhalten
Wenn es zu einer Kollision in der Folge (bk )k≥0 kommt, ohne dass gleichzeitig eine Kollision in der Folge (ak )k≥0 eintritt, hat man Indices i < j
bi = bj
und
ai 6= aj ,
d.h. p ist ein gemeinsamer Teiler von aj − ai und N , was man durch den Test
1 < ggT((aj − ai ) mod N, N ) < N
identifiziert. Die Kollision selbst findet man speichereffizient mittels der cycle-detectionMethode.
Bemerkung 10. Für die Laufzeiteffizient dieser Methode – dass man also im Mittel nach
√
O( p und somit O(N 1/4 Iterationen einen echten Teiler von N findet – ist die Berechtigung Zufälligkeitsannahme bezogen auf fN und fp wesentlich. In der Praxis haben sich
quadratische Polynome f (X) = X 2 + c mit c 6= 0, −2 sehr gut bewährt, obwohl das
durch theoretische Resultate bislang nur teilweise untermauert werden konnte.
Eine Basisform des Algorithmus von Pollard könnte also folgendermassen aussehen
(in der Literatur findet man zahlreiche Varianten):
6
Hierbei wird benutzt, dass die Transformation mittels eines Polynoms geschieht und die Abbildung
ZN → Zp : x 7→ x mod p mit Addition und Multiplikation verträglich ist, genau gesagt: ein Ringhomomorphismus ist.
62
pollardsrho := procedure(N )
wähle a, c ∈ {0, 1, 2, . . . , N − 1} zufällig, wobei c 6= 0, −2
x, y ← a
repeat
x ← x2 + c
a ← (y 2 + c)2 + c
g ← gcd(x − y, N )
if 1 < g < N then
return(g)
else
if g = N then
fail
end if
end if
until ()
end
Beispiel: N = 91643
a0
a1
a2
a3
a4
a5
a6
f = X2 − 1
=2
=5
= 26
= 677
= −100
= −914
= −692
a=3
ggT(a2 − a1 , N ) = 1
ggT(a4 − a2 , N ) = 1
ggT(a6 − a3 , N ) = 37
b0
b1
b2
b3
b4
b5
b6
=2
=5
= −11
= 11
= 11
= 11
= 11
In der Tat: 2183 = 37 · 59
Beispiel: N = 91643
a0
a1
a2
a3
a4
a5
a6
a7
a8
f = X2 − 1
=3
=8
= 63
= 3968
= 74070
= 65061
= 35193
= 83746
= 45368
a=3
ggT(a2 − a1 , N ) = 1
ggT(a4 − a2 , N ) = 1
ggT(a6 − a3 , N ) = 1
ggT(a8 − a4 , N ) = 113
In der Tat: 91643 = 113 · 811
63
b0
b1
b2
b3
b4
b5
b6
b7
b8
=3
=8
= 63
= 13
= 55
= 86
= 50
= 13
= 55
3.3.6
Exkurs: Fermatzahlen
Als Fermatzahlen bezeichnet man die Zahlen
n
Fn = 22 + 1.
Ausgehend von der Beobachtung, dass die Zahlen
F0 =3
F1 =5
F2 =17
F3 =257
F4 =65537
Primzahlen sind, hat Pierre de Fermat um 1650 vermutet, dass alle später nach ihm
benannten Zahlen Primzahlen sind. Das würde bedeuten, dass man eine einfache Formel
für unendlich viele Primzahlen hätte!
Fermats Vermutung trifft nun aber keineswegs zu! Tatsächlich hat sich, beginnend mit
Euler, der 1732 nachwies, dass F5 keine Primzahl ist, keine weitere Fermatzahl als
Primzahl identifizieren lassen. Von den Fermatzahlen F5 , . . . , F11 ist die Faktorisierung
bekannt, von etlichen weiteren Fermazahlen weiss man aus anderen Gründen, dass sie
keine Primzahlen sind. Da die F − n aber extrem rasch wachsen, befindet man sich
schnell ausserhalb des Bereichs, der heutzutage mit Rechnermethoden zugänglich ist.
Trotzdem: die Entwicklung von Methoden zur Faktorisierung von Fermatzahlen (und
ähnlicher Zahlen, wie z.B. Mersennezahlen 2p − 1 mit p Primzahl) ist ein heroisches
Kapitel der algorithmischen Zahlentheorie!
Hier die bekannten Faktorisierungen:
F5 =641 · 6700417
F6 =274177 · 67280421310721
F7 =59649589127497217 · 5704689200685129054721
F8 =1238926361552897 · 93461639715357977769163558199606896584051237541638188580280321
F9 =2424833 · 7455602825647884208337395736200454918783366342657 · P 99
F10 =45592577 · 6487031809 · 4659775785220018543264560743076778192897 · P 252
F11 =319489 · 974849 · 167988556341760475137 · 3560841906445833920513 · P 564
wobei P x eine x-stellige Primzahl bedeutet.
Einige Daten dazu:
64
Fn
5
6
7
8
9
10
11
Digits
10
20
39
78
155
309
617
Factors
2
2
2
2
3
4
5
Digits
3, 7
6, 14
17, 22
16, 62
7, 49, 99
8, 10, 40, 252
6, 6, 21, 22, 564
Reference
Euler 1732
Landry 1880
Morrison and Brillhart 1975
Brent and Pollard 1981
Manasse and Lenstra 1993
Brent 1995
Brent 1988
Als Quelle diente: Weisstein, Eric W. Fermat Number. From MathWorld–A Wolfram
Web Resource. http://mathworld.wolfram.com/FermatNumber.html wo man noch
viele weiter Informationen findet.
Bemerkung 11. Zwar hat sich Fermats Vermutung als unzutreffend herausgestellt, aber
ganz unrecht hat er nicht gehabt! Aus der leicht einzusehenden Tatsache
Fn+1 = F0 · F1 · · · Fn + 2
kann man schliessen, dass in den Fermatzahlen Fn unendlich viele verschiedene Primteiler
auftreten.
3.3.7
Exponentiation in Gruppen: Ordnung muss sein!
Hier wird nun das Thema “Iteration von Funktionen” noch einmal aufgegriffen in der
speziellem Situation, wo A eine Menge ist und f ∈ T (A) eine bijektive Transformation
von A. In diesem Fall ist die inverse Transformation f −1 wohldefiniert und man kann den
Begriff der Bahn (auch Orbit genannt) eines Elementes a unter f auf negative Potenzen
ausweiten, d.h. f −k (a) = (f −1 )k (a):
Of (a) = . . . , f −2 (a), f −1 (a), a, f (a), f (f (a)), . . . = (aj )j∈Z mit aj = f j (a) (j ∈ Z).
Es ist also schematisch
f
f
f
f
f
f
· · · 7−→ a−2 7−→ a−1 7−→ a0 7−→ a1 7−→ a2 7−→ · · ·
Wiederum gibt es zwei Möglichkeiten, falls die Menge A unendlich ist:
• die Bahnelemente f j (a) (j ∈ Z) sind paarweise verschieden – die Bahn Of (a) hat
also abzählbar unendliche Mächtigkeit;
• es gibt Indices i < j mit ai = aj und folglich ai+k = aj+k für alle k ∈ Z – die Bahn
Of (a) ist endlich; insbesondere ist dann a0 = aj−i .
Ist A selbst eine endliche Menge, so kann natürlich nur der zweite Fall eintreten. Das
Problem des cycle detection stellt sich dann aber hier garnicht erst – die Vorperiode ist
leer (λ = 0), schon a selbst muss in der Periode liegen. Das kleinste t > 0 mit f t (a0 ) = a0
65
(und folglich f t (a` ) = a` ) ist dann die Periodenlänge µ = t. Diese Zahl bezeichnet man
auch als die Ordnung von a unter f .
Für beliebige k, ` ∈ Z gilt dann, unter Verwendung von k = bk/tc · t + k mod t,
ak+` = f k (a` ) = f bk/tc·t+k mod t (a` ) = f k mod t (a` ) = ak+` mod t
und insbesondere
ak = a ⇐⇒ t | k.
Ist nun G = (A; ◦, e) ein Gruppe, so ist für jedes a ∈ A die Multiplikation mit a (von
links)
ma : A → A : x 7→ a ◦ x
eine bijektive Transformation.
Definition 8. Ist G = (A; ◦, e) ein Gruppe, so bezeichnet man mit
Oma (e) = {ak ; k ∈ Z}
die Bahn (den Orbit) von a unter ma . Ist ]Oma (e) unendlich, so sagt man, a sei ein
Element von unendlicher Ordnung und schreibt ordG (a) = ∞. Ist ]a = t < ∞, so sagt
man, a sei ein Element von der Ordnung t und schreibt ordG (a) = t.
Die Bahn Oma (e) = {ak ; k ∈ Z} ist mit der Verknüpfung ◦ und dem neutralen Element e selbst wieder eine Gruppe, also ein Untergruppe von G. Man bezeichnet hai =
(Oma (e); ◦, e) als die von a erzeugte Untergruppevon G.
Definition 9. Eine Gruppe G = (A; ◦, e) heisst zyklische Gruppe, wenn es ein a ∈ A
mit hai = G gibt. In diesem Fall ist ordG (a) = ]A.
Beispiel 11. Prototypen zyklischer Gruppen sind die Gruppen
• Z = ((−∞, +∞); +, 0) als zyklische Gruppe unendlicher Ordnung;
es gilt Z = h1i und Z = h−1i;
• ZN = ([0, N − 1]; +, 0) als zyklische Gruppe der Ordnung N für N ≥ 1;
es gilt beispielsweise Z = h1i.
Dies sind i.w. schon alle zyklischen Gruppen: jede zyklische Gruppe ist zu einer dieser
Gruppen isomorph.
• Die Gruppe (Q; +, 0) der rationalen Zahlen unter der Addition ist keine zyklische
Gruppe, ebenso wie die Gruppe (Q0 ; ·, 1) der rationalen Zahlen unter der Multiplikation. Entsprechendes gilt für reelle und komplexe Zahlen.
• Die symmetrischen Gruppen SN sind für N ≥ 3 keine zyklischen Gruppen.
66
Wegen der Wichtigkeit sei nochmal wiederholt, was es für ein Element a ∈ A bedeutet,
endliche Ordnung t zu haben:
ak = abk/tc·t+k mod t (a` ) = (at )bk/tc ◦ ak mod t = ak mod t
(k ∈ Z),
und insbesondere
ak = e
Eine wichtige Regel ist:
⇐⇒
t | k (d.h. k mod t = 0).
Satz 15. Ist G = (A; ◦, e) ein Gruppe und ordG (a) = t < ∞ so gilt für k ∈ Z
ordG (ak ) =
t
.
ggT(t, k)
Das ergibt sich ganz einfach aus
(ak )m = e ⇐⇒ t | k m ⇐⇒
t
| m.
ggT(t, k)
Folgerung 16. Ist ordG (a) = t < ∞, so gilt hai = hak i für alle k mit ggT(t, k) = 1.
Insbesondere gilt hki = ZN für alle k mit ggT(k, N ) = 1.
Beispiel 12.
7
1. G = (Z ; +, 0):
– für a = 0 ist hai = {0}, also ordZ (a) = 1;
– für a 6= 0 ist hai = {k · a; k ∈ Z} = a Z, also ordZ (a) = ∞;
2. G = (R0 ; ·1)
– für a = 1 ist hai = {1}, also ordR (1) = 1;
– für a = −1 ist hai = {±1}, also ordR (−1) = 2;
– für a 6= ±1 ist hai = {ak ; k ∈ Z}, also ordR (a) = ∞;
3. G = (C0 ; ·1)
– für a = 1 ist hai = {1}, also ordC (a) = 1;
N = 1 und die Elemente
– für ganzzahliges N > 1 sei ωN = e2πi/N ; dann gilt ωN
von
k
hωN i = {ωN
; 0 ≤ k < N}
sind paarweise verschieden. Also ist ordC (ωN ) = N .
7
Es ist hier wie auch später bisweilen angenehm, die Bezeichnung hai für die Gruppe wie für deren
Grundmenge zu verwenden, wenn klar ist, innerhalb welcher Gruppe man sich bewegt.
67
– für a ∈ C0 mit |a| =
6 1 oder a = e2πiφ mit irrationalem φ ist ordC (a) = ∞;
Man bezeichnet die komplexe Zahl a mit aN = 1, also eine Lösung der Gleichung
X N = 1, als komplexe N -te Einheitswurzel ; speziell ωN = e2πi/N ist eine primitive
k ; 0 ≤ k < N } bilden
N -te Einheitswurzel. Die N -ten Einheitswurzeln8 hωN i = {ωN
eine zyklische Gruppe der Ordnung N .
4. G = (S(A) ; ◦, id):
– Ist c eine zyklische Permutation der Länge t, so gilt offensichtlich ordSn (c) = t;
– Ist s = c1 c2 · cr die Darstellung einer Permutation als Produkt disjunkter
Zyklen, so gilt
ordSn (s) = kgV(ord(c1 ), . . . , ord(cr )).
Beispiel 13. Es sei Zn = ([0, n − 1]; +n , ·n , 0, 1) der Restklassenring modulo n. Die multiplikativ invertierbaren Elemente sind genau die Zahlen k ∈ [1, n − 1] mit ggT(k, n) = 1.
Diese bilden eine Gruppe, denn diese Menge ist wegen
ggT(a, n) = 1 ∧ ggT(b, n) = 1 =⇒ ggT(a · b, n) = 1
unter Multiplikation abgeschlossen. Man bezeichnet diese Zahlen als Einheitenmodulo n
und die Gruppe
Un = Z∗n = ({a ∈ [1, n − 1] ; ggT(a, n) = 1} ; ·n , 1)
als Einheitengruppe modulo n.
Für a ∈ [1, n − 1] wird die Ordnung von a in dieser Gruppe als Ordnung von a modulo
n bezeichnet: ordn (a).
Bemerkung 12. Die Ordnung von a modulo n ist eine interessante Größe und somit die
Frage nach ihrer effizienten Berechnung auch. Diese Grösse hat etwas mit dem Faktorisierungsproblem zu tun. Das sieht man an folgender Überlegung:
• Angenommen, N sei eine ganze Zahl, die man faktorisieren möchte. Zu einem
a ∈ ZN mit ggT(a, N ) = 1 sei ordN (a) bekannt. Falls ordN (a) gerade ist (was
meistens gilt, wenn N keine Primzahl ist), also ordN (a) = 2t, kann man schreiben
a2t − 1 = (at − 1)(at + 1) mod N.
Dabei ist ausgeschlossen, dass N | at − 1 gilt (Definition der Ordnung!). Falls also
nicht unglücklicherweise N | at + 1 gilt (was nur selten vorkommt), findet man
mittels
ggT(at + 1), N ) oder ggT(at − 1), N )
8
Ausser den genannten Elementen gibt es keine weiteren Lösungen der Gleichung X N = 1, denn C
ist eine Körper und in einem Körper hat eine Gleichung N -ten Grades höchstens N Lösungen – im Falle
des Körpers C sogar genau N Lösungen (unter Berücksichtigung der Vielfachheiten), das besagt gerade
der Fundamentalsatz der Algebra.
68
einen echten Teiler von N .
Dieser einfachen Überlegung kommt immense Bedeutung zu: obwohl das Faktorisierungsproblem als ein mit klassischen Mitteln mutmasslich nicht effizient lösbares
Problem angesehen wird, hat P. Shor in eine bahnbrechenden Arbeit9 gezeigt,
dass man mit einem Quantencomputer (wenn es ihn denn einmal geben wird) effizient faktorisieren kann! Der Schlüssel liegt darin, dass man mit Hilfe des Quantencomputer Ordnungen effizient berechnen kann. Dabei spielt zudem die diskrete
Fouriertransformation eine entscheidende Rolle!
Beispiel 14. Die Einheitengruppe Un = Z∗n für n = 7, 8, . . . , 12:
• n=7
h1i = {1}
ord7 (1) = 1
h2i = {20 = 1, 21 = 2, 22 = 4, 23 = 1, . . .} = {1, 2, 4}
h3i = {1, 3, 3 = 2, 3 = 6, 3 = 4, 3 = 5, 3 = 1, . . .}
2
3
4
5
ord7 (2) = 3
6
= {1, 2, 3, 4, 5, 6}
ord7 (3) = 6
h4i = {1, 4, 2, 1, . . .} = {1, 2, 4}
ord7 (4) = 3
h6i = {1, 6, 1, . . .} = {1, 6}
ord7 (6) = 2
h5i = {1, 5, 4, 6, 2, 31, . . .} = {1, 2, 3, 4, 5, 6}
ord7 (5) = 6
U7 = Z∗7 = h3i = h5i ist also eine zyklische Gruppe.
• n=8
h1i = {1}
ord8 (1) = 1
h3i = {1, 3, 3 = 1, . . .} = {1, 3}
ord8 (3) = 2
h7i = {1, 7, 7 = 1, . . .} = {1, 7}
ord8 (7) = 2
2
h5i = {1, 5, 52 = 1, . . .} = {1, 5}
2
ord8 (5) = 2
U8 = Z∗8 = {1, 3, 5, 7} =
6 h1i, h3i, h5i, h7i.
U8 ist also keine zyklische Gruppe.
9
P. W. Shor, Algorithms or qquantum computation: Discrete logarithms and factroing, Proc. 35th
IEEE Ann. Symp. Found. Comp. Sci. (1994), 124–134; siehe auch: P.W. Shor, Polynomial-time algorithms
for prime factorization and discrete logarithms on a quantum computer, SIAM J. Computation 26 (1997),
1484–1509.
69
• n=9
h1i = {1}
ord9 (1) = 1
h2i = {1, 2, 2 = 4, 2 = 8, 2 = 7, 2 = 5, 2 = 1, . . .}
2
3
4
5
6
= {1, 2, 4, 5, 7, 8}
ord9 (2) = 6
h4i = {1, 4, 7, 1, . . .} = {1, 4, 7}
ord9 (4) = 3
h7i = h4i
ord9 (7) = 3
h5i = {1, 5, 7, 8, 4, 2, 1, . . .} = h2i
ord9 (5) = 6
h8i = {1, 8}
ord9 (8) = 2
U9 = Z∗9 = {1, 2, 4, 5, 7, 8} = h2i = h5i
U9 ist also eine zyklische Gruppe.
• n = 10
h1i = {1}
ord10 (1) = 1
h7i = {1, 7, 9, 3, 1, . . .}
ord10 (7) = 4
h3i = {1, 3, 9, 7, 1, . . .}
ord10 (3) = 4
h9i = {1, 9, 1, . . .}
ord10 (9) = 2
U10 = Z∗10 = {1, 3, 7, 9} = h3i = h7i
U10 ist also eine zyklische Gruppe.
• n = 11
h1i = {1}
ord11 (1) = 1
h2i = {1, 2, 4, 8, 5, 10, 9, 7, 3, 6, 1, . . .}
ord11 (2) = 10
h3i = {1, 3, 9, 5, 4, 1, . . .}
ord11 (3) = 5
h5i = {1, 5, 3, 4, 9, 1, . . .}
ord11 (5) = 5
h4i = {1, 4, 5, 9, 3, 1, . . .}
ord11 (4) = 5
h6i = {1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1, . . .}
ord11 (6) = 10
h8i = {1, 8, 9, 6, 4, 10, 3, 2, 5, 7, 1, . . .}
ord11 (8) = 10
h7i = {1, 7, 5, 2, 3, 10, 4, 6, 9, 8, 1, . . .}
h9i = {1, 9, 4, 3, 5, 1, . . .}
h10i = {1, 10, 1, . . .}
ord11 (7) = 10
ord11 (9) = 5
ord11 (10) = 2
U11 = Z∗11 = {1, 2, 3, . . . , 10} = h2i = h6i = h7i = h8i
U11 ist also eine zyklische Gruppe.
70
• n = 12
h1i = {1}
ord12 (1) = 1
h7i = {1, 7, 1, . . .}
ord12 (7) = 2
h5i = {1, 5, 1, . . .}
ord12 (5) = 2
h11i = {1, 11, 1, . . .}
ord12 (10) = 2
U12 = Z∗12 = {1, 5, 7, 11} =
6 h1i, h5i, h7i, h11i
U12 ist also keine zyklische Gruppe.
Das allgemeine Resultat, unter das sich diese Beispiel unterordnen, lautet:
Theorem 17. Die Einheitengruppe Un = Z∗n ist genau dann eine zyklische Gruppe,
wenn n = 2, 4 oder n = pα oder n = 2 · pα , wobei p ungerade Primzahl, α ≥ 1.
Der Beweis ist nicht ganz einfach und wird hier nicht geführt. Er findet sich in jedem
guten Buch über elementare Zahlentheorie10 .
Beispiel 15.
1. Faktorisierung von N = 15
– Für a ∈ {3, 5, 6, 9, 10, 12} ist ggT(a, 15) > 1
– Für a ∈ U15 :
a ord15 (a)
2
4
4
2
7
4
8
4
11
2
13
4
14
2
t at +1 ggT(15, at +1) at −1 ggT(15, at −1)
2
5
5
3
3
1
5
5
3
3
2
50
5
48
3
2
65
5
63
3
1
12
3
19
5
2 170
5
168
3
1
15
15
13
1
– Ausser a = 14 (und a = 1, natürlich!) liefern alle a ∈ U14 eine Faktorisierung,
falls man ord15 (a) kennt.
2. Zur Faktorisierung von N = 77:
– Von den 60 Elementen a ∈ U77 haben 15 eine ungerade Ordnung ord77 (a).
– Von den 45 Elementen a ∈ U77 mit gerader Ordnung ord77 (a) = 2t liefern 30
mittels ggT(at + 1, 77) einen echten Teiler von 77.
3. Zur Faktorisierung von N = 119
10
beispielweise: K. H. Rosen, Elementary Number Theory and Its Applications, 4. Aufl., AddisonWesley, 2000.
71
– Von den 96 Elementen a ∈ U119 haben drei (1,18,86) eine ungerade Ordnung
ord119 (a).
– Von den 93 Elementen a ∈ U119 mit gerader Ordnung ord119 (a) = 2t liefern
90 (ausgenommen 33, 101, 118), mittels ggT(at + 1, 119) einen echten Teiler
von 119.
3.3.8
Diskreter Logarithmus
Das Theorem 17 beinhaltet insbesondere folgende Aussage11
• Ist p ein Primzahl, so ist die multiplikative Gruppe Up = Z∗p eine zyklische Gruppe,
d.h. es gibt eine Zahl g ∈ [2, p − 1] mit hgi = [1, p − 1], oder anders gesagt:
– zu jedem Element a ∈ [1, p − 1] gibt es eine Zahl j mit 0 ≤ j < p − 1 und
g j ≡ a mod p.
Ein solches Element g bezeichnet man als primitives Element modulo p.
Den Exponenten j bezeichnet man als diskreten Logarithmus modulo p von a zur
Basis g.
Einige Bemerkungen sind angebracht, ohne das Thema hier zu vertiefen:
• Primitive Elemente zu bestimmen scheint ein schwieriges Problem zu sein – bis
heute ist kein effizientes Verfahren bekannt (aber auch kein Beweis, dass es ein
solches nicht geben kann).
• Hat man ein primitives Element g modulo p, so ist scheint (von einigen wenigen
Ausnahmefällen abgesehen) die Berechnung des diskreten Logarithmus ein schwieriges Problem zu sein – bis heute ist kein effizientes Verfahren bekannt (aber auch
kein Beweis, dass es ein solches nicht geben kann).
• Die Effizienz der Berechnung von Potenzen (Exponentiation) und die Schwierigkeit der Berechnung diskreter Logarithmen sind die Basis der Verwendung dieser
Operationen in Kryptosystemen. Deren vermeintliche Sicherheit beruht auf den
Annahme, dass diskrete Logarithmen schwer zu berechnen sind.
• Die besten derzeit bekannten Algorithmen für das Faktorisieren ganzer Zahlen
und für die Berechnung diskreter Logarithmen haben die gleichen Aufwand – eine
Beobachtung, für die man keine schlüssige Erklärung hat.
3.3.9
Primzahlen und Komplexität – einige Hinweise
Das algorithmische Problem der Zerlegung ganzer Zahlen in ihre Primfaktoren hat die
Mathematiker seit der Antike beschäftigt - also seitdem man weiss, das sich jede ganze
11
Der Beweis ist nicht schwierig und wird vermutlich an späterer Stelle nachgeholt.
72
Zahl als Produkt von Primzahlpotenzen schreiben lässt. Eng damit zusammen hängt das
Problem, Primzahlen und zusammengesetzte Zahlen als solche zu erkennen.
Wichtige Bemerkung:
Soweit es um die Komplexität von Algorithmen geht, die mit ganzen
Zahlen eingeben, ist das logarithmische Komplexitätsmass relevant:
Eine Zahl n hat in der Basis b die “Länge” `(n) = dlogb (n)e + 1.
Ein effizienter Algorithmus, der n als Input erhält, muss seine Aufgabe
in einer Zeit erledigen die polynomiell in log n ist!
Beachte immer: n selbst ist exponentiell in log n.
• Die Menge P der Primzahlen gehört in die Komplexitätsklasse co-N P – das bedeutet, dass die komplementäre Menge N \ P der zusammengesetzten Zahlen zu N P
gehört: das ist einfach einzusehen, denn Zusammengesetztheit lässt sich durch Vorweisen eines Teilers und Probedivision effizient verfizieren. (Dabei ist der Aufwand,
einen Teiler zu finden, unerheblich).
• Das die Menge P der Primzahlen selbst zu N P gehört, ist keineswegs selbstverständlich. Gezeigt wurde dies 1974 durch V. Pratt12 , der ein Kriterium von
E. Lucas aus dem 19. Jh. für diese Zwecke geschickt verwendet hat.
• Aus den beiden vorangehenden Bemerkungen folgt, dass P ∈ N P ∩ co-N P gilt:
ein schwerwiegendes Indiz dafür, dass weder P noch N \ P N P-vollständig sind.
• G.M. Miller zeigt 1976, dass Primheit polynomiell entscheidbar ist – allerdings
unter einer sehr viel weiter reichenden Annahme, nämlich der sog. “Erweiterten
Riemann-Hypothese”, deren Beweis derzeit noch in den Sternen steht.
• In zwei klassischen Arbeiten haben R. Solovay und V. Strassen13 einerseits, sowie M.O. Rabin14 andererseits gezeigt, dass es effiziente probabilistische Tests mit
einseitigem Fehler, sog. “Monte-Carlo-Tests” für Zusammengesetztheit gibt. Technisch wird das durch P ∈ co-RP ausgedrückt, wobei RP für “random polynomial
time” steht.
• Die komplementäre Aussage P ∈ RP wurde erst viel später durch L.M. Adlemanund M.-D.A.- Huang15 nachgewiesen. Zusammen mit der vorhergehenden
Aussage ergibt dies
P ∈ ZPP = RP ∩ co-RP
wobei ZPP für “zero error probabilistic polynomial time” steht.
12
V. Pratt, Every prime has a succinct certificate, SIAM J. Computing 4 (1975), 214–220.
R. Solovay und V. Strassen, A fast Monte-Carlo-Test for primality, Computing 7 (1977), 74–86.
14
M. O. Rabin, Probabilistic algorithm for primality, Journal of Number Theory 12 (1980), 128–138.
15
L.M. Adleman und M.-D.A.- Huang, Primality testing and abelian varieties over finite fields, Lecture
Notes in Mathematics, vol. 1512, Springer-Verlag, 1992.
13
73
• Mit den zitierten Resultaten war es naheliegend “P ∈ P” zu vermuten. Viele Experten haben sich darum bemüht, so dass es im Jahr 2002 schon keine Überraschung
mehr war, als ein indischer Mathematiker mit zwei seiner Studenten (M. Agrawal, N. Kayal, N. Saxena) den Schlussstein setzte. Überraschenderweise ist das
Verfahren ganz einfach zu beschreiben, das Wesentliche steckt aber in der keineswegs einfachen Rechtfertigung der Korrektheit dieses Algorithmus. In einem Band
der Lecture Notes in Computer Science16 kann man das sehr schön nachlesen.
16
M. Dietzfelbinger, Primality Testing in Polynomial Time, Lecture Notes in Compuer Science, vol.
3000, Springer-Verlag, 2004.
74
4
4.1
Divide-and-Conquer-Multiplikation
Karatsuba-Multiplikation für Polynome (und Zahlen)
siehe separate Folien
4.2
Strasssens schnelle Matrix-Multiplikation
siehe separate Folien
75
Zwei divide-and-conquer Algorithmen der Arithmetik
• Karatsuba-Multiplikation von Polynomen (und von ganzen Zahlen)
Multiplikation zweier Polynome vom Grad deg f, deg g < 2n
f (x) =
2n−1
X
fi xi
i=0
g(x) =
2n−1
X
j=0
(f ∗ g)(x) =
2n−2
X
k=0
gj xj


X
0≤i≤k

fi · gk−i  xk
1
wird zurückgeführt auf drei Multiplikationen von Polynomen vom Grad < n
f (x) = a(x) + xn b(x)
g(x) = c(x) + xn d(x)
f (x)g(x)
= a(x)c(x) + xn (a(x)d(x) + b(x)c(x)) + x2n b(x)d(x)
= u(x) + xn (w(x) − u(x) − v(x)) + x2n v(x)
wobei
u(x)
:= a(x)c(x)
v(x)
:= b(x)d(x)
w(x)
:= (a(x) + b(x))(c(x) + d(x))
Diese Idee ist rekursiv anzuwenden, bis man Polynome vom Grad 0 (Konstanten)
oder Polynome eines kleinen Grades zu multiplizieren hat.
Die Idee überträgt sich wörtlich auf die Multiplikation ganzer Zahlen (aber:
Übertrag beachten!)
2
karatsuba := proc(f,g,x,m)
local a,b,c,d,u,v,w,deg;
if m=0 then RETURN(f*g) fi;
deg := 2^(m-1);
a := sum(’coeff(f,x,i)*x^i’,’i’=0..deg-1);
b := sum(’coeff(f,x,i+deg)*x^i’,’i’=0..deg-1);
c := sum(’coeff(g,x,i)*x^i’,’i’=0..deg-1);
d := sum(’coeff(g,x,i+deg)*x^i’,’i’=0..deg-1);
u := karatsuba(a,c,x,m-1);
v := karatsuba(b,d,x,m-1);
w := karatsuba(a+b,c+d,x,m-1);
RETURN(expand(u+(w-u-v)*x^deg+v*x^(2*deg)));
end;
kara_mult := proc(f,g,var)
local df,dg,bound;
df := degree(f,var);
dg := degree(g,var);
bound := ceil(simplify(log[2](max(df,dg)+1)));
karatsuba(f,g,var,bound);
end;
3
Komplexitätsanalyse (für n = 2m ):

(worst-case) Anzahl der Additionen und Multiplikationen
tK (n) := im Koeffizientenbereich

bei input-Grad < n
tK (2n) ≤ 3 · tK (n) + 8n , t(1) = 1
Lösung der divide-and-conquer-Rekursion
t(2n) = 3 · t(n) + Θ(n) , t(1) = Θ(1)
führt zu
⇒ tK (n) ∈ Θ(nlog2 3 )
Beachte: log2 3 = 1.584962501 . . .
4
• Siehe Heun, GA, Abschnitt 7.6. für eine genaue Analyse im Fall der
Multiplikation ganzer Zahlen (Theorem 7.45)
tK (n) ≤ 41 · nlog 3
und Optimierung des Rekursionsabbruchs (Theorem 7.46)
tK (n) ≤ 11 · nlog 3
• Seit der Arbeit von
A. A. Karatsuba, Y. P. Ofman, Multiplication of multidigit
numbers on automata, Dokl. Acad. Nauk SSR (145 (1962), 293–294
ist es gelungen, für die Komplexität der Multiplikation ganzer Zahlen eine
obere Schranke von O(n log n log log n) zu finden:
A. Schönhage, V. Strassen, Schnelle Multiplikation grosser
Zahlen, Computing 7 (1971), 281–292,
basierend auf der Technik der Schnellen Fourier-Transformation (FFT).
• Siehe D. E. Knuth, TAOCP vol. 2 für Details.
5
• Strassens Matrix-Multiplikation
Ausgangspunkt: die Multiplikation von zwei (2 × 2)-Matrizen läßt sich mit sieben
Multiplikationen im Koeffizientenbereich ausführen — statt mit 8
Multiplikationen nach “Schulmethode”:





a11 a12
b11 b12
a11 b11 + a12 b21 a11 b12 + a12 b22


 = 

a21 a22
b21 b22
a21 b11 + a22 b21 a21 b12 + a22 b22


d11 d12

= 
d21 d22
Wichtig: das gilt über jedem Ring!
6
Man berechnet zunächst 7 Produkte
c1
= (a12 − a22 )(b21 + b22 )
c2
=
(a11 + a22 )(b11 + b22 )
c3
=
c4
=
(a11 − a21 )(b11 + b12 )
c5
= a11 (b12 − b22 )
c6
c7
(a11 + a12 ) b22
= a22 (b21 − b11 )
=
(a21 + a22 ) b11
und danach die d11 , . . . , d22 durch
d11 = c1 + c2 − c4 + c6
d12 = c4 + c5
d21 = c6 + c7
d22 = c2 − c3 + c5 − c7
Der Witz der (rekursiven) Angelegenheit:
die Koeffizienten aij , bi,j , . . . können selbst wieder Matrizen sein!
7
Mit Strassens Idee erreicht man:
Reduktion einer Matrixmultiplikation für zwei (2n × 2n)-Matrizen
auf 7 Matrixmultiplikationen von (n × n)-Matrizen,
dazu 18 Additionen/Subtraktionen von (n × n)-Matrizen
8
strassen := proc(A::matrix,B::matrix,m)
local dim,A11,A12,A21,A22,B11,B12,B21,B22,
C1,C2,C3,C4,C5,C6,C7,D11,D12,D21,D22;
if m=0 then RETURN(evalm(A&*B)) fi;
dim := 2∧(m-1);
A11 := submatrix(A,1..dim,1..dim);
B22 := submatrix(B,dim+1..2*dim,dim+1..2*dim); ...(etc.)
C1 := strassen(evalm(A12-A22),evalm(B21+B22),m-1);
C2 := strassen(evalm(A11+A22),evalm(B11+B22),m-1);
C3 := strassen(evalm(A11-A21),evalm(B11+B12),m-1);
C4 := strassen(evalm(A11+A12),B22,m-1);
C5 := strassen(A11,evalm(B12-B22),m-1);
C6 := strassen(A22,evalm(B21-B11),m-1);
C7 := strassen(evalm(A21+A22),B11,m-1);
D11 := evalm(C1+C2-C4+C6);
D12 := evalm(C4+C5);
D21 := evalm(C6+C7);
D22 := evalm(C2-C3+C5-C7);
RETURN(stackmatrix(concat(D11,D12),concat(D21,D22)));
end;
9
Komplexitätsanalyse (für n = 2m ):

(maximale) Anzahl der arithmetischen Operationen im
tS (n) := Koeffizientenbereich für die Multiplikation von zwei

(n × n)-Matrizen
tS (2n) = 7 · t(n) + 18 · n2 , tS (1) = 1
Beachte: log2 7 = 2.81 . . . !
⇒ tS (n) ∈ Θ(nlog2 7 )
Traditionelle Matrixmultiplikation benötigt für die Multiplikation von zwei
(n × n)-Matrizen
n2 · n Multiplikationen und n2 · (n − 1) Additionen von Koeffizienten
ist also ein O(n3 )-Verfahren. Seit
V. Strassen, Gaussian elimination is not optimal,
Numerische Mathematik 13 (1969), 354–356
ist es gelungen, Verfahren bis zu O(n2.38... ) zu finden (Coppersmith,
Winograd, 1990)
10
• Siehe Abschnitt 7.8 in Heun, GA, für eine genaue Analyse (Theorem 7.50)
tS (n) ≤
141 log 7
·n
5
und Optimierung des Abbruchpunktes für die Rekursion (Theorem 7.51)
tS (n) ≤ 4.62 · nlog 7
• Siehe Kapitel 31.2 in Cormen/Leiserson/Rivest für einen
Rekonstruktionsversuch der Strassenschen Idee.
11
4.3
Das Master-Theorem für Rekursionsgleichungen
siehe separate Folien
Das sogenannte “Master-Theorem” für das asymptotische Verhalten der Lösungen von
Rekursionsgleichungen findet sich in der Literatur in vielen verschiedenen Formulierung,
unterschiedlich je nach Allgemeinheit der Aussage oder verwendeter Beweistechnik. Die
nachfolgenden Folien geben nur eine Möglichkeit wieder. Das wird elementar abgehandelt, so dass man für den Beweis mit der Summationsformel für endliche geometrische
Summen auskommt. Auf tiefere Einblicke (was das mit Konvergenzradien von Reihenentwicklungen usw. zu tun hat) wird hier verzichtet, Anregungen dazu finden sich im
Begleitmaterial zur Vorlesung.
Eine besonders handliche Versions des Master-Theorems findet sich in Abschnitt 1.9 (Seiten 56–59) des Buches Algorithmik von U. Schöning (Spektrum Akademischer Verlag,
2001), die hier wiedergegeben wird:
Satz 18. Gegeben sei eine Rekursionsgleichung der Form
T (n) =
m
X
T (αi n) + Θ(nk ),
i=1
wobei 0 < αi < 1, m ≥ 1, k ≥ 0.
Dann kann T (n) asymptotisch wie folgt abgeschätzt werden:

Pm k
k

falls
Θ(n ),
i=1 αi < 1,
P
m
k
T (n) = Θ(nk log n), falls
i=1 αi = 1,

P

m
k
Θ(nc ),
falls
i=1 αi > 1.
P
c
Hierbei ist c Lösung der Gleichung m
i=1 αi = 1. (Falls der Spezialfall vorliegt, dass alle
αi denselben Wert α haben, so ist also c = − ln(m)/ ln(α).)
80
Divide-and-Conquer-Algorithmen
Fundamentales Prinzip des Problemlösens
• Divide : Zerlege das zu lösende Problem in (ein oder) mehrere kleinere
Teilprobleme gleichen Typs
• Recur : Falls Problem “elementar”: löse dieses mit spezieller Methode
Falls Problem nicht “elementar”: wende Divide rekursiv an
• Conquer : Konstruiere Lösung des Problems aus den Lösungen der
Teilprobleme
• Allgemein: sowohl die Kosten von Divide wie von Conquer sind relevant
• wichtige Parameter: Anzahl und Grösse der jeweils erzeugten Teilprobleme
1
Beispiele: Mergesort, Quicksort, Karatsuba-Multiplikation,
Strassen-Multiplikation, closest-pair Algorithmus, . . .
Bemerkung:
• Mergesort: Divide ist simpel, die eigentliche Arbeit liegt im Conquer
(merge)
• Quicksort: Divide (partition) ist komplex, Conquer ist simpel
• Karatsuba: Divide ist simpel, Conquer erfordet Arbeit
• Strassen: Divide ist simpel, Conquer erfordet Arbeit
• closest pair: Divide und Conquer erfordern Arbeit
2
Kostenbilanz bei divide-and-conquer-Algorithmen
• Mergesort: Vergleichsoperationen
rek
rek
rek
rek
Vmerge
(n) = Vmerge
(dn/2e) + Vmerge
(bn/2c) + n − 1 (n > 1), Vmerge
(1) = 0
• Quicksort: Vergleichsoperationen (im Mittel)
V quick (n) = (n − 1) +
n−1
1X
V quick (k) (n ≥ 2), V quick (1) = 0
n
k=0
• Karatsuba: Multiplikationen und Additionen von Koeffizienten
tK (2n) ≤ 3 · tK (n) + 8 · n (n ≥ 1), tK (1) = 1
• Strassen: arithmetische Operationen mit Koeffizienten
tS (2n) = 7 · t(n) + 18 · n2 (n ≥ 1), tS (1) = 1
• closest pair: Vergleichsoperationen und arithmetische Operationen
tcp (n) = 2 · tcp (n/2) + O(n log n) (n > 2), tcp (2) = 1
3
Kostenbilanz bei (statischen) divide-and-conquer-Algorithmen
• bei Problemgrösse n sei
– Div(n) : Kosten für Divide,
Con(n) : Kosten für Conquer
– an : Anzahl der entstandenen Teilprobleme,
(ni )1≤i≤an Grössen der Teilprobleme
– C(n) : Gesamtkosten
• Bilanz:
C(n) = O(1)
C(n) = Div(n) +
an
X
i=1
(n ≤ n0 )
C(ni ) + Con(n)
(n > n0 )
Explizite Lösung bei dieser Allgemeinheit schwierig.
Betrachten hier nur eingeschränkte Fälle.
4
Vereinfachende Annahmen:
• aus Problemen der Grösse n entstehen bei Divide jeweils
a Teilprobleme der Größe n/b, wobei b > 1 konstant
• auftretende Argumente n sind Potenzen von b, d.h. n = bm für m ≥ 0
• Zerlegung wird nicht vorzeitig abgebrochen: n0 = 1
Zu lösende Rekursion
C(1) = d
(n > 1)
C(n) = a · C(n/b) + Div(n) + Con(n)
{z
}
|
f (n)
Mit den Abkürzungen cm = C(bm ), fm = f (bm ) (m ≥ 0), wobei
c0 = f0 = d
cm = a · cm−1 + fm (m > 0)
(inhomogene lineare Rekursion 1. Ordnung)
5
Lösung (durch Iteration/Induktion)
cm = a · cm−1 + fm
= a · (a · cm−2 + fm−1 ) + fm
= a · (a · (a · cm−3 + fm−2 ) + fm−1 ) + fm
..
.
= aj · cm−j +
= d · am +
j−1
X
ak fm−k (j = 1, 2, 3, . . . , m)
k=0
m−1
X
k=0
ak fm−k (m ≥ 0)
in der ursprünglichen Notation
logb n−1
C(n) = d · nlogb a +
6
X
k=0
ak · f (
n
)
bk
Spezialfall: lineare overhead-Funktion f (n) = c · n
Für n = bm gilt dann
a m
b
(beachte m = logb n ⇒ am = nlogb a ,
C(n) = cm = d · am +
= d · am +
m−1
X
k=0
m−1
X
k=0
= nlogb a−1 )
ak · fm−k
ak · c · bm−k
= d · nlogb a + c · n
|
{z
}
(I)
|
m−1
X
a k
b
k=0
{z
}
(II)
7
Lösungstypen für
C(n) = d · nlogb a + c · n
|
a < b ⇒ (I) ∈ o(n)
a = b ⇒ (I) ∈ Θ(n)
a > b ⇒ (I) ∈ Θ(n
Also:
logb a
{z
(I)
}
|
(II) ∈ Θ(n)
)
m−1
X
a k
b
k=0
{z
}
(II)
⇒ C(n) ∈ Θ(n)
(II) ∈ Θ(n log n) ⇒ C(n) ∈ Θ(n log n)
(II) ∈ Θ(nlogb a) ) ⇒ C(n) ∈ Θ(nlogb a )


falls a < b

Θ(n)
C(n) ∈ Θ(n log n) falls a = b



Θ(nlogb a ) falls a > b
8
Ganz analog beweist man im Fall f (n) = c · n` mit c, ` > 0

`

falls a < b`

Θ(n )
C(n) ∈ Θ(n` log n) falls a = b`



Θ(nlogb a )
falls a > b`
9
Diskussion weiterer spezieller Fälle
C(n) = a · C(n/b) + f (n) (n > 1),
C(1) = f (1) > 0,
wobei b ganz und ≥ 2, a > 0, f (n) ≥ 0.
Vereinfachung (wie vorher): für n nur Potenzen von b betrachten.
(Genaue Begründung: CLR, Abschnitt 4.4.2)
Notation (wie vorher)
cm = C(bm ), fm = f (bm ) (m ≥ 0)
Lösung der Rekursion
cm =
m
X
k=0
fk · am−k (m > 0),
c0 = f0 = f (1)
10
Fall f (n) ∈ Θ n` und a > b`
cm =
m
X
k=0
fk · am−k = am
Mit f (n) ≤ A · n , also fm ≤ A · b
`
f0 ≤
und daher
m
X
k=0
cm ∈ Θ am
m`
m
X
k=0
fk ·
1
ak
, ist
m
fk ·
X bk`
1
a
≤A·
≤A·
k
a
ak
a − b`
k=0
d.h. C(n) = cm ∈ Θ am = Θ nlogb a
11
Fall f (n) ∈ Θ n` und a < b`
cm =
m
X
k=0
fk · am−k = am
m
X
k=0
fk ·
1
ak
Mit f (n) ≤ A · n` , also fm ≤ A · bm` , ist
cm ≤ A · bm` ·
m X
a k
k=0
b`
< a · bm` ·
b`
b`
−a
also
cm ∈ O((bm )` ), d.h. C(n) ∈ O(n` )
Wegen cm ≥ fm gilt sogar
C(n) = cm ∈ Θ n`
12
Fall f (n) = B · n` · (logb n)q (n > 1) und a = b`
m
m
X
X
cm =
fk · am−k = am · f (1) + B
kq
k=0
k=1
Unterfall q < −1
Pm
q
k=1 k konvergiert für m → ∞, daher
cm ∈ Θ am , d.h. C(n) ∈ Θ nlogb a
Unterfall q = −1
Pm
Pm
q
k=1 k =
k=1
cm
= Hm ∼ log m, daher
∈ Θ am log m , d.h. C(n) ∈ Θ nlogb a log logb n
1
k
Unterfall q > −1
Pm
q
q+1
, daher
k=1 k ∈ Θ m
cm ∈ Θ am mq+1 , d.h. C(n) ∈ Θ nlogb a (logb n)1+q
13
Beispiele
t(n) = t(n/2) + c ⇒ t(n) ∈ Θ(log n)
t(n) = 2 t(n/2) + c n
t(n) = 2 t(n/2) + c n
2
t(n) = 4 t(n/2) + c n2
t(n) = 7 t(n/2) + c n2
t(n) = 2 t(n/2) + log n
t(n) = 3 t(n/2) + n log n
t(n) = 2 t(n/2) + n log n
t(n) = 5 t(n/2) + (n log n)2
⇒ t(n) ∈ Θ(n log n)
⇒ t(n) ∈ Θ(n2 )
⇒ t(n) ∈ Θ(n2 log n)
⇒ t(n) ∈ Θ(nlog2 7 )
⇒ t(n) ∈ Θ(n)
⇒ t(n) ∈ Θ(nlog2 3 )
⇒ t(n) ∈ Θ(n log2 n)
⇒ t(n) ∈ Θ(nlog2 5 )
14
Allgemeinerer Fall (“Master Theorem”)
(Heun, GA Theorem 2.17,
Cormen, Leiserson, Rivest, Abschnitte 4.3 und 4.4, “master method”)


falls f (n) ∈ Ω(nlogb (a)+ ) und a · f (n/b) ≤ c · f (n)

Θ(f (n))
C(n) ∈ Θ(nlogb a log n) falls f (n) ∈ Θ(nlogb a )



Θ(nlogb a )
falls f (n) ∈ O(nlogb (a)− )
(wobei > 0 und c < 1 konstant)
15
5
Natürliche Zahlen: abstrakt und konkret
5.1
5.1.1
Exkurs: primitiv-rekursive und rekursive Funktionen
Nachfolgerstrukturen
Definition 10. Eine Nachfolgerstruktur ist eine Struktur (A; s, 0) mit Signatur (1, 0),
d.h. eine Menge A mit ausgezeichnetem Element 0 und eine Abbildung s : A → A, die
den folgenden Axiomen genügt:
1. ∀x : s(x) 6= 0
2. ∀x, y : s(x) = s(y) ⇒ x = y
3. (A; s, 0) ist minimal
Nachfolgerstrukturen können sehr unterschiedlich “aussehen”, aber man kann sich leicht
davon überzeugen, dass je zwei solche Strukturen isomorph sind. Damit definiert in abstrakter Weise die natürlichen Zahlen N. Die Darstellung einer Zahl n durch n-fache
Anwendung der Nachfolgerfunktion s auf die Konstante 0 kann man als in unäre Codierung ansehen.
5.1.2
Primitiv-rekursive und rekursive Funktionen
Auf der rudimentären Struktur (N; s, 0) kann man nun weitere Funktionen definieren:
• Addition
add(x, 0) = x
add(x, s(y)) = s(add(x, y))
• Vorgängerfunktion
pred(0) = 0
pred(s(y)) = y
• Subtraktion (in N)
minus(x, 0) = x
minus(x, s(y)) = pred(minus(x, y))
• Multiplikation
mult(x, 0) = 0
mult(x, s(y)) = add(mult(x, y), x)
86
• Fakultät
fac(0) = 0
fac(s(y)) = mult(fac(x, y), s(y))
Das allgemeine Schema solcher Definitionen ist das der primitiven Rekursion: ausgehend
von schon bekannten Funktionen g : Nk → N und h : Nk+2 → N wird eine neue Funktion
f : Nk+1 → N rekursiv definiert durch
f (x, 0) = g(x)
f (x, s(y)) = h(x, y, f (x, y)),
wobei x = (x1 , x2 , . . . , xk ). Man schreibt dann f = primRek(g, h).
Man bezeichnet als die Klasse der primitiv-rekursiven Funktionen diejenige Menge von
Funktionen, die sich aus den sog. Grundfunktionen
• die Konstanten 0 (beliebiger Stellenzahl)
0k : Nk → N : (x1 , . . . , xk ) 7→ 0
• die Nachfolgerfunktion s
(0 ≤ k)
s : N → N : x 7→ s(x)
Begriff von berechenbarer Funktion
• die Projektionsfunktionen
π`k : Nk → N : (x1 , . . . , xk ) 7→ x`
(1 ≤ ` ≤ k)
mittels Komposition und primitiver Rekursion erzeugen lassen.
In diesem Sinne sind Addition und Multiplikation (und die anderen genannten Beispiele)
primitiv-rekursive Funktionen, denn es ist
add = primRek(π11 , s(π33 ))
mult = primRek(01 , add(π13 , π33 ))
Aus der Definition und der Tatsache, dass man die verwendeten Konstrukte in jeder
vernünftigen Programmiersprache modellieren kann, folgt:
Jede primitiv-rekursive Funktion ist eine berechenbare Funktion.
Interessant ist die Umkehrung – zunächst als Frage:
Ist jede berechenbare Funktion eine primitiv-rekursive Funktion?
87
Zunächst muss man das aus einem schlichten Grund verneinen: da Programme ja nicht
immer terminieren müssen und gemäss ihrer Definition primitiv-rekursive Funktionen
totale Funktionen sind, muss jeder sinnvolle Formalismus für berechenbare Funktionen
sich auf partielle (also nicht notwendig überall definierte) Funktionen beziehen. Also
sollte man genauer fragen:
Ist jede totale berechenbare Funktion eine primitiv-rekursive Funktion?
Hier liegt die Antwort nicht sofort auf der Hand, dafür muss man etwas tun! Tatsächlich
ist die Antwort negativ, wie zuerst anhand einer Funktionsdefinition von Wilhelm Ackermann (1926) gezeigt wurde, die (in einer speziellen Version) folgendermassen lautet
A(0, y) = y + 1
A(x, 0) = A(x − 1, 1)
falls x > 0
A(x, y) = A(x − 1, A(x, y − 1))
falls x, y > 0
Es ist nicht schwer (per Induktion) einzusehen, dass diese Rekursion immer terminiert,
diese totale Funktion also sicher (intuitiv) berechenbar ist. Aber sie kann nicht mit Hilfe
primitiver Rekursionschemata erzeugt werden!
Nachdem die gestellte Frage negativ beatwortet worden ist, schliesst sich die weitergehende Frage
Welche Konstrukte muss man noch hinzunehmen, um alle berechenbaren (totalen,, wie
nicht totalen) Funktionen rekursiv aus den Grundfunktionen zu erzeugen?
Es zeigt sich, dass ein weiteres Konstrukt genügt, die Minimalisierung, ein der whileSchleife entsprechendes Rekursionsschema.
Sei g : C : (x, y) 7→ g(x, y) eine k + 1-stellige partielle Funktion. Dabei ist wieder
x = (x1 , x2 , . . . , xk ). Die Minimalisierung µy g ist dann eine k-stellige partielle Funktion.
Zunächst der Definitionsbereich von f = µy g:
(
g(x, y) = 0
∧
x ∈ dom(f ) ⇔ ∃y :
0 ≤ z < y ⇒ g(x, z) > 0
Beachte, dass die Forderung g(x, y) = 0 bzw. g(x, z) > 0 insbesondere beinhaltet, dass
g an diesen Stellen definiert ist!
Die Funktion f = µy g : Nk ,→ N ist dann definiert durch
x ∈ dom(f ) ⇒ f (x) = min : g(x, y) = 0
y
Die Klasse von Funktionen, die entsteht, wenn neben Komposition und primitiver Rekursion als weiteres rekursives Konstruktionsschema die Minimalisierung hinzunimmt,
bezeichnet man als die Klasse der µ-rekursiven oder auch partiell-rekursiven Funktionen.
88
Jeder Programmierer weiss, dass man die loop-Konstruktion der primitiven Rekursion
durch while-Konstrukte simulieren kann, dass also die primitive Rekursion entbehrlich
wäre, sobald man die Minimalisierung zulässt. Interessant ist aber, dass man bei Vorhandensein der primitiven Rekursion die Minimalisierung nur ganz sparsam benötigt,
nämlich höchstens einmal!
• Zu jeder partiell-rekursiven Funktion f gibt es zwei primitiv-rekursive Funktionen
g und h mit
f = g ◦ µy h,
im Sinne der Gleichheit von partiellen Funktionen
(Normalformentheorem von Kleene).
Die fundamentale Tatsache, dass die Klasse der partiell-berechenbaren Funktionen mit
der Klasse der Turing-berechenbaren Funktionen übereinstimmt (und mit weiteren Formalismen wie den λ-definierbaren Funktionen von Church), ist die Grundlage für die
Church-Turing-These, dass man mit jedem dieser Formalismen den intuitiven Begriff
der berechenbaren Funktion erfasst hat.
5.2
Divisionseigenschaft
Die bei weitem wichtigste arithmetische Eigenschaft des Systems der ganzen Zahlen ist
die Divisionseigenschaft:
Theorem 19. Sind a, b ganze Zahlen und ist b > 0, so gibt es eindeutig bestimmte ganze
Zahlen q und r mit
a = b · q + r mit 0 ≤ r < b.
Man nennt q den Quotienten und r den Rest der ganzzahligen Division von a durch
b, abgekürzt: b = quo(a, b) (oder auch div(a, b)) für den Quotienten und r = mod(a, b)
(oder auch rem(a, b) für den Rest.
Falls r = rem(a, b) = 0 ist, sagt man, dass b das a teilt: b | a. Die Tatsache, dass b das a
nicht teilt, also r = rem(a, b) 6= 0, wird mit b - a notiert.
In algebraischer Terminologie bedeutet das, dass (Z; +, ∗, 0, 1) ein Ring mit euklidischer
Division, kurz: ein euklidischer Ring ist. Das hat tiefgreifende Konsequenzen, auch algorithmischer Art, und es sei hier nur als Warnung erwähnt, dass es nicht viele Ringe
mit dieser Eigenschaft gibt!
Wegen der Wichtigkeit dieser (hoffentlich bekannten!) Tatsache soll der Beweis an dieser
Stelle aufgeschrieben werden (wobei nur der Fall a ≥ 0 behandelt wird; der Fall a < 0
ergibt sich dann ohne Probleme).
– Existenz (per Induktion über a):
89
– Die Behauptung gilt für a = 0 mit q = 0 und r = 0.
– Gilt a = b · q + r mit 0 ≤ r < b, so gilt
(
b · q + (r + 1) falls r < b − 1, also r + 1 < b,
a=
b · (q + 1) + 0 falls r = b − 1.
– Eindeutigkeit:
Angenommen, es sei
a = q · b + r und a = q 0 · b + r0 mit 0 ≤ r ≤ r0 < b.
Dann ist
0 ≤ r0 − r = (q − q 0 ) · b < b.
r0 − r ist also eine Zahl, die durch b teilbar ist und im Intervall [0, b − 1] liegt. Das
trifft aber nur für die Zahl 0 zu. Also ist r = r0 und somit (q − q 0 ) · b = 0. Wegen
b > 0 kommt aber nur der Fall q = q 0 in Frage.
Folgerung 20. Ist (H; +, 0) eine Untergruppe von (Z; +, 0) so gibt es ein b ∈ N mit
H = b · Z = {b z ; z ∈ Z}.
Ist H = {0}, so leistet k = 0 das Verlangte.
Ist H 6= {0}, so muss H mindestens ein Element x 6= 0 enthalten. Da mit x auch
−x zu H gehört (Untergruppe!), kann man annehmen, dass x > 0 ist. Sei b > 0 das
kleinste Element dieser Art. Dann gilt H = b · Z. In der Tat: Zunächst folgt aus b ∈
H auch b · Z ⊆ H. Ist andererseits a ∈ H ein beliebiges Element, so folgt aus der
Divisionsbeziehung
a = b · q + r mit 0 ≤ r < b,
und wegen b · q ∈ H, dass auch r = a − b · q ∈ H ist. Dann kann aber wegen der
Minimalität von b der Rest r nicht > 0 sein. Also ist r = 0 und somit a ∈ b · Z, also
H ⊆ b · Z. somit ist H = b · Z gezeigt.
Diese Folgerung führt unmittelbar zum grössten gemeinsamen Teiler zweier ganzer Zahlen a, b (nicht beide =0):
Folgerung 21. Die Menge
a · Z + b · Z = {a · s + b · t ; s, t ∈ Z} =
6 {0}
ist eine Untergruppe d · Z von Z, d.h.
a · Z + b · Z = d · Z.
d ist der grösste gemeinsame Teiler von a und bm d = ggT(a, b).
90
Wegen d ∈ a · Z + b · Z gibt es (nicht eindeutig bestimmte) ganze Zahlen s, t mit
d=a·s+b·t
Solche Zahlen nennt man Bézout-Koeffizienten von (a, b).
Der Schlüssel für den Nachweis der Eindeutigkeit der Primfaktorisierung ganzer Zahlen
ist dieser:
Folgerung 22 (Gauss). Ist p eine Primzahl und teilt p ein Produkt a · b ganzer Zahlen,
so teilt p mindestens einen der beiden Faktoren.
Zum Beweis nimmt man an, das p | a · b und p - a gilt. p und a sind teilerfremd, d.h.
ggT(p, a) = 1; somit gibt es s, t ∈ Z mit 1 = p · s + a · t. Dann folgt aber
b = b · p · s + a · b · t.
p teilt beide Faktoren auf der rechten Seite, also auch b.
Theorem 23. Jede natürliche Zahl N ≥ 1 lässt sich auf genau eine Weise als ein Produkt von Primzahlpotenzen schreiben:
N = pe00 pe11 pe22 pe33 pe44 · · ·
Dabei ist (p0 , p1 , p2 , p3 , p4 , . . .) = (2, 3, 5, 5, 11, . . .) die unendliche Folge der Primzahlen
und die Exponenten (eo , e1 , e2 , e3 , e4 , . . .) sind natürliche Zahlen (wobei nur endlich-viele
> 0 sind).
Der Beweis wird durch vollständige Induktion geführt.
Die Existenz einer Primfaktorisierung ist einfach nachzuweisen: sie gilt fÜr die Zahl
N = 1 (leeres Produkt) und ist N > 1 eine Zahl die keine Primzahl ist, so lässt sie sich
als Produkt von zwei kleineren Zahlen schreiben. Aus deren Primfaktorisierungen erhält
ma n eine Primfaktorsierung von N .
MIt der Eindeutigkeit ist es nicht ganz so einfach! Für N = 1 ist die Aussage offensichtlich richtig, denn N = 1 kann nur durch ein leeres Produkt (alle Exponenten ei = 0)
dargestellt werden.
Sei nun N > 1 und seien
N = pe00 pe11 · · · = pf00 pf11 · · ·
zwei Darstellungen von N als Produkt von Primzahlpotenzen. Sei ferner j ein Index mit
ej > 0, d.h. pj | N . Dann muss auch fj > 0 sein, denn pj teilt das Produkt teilerfremder
Faktoren pei i auf der rechten Seite und pj teilt keine andere Primzahl.
91
Angenommen, es sei ej ≥ fj (den umgekehrten Fall erledigt man analog). Dann hat man
für die Zahl N/pfj < N zwei Darstellungen
N
f
pj j
e
e −fj
j−1
= pe00 · · · pj−1
· pj j
e
f
f
j+1
j−1
j+1
· pj+1
· · · = pf00 · · · pj−1
· p0j · pj+1
···
f
Wegen der Eindeutigkeit der Primfaktorisierung von N/pj j muss dann aber
e0 = f0 , e1 = f1 , . . . , ej−1 = fj−1 , ej − fj = 0, ej+1 = fj+1 , . . .
gelten. Das war zu zeigen.
5.3
Zahldarstellungen
Die nachfolgend beispielhaft aufgeführten Darstellungen natürlicher Zahlen in verschiedenen Zahlsystemen ergeben sich aus der Divisionseigenschaft. Beachte: mit Ausnahme
der Basis-b-Darstellung (insbesondere in den Ausprägungen b = 2, 8, 10, 16) sind diese
Darstellungen nicht dazu geeignet, mit ihnen die übliche Arithmetik (Addition, Multiplikation usw.) zu betreiben. Sie haben aber andere nützliche Eigenschaften, indem
sie Mengen von häufig benutzten Objekten (Wörter, Permutationen, Teilmengen) parametrisieren. Auf diese Weise kann man jedem Objekt eindeutig eine natürliche Zahl
zuordnen (ranking) und umgekehrt zu jeder natürlichen Zahl eindeutig ein Objekt (unranking). Diesen Mechanismus kann man beipsielweise für die Zufallserzeugung diskreter
Strukturen einsetzen.
5.3.1
Basis-b-Darstellung
Es sei b ∈ N, b ≥ 2. Dann gilt:
• Zu jedem a ∈ N>0 gibt es eindeutig bestimmte k, x, y ∈ N mit
a = x · bk + y, wobei 1 ≤ x < b und 0 ≤ y < bk .
• Eindeutige Darstellung mit aj ∈ [0, b), ak 6= 0:
a = a0 + a1 b + · · · + ak−1 bk−1 + ak bk =
k
X
j=0
aj bj = ha0 , a1 , . . . , ak ib
• Parametrisierung der Wörter über {0, 1, . . . , b − 1}:
Die Abbildung
{0, 1, . . . , b − 1}k+1 → [0, bk+1 ) : (a0 , a1 , . . . , ak ) 7→ ha0 , a1 , . . . , ak ib
ist eine Bijektion. Beachte insbesondere
bk+1 − 1 = (b − 1) · (1 + b + b2 + · · · + bk ).
92
5.3.2
Faktorielle Darstellung
• Zu jedem a ∈ N>0 gibt es eindeutig bestimmte k, x, y ∈ N mit
a = x · k! + y, wobei 1 ≤ x ≤ k und 0 ≤ y < k!.
• Eindeutige Darstellung mit aj ∈ [0, j], ak > 0:
a = a1 1! + a2 2! + · · · + ak−1 (k − 1)! + ak k! =
k
X
j=1
aj j! = ha1 , a2 , . . . , ak i!
• Parametrisierung der Permutationen (z.B. mittels Inversionsvektoren):
Die Abbildung
k
Y
[1, j] → [0, (k + 1)!) : (a1 , . . . , ak ) 7→ ha1 , . . . , ak i!
j=0
ist eine Bijektion. Beachte insbesondere
(k + 1)! − 1 = 1 · 1! + 2 · 2! + · · · + k · k!
93
Beispiel: k = 3
000
100
010
110
020
120
001
101
011
111
021
121
002
102
012
112
022
122
003
103
013
113
023
123
5.3.3
↔
↔
↔
↔
↔
↔
↔
↔
↔
↔
↔
↔
↔
↔
↔
↔
↔
↔
↔
↔
↔
↔
↔
↔
0 · 1! + 0 · 2! + 0 · 3!
1 · 1! + 0 · 2! + 0 · 3!
0 · 1! + 1 · 2! + 0 · 3!
1 · 1! + 1 · 2! + 0 · 3!
0 · 1! + 2 · 2! + 0 · 3!
1 · 1! + 2 · 2! + 0 · 3!
0 · 1! + 0 · 2! + 1 · 3!
1 · 1! + 0 · 2! + 1 · 3!
0 · 1! + 1 · 2! + 1 · 3!
1 · 1! + 1 · 2! + 1 · 3!
0 · 1! + 2 · 2! + 1 · 3!
1 · 1! + 2 · 2! + 1 · 3!
0 · 1! + 0 · 2! + 2 · 3!
1 · 1! + 0 · 2! + 2 · 3!
0 · 1! + 1 · 2! + 2 · 3!
1 · 1! + 1 · 2! + 2 · 3!
0 · 1! + 2 · 2! + 2 · 3!
1 · 1! + 2 · 2! + 2 · 3!
0 · 1! + 0 · 2! + 3 · 3!
1 · 1! + 0 · 2! + 3 · 3!
0 · 1! + 1 · 2! + 3 · 3!
1 · 1! + 1 · 2! + 3 · 3!
0 · 1! + 2 · 2! + 3 · 3!
0 · 1! + 2 · 2! + 3 · 3!
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
↔
↔
↔
↔
↔
↔
↔
↔
↔
↔
↔
↔
↔
↔
↔
↔
↔
↔
↔
↔
↔
↔
↔
↔
1234
2134
1324
3124
2314
3214
1243
2143
1423
4123
2413
4213
1342
3142
1432
4132
3412
4312
2341
3241
2431
4231
3421
4321
Fibonacci-Darstellung
(Fn )n≥1 = (1, 2, 3, 5, 8, . . .) sei die Folge der Fibonacci-Zahlen.
• Zu jedem a ∈ N>0 gibt es eindeutig bestimmte k, y ∈ N mit
a = Fk + y, wobei 0 ≤ y < Fk−1 .
• Eindeutige Darstellung mit aj ∈ {0, 1}, aj aj−1 = 0, ak = 1:
a = a1 F1 + a2 F2 + · · · + ak−1 Fk−1 + ak Fk =
k
X
j=1
ak Fk = ha1 , a2 , . . . , ak iφ
• Parametrisierung der Fibonacci-Wörter (d.h. Wörter über {0, 1}, in denen 11 als
Faktor nicht vorkommt)
Die Abbildung
Φ → [0, Fk ) : (a1 , . . . , ak ) 7→ ha1 , . . . , ak iφ
94
ist eine Bijektion. Beachte insbesondere
Fk − 1 = Fk−2 + Fk−4 + · · · .
Beispiel: k = 5
5.3.4
00000
10000
01000
00100
10100
00010
10010
01010
00001
10001
01001
00101
10101
↔
↔
↔
↔
↔
↔
↔
↔
↔
↔
↔
↔
↔
0
F1
F2
F3
F1 + F3
F4
F1 + F4
F2 + F4
F5
F1 + F5
F2 + F5
F3 + F5
F1 + F3 + F5
= 0
= 1
= 2
= 3
= 4
= 5
= 6
= 7
= 8
= 9
= 10
= 11
= 12
Binomialdarstellung
• Zu jedem a ∈ N>0 , k ∈ N≥1 gibt es eindeutig bestimmte x, y ∈ N mit
x
x
a=
+ y wobei 0 ≤ y <
.
k
k−1
Eindeut. Darstellung (für festes k) mit 0 ≤ a1 < a2 < · · · < ak−1 < ak :
a1
a2
ak−1
ak
+
+ ··· +
+
= ha1 , a2 , . . . , ak i()
a=
1
2
k−1
k
• Parametrisierung der k-Teilmengen
Die w ∈ Bnk seien dargestellt als Linearkombinationen der Basisvektoren ei =
(δi,j )1≤j≤n (1 ≤ i ≤ n), d.h. w = ei1 ⊕ ei2 ⊕ · · · ⊕ eik mit 1 ≤ i1 < i2 < . . . < ik ≤ n.
Die Abbildung
Bnk → [0,
n
k
) : w = ⊕1≤j≤k eij 7→ hi1 − 1, . . . , ik − 1i()
ist eine Bijektion. Beachte insbesondere
n
n−1
n−2
n−k
−1=
+
+ ··· +
.
k
k
k−1
1
95
Beispiel: n = 5, k = 3
11100 ↔
11010 ↔
10110 ↔
01110 ↔
11001 ↔
10101 ↔
01101 ↔
10011 ↔
01011 ↔
00111 ↔
0
1
0
1
0
1
1
1
0
1
0
1
1
1
0
1
1
1
2
1
96
+
+
+
+
+
+
+
+
+
+
1
2
1
2
2
2
2
2
1
2
2
2
2
2
3
2
3
2
3
2
+
+
+
+
+
+
+
+
+
+
2
3
3
3
3
3
3
3
4
3
4
3
4
3
4
3
4
3
4
3
= 0
= 1
= 2
= 3
= 4
= 5
= 6
= 7
= 8
= 9
6
Der Ring Z und seine Restklassenringe Zn
6.1
Grundlegende Eigenschaften
siehe separate Folien und Abschnitt 5.2
6.2
Euklids Algorithmus
6.2.1
Rekursive und interativer Version des euklidischen Algorithmus
6.2.2
Komplexität im uniformen und logarithmischen Kostenmodell
6.2.3
Der erweiterte euklidische Algorithmus
6.2.4
Lösen ganzzahliger lineare Gleichungen
6.2.5
Der binäre euklidische Algorithmus
siehe separate Folien
97
Arithmetik
• Grundlegende Tatsachen über den Ring Z
• Euklidischer Algorithmus
• Lösung ganzzahliger Gleichungssysteme
• Binärer euklidischer Algorithmus
1
Grundlegende Tatsachen über den Ring Z
• hZ; +, · i ist ein nullteilerfreier Ring
• Divisionseigenschaft
∀a ∈ Z, b ∈ Z>0 ∃q, r ∈ Z : a = b · q + r, 0 ≤ r < b
• Bezeichnungen
a
q = b c = (a div b)
b
a
r = a − b c · b = (a mod b)
b
• Teilbarkeit
: Quotient
: Rest
b teilt a : b|a ⇔ (a mod |b|) = 0
2
• grösster gemeinsamer Teiler für (a, b) ∈ Z × Z, (a, b) 6= (0, 0)
ist d ∈ Z>0 mit
d|a ∧ d|b ∧ ( ∀c ∈ Z>0 : c|a ∧ c|b ⇒ c|d )
Bezeichnung: d = ggT(a, b)
Tatsache: d = ggT(a, b) = max{c ∈ Z>0 ; c|a ∧ c|b}
Konvention (GA): ggT(0, 0) = 0
• kleinstes gemeinsames Vielfaches für (a, b) ∈ Z × Z, (a, b) 6= (0, 0)
ist m ∈ Z>0 mit
a|m ∧ b|m ∧ ( ∀c ∈ Z>0 : a|c ∧ b|c ⇒ m|c )
Bezeichnung: m = kgV(a, b)
Tatsache: m = kgV(a, b) = min{c ∈ Z>0 ; a|c ∧ b|c}
3
• p ∈ Z>1 ist Primzahl, wenn gilt
∀a ∈ [1..p] : (a|p ⇒ a = 1 ∨ a = p)
• Euklid:
p Primzahl ⇒
∀a, b ∈ Z : p|(a · b) ⇒ p|a ∨ p|b
• Euklid: es gibt unendlich viele Primzahlen
• Fundamentalsatz der Arithmetik (Gauss, GA Theorem 7.21)
Die Zerlegung natürlicher Zahlen in ihre Primteiler (mit Vielfachheiten)
ist eindeutig, d.h.
zu jeder natürlichen Zahl n > 1 gibt es eindeutig bestimmte
Primzahlen p1 < p2 < . . . < pk und Exponenten e1 , e2 , . . . , ek ∈ N>0
mit
n = pe11 · pe22 · · · pekk
• Die Berechnung dieser Darstellung (Faktorisierung) ist mutmasslich ein
algorithmisch sehr aufwendiges Problem.
4
• Sind a, b ∈ Z>0 mit
β1
β2
βk
αk
α2
1
a = pα
1 · p2 · · · pk , b = p1 · p2 · · · pk
mit Primzahlen p1 < p2 < . . . < pk und Exponenten
α1 , α2 , . . . , αk , β1 , β2 , . . . , βk ≥ 0, so gilt
min{α1 ,β1 } min{α2 ,β2 }
p2
ggT(a, b) = p1
max{α1 ,β1 } max{α2 ,β2 }
p2
kgV(a, b) = p1
min{αk ,βk }
· · · pk
max{αk ,βk }
· · · pk
ggT und kgV ganzer Zahlen lassen sich also prinzipiell mittels Faktorisierung
berechnen — das ist aber keine effiziente Methode!
• ggT(a, b) · kgV(a, b) = a · b
• Ganze Zahlen a, b heissen teilerfremd (relativ prim), wenn ggT(a, b) = 1.
5
Euklidischer Algorithmus — Grundalgorithmus
Von Euklid stammt ein effizientes Verfahren zur ggT-Berechnungs mittels
iterierter Division mit Rest:
rekursive Version:
Euclid-rek (int a,int b)
iterative Version:
Euclid-iter (int a,int b)
if b = 0 then
return(a)
else
return(Euclid-rek(b, a mod b))
end if
α := a, β := b
while β 6= 0 do
(α, β) := (β, α mod β)
end while
return(α)
basierend auf
Theorem (GA, Thm. 7.19)
∀a, b ∈ Z : ggT(a, b) = ggT(b, a mod b)
6
Schema der Ausführung von Euklids Algorithmus
a0
:= a
a1
:= b
a0
=
a1
=
a2
=
..
.
an−2
=
an−1
=
a1 · q0 + a2
(q0 ∈ Z, 0 < a2 < a1 )
a3 · q2 + a4
(q2 ∈ N+ , 0 < a4 < a3 )
a2 · q1 + a3
(q1 ∈ N+ , 0 < a3 < a2 )
an−1 · qn−2 + an
(qn−2 ∈ N+ , 0 < an < an−1 )
(qn−1 ≥ 2, an+1 = 0)
an · qn−1
hq0 , q1 , q2 , . . . , qn−1 i : Quotientenfolge
ha0 , a1 , a2 , . . . , an , 0i : Restefolge
7
Beispiel: a = 57, b = 33
57 = 33 · 1 + 24
33 = 24 · 1 + 9
24 = 9 · 2 + 6
9=6·1+3
6=3·2
Quotientenfolge: hq0 , q1 , . . . , q4 i = h1, 1, 2, 1, 2i
Restefolge: ha0 , a1 , a2 , . . . , a6 i = h57, 33, 24, 9, 6, 3, 0i
8
• Terminierung
a0 ≥ a1 > a2 > · · · > an > an+1 = 0 für ein n ≥ 1
• Korrektheit
ggT(a, b) = ggT(a0 , a1 )
= ggT(a1 , a2 )
= ggT(a2 , a3 )
= · · · = ggT(an , an+1 ) = ggT(an , 0) = an
9
Effizienz wird gesichert durch den Satz von Lamé (1845):
Wenn die Berechnung von ggT(a, b) für a > b > 0 genau k Aufrufe der
Prozedur Euclid-rek (bzw. k Schleifendurchläufe der while-Schleife in
Euclid-iter) erfordert, dann gilt a ≥ fk+2 und b ≥ fk+1 , wobei fi die
i-te Fibonacci-Zahl ist.
Aus den bekannten Aussagen über die Fibonacci-Zahlen ergibt sich:
Sind a, b ∈ N mit a ≥ b, dann ist die Zahl der Divisionschritte im
Euklidischen Algorithmus für a, b ≤ 4.8 · log10 (a) + 2.
This theorem has the historical claim of being the first practical
application of the Fibonacci sequence; since the many other applications
of the Fibonacci numbers to algorithms and to the study of algorithms
have been discovered.
D. E. Knuth, TAOCP, chap. 4.5.3.
10
Eine alternative Betrachtung:
Euklids Algorithmus für (a, b) = (a0 , a1 ) erzeugt zu der Folge
ai = ai+1 · qi + ai+2
(0 ≤ i ≤ n)
von Divisionsschritten eine Quotientenfolge hq0 , q1 , . . . , qn i mit
qi ≥ 1 (0 ≤ i < n)
und qn ≥ 2
Es gilt
ai+2 · (qi + 1) < ai+1 · qi + ai+2 = ai (0 ≤ i < n)
und somit
qi + 1 < ai /ai+2 (0 ≤ i < n) und qn = an /an+1 .
11
Ausgehend von a = a0 ≥ a1 = b ergibt sich
2n+1
n−1
Y
n−1
an Y ai
a0 · · · an
≤
an+1 i=0 ai+2
a2 · · · an+1 an+1
2
a
≤
ggT(a, b)
(qi + 1) <
≤
qn
=
a0 a1
an+1 an+1
i=0
• Theorem : Für a, b ∈ N benötigt die Berechnung von ggT(a,b) höchstens
b2 · log2 max(a, b)c + 1 Divisionsschritte
(Linearität in der Problemgrösse)
12
Untersuchung im logarithmischen Komplexitätsmodell:
`β (a) : Grösse (Länge) von a bei der Darstellungen in Basis β
Jeder Divisionschritt ai = ai+1 · qi + ai+2 erfordert `β (ai+1 ) · `β (qi ) Operationen
in β-Arithmetik.
Gesamtaufwand, gemessen in Basis-β-Operationen für Euklids Algorithmus (a, b):
n
X
i=0
`β (ai+1 ) · `β (qi )
und dies ist, unter der Annahme a ≥ b, beschränkt durch
!
n−1
n−1
X
Y
`β (a1 ) ·
`β (qi + 1) + `β (qn ) ∼ `β (b) · `β (qn ·
(qi + 1))
i=0
i=0
≤ 2 `β (b) · (`β (a) − `β (ggT(a, b)) + 1)
13
Euklidischer Algorithmus — erweiterte Form
Eine fundamental wichtige Eigenschaft des ggT für ganze Zahlen ist:
der ggT(a, b) lässt sich als Linearkombination von a und b mit
ganzzahligen Koeffizienten darstellen ( Bézout-Beziehung)
∀a, b ∈ Z ∃s, t ∈ Z : a · s + b · t = ggT(a, b)
Tatsächlich ist ggT(a, b) die kleinste positive Zahl ∈ Z, die sich als
Linearkombination von a und b darstellen lässt.
14
Die algebraische Sicht:
• Für a, b ∈ Z ist
Ha,b = { a · u + b · v ; u, v ∈ Z }
eine Untergruppe (sogar ein “Ideal”) von Z,
d.h. x, y ∈ Ha,b ⇒ x − y ∈ Ha,b (und u · x ∈ Ha,b für alle u ∈ Z)
• Divisionseigenschaft von Z ⇒ ist H 6= {0} eine Untergruppe von Z, so gilt
H = k · Z = {k · u ; u ∈ Z }
wobei k = min{h ∈ H ; h > 0}
• Für a, b ∈ Z mit (a, b) 6= (0, 0) gilt Ha,b = k · Z mit k = a · s + b · t und es ist
k = ggT(a, b), denn
– a ∈ Ha,b ⇒ k | a und b ∈ Ha,b ⇒ k | b
– c|a ∧ c | b ⇒ c | (a · s + b · t) = k
• Das liefert noch kein algorithmisches Verfahren zur Berechnung von (s, t)
15
Extended Euclid (int a, int b)
{
/* returns (d, s, t), where d = gcd(a, b) = as + bt */
if (b == 0) return (a, 1, 0);
else
{
(d0 , s0 , t0 ) = Extended Euclid(b, a mod b);
s = t0 ;
t = s0 − t0 · (a div b);
return (d0 , s, t);
}
}
16
Iterative Version des erweiterten Euklidischen Algorithmus:
seien a ≥ b > 0
für i = 0, 1, 2, . . . seien α(i) = hsi , ti , ai i ∈ Z3 und qi ∈ N+ definiert durch
α(0) := h1, 0, ai
α(1) := h0, 1, bi
i := 1
while ai 6= 0 do
qi−1 := bai−1 /ai c
α(i+1) := α(i−1) − qi−1 · α(i)
i := i + 1
end while
17
Beispiel a = 57, b = 33
α(0) = h1, 0, 57i
α(1) = h0, 1, 33i
α(2) = α(0) − q0 · α(1) = h1, −1, 24i
α
(3)
=α
(1)
α
(4)
=α
(2)
− q1 · α
(2)
− q2 · α
(3)
− q4 · α
(5)
= h−1, 2, 9i
= h3, −5, 6i
α(5) = α(3) − q3 · α(4) = h−4, 7, 3i
α
(6)
=α
(4)
= h11, −19, 0i
q0 = b57/33c = 1
q1 = b33/24c = 1
q2 = b24/9c = 2
q3 = b9/6c = 1
q4 = b6/3c = 2
Bézout-Beziehung
57 · (−4) + 33 · 7 = 3 = ggT(57, 33)
Notabene
57 · 11 − 33 · (−19) = 0, 11 =
57
33
, 19 =
ggT(57, 33)
ggT(57, 33)
18
Die Eigenschaften des erweiterten Euklidischen Algorithmus ergeben sich leicht
aus einer Darstellung in Matrizenschreibweise
α = hα1 , α2 , α3 i := h1, 0, ai
β = hβ1 , β2 , β3 i := h0, 1, bi
while β3 6= 0 do
q := α3 div β3
 

 
α
0 1
α
  := 
 
β
1 −q
β
end while
hs, t, di := hα1 , α2 , α3 i
19
Es ist

α(i)


0

=
α(i+1)
1
für 0 ≤ i ≤ n;
daher ist

0
···
−qi−1
1
1

1
−q0


1
0
0
1

a

b
 
  a
 
α  
0
  b  =  
 
β
0
−1
eine Schleifeninvariante.
Mit α(i) = hsi , ti , ai i ist
a · si + b · ti = ai für 0 ≤ i ≤ n + 1
20
Daraus ergibt sich die Bézout-Beziehung:
a · sn + b · tn = an = ggT(a, b)
sowie
a · sn+1 + b · tn+1 = an+1 = 0
mit
sn+1 = (−1)n+1
b
a
und tn+1 = (−1)n
ggt(a, b)
ggt(a, b)
21
Beweis (Induktion über Anzahl der Divisionen im EA)
beachte: ist hq0 , q1 , . . . , qn−1 i die Quotientenfolge für EA(a0 , a1 ), so ist
hq1 , q2 , . . . , qn−1 i die Quotientenfolge für EA(a1 , a2 ), wobei
ggt(a0 , a1 ) = ggt(a1 , a2 ), daher
0
s
@ n
sn+1
0
1
0
10
1
0
1
0
1
0
1
A=@
A···@
A@
A
tn+1
1 −qn
1 −q1
1 −q0
0
10
1 0
s0n−1 t0n−1
0
1
s0
A@
A = @ n−1
=@
(−1)n a2
s0n
t0n
1 −q0
ggt(a1 ,a2 )
0
1
t0n−1
s0n−1 − q0 t0n−1
A
= @ (−1)n+1 a
n+1
a1
(−1)n a2
1
− q0 (−1)
ggt(a0 ,a1 )
ggt(a0 ,a1 )
ggt(a0 ,a1 )
0
1
t0n−1
s0n−1 − q0 t0n−1
A
=@
n+1
n
tn
1
(−1)
a1
ggt(a0 ,a1 )
t0n−1
(−1)n+1 a1
ggt(a1 ,a2 )
10
A@
0
1
1
−q0
(−1) a0
ggt(a0 ,a1 )
22
Beispiel a = 57, b = 33:
Quotientenfolge : hq0 , . . . , q4 i = h1, 1, 2, 1, 2i

0

1

0

1

1
0

−2
1

0

1

1
0

−1
1

1
0

−1
1

0

1

1
0

−2
1

1
0

−2
1

1
0

−2
1

0

−1
1

1
0

−1
1

1
0

−1
1

1
0

−1
1
1
1


1
=
−1
−1
 
−1
1
=
−1
3
 
1
3
=
−1
−4
 
1
−4
=
−1
11

−1

2

2

−5

−5

7

7

−19
23
Euklids Algorithmus (in der erweiterten Form von Bézout) behandelt ein
fundamentales Problem:
Lösen linearer Gleichungen in Z
denn es gilt für a, b, c ∈ Z mit (a, b) 6= (0, 0):
∃ u, v ∈ Z : a · u + b · v = c ⇔ ggT(a, b) | c
und wenn diese Bedingung erfüllt ist, ist die Menge der ganzzahligen Lösungen
der Geradengleichung
a·x+b·y =c
gegeben durch
c
k
· (s, t) + · (−b, a) (k ∈ Z)
d
d
wobei s, t Bézout-Koeffizienten für (a, b) und d = ggT(a, b) sind, d.h.,
a·s+b·t=d
(x, y) =
24
1
A
25
Zum Beweis:
• es gilt
Ha,b = { a · u + b · v ; u, v ∈ Z } = ggT(a, b) · Z
daher ist a · x + b · y = c in Z lösbar ⇔ c ∈ Ha,b (d.h. ggT(a, b) | c)
• falls Lösbarkeit gegeben und d = ggT(a, b)
a·x+b·y =c⇔
a
b
c
·x+ ·y =
d
d
d
wobei nun ggT(a/d, b/d) = 1, d.h. es genügt, den Fall ggT(a, b) = 1 zu betrachten
• mit Bézout-Koeffizienten s, t, d.h. a · s + b · t = 1 gilt
a · (c · s) + b · (c · t) = c
d.h. (x0 , y0 ) = (c · s, c · t) ist spezielle Lösung von a · x + b · y = c
• (x, y) = (x0 + X, y0 + Y ) ist genau dann Lösung von a · x + b · y = c, wenn (X, Y )
Lösung von a · X + b · Y = 0
• die Lösungen von a · X + b · Y = 0 sind genau die (k · b, −k · a) mit k ∈ Z —
hierfür benötigt man ggT(a, b) = 1
26
Beispiel
• 57 · x + 33 · y = −9
Lösungsmenge:
k
−9
· (−4, 7) + · (−33, 57)
3
3
= (12 − 11 · k, −21 + 19 · k) (k ∈ Z)
(x, y) =
• 57 · x + 33 · y = −8
Lösungsmenge: ∅
Wichtige Bemerkung:
man kann diese Idee ausbauen zu einem Verfahren, um die Menge der
ganzzahligen Lösungen von linearen Gleichungssysteme mit ganzzahligen
Koeffizienten zu berechnen.
27
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
(11)
(12)
(13)
(14)
(15)
57x + 33y
x+y
24x + 33z
x+z
24u + 9z
2u + z
6u + 9v
u+v
6w + 3v
2w + v
v
u
z
x
y
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
−9
z
−9
u
−9
v
−9
w
−9
−3
−3 − 2w
3w + 3
−9 − 8w
11w + 12
−21 − 19w
die zu lösende Gleichung
Division mit 33 = min{57, 33}, neue Variable z
(1) − 33 · (2)
Division mit 24 = min{24, 33}, neue Variable u
(3) − 24 · (4)
Division mit 9 = min{24, 9}, neue Variable v
(5) − 9 · (6)
Division mit 6 = min{6, 9}, neue Variable w
(7) − 6 · (8)
Division mit min{3, 6} = 3
aus (10)
aus (11) und (8)
aus (12) und (6)
aus (13) und (4)
aus (14) und (2)
Die ganzzahlige Lösungsmenge der Gleichung 57x + 33y = −9 ist also
(x, y) = (12, −21) + w · (11, −19) mit w ∈ Z
28
Das Verfahren funktioniert auch für Gleichungen mit mehreren Variablen
(1)
8x − 7y − 5z
(2)
(3)
x−y−z
3x − 2y + 5u
=
2
zu lösende Gleichung
=
u
Division mit 5, neue Variable u
=
2
(1) − 5 · (2)
(4)
x − y + 2u
=
v
Division mit 2, neue Variable v
(5)
x + 2v + u
=
2
(6)
x
=
2 − u − 2v
(3) − 2 · (4)
(7)
y
=
(8)
z
=
2 + u − 3v
−3u + v
aus (5)
aus (6) und (4)
aus (7) und (2)
Die ganzzahlige Lösungsmenge der Gleichung 8x − 7y − 5z = 2 ist also
2 3 2
3
2 3
x
−1 −2 2 3
2
6 7 6
7 u
6 7
6y 7 = 6 1
7
6
7
4
5
+
−35
4 5 4
425 u, v ∈ Z
v
z
−3
1
0
29
Zur Lösung linearer Gleichungen über Z
Gesucht ganzzahlige Lösungsmenge von
(∗) a1 · x1 + a2 · x2 + · · · + an · xn = b
wobei a1 , · · · , an , b ∈ Z, nicht alle ai = 0
– ohne Einschränkung sei a1 > 0 und a1 = min1≤i≤n {|ai | ; ai 6= 0}
– Fall 1: a1 = 1
dann ist die allgemeine Lösung von (*) gegeben durch
(b − a2 · x2 − · · · − an · xn , x2 , . . . , xn ) mit (x2 , . . . , xn ) ∈ Zn−1
– Fall 2a: a1 > 1, alle ai durch a1 teilbar
dann ist (*) lösbar ⇔ a1 | b und Lösung ergibt sich aus
a1
a2
an
b
· x1 +
· x2 + · · ·
· xn =
a1
a1
a1
a1
→ Fall 1.
30
– Fall 2a: a1 > 1, nicht alle ai durch a1 teilbar
Bezeichnungen (÷ = ganzzahlige Division)
a = ha1 , a2 , . . . , an i
x = hx1 , x2 , . . . , xn i
(a ÷ a1 ) = ha1 ÷ a1 , a2 ÷ a1 , . . . , an ÷ a1 i
| {z }
=1
(a mod a1 ) = ha1 mod a1 , a2 mod a1 , . . . , an mod a1 i
| {z } |
{z
}
=0
nicht alle =0
Zu lösende Gleichung (• = Skalarprodukt)
(∗)
a•x=b
Divisionsbeziehung
a = a1 · (a ÷ a1 ) + (a mod a1 )
31
Daher
a • x = a1 · (a ÷ a1 ) • x +(a mod a1 ) • x
|
{z
}
y
Betrachte y als neue Variable mit
(∗∗) y = x1 + b
a2
an
c · x2 + · · · + b c · xn
a1
a1
Mit
e = ha1 , a2 mod a1 , . . . , an mod a1 i
a
e = hy, x2 , . . . , xn i
x
gilt: die Lösungen hx1 , x2 , . . . , xn i von (∗) entsprechen ein-eindeutig den
Lösungen hy, x2 , . . . , xn i von
e•x
e=b
a
vermöge (∗∗).
Wichtig (für die Terminierung):
min{a1 , a2 mod a1 , . . . , an mod a1 } < a1
32
Das Verfahren lässt sich für die Bestimmung der ganzzahligen Lösungen
ganzzahliger Gleichungssysteme verwenden.
Beispiel (vgl. Knuth, TAOCP, Abschnitt 4.5.2)
1. zu lösendes System
10w
6w
+
3x
+
3y
− 7x
+
8z
=
1
−
5z
=
2
2. Elimination von y mittels der ersten Gleichung und Einführung einer neuen
Variablen t1
3w
+
x +
y
+
2z
=
t1
+
3t1
+
2z
=
1
w
3. Elimination von w aus zweiter Gleichung
6(1 − 3t1 − 2z) − 7x −
18t1
+
33
7x +
5z
=
2
17z
=
4
4. Elimination von x durch Einführung einer neuen Variablen t2
2t1
+
x
+
2z
= t2
4t1
+
7t2
+
3z
=
4
5. Elimination von z durch Einführung einer neuen Variablen t3
t1
+
2t2
+
z
t1
+
t2
+
3t3
= t3
=
4
6. Auflösen nach t2 und Rückwaärtseinsetzen liefert
w
=
x =
y
=
z
=
17 −
5t1
+
19t1
+
t1
20 −
−55
−8
5t1
−
14t3
+
45t3
+
7t3
−
17t3
34
35
Der binäre Euklidische Algorithmus
macht sich die Binärdarstellung der Zahlen zu Nutze und realisiert die Berechnung
des ggT mittels Subtraktion und Division durch Zweierpotenzen (= shift).
Er benützt die (offensichtlichen) Beziehungen
ggT(2a, 2b) = 2 · ggT(a, b)
(a, b ∈ N)
ggT(2a, b) = ggT(a, b)
(a, b ∈ N, b ungerade)
ggT(a, b) = ggT(a − b, b)
(a, b ∈ N, a ≥ b, beide ungerade)
36
Binary Euclid (int a, int b)
{ /* returns gcd(a, b) provided that a, b ∈ N */
int d = 1;
while ((a mod 2 == 0) && (b mod 2 == 0))
{
a = a/2; b = b/2; d = 2 · d;
}
while (a 6= 0)
{
/* a or b is odd */
while (a mod 2 == 0) a = a/2;
while (b mod 2 == 0) b = b/2;
/* a and b are odd */
if (a < b) swap(a, b)
a = a − b;
}
return (b · d);
}
37
Beispiel: a = 40902, b = 24140
a
40902
20451
14416
5134
1666
68
816
34
0
b →
a
b
24140 → 20451
12770
12770 → 20451
6035 →
6035
901
6035
901 →
2567
901
901 →
833
901
833 →
17
833
17 →
51
17
17 →
17
17
⇒d=2
17 →
⇒ ggT(40902, 24140) = 2 · 17 = 34
38
• Termination und Korrektheit von Binary Euclid ergeben sich aus den drei
verwendeten Gleichungen für den ggT
• Bei jedem Durchlauf der äusseren while-Schleife wird mindestens eines der
beiden Argumente halbiert ⇒ O(log(a + b)) Schleifendurchläufe
• Jeder Schleifendurchlauf erfordert Operationen (Vergleiche, Zuweisungen,
Divisionen durch 2, Subtraktion), die sich insgesamt in O(log(a + b))
Bit-Operationen ausführen lassen
• Binary Euclid berechnet den ggT von natürlichen Zahlen mit
O(log2 (a + b)) Bit-Operationen
(Heun, Grundlegende Algorithmen, Abschnitt 7.1; siehe auch Knuth, The
Art of Computer Programing, vol. 2, Seminumerical Algorihtms, Abschnitt
4.5.2, und Bach/Shallit, Algorithmic Number Theory, vol.1 Efficient
Algorithms, Kapitel 4)
39
Binary Extended Euclid (int a, int b)
{ /* returns (d, s, t), where d = gcd(a, b) = a · s + b · t */
(d, s, t) = (a, 1, 0);
(d0 , s0 , t0 ) = (b, 0, 1);
while (d0 6= 0)
{
if (d0 < d) swap((d, s, t), (d0 , s0 , t0 ))
0
c = 1 << max(`(d0 ) − `(d) − 1, 0); /*c = 2max(`(d )−`(d)−1,0) */
(d0 , s0 , t0 ) = (d0 , s0 , t0 ) − c(d, s, t);
}
return (d, s, t);
}
40
• die wesentliche Änderung gegenüber der iterativen Version der Euklidischen
Algorithmus
– an Stelle der exakten Quotienten bd0 /dc wird mit den angenäherten
Quotienten
0
c = 2max(`(d )−`(d)−1,0)
gerechnet (→ shift-Operationen). Dabei gilt
0
1
· bd0 /dc ≤ 2max(`(d )−`(d)−1,0) ≤ bd0 /dc
4
• Konsequenz für die Bit-Komplexität: auch Binary Extended Euclid
verwendet nur O(log2 (a + b)) Bit-Operationen.
41
a
1023
b
x=b∗2
15
`(a)−`(b)−1
c=a−x
y = b ∗ 2`(c)−`(b)−1
d=c−y
z = b ∗ 2`(d)−`(b)−1
e=d−z
`(e)−`(b)−1
u=b∗2
f =e−u
v =f ∗2
`(b)−`(f )−1
g =b−v
w = f ∗ 2`(g)−`(f )−1
h=g−w
`(a) = 10
1
1
1
1
1
1
1
1
1
1
`(b) = 4
0
0
0
0
0
0
1
1
1
1
0
1
1
1
1
0
0
0
0
0
`(c) = 10
1
0
0
0
0
1
1
1
1
1
0
1
1
1
1
0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
0
0
0
0
0
1
1
1
1
0
`(e) = 6
0
0
0
0
1
0
0
0
0
1
0
0
0
0
0
1
1
1
1
0
`(f ) = 2
0
0
0
0
0
0
0
0
1
1
0
0
0
0
0
0
0
1
1
0
480
543
480
63
`(d) = 6
30
33
30
3
6
9
`(g) = 4
6
3
`(h) = 2
42
0
0
0
0
0
0
1
0
0
1
0
0
0
0
0
0
0
1
1
0
0
0
0
0
0
0
0
0
1
1
6.3
Fibonacci-Zahlen und Lamés Theorem
Wegen der historischen Bedeutung, die von D.E. Knuth hervorgehoben wird:
This theorem has the historical claim of being the first practical application
of the Fibonacci sequence; since the many other applications of the Fibonacci
numbers to algorithms and to the study of algorithms have been discovered.
D. E. Knuth, TAOCP, chap. 4.5.3.
soll der Beweis des Theorems von Lamé separat adargestellt werden.
Zunächst wird an Eigenschaften der Fibonacci-Zahlen erinnert. Die Folge der Fibonacci-Zahlen
(Fn )n≥0 = (0, 1, 1, 2, 3, 5, 8, 13, 21, . . .)
wird definiert durch die Rekursion
F0 = 0, F1 = 1, Fn+1 = Fn + Fn−1 (n ≥ 1)
In der Terminologie der Differenzenrechnung handelt es sich um eine lineare Rekursion
2. Ordnung mit konstanten Koeffizienten, um die einfachste Rekursion dieser Art. Man
kann die Rekursion in Matrixform schreiben, also:
n 1 1
Fn+1
Fn
=
1 0
Fn Fn−1 ,
woraus man mittel der Determinanten sofort erhält:
Satz 24 (Cassinis Identität).
Fn+1 Fn−1 − Fn2 = (−1)n
mit der unmittelbaren
Folgerung 25. Für n ∈ N gilt ggT(Fn , Fn+1 ) = 1.
.
Cassinis Formel sagt sogar, was die Bézout-Koeffizienten sind. Es gilt sogar noch
mehr:
Satz 26. Für m, n ∈ N gilt
ggT(Fm , Fn ) = FggT (m, n).
Der Beweis folgt aus der Beziehung
112
Satz 27. Für m, n ∈ N gilt
Fm+n = Fm+1 Fn + Fm Fn−1 ,
die ihrerseits eine direkte Folgerung aus der Matrixbeziehung
1 1
1 0
m+n
=
1 1
1 0
m n
1 1
1 0
ist. Aus Satz 27 folgt nämlich
ggT(Fm , Fn ) = ggT(Fn , Fm mod n )
und damit ist Satz 26 eine Folge aus dem euklidischen Algorithmus.
Man beachte, dass Satz 26 eine Art Homomorphieeigenschaft ausdrückt, die sich anschaulich in einem kommutativen Diagramm darstellen lässt:
m, n


ggTy
F
−−−−→
Fm , Fn


ggTy
F
ggT(m, n) −−−−→ FggT(m,n) = ggT(Fm , Fn )
Das ist deshalb interessant, weil – wie gleich präzisiert – die Fn in Anbhängigkeit von
n exponentiell schnell wachsen, der Weg im Diagramm über die obere rechte Ecke über
sehr grosse Zahlen führt, während der über die linke untere Ecke das unter Umständen
drastisch vermeidet!
Mit Hilfe des goldenen Schnittes, das ist die positive Lösung
√
1+ 5
φ=
= 1.618 . . .
2
der Gleichung X 2 = X + 1, die andere ist
√
5
1
−
φb =
= −0.618 . . . ,
2
kann man die Fibonacci-Zahlen explizit darstellen17 :
Satz 28.
Fn =
φn − φbn
√
5
` n´
b
Genau gesagt: die Folgen (φn )n≥0 und φ
sind unabhängige Fundamentallösungen der Rekursin≥0
on xn+1 = xn + xn−1 . Die Folge (Fn )n≥0 ist als weitere Lösung dieser Rekursion eine Linearkombination
aus den Fundamentallösungen mit den passenden Anfangswerten.
17
113
Da φbn wegen |b(φ)| < 1 mit wachsendem n sehr schnell gegen 0 geht, ist sogar
j φn m
Fn = √ .
5
Die folgende Abschätzung beweist man ganz einfach per Induktion
φn−1 ≤ Fn ≤ φn−1 .
Theorem 29 (Lamé, 1845). Sind a < b < 0 ganze Zahlen und benötigt der euklidische
Algorithmus für (a, b) genau N Divisionsschritte, so ist a ≥ Fn+2 und b ≥ Fn+1 .
Der Beweis wird natürlich per Induktion geführt. Im Fall N = 1 ist a = b · q = 0, d.h.
der euklidische Algorithmus für (a, b) besteht nur aus diesem einen Divisionschritt. Dann
ist
a ≥ 2 = F3 und b ≥ 1 = F2 .
Der Schluss von N auf N + 1 besteht darin, dass wenn der e.A. für (a, b) genau N + 1
Divisionsschritte benötigt, der e.A. für (b, a mod b) genau N Divisionsschritte benötigt
und daher
b ≥ FN +2 und (a mod b) ≥ FN +1
ist. Aus a = b · q + (a mod b) mit q ≥ 1 folgt dann aber
a ≥ b + (a mod b) ≥ Fn+2 + Fn+1 = Fn+3
und genau das war zu zeigen.
Folgerung 30. √Für 0 ≤ a, b < N benötigt der euklidische Algorithmus bei Input (a, b)
höchstens dlogφ 5N e ≈ 4.785 log10 N + 1.672 Divisionsschritte.
Das ergibt sich aus der Implikation
Fn+1 < N
6.4
6.4.1
⇒
φn+1
√ <N
5
⇒ n + 1 < logφ
√
5N.
Exkurs: Kettenbrüche
Historisches
Kettenbrüche sind als eine sehr spezielle Darstellungsform reeller Zahlen bereits im Abschnitt der einleitenden Beispiele erwähnt worden. Tatsächlich reicht die Idee der Kettenbrüche, zumindest in impliziter Form, bis in die antike Mathematik zurück. Sie hat
mit dem Aufkommen der Analysis im 18. Jh. eine Blüte erlebt und sich in verschiedenen
Teilen der Mathematik, vor allem in der Zahlentheorie, aber auch in der Analysis (orthogonale Polynome, hypergeometrische Reihen) als interessanter Forschungsgegenstand
etabliert. In der Informatik haben Kettenbrüche bei der Untersuchung des dynamischen
Verhaltens von Datenstrukturen Einzug gehalten.
114
6.4.2
Der euklidische Algorithmus in Kettenbruchform
Die Gleichungen des euklidischen Algorithmus
a0 = a1 · q0 + a2
(0 < a2 < a1 )
a1 = a2 · q1 + a3
..
.
(0 < a3 < a2 )
ak = ak+1 · qk + ak+2
..
.
(0 < ak+2 < ak+1 )
an−2 = an−1 · qn−2 + an
(0 < an < an−1 )
an−1 = an · qn−1 + 0
(an+1 = 0)
kann man auch so umformen
a0
= q0 +
a1
a1
= q1 +
a2
..
.
a2
1
= q0 +
a1
a1 /a2
a3
1
= q1 +
a2
a2 /a3
ak
ak+2
1
= qk +
= q0 +
ak+1
ak+1
ak+1 /ak+2
..
.
an
1
an−2
= qn−2 +
= qn−2 +
an−1
an−1
an−1 /an−2
an−1
= qn−1
an
und daraus ergibt sich durch sukzessives Einsetzen
a0
= q0 +
a1
1
1
q1 +
1
q2 +
q3 +
1
..
.+
1
qn−1
Diese Darstellung einer rationalen Zahl a0 /a1 in Kettenbruchform ist also nicht anderes
als eine andere Darstellung des Ablaufs des euklidischen Algorithmus für (a0 , a1 )! In
der Kettenbruchdarstellung trit nur noch die Quotientenfolge (q0 , q1 , . . . , qn ) auf, die
Restefolge ist nur mehr implizit vorhanden.
115
6.4.3
Der Kettenbruchalgorithmus
Die Idee der Kettenbruchdarstellung einer rationalen Zahl und der Weg, wie diese erzeugt
wird, lässt sich zwanglos auf beliebige reelle Zahlen erweitern.
cfrac := procedure(α)
input: α ∈ R
output: q0 , q1 , q2 , . . . (endl. o. unendl.) Folge mit q0 ∈ Z, qk ∈ N≥1 (k ≥ 1)
q0 ← bαc
n←1
while α ∈
/ N do
1
α ← α−bαc
qn ← bαc
n++
end while
Für diesen Algorithmus gib es drei Alternativen (Theorem von Lagrange)
• α ∈ Q: In diesem Fall terminiert der Algorithmus und hat die Quotientenfolge des
euklidische Algorithmus für (a, b) erzeugt, wobei α = a/b;
• α∈
/ Q, aber α ist Lösung einer quadratischen Gleichung mit ganzzahligen Koeffizienten (eine quadratische Irrationalzahl : in diesem Fall wird die Quotientenfolge
der (qn )n≥0 schliesslich periodisch;
• α∈
/ Q, aber α ist nicht Lösung einer quadratischen Gleichung mit ganzzahligen
Koeffizienten: in diesem Fall wird die Quotientenfolge (qn )n≥0 nicht schliesslich
periodisch.
Als Beispiel für die erste Alternative: der euklidische Algorithmus für a = 57, b = 33
liefert
57 = 33 · +24
33 = 24 · 1 + 9
24 = 9 · 2 + 6
9=6·1+3
6=3·2
und der Quotientenfoge (1, 1, 2, 1, 2) entspricht der endliche Kettenbruch
57
=1+
33
1
1
1+
2+
1
1+
116
1
2
Beispiele für die zweite und die dritte Alternative finden sich im Abschnitt 1.1. Wie
erwähnt: der goldene Schnitt φ ist eine quadratische Irrationalzahl (Lösung der Gleichung
X 2 = X+1), der zugehörige Kettenbruch ist der einfachste unendliche Kettenbruch überhaupt. Die Kettenbrüche für e und für π sind beide nicht schliesslich-periodisch: beides
sind sog. transzendente Zahlen, also Zahlen, die überhaupt keiner Polynomgleichung mit
ganzen Koefffizienten genügen.
Schliesslich noch zwei Beispiele aus der Antike:
• Aristarch benutzt
43
= [1, 6, 6] = 1.162162162 . . .
37
als Approximation für
71 755 875
= [1, 6, 6, 4, 1, 2, 1, 2, 1, 6] = 1.162311393 . . .
61 735 500
• Archimedes benutzt
3+
10
= [3, 7, 10] = 3.14085070 . . .
71
als Approximation für
π = [3, 7, 15, 1, 292, 1, 1, 2, 1, 3, . . .] = 3.1415926535 . . .
6.4.4
Anwendungen und Ausblicke
Das Hauptinteresse an den Kettebrüchen rührt her von ihrer Approximationseigenschaft
für reelle Zahlen durch rationale Zahlen. Um das zu beschreiben, sei α eine reelle, aber
nicht rationale Zahl, so dass die vom Kettenbruchalgorithmus gelieferte Quotientenfolge
(q0 , q1 , q2 , . . .) unendlich lang ist. Sei nun
1
α(n) = q0 +
1
q1 +
1
q2 +
q3 +
1
..
.+
1
qn
Die rationalen Zahlen α(n) nennt man die Näherungsbrüche für α. Man kann sich leicht
davon überzeugen, dass diese Zahlen das α “einschachteln”:
α(0) < α(2) < α(4) < · · · < α < · · · < α(5) < α(3) < α(1) .
117
Daraus folgt, dass die Folge α(n)
se
n≥0
gegen α konvergiert und deshalb die Schreibwei1
α = lim α(n) = q0 +
n→∞
1
q1 +
1
q2 +
1
..
.
gerechtfertigt ist. Mehr noch, die Konvergenz ist ausserordentlich schnell! Um das zu
sehen, scheibe amn die rationalen Näherungsbrüche als
q3 +
α(n) =
Pn
Qn
mit ganzzahligen und teilerfremden Pn , Qn . Dann gilt, wie man leicht überprüft – ganz
wie beim euklidischen Algorithmus –
Pn
Qn
qn 1
Pn−1 Qn−1
=
·
Pn−1 Qn−1
1 0
Pn−2 Qn−2
Mittels der Determinanten erhält man hieraus
Pn Qn−1 − Pn−1 Qn = (−1) (Pn−1 Qn−2 − Pn−2 Qn−1 ) = . . .
= (−1)n−1 (P1 Q0 − P0 Q1 ) = (−1)n−1
und somit
α(n) − α(n−1) =
(−1)n−1
Qn Qn−1
und da α zwischen α(n−1) und α(n) liegt, ist
|α − α(n) | <
(−1)n−1
Qn Qn−1
Nun weiss man aus dem genaueren Studium des euklidischen Algorihtmus, dass die Qn
sehr schnell wachsen! In diesem Sinn hat man also eine sehr gute Approximation der
irrationalen Zahl α durch ihre rationale Näherungsbrüche α(n) . Man kann zeigen, dass
diese Approximation in einem sehr natürlichen Sinn sogar optimal ist. Dies hat vielfache
Anwendungen in der Mathematik, insbesondere auch bei algorithmischen Problemen.
Zunächst solle zwei Beispiele das ausserordentlich gute Approximationsverhalten illustrieren:
Beispiel 16.
1. Die Näherungsbrüche des “goldenen Schnittes”:
√
1+ 5
φ=
= [1; 1, 1, 1, 1, 1, 1, 1, . . .] = 1.618033989 . . .
2
118
sind
φ(0) = [1] = 1
φ(1) = [1; 1] = 2/1 = 2
φ(2) = [1; 1, 1] = 3/2 = 1.5
φ(3) = [1; 1, 1, 1] = 5/3 = 1.666 . . .
φ(4) = [1; 1, 1, 1, 1] = 8/5 = 1.6
φ(5) = [1; 1, 1, 1, 1, 1] = 13/8 = 1.625
φ(6) = [1; 1, 1, 1, 1, 1, 1] = 21/13 = 1.65384615 . . .
φ(7) = [1; 1, 1, 1, 1, 1, 1, 1] = 34/21 = 1.619047619 . . .
φ(8) = [1; 1, 1, 1, 1, 1, 1, 1, 1] = 55/34 = 1.617647059 . . .
119
2. Die Näherungsbrüche von e e = [2; 1, 2, 1, 1, 4, 1, 1, 6, 1, 1, 8, 1, 1, . . . = 2.7182818 . . .
sind
e(0) = [2] = 2
e(1) = [2; 1] = 3/1 = 3
e(2) = [2; 1, 2] = 8/3 = 2.666 . . .
e(3) = [2; 1, 2, 1] = 11/4 = 2.75
e(4) = [2; 1, 2, 1, 1] = 19/7 = 2.7142875 . . .
e(5) = [2; 1, 2, 1, 1, 4] = 87/32 = 2.71875
e(6) = [2; 1, 2, 1, 1, 4, 1] = 106/39 = 2.7179487 . . .
e(7) = [2; 1, 2, 1, 1, 4, 1, 1] = 193/71 = 2.7183098 . . .
e(8) = [2; 1, 2, 1, 1, 4, 1, 1, 6] = 1264/465 = 2.7182795 . . .
Abschliessend seien drei exemplarische Situationen von grosser Bedeutung der Kettenbruchtechniken für die Algorithmik genannt:
• Der Faktorisierungsalgorithmus für ganze Zahlen von Morrison und Brillhart,
der zusammen mit dem ρ-Algorithmus von Pollard den Beginn der Neuzeit des
Faktorisieren markiert,
basiert auf Informationen, die man aus der Kettenbruch√
entwicklung von N gewinnt, wenn man N faktorisieren will. Man spricht deshalb
auch von der Kettenbruchmethode 18 Tatsächlich ist die in diesem Zusammenhang
eingeführte Idee der Faktorbasen grundlegend für alle später entwickelten Faktorisierungsalgorithmen.
• Der euklidische Algorithmus für ganz Zahlen hat ein wort-wörtliches Analogon für
Polynome (auch der Polynomring F [X] über einem Körper besitzt eine euklidische
Division, ist eineuklidischer Ring). In der Informations- und Codierungstheorie
untersucht man seit langem fehlerkorrigierende Codes mit algebraischer Struktur
(zyklische Codes, oft CRC-Codes genannt (cyclic redundancy check ), um effiziente
Decodierungsalgorithmen zur Verfügung zu haben. Der prominenteste und effizienteste Algorithmus dieser Art, der Algorithmus von Berlekamp und Massey,
erweist sich bei genauem Hinsehen als ein euklidischer Algorithmus, der genau
die hervorragenden Approximationseigenschaften der Kettenbruchentwicklung benutzt19 .
• Das Faktorisierungsverfahren für ganze Zahlen von Shor, das in der Lage sein
wird, auf einem Quantencomputer das Faktorisierungsproblem in polynomieller
18
M.A. Morrison, J. Brillhart, A method of factoring and the fancorization of F7 , Mathematics
of Computation 29 (1975), 183–205. D. Bressoud, S. Wagon, A Course in Computational Number
Theory, Springer-Verlag, 2000.
19
Literaturhinweis: R.M. Roth, Introduction to Coding Theory, Cambridge UP, 2006.
120
Zeit zu lösen, benutzt bzw. implementiert neben den Besonderheiten der hochparallelen Verarbeitung auf dem Quantencomputer drei “klassische” Verfahren der
Mathematik in wesentlicher Weise20 :
– Fouriertransformation
– Faktorisierung durch Ordnungsbestimmung in UN = Z∗N
– Kettenbruchentwicklung
Letzteres dient dazu, um aus einem durch (physikalisch!) Messungen nur angenähert
bekannten Resultat das “echte” Resultat herauszudestillieren: man weiss, dass es
als Näherungsbruch in einer Kettenbruchentwicklung enthalten ist.
Generell ist der Hinweis angebracht, dass der euklidische Algorithmus und seine Beziehung zu den Kettenbrüchen in TAOCP21 ausführlichst behandelt wird. Die Grundzüge
der Theorie der Kettenbrüche findet man in jedem guten Buch zur Zahlentheorie22 .
6.5
Die Restklassenringe und ihre Einheitengruppen
siehe separate Folien
20
Literaturhinweis: P.W. Shor, Polynomial-time algorithms for prime factorization and discrete logarithms on a quantum computer, SIAM J. Computing 26 (1997). S. Loepp, W.K. Wootters, Protecting
Information. From Classical Error Correction to Quantum Cryptography, Cambridge UP, 2006. M. Hirvensalo, Quantum Computing, Springer-Verlag, 2004.
21
D.E: Knuth, The Art of Computer Programming, vol 2, Seminumerical Algorithms, Addison-Wesley,
1998, Kapitel 4.5; siehe auch R.L. Graham, D.E. Knuth, O. Patashnik, Concrete Mathematics,
Addison-Wesley, 1989, Kapitel 6.7.
22
Bespielsweise: G.H. Hardy, E.M. Wright, An Introducting to the Theory of Numbers, Oxford
UP, 1960; K.H. Rosen, Elementary Number Theory and Its Applications, Addison-Wesley, 2000; R.
Kimanduri, C. Romero, Number Theory with Computer Applications Printice-Hall, 1998.
121
6.5.1
Die Restklassenringe der ganzen Zahlen
6.5.2
Einheiten
6.5.3
Eulers φ-Funktion
6.5.4
Exkurs: Möbius-Inversion
6.5.5
Gruppentheoretisches, insbes. zyklische Gruppen
6.5.6
Die Sätze von Lagrange, Fermat und Euler
6.5.7
Ordnung und Faktorisierung
122
Die Restklassenringe Zn
Definitionen
Die Ringe Zn
I
für n > 0 wird auf Zn = {0, 1, 2, . . . , n − 1} definiert:
+n : Zn × Zn → Zn : (a, b) 7→ (a + b) mod n
∗n : Zn × Zn → Zn : (a, b) 7→ (a ∗ b) mod n
Beispiel n = 15
9 ∗15 11 = 9
9 +15 11 = 5
9 ∗15 5 = 0
9 ∧15 11 = 9
I
hZn ; +n , ∗n i ist ein Ring mit kommutativer Addition und
Multiplikation
I
hZn ; +n , ∗n i ist genau dann nullteilerfrei, wenn n eine
Primzahl ist
Die Restklassenringe Zn
Definitionen
Algebraische Bemerkung (äquivalente Definition)
Der Ring hZn ; +n , ∗n i entsteht aus dem Ring hZ; +, ∗i, indem man
Restklassen bezüglich der Untergruppe (sogar: Ideal)
nZ = {n · k ; k ∈ Z} betrachtet:
I
Die n verschiedenen Restklassen
[a]n = a + nZ = {a + n · k ; k ∈ Z}
bilden die Elemente des Ringes hZ/(nZ); ⊕n , n i mit
[a]n ⊕n [b]n = [a + b]n (a, b ∈ Z)
[a]n n [b]n = [a · b]n (a, b ∈ Z)
I
I
[a]n = [b]n ⇔ a ≡ b mod n ⇔ n|(a − b)
Die Ringe hZ/(nZ); ⊕n , n i und hZn ; +n , ∗n i sind isomorph:
(Z/nZ) 3 [a]n
⇐⇒ a mod n ∈ Zn
Die Restklassenringe Zn
Invertierbare Elemente (Einheitengruppe)
Invertierbare Elemente (“Einheiten”)
I
beachte: für a, n ∈ Z gilt (Bézout!!)
ggT(a, n) = 1 ⇔ ∃b ∃k ∈ Z : a ∗ b + n ∗ k = 1
I
Dabei gilt
ggT(a, n) = 1 ⇒ ggT(b, n) = 1
I
b ist bis auf Vielfache von n eindeutig bestimmt, ist also ein
Element von Zn !
I
Man berechnet b (bzw. b mod n) mit Hilfe des erweiterten
euklidischen Algorithmus.
Die Restklassenringe Zn
Invertierbare Elemente (Einheitengruppe)
I
für a ∈ Zn
∃b ∈ Zn : a ∗n b = 1 ⇔ ∃b ∈ Z ∃k ∈ Z : a ∗ b + n ∗ k = 1
⇔ ggT(a, n) = 1
I
I
I
I
dieses b ∈ Zn ist das Inverse von a ∈ Zn bezüglich der
Multiplikation: b = a−1
Menge der invertierbaren Elemente von Zn :
Z∗n = a ∈ {1, 2, . . . , n − 1} ; ggT(a, n) = 1
Beispiel:
EEA(11, 19) ⇒ 11 · 7 + 19 ∗ (−4) = 1 ⇒ 11−1 = 7 in Z19
Beispiel Z18
a
a−1
1 5 7 11 13 17
1 11 13 5 7 17
Die Restklassenringe Zn
Invertierbare Elemente (Einheitengruppe)
I
Z∗n hat multiplikative Gruppenstruktur, denn wegen
ggT(a, n) = 1, ggT(b, n) = 1 ⇒ ggT(a ∗ b, n) = 1
gilt
I
I
∀a, b ∈ Z∗n : a ∗n b ∈ Z∗n
∀a ∈ Z∗n ∃b ∈ Z∗n : a ∗n b = 1
(eeA!!!)
und daher:
Un = hZ∗n ; ∗n i ist eine kommutative Gruppe
(“Einheitengruppe modulo n”)
Die Restklassenringe Zn
Invertierbare Elemente (Einheitengruppe)
Beispiel Z∗18 = U18 :
∗18 1 5 7
1
1 5 7
5
5 7 17
7 17 13
7
11 11 1 5
13 13 11 1
17 17 13 11
11
11
1
5
13
17
7
13
13
11
1
17
7
5
17
17
13
11
7
5
1
Die Restklassenringe Zn
Invertierbare Elemente (Einheitengruppe)
I
Folgerung (Gleichungslösen in Zn )
∀a ∈ Z∗n ∀b ∈ Zn ∃1 x ∈ Zn : a ∗n x = b
I
nämlich x = a−1 ∗n b
Aus dem Lösungsverfahren für Z folgt:
I
Für a, b ∈ Zn gilt:
a ∗n x = b lösbar ⇐⇒ ggT(a, n) | b
I
Falls ggT(a, n) = d, so gibt es genau d verschiedene Lösungen
x0 + k ·
a
n
n
(0 ≤ k < d) wobei · x0 = in Zn/d (eindeutig )
d
d
d
Die Restklassenringe Zn
Eulers ϕ-Funktion
Eulers ϕ-Funktion
I
I
Definition: ]Un = ]Z∗n = ϕ(n)
erste Werte:
n
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
ϕ(n) 1 1 2 2 4 2 6 4 6 4 10 4 12 6 8
I
ϕ ist multiplikativ in folgendem Sinne:
ggT(a, b) = 1 ⇒ ϕ(a ∗ b) = ϕ(a) ∗ ϕ(b)
I
I
Multiplikativität ist äquivalent zu
X
n=
ϕ(d) (n > 0)
d |n
P
: Summe über alle positiven Teiler d von n
Beispiel: 18 = ϕ(1) + ϕ(2) + ϕ(3) + ϕ(6) + ϕ(9) + ϕ(18) =
1+1+2+2+6+6
d |n
Die Restklassenringe Zn
Eulers ϕ-Funktion
Folgerung aus der Multiplikativität
I
ϕ ist durch seine Werte auf Primzahlpotenzen bestimmt:
p prim ⇒ ϕ(p e ) = p e−1 (p − 1) (e > 0)
I
I
Speziell: hZn ; +n , ∗n i Körper ⇔ n Primzahl ⇔ ϕ(n) = n − 1
Q
Folgerung: falls n = ki=1 piei
ϕ(n) =
k
Y
i=1
I
I
piei −1 (pi
− 1) = n ·
Y p|n
p prim
1
1−
p
Also: Berechnung von ϕ(n) einfach, falls Primfaktorisierung
von n bekannt
Aber: bis heute ist kein effizientes Verfahren zur Berechnung
von φ(n) (z.B. ohne Kenntnis der Primfaktorisierung)
bekannt!
Die Restklassenringe Zn
Eulers ϕ-Funktion
Beispiele
I
n = 12
Z∗12 = {1, 5, 7, 11}
I
12 = 22 ∗ 3
n = 13
ϕ(12) = ]Z∗12 = 4
1
1
ϕ(12) = 12 · (1 − )(1 − ) = 4
2
3
Z∗13 = {1, 2, 3, . . . , 12}
ϕ(13) = ]Z∗13 = 12
1
ϕ(13) = 13 · (1 − ) = 12
13
13 = 13
I
n = 67914
67914 = 2 ∗ 32 ∗ 73 ∗ 11
1
1
1
1
ϕ(67914) = n · (1 − ) · (1 − ) · (1 − ) · (1 − ) = 17640
2
3
7
11
Die Restklassenringe Zn
Eulers ϕ-Funktion
Beispiel: Zerlegung von Z18
Z18 = {0, 1, 2, 3, . . . , 17}
= {1, 5, 7, 11, 13, 17} ] {2, 4, 8, 10, 14, 16}
|
{z
} |
{z
}
ggT (a,18)=1
ggT (a,18)=2
] {3, 15} ] {6, 12} ]
| {z }
| {z }
ggT (a,18)=3
ggT (a,18)=6
{9}
|{z}
ggT (a,18)=9
]
{0}
|{z}
ggT (a,18)=18
= 1 · {1, 5, 7, 11, 13, 17} ] 2 · {1, 2, 4, 5, 7, 8}
] 3 · {1, 5} ] 6 · {1, 2} ] 9 · {1} ] 18 · {0}
= 1]
· Z∗18 ] 2 · Z∗9 ] 3 · Z∗6 ] 6 · Z∗3 ] 9 · Z∗2 ] 18 · Z∗1
=
d · Z∗18/d
d | 18
⇒ 18 =
X
]Z∗18/d =
d | 18
X
ϕ(
d | 18
X
18
)=
ϕ(d)
d
d | 18
Die Restklassenringe Zn
Eulers ϕ-Funktion
Nachweis der Multiplikativität
I
Für n ∈ N und d | n ist
An,d := { a ∈ Zn ; ggT(a, n) = d } = d · Z∗n/d
I
Wegen Zn =
n = ]Zn =
U
d |n
I
An,d folgt
X
X
X
]An,d =
Z∗n/d =
ϕ(n/d) =
ϕ(d)
d |n
X
d |n
d |n
d |n
Induktion über Teilerstruktur für a, b mit ggT(a, b) = 1:
I
Angenommen: für e, f mit e|a, f |b und e · f 6= a · b sei
ϕ(e) · ϕ(f ) = ϕ(e · f ) bereits gezeigt, dann folgt
ϕ(a) · ϕ(b) = ϕ(a · b) aus
XX
X
X
X
ϕ(e · f ) =
ϕ(d) = a · b =
ϕ(e) ·
ϕ(f )
e|a f |b
d|a·b
e|a
f |b
Die Restklassenringe Zn
Möbius-Inversion
Exkurs: Möbius-Inversion
(A.F. Möbius: Über eine besondere Art der Umkehrung von
Reihen, 1831)
I
Definiere eine multiplikative Funktion µ : N>0 → {0, ±1} (die
Möbiusfunktion) durch
(
−1 für e = 1
µ(1) = 1, µ(p e ) =
(p Primzahl)
0
für e > 1
also für n = p1e1 · p2e2 · · · pkek
(
(−1)k falls e1 = e2 = . . . = ek = 1 (quadratfrei)
µ(n) =
0
sonst
I
erste Werte:
n
1 2
3 4 5 6 7 8 9 10 11 12 13 14 15
µ(n) 1 −1 −1 0 −1 1 −1 0 0 1 −1 0 −1 1 1
Die Restklassenringe Zn
Möbius-Inversion
I
µ hat die Eigenschaft
X
µ(d) = δn,1
d |n
I
(
1 n=1
=
0 n>1
Beweis mittels Binomialformel. Für n = p1e1 · p2e2 · · · pkek ist
X
µ(d) =
d |n
=
X
µ(d) ; d | n, d quadratfrei
X
X
0≤j≤k 1≤i1 <i2 <...<ij ≤k
µ(pi1 · pi2 · · · pij )
(
X k 0 k >0
j
k
=
(−1) = (1 − 1) = δk,0 =
j
1 k =0
0≤j≤k
Die Restklassenringe Zn
Möbius-Inversion
I
Sind f , g : N>0 → C Funktionen, so sind die beiden Aussagen
X
g (n) =
f (d) (n ≥ 1))
d |n
f (n) =
X
d |n
X n
n
µ(d) · g ( ) =
µ( ) · g (d)
d
d
d |n
(n ≥ 1)
äquivalent zueinander. Insbesondere ist dann jede der beiden
Funktionen durch die andere eindeutig bestimmt
I
Beweis (durch Vertauschen von Summationen):
X
X
X
X
X
n
µ(d) · g ( ) =
µ(d) ·
f (e) =
f (e) ·
µ(d)
d
n
n
d |n
d |n
e| d
e |n
d|e
X
=
f (e) · δe,n = f (n)
e |n
Die Restklassenringe Zn
Möbius-Inversion
Das spezielle Beispiel g (n) = n, f (n) = ϕ(n)
X
X
g (n) = n =
ϕ(d) =
f (d)
d |n
f (n) = ϕ(n) =
X
d |n
d |n
X
n
n
µ(d) ·
µ(d) · g ( ) =
d
d
d |n
Beachte nun für n = p1e1 · p2e2 · · · pkek
X
X
X
n
n
µ(pi1 · pi2 · · · pij ) ·
µ(d) · =
d
pi1 · pi2 · · · pij
d |n
0≤j≤k 1≤i1 <i2 <...<ij ≤k
=n·
=n·
X
X
0≤j≤k 1≤i1 <i2 <...<ij ≤k
Y p|n
p prim
1
1−
p
·
(−1)j
pi1 · pi2 · · · pij
Die Restklassenringe Zn
Untergruppen und Nebenklassen
Gruppentheoretisches Intermezzo (additiv)
G kommutative Gruppe , H Untergruppe von G
I Definition der H-Äquivalenz:
∀a, b ∈ G : a ∼H b ↔ b − a ∈ H
0∈H
⇒
a, b ∈ H → a + b ∈ H
⇒
a ∈ H → −a ∈ H
I
⇒
∼H ist reflexiv
∼H ist symmetrisch
∼H ist transitiv
Folgerung: ∼H ist eine Äquivalenzrelation auf G
Die Äquivalenzklassen (“Nebenklassen” (cosets) von H)
[a]H = {b ∈ G ; a ∼H b} = {a + h ; h ∈ H} = a + H
partitionieren G in “gleich grosse” Teile, denn
H → [a]H : h 7→ a+h ist bijektiv, also ∀a ∈ G : ][a]H = ]H
Die Restklassenringe Zn
Untergruppen und Nebenklassen
Gruppentheoretisches Intermezzo (multiplikativ)
G Gruppe, H Untergruppe von G
I Definition der H-Äquivalenz:
∀a, b ∈ G : a ∼H b ↔ a−1 ∗ b ∈ H
e∈H
⇒
a, b ∈ H → a ∗ b ∈ H
⇒
a ∈ H → a−1 ∈ H
I
⇒
∼H ist reflexiv
∼H ist symmetrisch
∼H ist transitiv
Folgerung: ∼H ist eine Äquivalenzrelation auf G
Die Äquivalenzklassen (“Nebenklassen” (cosets) von H)
[a]H = {b ∈ G ; a ∼H b} = {a ∗ h ; h ∈ H} = a ∗ H
partitionieren G in “gleich grosse” Teile, denn
H → [a]H : h 7→ a ∗ h ist bijektiv, also ∀a ∈ G : ][a]H = ]H
Die Restklassenringe Zn
Untergruppen und Nebenklassen
Bemerkung für die Definitionen der H-Äquivalenz bezüglich einer
Untergruppe H in einer nicht-kommutativen Gruppe G :
– Es kommt bei der Multiplikation auf die Reihenfolge der
Faktoren an. Die Aussagen a−1 ∗ b ∈ H (d.h. b ∈ a ∗ H) und
b ∗ a−1 ∈ H (d.h. b ∈ H ∗ a) sind i.a. nicht gleichwertig.
Entsprechend muss man “Linksnebenklassen” a ∗ H und
“Rechtsnebenklassen” H ∗ a unterschieden. Es kann
vorkommen, dass a ∗ H 6= H ∗ a
– Ist H eine Untergruppe von G und gilt a ∗ H = H ∗ a für alle
a ∈ G , so spricht man von H als einer normalen Untergruppe
oder einem Normalteiler von G .
Normalteiler sind besonders angenehme Untergruppen, weil
man auf der Menge der Nebenklassen wieder eine
Gruppenoperation definieren kann
∀a, b ∈ G : [a]H ∗ [b]H := [a ∗ b]H
Für Nicht-Normalteiler funktioniert das nicht!
Die Restklassenringe Zn
Zyklischen Gruppen
Zyklische Gruppen
I
G Gruppe (multiplikativ), a ∈ G
hai = { . . . , a−2 , a−1 , e = a0 , a = a1 , a2 , a3 , . . . } = {ak ; k ∈ Z }
I
ist eine Untergruppe von G : die von a erzeugte Untergruppe
Falls ]hai = ∞: hai hat die gleiche Struktur wie (Z, +) :
I
I
I
Falls ]hai = n < ∞: hai hat die gleiche Struktur wie (Zn , +n ) :
I
I
I
I
a hat unendliche Ordnung, ordG (a) = ∞,
hai ist eine unendliche zyklische Gruppe.
a hat endliche Ordnung, ordG (a) = n,
hai ist eine endliche zyklische Gruppe der Ordnung n.
Eine Gruppe G heisst zyklische Gruppe, wenn es ein a ∈ G
gibt mit G = hai.
Die Gruppen (Z, +) und (Zn , +n ) (für n ≥ 1) sind — bis auf
Isomorphie – die einzigen zyklischen Gruppen.
Die Restklassenringe Zn
Zyklischen Gruppen
Beispiele
Betrachten Einheitengruppen Un = Z∗n :
]hai = ordn (a): die Ordnung (Periode) von a modulo n
I
n=7
h1i = {1}
ord7 (1) = 1
h2i = {20 = 1, 21 = 2, 22 = 4, 23 = 1, . . .} = {1, 2, 4}
2
3
4
5
ord7 (2) = 3
6
h3i = {1, 3, 3 = 2, 3 = 6, 3 = 4, 3 = 5, 3 = 1, . . .}
= {1, 2, 3, 4, 5, 6}
ord7 (3) = 6
h4i = {1, 4, 2, 1, . . .} = {1, 2, 4}
ord7 (4) = 3
h6i = {1, 6, 1, . . .} = {1, 6}
ord7 (6) = 2
h5i = {1, 5, 4, 6, 2, 31, . . .} = {1, 2, 3, 4, 5, 6}
U7 = Z∗7 = h3i = h5i ist also eine zyklische Gruppe
ord7 (5) = 6
Die Restklassenringe Zn
Zyklischen Gruppen
Beispiele
I
n=8
h1i = {1}
ord8 (1) = 1
2
h3i = {1, 3, 3 = 1, . . .} = {1, 3}
ord8 (3) = 2
h5i = {1, 5, 52 = 1, . . .} = {1, 5}
ord8 (5) = 2
2
h7i = {1, 7, 7 = 1, . . .} = {1, 7}
ord8 (7) = 2
U8 = Z∗8 = {1, 3, 5, 7} =
6 h1i, h3i, h5i, h7i.
U8 ist also keine zyklische Gruppe.
Die Restklassenringe Zn
Zyklischen Gruppen
Beispiele
I
n=9
h1i = {1}
ord9 (1) = 1
2
3
4
5
6
h2i = {1, 2, 2 = 4, 2 = 8, 2 = 7, 2 = 5, 2 = 1, . . .}
= {1, 2, 4, 5, 7, 8}
h4i = {1, 4, 7, 1, . . .} = {1, 4, 7}
ord9 (4) = 3
h7i = h4i
ord9 (7) = 3
h5i = {1, 5, 7, 8, 4, 2, 1, . . .} = h2i
ord9 (5) = 6
h8i = {1, 8}
ord9 (8) = 2
U9 = Z∗9 = {1, 2, 4, 5, 7, 8} = h2i = h5i
U9 ist also eine zyklische Gruppe.
Die Restklassenringe Zn
Zyklischen Gruppen
Beispiele
I
ord9 (2) = 6
n = 10
h1i = {1}
ord10 (1) = 1
h3i = {1, 3, 9, 7, 1, . . .}
ord10 (3) = 4
h9i = {1, 9, 1, . . .}
ord10 (9) = 2
h7i = {1, 7, 9, 3, 1, . . .}
U10 = Z∗10 = {1, 3, 7, 9} = h3i = h7i
U10 ist also eine zyklische Gruppe.
ord10 (7) = 4
Die Restklassenringe Zn
Zyklischen Gruppen
I
n = 11
h1i = {1}
ord11 (1) = 1
h2i = {1, 2, 4, 8, 5, 10, 9, 7, 3, 6, 1, . . .}
ord11 (2) = 10
h3i = {1, 3, 9, 5, 4, 1, . . .}
ord11 (3) = 5
h5i = {1, 5, 3, 4, 9, 1, . . .}
ord11 (5) = 5
h4i = {1, 4, 5, 9, 3, 1, . . .}
ord11 (4) = 5
h6i = {1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1, . . .}
ord11 (6) = 10
h8i = {1, 8, 9, 6, 4, 10, 3, 2, 5, 7, 1, . . .}
ord11 (8) = 10
h7i = {1, 7, 5, 2, 3, 10, 4, 6, 9, 8, 1, . . .}
h9i = {1, 9, 4, 3, 5, 1, . . .}
h10i = {1, 10, 1, . . .}
ord11 (7) = 10
ord11 (9) = 5
ord11 (10) = 2
U11 = Z∗11 = {1, 2, 3, . . . , 10} = h2i = h6i = h7i = h8i
U11 ist also eine zyklische Gruppe.
Die Restklassenringe Zn
Zyklischen Gruppen
I
n = 12
h1i = {1}
ord12 (1) = 1
h5i = {1, 5, 1, . . .}
h7i = {1, 7, 1, . . .}
h11i = {1, 11, 1, . . .}
ord12 (5) = 2
ord12 (7) = 2
ord12 (10) = 2
U12 = Z∗12 = {1, 5, 7, 11} =
6 h1i, h5i, h7i, h11i
U12 ist also keine zyklische Gruppe.
Die Restklassenringe Zn
Lagrange, Fermat, Euler
Die Sätze von Lagrange, Fermat und Euler
I
I
Satz von Lagrange
G endliche Gruppe, H ⊆ G Untergruppe ⇒ ]H | ]G .
Folgerung:
I
G endliche (multiplikative) Gruppe mit neutralem Element e.
Für jedes a ∈ G gilt:
ordG (a) | ]G
und somit
a]G = aordG (a) = e
I
ordG (a) ist die kleinste positive Zahl t mit at = e
Die Restklassenringe Zn
Lagrange, Fermat, Euler
Nützliche Regeln für das Rechnen mit Ordnungen:
I
Wegen der Divisionseigenschaft gilt für k ∈ Z:
ak = ak mod ordG (a) = ak mod ]G
also
ak = e
I
⇔ ordG (a) | k
Für k ∈ Z gilt:
ordG (ak ) =
ordG (a)
kgV(k, ordG (a))
=
ggT(k, ordG (a))
k
Begründung: für a, b, c ∈ Z gilt
a | (b · c) ⇔
a
|c
ggT(a, b)
⇔
kgV(a, b)
|c
b
Die Restklassenringe Zn
Lagrange, Fermat, Euler
I
Spezielle Situation der Einheitengruppen Un = Z∗n modulo n:
∀a ∈ Un : ordn (a) = ]hai | ]G = ϕ(n)
also
I
I
I
∀a ∈ Un : aϕ(n) = aordn (a) = 1
Satz von Euler: Für alle a ∈ Z mit ggT(a, n) = 1:
aϕ(n) ≡ 1
(mod n)
Satz von Fermat: Für jede Primzahl p und beliebiges a ∈ Z
mit p 6 | a gilt
ap−1 ≡ 1 (mod p)
und damit auch ap ≡ a (mod p) für alle a ∈ Z.
Für alle a ∈ Z mit ggT(a, n) = 1 und k ∈ Z gilt:
ak = ak mod ϕ(n) = ak mod ordn (a) mod n
Die Restklassenringe Zn
Lagrange, Fermat, Euler
Zur Illustration: Z∗36
I
I
I
I
I
I
Z∗36 = {1, 5, 7, 11, 13, 17, 19, 23, 25, 29, 31, 35}, ϕ(36) = 12
ϕ(36) = 36 · (1 − 12 )(1 − 13 ) = 12
h5i = {1, 5, 25, 17, 13, 29}, ord36 (5) = 6
5117 ≡ 59 ≡ 53 ≡ 17 mod 36
h13i = {1, 13, 25}, ord36 (13) = 3
13116 ≡ 138 ≡ 132 ≡ 25 mod 36
Die Restklassenringe Zn
Lagrange, Fermat, Euler
Zur Illustration: Z∗17
I
I
I
I
I
I
Z∗17 = {1, 2, 3, . . . , 16}, ϕ(17) = 16
ϕ(17) = 17 · (1 −
1
17 )
= 16
h3i = {1, 3, 9, 10, 13, 5, 15, 11, 16, 14, 8, 7, 4, 12, 2, 6},
ord17 (3) = 18
399 ≡ 33 ≡ 10 mod 17
h4i = {1, 4, 16, 13}, ord17 (4) = 4
4106 ≡ 410 ≡ 42 ≡ 16 mod 17
Die Restklassenringe Zn
Ordnung und Faktorisierung
Ein Blick in Richtung Faktorisierung
I
I
I
Problem: eine grosse Zahl N ∈ N soll faktorisiert werden.
Annahme: man kann für a mit 1 < a < N die Ordnung
(Periode) ordN (a) bestimmen.
Man wählt sich ein a und berechnet ggT(a, N).
I
I
Falls ggT(a, N) > 1 hat man einen Faktor von N gefunden!
Andernfalls ist a ∈ Z∗N und ordN (a) ist definiert.
I
Falls ordN (a) ungerade, ist a nicht weiter brauchbar.
(Der Fall tritt nur selten ein)
I
Falls ordN (a) = 2t, so gilt N|(a2t − 1) und N6 | (at − 1), also
N | (a2t − 1) = (at − 1)(at + 1)
I
I
Falls N | (at + 1), ist a nicht weiter brauchbar.
(Der Fall tritt nur selten ein)
Falls N6 | (at + 1), müssen ggT(N, at + 1) und ggT(N, at − 1)
echte Faktoren von N liefern!
Die Restklassenringe Zn
Ordnung und Faktorisierung
Beispiel: die Faktorisierung von N = 15
I
I
Für a ∈ {3, 5, 6, 9, 10, 12} ist ggT(a, 15) > 1
Für a ∈ U15 :
a ord15 (a)
2
4
4
2
7
4
8
4
11
2
13
4
14
2
I
t at +1 ggT(15, at +1) at −1 ggT(15, at −1)
2
5
5
3
3
1
5
5
3
3
2
50
5
48
3
2
65
5
63
3
1
12
3
19
5
2 170
5
168
3
1
15
15
13
1
Ausser a = 14 (und a = 1, natürlich!) liefern alle a ∈ U14 eine
Faktorisierung, falls man ord15 (a) kennt.
Die Restklassenringe Zn
Ordnung und Faktorisierung
I
N = 77:
I
I
I
I
1
) = 60
ϕ(77) = 77 · (1 − 17 ) · (1 − 11
Von den 60 Elementen a ∈ U77 haben 15 eine ungerade
Ordnung ord77 (a).
Von den 45 Elementen a ∈ U77 mit gerader Ordnung
ord77 (a) = 2t liefern 30 mittels ggT(at + 1, 77) einen echten
Teiler von 77.
N = 119
I
I
I
1
) = 96
ϕ(119) = 119 · (1 − 17 ) · (1 − 17
Von den 96 Elementen a ∈ U119 haben drei (1,18,86) eine
ungerade Ordnung ord119 (a).
Von den 93 Elementen a ∈ U119 mit gerader Ordnung
ord119 (a) = 2t liefern 90 (ausgenommen 33, 101, 118) ,
mittels ggT(at + 1, 119) einen echten Teiler von 119.
6.6
Chinesischer Restesatz und modulare Arithmetik
6.6.1
Das Homomorphieprinzip für Ringe
6.6.2
Chinesischer Restesatz – einfachste Form
6.6.3
Chinesischer Restesatz – allgemeine Form für teilerfremde Moduln
6.6.4
Das Prinzip der primitiven Idempoteten und analoge Situationen
6.6.5
Die algebraische Version des chinesischen Restesatzes
6.6.6
Modulare Arithmetik
6.6.7
Partialbruchdarstellung für rationale Zahlen und Polynome
6.6.8
Der Miller-Rabin-Test als Beispiel
6.6.9
Der chinesische Restesatz für nicht-teilerfremde Moduln
siehe separate Folien
135
Simultane Kongruenzen – Modulare Arithmetik
Vorbemerkung: Homorphieprinzip für Ringe
Ringe hR, +R , ∗R , 0R , 1R i und hS, +S , ∗S , 0S , 1S i
Abbbildung Φ : R → S ist Homomorphismus, falls ∀a, b ∈ R
Φ(a +R b) = Φ(a) +S Φ(b)
Φ(a ∗R b) = Φ(a) ∗S Φ(b)
Φ(0R ) = 0S
Φ(1R ) = 1S
Dann gilt
Φ(fR (a, b . . . , c)) = fS (Φ(a), Φ(b), . . . , Φ(c))
für alle Funktionen f , die aus +, ∗ durch Komposition entstehen
(Ringterme).
Φ ist Isomorphismus, falls bijektiv.
Simultane Kongruenzen – Modulare Arithmetik
Schematische Darstellung (kommutatives Diagramm)
für +, ∗ und zweistelliges f :
Φ×Φ
R ×R
−→
↓+R ,∗R ,fR
S ×S
↓+S ,∗S ,fS
Φ
−→
R
S
Im Folgenden geht es um Homomorphismen
ΦN : Z → ZN : a 7→ a mod N
bzw.
ΦN,M : ZN → ZM : a 7→ a mod M (falls M|N)
Das sind die einzigen Homomorphismen, die die Ringe Z bzw. ZN
überhaupt zulasssen!
Simultane Kongruenzen – Modulare Arithmetik
Aus einem alten indischen Rechenbuch:
I
Aus Früchten werden 63 gleich grosse Haufen gelegt, 7 Stück
bleiben übrig. Es kommen 23 Reisende, unter denen die
Früchte gleichässig verteilt werden, so dass keine übrig bleibt.
Wieviele waren es?
I
Gesucht ist eine (die kleinste?) natürliche Zahl x mit
x
x
I
≡ 7
≡ 0
mod 63
mod 23
Lösung: x ≡ 322 mod 23 · 63 ≡ 322 mod 1449
Simultane Kongruenzen – Modulare Arithmetik
Chinesischer Restesatz — einfachste Form
I
I
I
I
p, q ∈ Z>0 mit ggT(p, q) = 1
Bézout-Koeffizienten u, v ∈ Z : p · u + q · v = 1
also p · u ≡ 1 mod q und q · v ≡ 1 mod p
für b, c ∈ Z sei x = c · p · u + b · q · v , dann gilt
x ≡ b mod p
x ≡ c mod q
I
für y ∈ Z gilt
y ≡ b mod p
y ≡ c mod q
⇔
x ≡ y mod (p · q)
d.h. es gibt in Zp·q genau eine Lösung y der simultanen
Kongruenzen y ≡ b mod p und y ≡ c mod q, nämlich
y = x mod (p · q)
Simultane Kongruenzen – Modulare Arithmetik
Beispiel
I bestimme x ∈ Z mit
I
I
I
x ≡ 3 mod 5 und x ≡ 2 mod 7
berechne mittels erweitertem euklidischen Algorithmus
Bézout-Koeffizienten für (5, 7)
3·5−2·7=1
es gilt also
3 = 5−1 in Z7 und − 2 = 7−1 in Z5
für
x = 3 · 7 · (−2) + 2 · 5 · 3 = −42 + 30 = −12
gilt dann
x ≡ 3 mod 5 und x ≡ 2 mod 7
und ebenso für jede Zahl y mit y ≡ x mod (5 · 7),
also insbesondere auch für y = 23 ∈ Z35
Simultane Kongruenzen – Modulare Arithmetik
Aus einem alten chinesischen Rechenbuch:
I
Eine Bande von 17 Räubern stahl einen Sack mit Goldstücken.
Als sie ihre Beute teilen wollten, blieben 3 Goldstücke übrig.
Beim Streit darüber, wer ein Goldstück mehr erhalten sollte,
wurde ein Räuber erschlagen. Jetzt blieben bei der Verteilung
10 Goldstücke übrig. Erneut kam es zum Streit, und wieder
verlor ein Räuber sein Leben. Jetzt liess sich endlich die Beute
gleichmässig verteilen. Wieviele Goldstücke waren mindestens
in dem Sack?
I
Gesucht ist eine (die kleinste?) natürliche Zahl x mit
x
x
x
I
≡ 3
≡ 10
≡ 0
mod 17
mod 16
mod 15
Lösung: x ≡ 3930 mod 15 · 16 · 17 ≡ 3930 mod 4080
Simultane Kongruenzen – Modulare Arithmetik
Chinesischer Restesatz
I Theorem:
I
I
I
m1 , m2 , . . . , mk paarweise teilerfremden natürlichen Zahlen
(“Moduln”), M = m1 · m2 · · · mk
Elemente c1 ∈ Zm1 , c2 ∈ Zm2 , . . . , ck ∈ Zmk
Dann gibt es genau ein c ∈ ZM mit
c ≡ c1 mod m1
c ≡ c2 mod m2
..
.
c ≡ ck mod mk
d.h.
c ≡ ci mod mi (1 ≤ i ≤ k)
Simultane Kongruenzen – Modulare Arithmetik
I
Beweis
I
I
bestimme Bézout-Koeffizienten ui , vi ∈ Z für mi und M/mi
(1 ≤ i ≤ k):
ui · mi + vi · (M/mi ) = 1
P
für x = 1≤i≤k ci · vi · (M/mi ) gilt
x ≡ ci (mod mi ) (1 ≤ i ≤ k)
I
für y ∈ Z gilt
y ≡ ci (mod mi ) (1 ≤ i ≤ k) ⇔ y ≡ x (mod M)
d.h. es gibt in ZM genau eine Lösung y der simultanen
Kongruenzen y ≡ ci mod mi (1 ≤ i ≤ k), nämlich
y = x mod M
Simultane Kongruenzen – Modulare Arithmetik
I
Beispiel
I
bestimme x ∈ Z5·7·11 mit
x ≡ 3 mod 5, x ≡ 1 mod 7, x ≡ 7 mod 11
I
I
eeA liefert Bézout-Koeffizienten
31 · 5 − 2 · 77 = 1,
also
8 · 7 − 1 · 55, = 1,
also
16 · 11 − 5 · 35 = 1,
also
(
1
(−2) · 77 ≡ 0
0
(
0
(−1) · 55 ≡ 1
0
(
0
(−5) · 35 ≡ 0
1
mod 5
mod 7
mod 11
mod 5
mod 7
mod 11
mod 5
mod 7
mod 11
Lösung
x = 3·(−2)·77+1·(−1)·55+7·(−5)·35 = −1742 ≡ 183 mod 5·7·11
Simultane Kongruenzen – Modulare Arithmetik
Warum funktioniert das?
I
I
die Zahlen ei = vi · (M/mi ) (1 ≤ i ≤ k) haben die
“Indikatoreigenschaft”
(
1 mod mi
ei ≡
(1 ≤ i ≤ k)
0 mod mj für j 6= i
Damit kann man Zahlen mit vorgegebenen
Kongruenzeigenschaften (= Werten an den Stellen mi ) mittels
Linearkombination konstruieren
P
für x = 1≤i≤k ci · ei gilt
x ≡ ci mod mi (1 ≤ i ≤ k)
Simultane Kongruenzen – Modulare Arithmetik
Dieses Konstruktionsprinzip ist weit verbreitet. Andere Instanzen
sind:
I
Interpolationsformel von Lagrange
I
I
I
Zu vorgegebenen (paarweise verschiedenen) Stellen
m1 , m2 , . . . , mk ∈ C
und vorgegebenen Werten c1 , c2 , . . . , ck ∈ C
gibt es genau ein Polynom
p(X ) =
X
pi X i
mit Grad deg p(X ) < k,
0≤i<k
das an den Stellen mi die vorgegebenen Werte ci annimmt:
p(mi ) = ci (1 ≤ i ≤ k)
Simultane Kongruenzen – Modulare Arithmetik
I
Dieses p(X ) kann man angeben
p(X ) =
Q
X
j6=i (X − mj )
ci · Q
j6=i (mi − mj )
1≤i≤k
I
Für die Polynome
Q
j6=i (X − mj )
ei (X ) = Q
j6=i (mi − mj )
gilt die Indikatoreigenschaft
ei (mj ) = δi,j
(
1
=
0
für i = j
für i =
6 j
Simultane Kongruenzen – Modulare Arithmetik
I
Darstellung Boolescher Funktionen in disjunktiver
Normalform
I
I
B = {0, 1}n : Boolesche Algebra mit ¬, ∨, ∧
Jede Boolesche Funktion f : Bn → B kann als Boolesches
Polynom
_
f (X1 , . . . , Xn ) =
f (b) · eb (X1 , . . . , Xn )
b∈Bn
dargestellt werden.
Simultane Kongruenzen – Modulare Arithmetik
I
Dabei sind für b = (b1 , b2 , . . . , bn ) ∈ Bn die “Minterme”
^
^
eb (X1 , . . . , Xn ) =
Xi ∧
(¬Xi )
bi =1
bi =0
Funktionen mit
eb (a1 , . . . , an ) = δa,b
(
1 für (b1 , . . . , bn ) = (a1 , . . . , an )
=
0 für (b1 , . . . , bn ) 6= (a1 , . . . , an )
für a = (a1 , a2 , . . . , an ) ∈ Bn
Simultane Kongruenzen – Modulare Arithmetik
Algebraische Version des Chinesischen Restesatzes:
I
Die Abbildung
Ψ : ZM → Zm1 × Zm2 × · · · × Zmk
a 7→ (a mod m1 , a mod m2 , . . . , a mod mk )
I
ist ein Isomorphismus von Ringen
Insbesondere gilt für die invertierbaren Elemente (Einheiten)
Ψ(Z∗M ) = Z∗m1 × Z∗m2 × · · · × Z∗mk
I
(Isomorphismus von Gruppen)
Bemerkung: aus der Isomorphie der Einheitengruppen folgt
ϕ(M) = ϕ(m1 ) · ϕ(m2 ) · · · ϕ(mk )
d.h. die Multiplikativität der Eulerschen ϕ-Funktion
Simultane Kongruenzen – Modulare Arithmetik
Beispiel
Isomorphismus der Ringe: Z4 × Z9 ' Z36
0
1
2
3
Z4
0 1
2 3
4
5
6
7
8
0 28 20 12 4 32 24 16 8
9 1 29 21 13 5 33 25 17
18 10 2 30 22 14 6 34 26
27 19 11 3 31 23 15 7 35
Z9
Z36
Isomorphismus der Einheitengruppen:
1
3
Z∗4
1
1
19
Z∗4
×
2
4 5
29 13 5
11 31 23
Z∗9
'
Z∗36
7
8
25 17
7 35
Z∗9
Z∗36
Simultane Kongruenzen – Modulare Arithmetik
Schema der modularen Arithmetik
ZM
↓op
ZM
−→Ψ
←−Ψ−1
Zm1
↓op
Zm1
× Zm2
↓op
× Zm2
× ... ×
...
× ... ×
Zmk
↓op
Zmk
wobei op ∈ {+, ∗, inverse}
I
die Abbildung Ψ ist eine “Auswertungsabbildung”
I
ihre Umkehrabbildung Ψ−1 ist eine “Interpolationsabbildung”
Simultane Kongruenzen – Modulare Arithmetik
Beispiel: Addition in Z36 ' Z4 × Z9
Z36
(22, 25) −→Ψ
↓+36
11
←−Ψ−1
Z4
Z9
(2, 1) (4, 7)
↓+4
↓+9
3
2
Beispiel: Multiplikation in Z36 ' Z4 × Z9
Z36
(22, 25) −→Ψ
↓∗36
10
←−Ψ−1
Z4
Z9
(2, 1) (4, 7)
↓∗4
↓∗9
2
1
Simultane Kongruenzen – Modulare Arithmetik
Beispiel: Inverse in Z∗36 ' Z∗4 × Z∗9
Z∗36
25
↓inv36
13
Z∗4
1
↓inv4
1
−→Ψ
←−Ψ−1
Z∗9
7
↓inv9
4
Simultane Kongruenzen – Modulare Arithmetik
Das Schema der modularen Arithmetik
I
ZM
↓f
ZM
−→Ψ
←−Ψ−1
Zm1
↓f
Zm1
× Zm2
↓f
× Zm2
× ... ×
...
× ... ×
Zmk
↓f
Zmk
gilt für alle Funktionen f, die mit den Ringoperationen
verträglich sind (“Homomorphismen”), d.h. aus
{+, ∗, inverse} mittels Komposition entstehen.
I
Man kann Berechungen in Z “modularisiert” ausführen, wenn
man M gross genug macht (d.h. genügend viele “kleine”
Moduln mi , z.B. Primzahlen in Maschinenwortgrösse)
I
Vorteil: Exaktes Rechnen in Bereichen kontrollierter Grösse,
Parallelisierung
Simultane Kongruenzen – Modulare Arithmetik
Beispiel: Lösung einer linearen Kongruenz
I Bestimme die Lösung von 1193 · x ≡ 367 mod 31500
I 31500 = 22 · 32 · 53 · 7
I Wähle Moduln m1 = 4, m2 = 9, m3 = 125, m4 = 7
I Die gegebene Kongruenz ist äquivalent zu
1·x
5·x
68 · x
3·x
I
mod
mod
mod
mod
4
9
125
7
Wegen 5−1 = 2 ∈ Z9 und 68−1 ≡ 57 ∈ Z125 :
x
x
x
x
I
≡
3
≡
7
≡ 117
≡
3
≡
3
≡
2·7 ≡ 5
≡ 57 · 117 ≡ 44
≡
1
Lösung: x ≡ 22919 mod 31500
mod
mod
mod
mod
4
9
125
7
Simultane Kongruenzen – Modulare Arithmetik
I
I
Beispiel: Berechnung einer Determinanten


−82 −48 −11
−7
58 
A =  38
det A =?
−94 −68 14
Homomorphieprinzip: Determinanten sind ’Ringterme’,
deshalb gilt
(detZ A) mod m = detZm (A mod m)
und für M = m1 · m2 · mk
(detZM (A mod M)) mod mi = detZmi (A mod mi ) (1 ≤ i ≤ k)
Simultane Kongruenzen – Modulare Arithmetik
Homomorphieprinzip: Determinanten sind Ringterme!
I
Z → Zm : a 7→ a mod m
detZ
I
mod m
mod m
−→
ZM → Zmi : a 7→ a mod mi
detZM
A mod m
↓
detZm
det(A mod m)
−→
A
↓
det(A)
(M = m1 · · · mk )
mod mi
A mod mi
↓
−→
A
↓
mod mi
det(A)
det(A mod mi )
−→
Simultane Kongruenzen – Modulare Arithmetik
I
I
Moduln :
m1 = 29, m2 = 31, m3 = 37, m4 = 41
M = m1 · m2 · m3 · m4 = 1363783
Berechungen in den einzelnen Zmi (1 ≤ i ≤ 4)
I
m1 = 29
"
#
5 10 18
A mod 29 = 9 22 0
22 19 14
det(A mod 29) = (det A) mod 29 = 11
I
m2 = 31
"
#
11 14 20
A mod 31 = 7 24 27
30 25 14
det(A mod 31) = (det A) mod 31 = 20
detZmi
Simultane Kongruenzen – Modulare Arithmetik
I
m3 = 37


29 26 26
A mod 37 =  1 30 21
17 6 14
det(A mod 37) = (det A) mod 37 = 11
m4 = 41

0

A mod 41 = 38
29

34 30
34 17
14 14
det(A mod 41) = (det A) mod 41 = 19
Simultane Kongruenzen – Modulare Arithmetik
I
I
Modulares Schema
Z29·31·37·41
A
−→Ψ
↓detM
7522
←−Ψ−1
I
Z29
Z31
Z37
Z41
A mod 29 A mod 31 A mod 37 A mod 41
↓det41
↓det37
↓det29
↓det31
11
20
11
19
Dieses Schema zeigt
det A ≡ 7522 mod M
I
Tatsächlich gilt sogar
det A = 7522
Das kann man folgern, wenn man weiss, dass 0 ≤ det A < M
oder −(M/2) ≤ det A ≤ M/2 ist
(z.B. mittels der Ungleichung von Hadamard für
Determinanten)
Simultane Kongruenzen – Modulare Arithmetik
Eine andere Sicht der modularen Arithmetik:
I Gegeben teilerfremde Moduln m1 , m2 , . . . , mk ,
M := m1 · m2 · · · mk
I Aus den Bézout-Beziehungen
ui · mi + vi ·
I
M
= 1 (1 ≤ i ≤ k)
mi
hat man vi = (M/mi )−1 ∈ Zmi und ei ≡ vi · (M/mi ) ∈ ZM .
Seien nun a ∈ Z sowie ai ∈ Zmi (1 ≤ i ≤ k) mit
a ≡ a1 · e1 + a2 · e2 + · · · + ak · ek mod M
I
Anders formuliert: es gibt ein a0 ∈ Z mit
a = a0 · M + a1 · v1 ·
M
M
M
+ a2 · v2 ·
+ · · · + ak · vk ·
m1
m2
mk
Simultane Kongruenzen – Modulare Arithmetik
I
Division durch M ergibt
a1 · v1 a2 · v2
ak · vk
a
= a0 +
+
+ ··· +
M
m1
m2
mk
I
Indem man jetzt noch Division mit Rest in den Brüchen
macht, erhält man eine Darstellung
a
α1
α2
αk
= α0 +
+
+ ··· +
M
m1 m2
mk
mit α0 ∈ Z und αi ∈ Zmi (1 ≤ i ≤ k)
I
Diese “modulare” Darstellung (Partialbruchdarstellung ) der
rationalen Zahl a/M ist eindeutig!
I
Solche modularen Darstellungen verwendet man vorteilhaft
beim exakten Rechnen mit rationalen Zahlen, die grosse
Nenner haben.
Simultane Kongruenzen – Modulare Arithmetik
Beispiel:
I
I
a = 19853, M = 5544 = 7 · 8 · 9 · 11
Mit m1 = 7, m2 = 8, m3 = 9, m4 = 11 ergibt sich
v1
v2
v3
v4
I
= (8 ∗ 9 ∗ 11)−1 mod 7 = 1 a mod 7 = 1 a · v1 mod 7 = 1
= (7 ∗ 9 ∗ 11)−1 mod 8 = 5 a mod 8 = 5 a · v2 mod 8 = 1
= (7 ∗ 8 ∗ 11)−1 mod 9 = 7 a mod 9 = 8 a · v3 mod 9 = 2
= (7 ∗ 8 ∗ 9)−1 mod 11 = 5 a mod 11 = 9 a · v4 mod 11 = 1
Darstellung
a
19853
3221
1 1 2
1
=
=3+
=3+ + + +
M
5544
5544
7 8 9 11
Simultane Kongruenzen – Modulare Arithmetik
Partialbruchzerlegung für Polynome
I
Betrachten Polynome in der Variablen X über einem Körper k
I
M(X ) ∈ k[X ] ein normiertes Polynom
I
M(X ) = m1 (X ) · m2 (X ) · · · mk (X )
Zerlegung von M(X ) in normierte teilerfremde Faktoren
I
Für jedes Polynom a(X ) ∈ k[X ] hat die rationale Funktion
a(X )/M(X ) genau eine Darstellung
a(X )
α1 (X )
α2 (X )
αk (X )
= α0 (X ) +
+
+ ··· +
M(X )
m1 (X ) m2 (X )
mk (X )
mit α0 (X ), . . . , αk (X ) ∈ k[X ] und
deg αi (X ) < deg mi (X ) (1 ≤ i ≤ k)
Simultane Kongruenzen – Modulare Arithmetik
I
I
I
I
Modulare Arithmetik lässt sich sehr effizient z.B. für die
exakte Lösung von ganzzahligen Gleichungssystemen mit sehr
grossen Koeffizienten einsetzen
Modulare Arithmetik lässt sich sehr effizient für das exakte
Rechnen mit “grossen” rationalen Zahlen einsetzen
Die Prinzipien der modularen Arithmetik für Z übertragen sich
wörtlich auf Polynomringe k[X ].
Literaturhinweise
I
I
I
J. D. Lipson,
Elements of Algebra and Algebraic Computing,
Addison-Wesley, Kapitel 8.
D. E. Knuth,
The Art of Computer Programming, vol. 2, (Seminumerical
Algorithms), Addison-Wesley, Abschnitt 4.3.2.
J. v.z. Gathen, J. Gerhard,
Modern Computer Algebra,
Cambridge University Press, Kap. 5.
Simultane Kongruenzen – Modulare Arithmetik
Primzahltest-Beispiel
I
I
I
ZN ist ein Körper ⇔ N ist Primzahl
Allgemein gilt: ein Polynom k-ten Grades hat in einem Körper
höchstens k Nullstellen.
Die Gleichung X 2 = 1 hat in einem Körper genau zwei
Nullstellen, nämlich ±1
I
I
I
Sonderfall: im Körper Z2 hat X 2 = 1 nur die Nullstelle 1, aber
die zählt doppelt (wegen +1 = −1)
Beobachtet man in einem ZN eine Zahl 1 < a < N − 1 mit
a2 = 1, so ist N keine Primzahl!
Beispiele:
I
I
N = 8: in Z8 gilt 32 = 52 = 1, die Gleichung X 2 = 1 hat 4
Lösungen.
N = 21: in Z21 gilt 82 = 132 = 1, die Gleichung X 2 = 1 hat 4
Lösungen.
Simultane Kongruenzen – Modulare Arithmetik
N = 1105 = 5 · 13 · 17
EEA:
1 · 13 · 17 − 44 · 5 = 1
2 · 5 · 17 − 13 · 13 = 1
(−6) · 5 · 13 + 23 · 17 = 1
⇒
⇒
⇒


1
e5 = 221 ≡ 0


0


0
e13 = 170 ≡ 1


0


0
e17 = 715 ≡ 0


1
mod 5
mod 13
mod 17
mod 5
mod 13
mod 17
mod 5
mod 13
mod 17
Simultane Kongruenzen – Modulare Arithmetik
Die Gleichung X 2 = 1 hat in Z1105 ≡ Z5 × Z13 × Z17 insgesamt
23 = 8 Lösungen (Z5 , Z13 , Z17 sind Körper).
Z5 × Z13 × Z17
(+1, +1, +1) = (1, 1, 1)
(+1, +1, −1) = (1, 1, 16)
(+1, −1, +1) = (4, 12, 1)
(−1, +1, +1) = (4, 1, 1)
(+1, −1, −1) = (1, 12, 16)
(−1, +1, −1) = (4, 1, 16)
(−1, −1, +1) = (4, 12, 1)
(−1, −1, −1) = (4, 12, 16)
↔
↔
↔
↔
↔
↔
↔
↔
Z1105
e5 + e13 + e17 =
1
e5 + e13 − e17 = 781
e5 − e13 + e17 = 766
−e5 + e13 + e17 = 664
e5 − e13 − e17 = 441
−e5 + e13 − e17 = 339
−e5 − e13 + e17 = 324
−e5 − e13 − e17 = 1104
Simultane Kongruenzen – Modulare Arithmetik
Miller-Rabin-Test
I
I
I
N − 1 = 2t · u mit t ≥ 1 und u ungerade
Wähle a ∈ ZN mit ggT(a, N) = 1
Berechne durch fortgesetztes Quadrieren in ZN :
t
au 7→ a2·u 7→ a4·u 7→ · · · 7→ a2 ·u = aN−1
I
Falls in dieser Folge die 1 nicht auftaucht, ist N keine
Primzahl (Fermat!)
I
Falls die 1 auftaucht mit Vorgänger 6= −1, ist N keine
Primzahl (ZN ist kein Körper)
I
Im Erfolgsfalle: a ist “Zeuge” für die Nicht-Primheit von N
I
Miller-Rabin: falls N nicht prim, sind solche Zeugen
häufig!
Simultane Kongruenzen – Modulare Arithmetik
Beispiel: N = 1105, a = 2
I
I
N − 1 = 1104 = 24 · 69, also t = 4, u = 69
Ordnungen
ord5 (2) = 4 = φ(5)
ord13 (2) = 12 = φ(13)
⇒ ord1105 (2) = kgV(4, 12, 8) = 24
ord17 (2) = 8 | 16 = φ(17)
I
Berechnung von 269 in Z1105 bei Kenntnis der Faktorisierung
(!)
Z5 : 269 = 21 = 2
269 = 2 · e5 + 5 · e13 − 2 · e17
Z13 : 269 = 29 = 5 ⇒
= −138 = 967 ∈ Z1005
Z17 : 269 = 25 = 15
Simultane Kongruenzen – Modulare Arithmetik
I
Test durch Quadrieren
Z5 × Z13 × Z17
(269 , 269 , 269 ) = (2, 5, 15)
(22 , 52 , 52 ) = (4, 12, 4)
(42 , 122 , 42 ) = (1, 1, 16)
(12 , 12 , 162 ) = (1, 1, 1)
I
Z1105
↔ 2 · e5 + 5 · e13 − 2 · e17 = 967
↔
4 · e5 − e13 + 4 · e17 = 259
↔
e5 + e13 − e17 = 781
↔
e5 + e13 + e17 = 1
Fazit: a = 2 bezeugt, dass N = 1105 keine Primzahl ist, denn
24·69 = 781 6= 1 und 28·69 = 269
2
= 1 in Z1105
Simultane Kongruenzen – Modulare Arithmetik
I
Aus einem alten indischen Lehrbuch der Astronomie und
Mathematik:
I
I
I
Aus Fibonaccis Liber abbaci:
I
I
I
Man bestimme die kleinste positive Zahl, die bei Division
durch 3,4,5 und 6 die Reste 2,3,4, bzw. 5 lässt.
Lösung: x = 59
Man bestimme die kleinste positive Zahl, die bei Division
durch 2,3,4,5,6 jeweils den Rest 1 lässt und durch 7 teilbar ist
Lösung: x = 301
Die Moduln sind nicht mehr teilerfremd!
Simultane Kongruenzen – Modulare Arithmetik
Was tun, wenn die Moduln nicht teilerfremd sind?
I
Wegen
n | (x − a) ∧ d | n ⇒ d | (x − a)
gilt
x ≡ a mod n ∧ d | n ⇒ x ≡ a mod d
und somit:
x ≡ a mod m
lösbar ⇔ ggT(m, n) |a − b
x ≡ b mod n
I
Allgemein für beliebige Moduln mi (1 ≤ i ≤ k)
x ≡ ai mod mi
lösbar ⇔ ggT(mi , mj ) | ai − aj (1 ≤ i < j ≤ k)
(1 ≤ i ≤ k)
I
Die Lösung ist eindeutig modulo kgV(m1 , m2 , . . . , mk ).
Simultane Kongruenzen – Modulare Arithmetik
Beispiele
I Lösung von
I
x ≡ 3 mod 6
x ≡ 7 mod 8
existiert wegen ggT(6, 8) = 2 | (3 − 7).

x ≡ 1 mod 2 x ≡ 3 mod 6
x ≡ 0 mod 3
⇔ x ≡ 0 mod 3 ⇔
⇔ x ≡ 15 mod 24
x ≡ 7 mod 8 
x ≡ 7 mod 8
x ≡ 7 mod 8
Lösung von
x ≡ 7 mod 9
x ≡ 2 mod 12
existiert nicht wegen ggT(9, 12) = 3 6 | (7 − 2).
Genauer:
x ≡ 7 mod 9 ⇒ x ≡ 1 mod 3
x ≡ 2 mod 12 ⇒ x ≡ 2 mod 3
Simultane Kongruenzen – Modulare Arithmetik
Ergänzende Bemerkung zur Algebra:
I Sind p, q ∈ Z>0 beliebig, so gibt es einen Isomorphismus von
Ringen
Zp × Zq ' ZggT(p,q) × ZkgV(p,q)
I
I
Jede endliche kommutative Gruppe Zm1 × Zm2 × . . . × Zmk ist
isomorph zu genau einer Gruppe
Zd1 × Zd2 × . . . × Zd` mit 2 ≤ d1 | d2 | . . . | d`
(Elementarteilersatz)
Isomorphie von endlichen kommutativen Gruppen
?
Zm1 × Zm2 × . . . × Zmk ' Zn1 × Zn2 × . . . × Zn`
kann man mittels lokaler Transformationen
(p, q) 7→ (ggT(p, q), kgV(p, q)) effizient entscheiden, indem
man die Indexfolgen (m1 , . . . , mk ) und (n1 , . . . , n` ) in
Elementarteilerform transformiert.
7
Primzahlen, Faktorisierung und Kryptografie
7.1
Primzahlen
7.1.1
Historisches
7.1.2
Verifizieren vs. Entscheiden
7.1.3
Körper und Ordnungen
7.1.4
Das Ordnungskriterium für Primzahlen
7.1.5
Zertifikate für Primzahlen
7.1.6
Primes ∈ N P
7.1.7
Primes ∈ P
7.2
Probabilistische Primzahltests
7.2.1
Teilbarkeitstest, Euklid-Test, Fermat-Test, SPP-Test
7.2.2
Der SPP-Test von Miller-Rabin im Detail
7.2.3
Komplexitätsaussagen
siehe separate Folien
150
Effiziente Verifikation von Primzahlen
Die Primheit von Primzahlen kann man effizient
verifizieren
oder
Primes ∈ NP
Effiziente Verifikation von Primzahlen
Historisches
I
Die Zahl
n = 114381625757888867669235779976146612010218296721242
362562561842935706935245733897830597123563958705
058989075147599290026879543541
I
ist keine Primzahl.
Klar! Denn n = p · q mit
p = 34905295108476509491478496199038981334177646384933
87843990820577
q = 32769132993266709549961988190834461413177642967992
942539798288533
I
I
p und q sind Primzahlen! Aber wie garantiert man das?
n ist Kryptologen bekannt als RSA-129.
Effiziente Verifikation von Primzahlen
Historisches
Problema, numeros primos a compositis dignoscendi . . . ad gravissima
ac utilissima tabus arithmeticae pertinere. . .
. . . scientiae dignitas requirere videtur, ut omnia subsidia ad solutionem problematis tam elegantis ac celebris sedulo excolantur.
J. C. F. Gauss (1777–1855),
Disquisitiones Arithmeticae, Artikel 329
Effiziente Verifikation von Primzahlen
Historisches
aus der Übersetzung von Maser (1889):
Dass die Aufgabe, die Primzahlen von den zusammengesetzten zu
unterscheiden und letztere in ihre Primfactoren zu zerlegen, zu den
wichtigsten und nützlichsten der gesamten Arithmetik gehört und die
Bemühungen und den Scharfsinn sowohl der alten als auch der neueren Geometer in Anspruch genommen hat, ist so bekannt, dass es
überflüssig wäre, hierüber viele Worte zu verlieren. [. . . ] ausserdem
dürfte es die Würde der Wissenschaft erheischen, alle Hülfsmittel zur
Lösung jenes so eleganten und berühmten Problems fleissig zu vervollkommnen.
Trotzdem muss man gestehen, dass alle bisher angegebenen Methoden entweder auf sehr specielle Fälle beschänkt oder so mühsam und
weitläufig sind, dass sie [. . . ] auf grössere Zahlen aber meistenteils
kaum angewendet werden können.
Effiziente Verifikation von Primzahlen
Historisches
K. Gödel (Brief an J. von Neumann, 1956)
Wenn es eine Maschine mit ... gäbe, hätte das Folgerungen von der
grössten Tragweite. Es würde offenbar bedeuten, dass man trotz der
Unlösbarkeit des Entscheidungsproblems die Denkarbeit der Mathematiker bei ja-oder-nein-Fragen vollständig (abgesehen von der Aufstellung der Axiome) durch Maschinen ersetzen könnte.
... bedeutet, dass die Anzahl der Schritte gegenüber dem
blossen Probieren von N auf log N verringert werden kann. So starke
Verringerungen kommen aber bei anderen finiten Problemen durchaus
vor, z.B. bei der Berechnung eines quadratischen Restsymbols durch
wiederholte Anwendung des Reziprozitätsgesetzes. Es wäre interessant zu wissen, wie es damit z.B. bei der Feststellung, ob eine Zahl
Primzahl ist, steht und wie stark im allgemeinen bei finiten kombinatorischen Problemen die Anzahl der Schritte gegenüber dem blossen
Probieren verringert werden kann.
Effiziente Verifikation von Primzahlen
Häufigkeit von Primzahlen
Häufigkeit von Primzahlen
I
Primzahlsatz (von Gauss vermutet, erst viel später von
Hadamard und de la Vallée-Poussin bewiesen)
π(n) = ]{p ≤ n ; p Primzahl} ∼
n
ln n
Effiziente Verifikation von Primzahlen
Probedivision
Primzahltest mittels Probedivision
I
Kriterium:
n ist Primzahl ⇔ ∀a:2≤a≤√n a 6 | n
I
Logarithmisches Kostenmodell:
I
I
I
I
I
I
Input-Grösse ist log n
√
1
Anzahl der Probedivisionen: O( n) = O(2 2 log n )
Jede Probedivision erfordert O(log2 n) Bit-Operationen
Laufzeit für m-stelliges n ist im worst-case O(m2 · 2m/2 )
Exponentieller Aufwand in Problemgrösse m = log n —
prohibitiv!
NB: man kann sich bei den Probeteilern a auf Primzahlen
beschränken.
Effiziente Verifikation von Primzahlen
Probedivision
Konkreter:
I
Das Testen einer Zahl n ∼ 10k erfordert etwa
10k/2
(k/2) log 10
Probedivisionen
I
Annahme: man kann pro Sekunde 106 Divisionen ausführen.
I
Dann benötigt ein Primzahltest per Probedivision für eine
Zahl mit k Dezimalstellen etwa
10k/2
10k/2
=
×2.75×10−14 Jahre
(k/2) log 10× 106 ×60 ×60×24× 356
k
I
Einige Zahlenbeispiele:
k=30
k=50
k=100
⇒
⇒
⇒
11 Monate
5.5 × 109 Jahre
2.75 × 1034 Jahre
Effiziente Verifikation von Primzahlen
Entscheidung versus Verifikation
Entscheidung versus Verifikation
I
Beispiele:
267 − 1 ∈ Prim ?
I
2128 + 1 ∈ Prim ?
2858433 − 1 ∈ Prim ?
Zusammengesetztheit hat effiziente Zeugen (z.B. Teiler)
267 − 1 = 147.573.952.589.676.412.927
= 761.838.257.287 · 193.707.721
[Frank Cole (1903) benötigte “die Sonntage dreier Jahre”...]
Es ginge in diesem Fall auch (Fermat)
32
67 −2
(mod 267 − 1) = 95.591.506.202.441.271.281
aber das geht nicht immer!
Effiziente Verifikation von Primzahlen
Entscheidung versus Verifikation
I
Wie kann man jemanden effizient davon überzeugen, dass eine
vorgelegte (sehr grosse) Zahl N keine Primzahl ist?
I
Man nimmt zwei geeignete Zahlen P, Q, multipliziert sie und
überprüft:
?
N =P ×Q
I
Teiler einer Zahl sind “Zeugen” dafür, dass die Zahl nicht
Primzahl ist.
Analog kann man ggT-Berechnungen verwenden.
Es wird nicht verlangt, dass Zeugen leicht zu finden sind!
Fazit: Nicht-Primzahlen lassen sich effizient verifizieren!
I
I
I
Effiziente Verifikation von Primzahlen
Entscheidung versus Verifikation
I
Wie kann man jemanden effizient davon überzeugen, dass eine
vorgelegte (sehr grosse) Zahl N eine Primzahl ist?
Gibt es “Zeugen” dafür, dass eine Zahl keine echten Teiler
besitzt?
Lassen sich Primzahlen effizient verifizieren?
I
I
Ja! Aber das ist keineswegs offensichtlich (Pratt, 1975).
Grundsätzliche Bemerkung:
Per def. ist Primheit eine “universelle” und Nicht-Primheit
eine “existentielle” Eigenschaft von Zahlen.
Effiziente Verifikation von Primzahlen
Körper und Ordnungen
Körper und Ordnungen
I
F Körper, F∗ = F \ {0} : multiplikative Gruppe
I
Fakt: In einem Körper F hat ein Polynom vom Grad k
höchstens k Nullstellen (Vielfachheiten mitgezählt)
I
Für a ∈ F∗ : ordF∗ (a) Ordnung von a in F∗
ordF∗ (a) = ]hai = min{t ≥ 1 ; at = 1}
I
Für a ∈ F∗ , n ≥ 1:
ordF∗ (a) | n ⇔ a ist Nullstelle von X n − 1
I
Folgerung: In einem Körper F gibt es höchstens n Elemente
a ∈ F mit ordF∗ (a) | n (n ≥ 1).
Effiziente Verifikation von Primzahlen
Körper und Ordnungen
I
Lemma: Für n ≥ 1 ist die Anzahl der Elemente a ∈ F mit
ordF∗ (a) = n entweder = 0 oder = ϕ(n).
I
Beweis: sei a ∈ F∗ mit ordF∗ (a) = n.
Für ak ∈ hai k ∈ Zn gilt (ak )n = (an )k = 1k = 1,
dies sind genau n verschiedene Nullstellen von X n − 1.
Weitere kann es nicht geben. Es gilt
n
ordF∗ (ak ) =
,
ggT(k, n)
ordF∗ (ak ) = n für k ∈ Z∗n .
Effiziente Verifikation von Primzahlen
Körper und Ordnungen
I
Satz: Jede endliche Untergruppe G von F∗ ist zyklisch.
I
Beweis: Sei ]G = n, also (Lagrange!) ordF∗ (a) | n für alle
a ∈ G . Für d | n sei
(
1 es gibt ein a ∈ G mit ordF∗ (a) = d
χ(d) =
0 sonst
Dann ist
n=
X
d |n
χ(d) · ϕ(d) ≤
X
ϕ(d) = n
d |n
Also gilt Gleichheit und somit χ(d) = 1 für alle d | n.
Insbesondere ist χ(n) = 1, d.h. es gibt Elemente a ∈ G mit
ordF∗ (a) = n.
Effiziente Verifikation von Primzahlen
Körper und Ordnungen
I
I
I
Folgerung: F endlicher Körper ⇒ F∗ zyklische Gruppe.
Die a ∈ F∗ mit hai = F∗ nennt man primitive Elemente von F.
Es ist nicht klar, wie man primitive Elemente tatsächlich
findet — ausser durch Probieren....
Effiziente Verifikation von Primzahlen
Körper und Ordnungen
Beispiel:
I
N = 13, ϕ(ϕ(13)) = ϕ(12) = 4
primitive Elemente 2, 6, 7, 11
I
Ordnungen in Z∗13
1 2 3 4 5 6 7 8 9 10 11 12
ord13 (a) 1 12 3 6 4 12 12 4 3 6 12 2
a
I
2 als primitives Element von Z∗13
k
0 1 2
k
2
1 2 4
ord13 (2k ) 1 12 6
ggT(k, 12) 12 1 2
3
8
4
3
4 5 6 7 8
3 6 12 11 9
3 12 2 12 3
4 1 6 1 4
9 10 11
5 10 7
4 6 12
3 2 1
Effiziente Verifikation von Primzahlen
Körper und Ordnungen
Beispiel:
I
N = 17, ϕ(ϕ(17)) = ϕ(16) = 8
primitive Elemente 3, 5, 6, 7, 10, 11, 12, 14
I
Ordnungen in Z∗17
a
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
ord17 (a) 1 8 16 4 16 16 16 8 8 16 16 16 4 16 8 2
I
7 als primitives Element von Z∗17
k
7k
ord17 (7k )
ggt(k, 16)
0
1
1
1
1
7
16
1
2
15
8
2
3
3
16
1
4
4
4
4
5
11
16
1
6
9
8
2
7
12
16
1
8
16
2
8
9
10
16
1
10
2
8
2
11
14
16
1
12
13
4
4
13
6
16
1
14
8
8
2
Effiziente Verifikation von Primzahlen
Körper und Ordnungen
Struktur von Z∗13
Struktur von Z∗17
{2, 6, 7, 11}
12
6
3
2
1
{4, 10}
4
{5, 8}
{12}
{3, 9}
{1}
16
{3, 5, 6, 7, 10, 11, 12, 14}
8
{2, 8, 9, 15}
4
{4, 13}
2
{16}
1
{1}
15
5
16
1
Effiziente Verifikation von Primzahlen
Endliche Körper
Endliche Körper
I
Ist F ein endlicher Körper, so gibt es eine eindeutig
bestimmte Primzahl p mit p · 1 = 1| + 1 +
{z· · · + 1} = 0.
p
Dieses p nennt man die “Charakteristik” von F.
I
Ist F ein endlicher Körper der Charakterisitk p, so hat F p n
Elemente für ein n >= 1.
I
Zu jeder Primzahl p und jedem n ≥ 1 existiert ein Körper mit
p n Elementen.
I
Alle Körper mit p n Elementen sind “isomorph”.
I
Speziell für n = 1: diese Körper sind die Zp .
I
Körper mit p n Elementen (n > 1) entstehen aus Zp durch
“algebraische Erweiterung”.
(Sie haben nichts mit Zpn zu tun!)
Effiziente Verifikation von Primzahlen
Primzahlkriterium
Primzahlkriterium
I
Für n ∈ N gilt:
n ist Primzahl ⇔ ∃a ∈ Z∗n : ordn (a) = n − 1
I
Beweis:
I
I
I
⇒: n Primzahl → Zn Körper → Z∗n zyklisch mit ]Z∗n = n − 1.
⇐: Aus ]Z∗n = n − 1 = ϕ(n) folgt bereits, dass n Primzahl.
Wichtige Bemerkung: das ist ein existentielles Kriterium für
Primheit! Ein solches a ist Zeuge dafür, dass n Primzahl ist.
Effiziente Verifikation von Primzahlen
Primzahlkriterium
I
Das Ordnungskriterium:
ordn (a) = n − 1 ⇔
I
(
an−1 ≡ 1 mod n
∀1≤t<n−1 at 6≡ 1 mod n
Das Ordnungskriterium präzisiert:

an−1 ≡ 1 mod n
ordn (a) = n − 1 ⇔
∀ 1≤t<n−1 at 6≡ 1 mod n
∧
∧
t | (n−1)
I
Das Ordnungskriterium ganz ökonomisch:
(
an−1 ≡ 1 mod n
ordn (a) = n − 1 ⇔
∀p prim,p | n−1 a(n−1)/p 6≡ 1 mod n
∧
Effiziente Verifikation von Primzahlen
Primzahlkriterium
I
Das ganz ökonomische Primzahlkriterium (E. Lucas):
(
an−1 ≡ 1 mod n ∧
n ist Primzahl ⇔ ∃a ∈ Z∗n :
∀p prim,p | n−1 a(n−1)/p 6≡ 1 mod n
I
Also: Primheit von n lässt sich mittels k + 1 Exponentiationen
modulo n verifizieren, wobei k = Anzahl der Primteiler von n.
I
Die Ökonomie hat ihren Preis: das Kriterium ist rekursiv!
I
Ist das noch effizient verifizierbar?
I
JA!
V. Pratt: Every prime has a succinct certificate,
SIAM Journal on Computing, 4 (1975), 214-220.
Effiziente Verifikation von Primzahlen
Zertifikate für Primzahlen
Zertifikate für Primzahlen
Zertifikat C (n) für die Primheit von einer Primzahl n:
I
Angabe einer Faktorisierung
n − 1 = p1α1 · p2α2 · . . . · pkαk
wobei die pi ganze Zahlen ≥ 2 und die αi ganze Zahlen ≥ 1
sind;
I
Nachweis, dass die Zahlen p1 , . . . , pk Primzahlen sind, durch
Angabe von Zertifikaten C (pi ) für die pi > 2;
I
Angabe einer positiven Zahl a < n mit
an−1 ≡ 1 mod n und a(n−1)/pi 6≡ 1 mod n (1 ≤ i ≤ k).
Effiziente Verifikation von Primzahlen
Zertifikate für Primzahlen
I
79 ist Primzahl, denn es gilt
I
I
I
I
d.h. C (79) = [ 2 · 3 · 13 ; C (3), C (13) ; 3 ] ist ein
Prim-Zertifikat für 79.
13 ist eine Primzahl, denn es gilt
I
I
I
I
79 − 1 = 78 = 2 · 3 · 13
2, 3 und 13 sind Primzahlen
378 ≡ 1 , 378/2 ≡ 78 , 378/3 ≡ 23 , 378/13 ≡ 18 mod 79
13 − 1 = 12 = 22 · 3
2 und 3 sind Primzahlen
212 ≡ 1 , 26 ≡ 12 , 24 ≡ 3 mod 13
d.h. C (13) = [ 22 · 3 ; C (3) ; 2 ] ist ein Prim-Zertifikat für
13.
3 ist Primzahl, denn es gilt
I
I
I
3−1=2=2
2 ist Primzahl
22 ≡ 1 , 21 ≡ 2 mod3
d.h. C (3) = [ 2 ; − ; 2 ] ist ein Prim-Zertifikat für 3.
Effiziente Verifikation von Primzahlen
Zertifikate für Primzahlen
Ein grösseres Beispiel:
I
N = 1653701519 ist Primzahl, denn:
N − 1 = 2 · 7 · 19 · 23 · 137 · 1973 , 7N−1 ≡ 1 mod N und
♦
2
♦
7
♦
19
♦
23
♦ 137
♦ 1973
ist
ist
ist
ist
ist
ist
Primzahl
Primzahl
Primzahl
Primzahl
Primzahl
Primzahl
und
und
und
und
und
und
7(N−1)/2
7(N−1)/7
7(N−1)/19
7(N−1)/23
7(N−1)/137
7(N−1)/1973
≡
≡
≡
≡
≡
≡
1653701518 mod N
356579618 mod N
120777631 mod N
1080868740 mod N
101758286 mod N
1287679432 mod N
Effiziente Verifikation von Primzahlen
Zertifikate für Primzahlen
I
1973 ist Primzahl, denn:
1972 = 2 · 2 · 17 · 29, 31972 ≡ 1 mod 1973 und
♦ 2 ist Primzahl und 31972/2 ≡ 1972 mod 1973
♦ 17 ist Primzahl und 31972/17 ≡ 273 mod 1973
♦ 29 ist Primzahl und 31972/29 ≡ 934 mod 1973
I
137 ist Primzahl, denn:
136 = 2 · 2 · 2 · 17 , 3136 ≡ 1 mod 137
und
♦ 2 ist Primzahl und 3136/2 ≡ 136 mod 137
♦ 17 ist Primzahl und 3136/17 ≡ 122 mod 13
Effiziente Verifikation von Primzahlen
Zertifikate für Primzahlen
I
29 ist Primzahl, denn:
28 = 2 · 2 · 7 , 228 ≡ 1 mod 29 und
♦ 2 ist Primzahl und 228/2 ≡ 28 mod 29
♦ 7 ist Primzahl und 228/7 ≡ 16 mod 29
I
23 ist Primzahl, denn:
22 = 2 · 11 , 522 ≡ 1 mod 22 und
♦ 2 ist Primzahl und 522/2 ≡ 22 mod 23
♦ 11 ist Primzahl und 522/11 ≡ 2 mod 23
I
19 ist Primzahl, denn:
18 = 2 · 3 · 3 , 218 ≡ 1 mod 19 und
♦ 2 ist Primzahl und 218/2 ≡ 18 mod 19
♦ 3 ist Primzahl und 218/3 ≡ 7 mod 19
Effiziente Verifikation von Primzahlen
Zertifikate für Primzahlen
I
17 ist Primzahl, denn:
16 = 2 · 2 · 2 · 2 , 316 ≡ 1 mod 17 und
♦ 2 ist Primzahl und 316/2 ≡ 16 mod 17
I
11 ist Primzahl, denn:
10 = 2 · 5 , 210 ≡ 1 mod 11 und
♦ 2 ist Primzahl und 210/2 ≡ 10 mod 11
♦ 5 ist Primzahl und 210/5 ≡ 4 mod 11
Effiziente Verifikation von Primzahlen
Zertifikate für Primzahlen
I
7 ist Primzahl, denn:
6 = 2 · 3 , 36 ≡ 1 mod 7 und
♦ 2 ist Primzahl und 36/2 ≡ 6 mod 7
♦ 3 ist Primzahl und 36/3 ≡ 3 mod 7
I
5 ist Primzahl, denn:
4 = 2 · 2 , 24 ≡ 1 mod 5 und
♦ 2 ist Primzahl und 24/2 ≡ 4 mod 5
I
3 ist Primzahl, denn:
2 = 2 , 22 ≡ 1 mod 3 und
♦ 2 ist Primzahl und 22/2 ≡ 2 mod 3
Effiziente Verifikation von Primzahlen
Zertifikate für Primzahlen
Als “Zertifikate” geschrieben:
C (1653701519) = [ 2 · 7 · 19 · 23 · 137 · 1973 ;
C (7), C (19), C (23), C (137), C (1973) ; 7 ]
C (1973) = [ 22 · 17 · 29 ; C (17), C (29) ; 3 ]
C (137) = [ 23 · 17 ; C (17) ; 3 ]
C (29) = [ 22 · 7 ; C (7) ; 2 ]
C (23) = [ 2 · 11 ; C (11) ; 5 ]
C (19) = [ 2 · 32 ; C (3) ; 2 ]
C (17) = [ 24 ; − ; 3 ]
C (11) = [ 2 · 5 ; C (5) ; 2 ]
C (7) = [ 2 · 3 ; C (3) ; 3 ]
C (5) = [ 22 ; − ; 2 ]
C (3) = [ 2 ; − ; 2 ]
Effiziente Verifikation von Primzahlen
Aufwand für das Überprüfen von Zertifikaten
Aufwand der Prim-Verifikation
Aufwandsabschätzung für das Überprüfen eines Zertifikats C (n):
T (n) = Anzahl der Verifikationen von Produkten
?
m = q1β1 q2β2 · . . .
und von mod-q-Berechnungen
?
x ≡ 1 mod q
die für das Überprüfen von C (n) benötigt werden.
Effiziente Verifikation von Primzahlen
Aufwand für das Überprüfen von Zertifikaten
I
Rekursion: Für n − 1 = p1α1 · . . . · pkαk
T (n) = 1 +
k
X
T (pi ) + k + 1
i=2
Dabei ist p1 = 2, und C (2) ist “kostenlos”, d.h. T (2) = 0.
I
Setze S(n) = T (n) + 1, dann ist
S(n) =
r
X
S(pi ) + 4
i=2
Effiziente Verifikation von Primzahlen
Aufwand für das Überprüfen von Zertifikaten
I
Verifiziere per Induktion, dass für alle Primzahlen n:
S(n) ≤ 4 · log2 n
I
I
Für n = 2 ist nichts zu zeigen.
Für Primzahlen n > 2 mit
n − 1 = p1α1 p2α2 . . . pkαk
(p1 = 2)
gilt dann:
S(n) ≤
k
X
i=2
(4 · log2 pi ) + 4 = 4 ·
= 4 · log
k
Y
i=1
pi ≤ 4 · log n
k
X
i=1
log2 pi
Effiziente Verifikation von Primzahlen
Aufwand für das Überprüfen von Zertifikaten
I
Beachte: alle Operationen (inklusive Exponentiationen (!!)
mod q) werden mit Zahlen mit ≤ log n Binärstellen
durchgeführt — insgesamt ist der Rechenaufwand für das
Verifizieren von C (n) polynomial in log n.
I
Ganz wichtig: der Aufwand für das Finden der Zertifikate wird
nicht berücksichtigt – es geht ausschliesslich um das
Verifizieren!
I
Fazit: Primheit lässt sich effizient verifizieren,
Primes ∈ NP
I
Tatsächlich gilt sogar: Primheit lässt sich effizient entscheiden
Primes ∈ P
Aber das weiss man erst seit 2002.
Effiziente Verifikation von Primzahlen
Primes ∈ P
I
Im August 2002 wurde von Agrawal, Kayal, Saxena das
lange offene Problem endlich gelöst:
Primes ∈ P
Der AKS-Algorithmus
I
I
I
I
ist verblüffend einfach (⇒ folgende Seite)
die Begründung der Korrektheit ist nicht ganz so einfach, aber
interessierten Studenten durchaus zugänglich
hat eine (bewiesene!) Laufzeit O(log12 n)
(aber vermutlich real noch deutlich besser)
Hinweis: sehr instruktiver Artikel mit vielen weiteren Hinweisen
F. Bornemann, Primes is in P: Ein Durchbruch für
“Jedermann”, Mitteilungen der Deutschen
Mathematiker-Vereinigung, 4-2002, 14–21.
engl. Übersetzung: Primes is in P: A Breakthrough for
“Everyman”, Notices of the American Mathematical Society
50/5 (2003), 545–552.
Effiziente Verifikation von Primzahlen
Primes ∈ P
Der Algorithmus von Agrawal, Kayal, Saxena
Input: integer n > 1
if n = ab for a ∈ N and b > 1 then
output COMPOSITE
end if
Find the smallest r such that ordr (n) > 4 log2 n
if 1 < (a, n) < n for some a ≤ r then
output COMPOSITE
end if
if n ≤ r then
output PRIME
end if
p
for a = 1 to b2 φ(r ) log nc do
if (X + a)n 6= X n + a (mod X r − 1, n) then
output COMPOSITE
end if
end for
output PRIME
Primzahltests
I
Probedivision: n ist Primzahl
⇔ ∀k : 2≤k≤√n k 6 |n
is prime (int n)
{
√
for (int i = 2; i ≤ n; i++)
if (i | n) return FALSE;
return TRUE;
}
I
logarithmisches Kostenmodell:
I
input-Grösse ist log n
I
√
1
Anzahl der Schleifendurchläufe ist O( n) = O(2 2 log n )
I
Jede Probedivision erfordert O(log2 n) Bit-Operationen
I
Laufzeit für m-stelliges n ist im worst-case O(m2 · 2m/2 )
Primzahltests
Pseudo-Primzahltests
I
A(n, a) : Eigenschaft ganzer Zahlen mit
n Primzahl ⇒ ∀a : 1<a<n A(n, a)
I
Wird w (1 < w < n) gefunden mit ¬A(n, w ), so ist n keine
Primzahl:
∃w : 1<w <n ¬A(n, w ) ⇒ n ist keine Primzahl
I
Solch ein w heisst Zeuge (witness) für die
Zusammengesetztheit von n
Primzahltests
I
Beispiele
I
Teilbarkeitstest
D(n, a) : a 6 | n
I
Euklid-Test
E (n, a) : ggT(n, a) = 1
I
Fermat-Test
F (n, a) : ggT(n, a) = 1 ⇒ an−1 ≡ 1 (mod n)
I
SPP-Test (“strong probable prime”, Miller-Rabin)
sei n − 1 = 2t · u mit ungeradem u
(
au ≡ 1 mod n
MR(n, a) :
i
au·2 ≡ −1 mod n
oder
für ein i mit 0 ≤ i < t
Primzahltests
I
Begründung für den SPP-Test
MR(n, a) : n − 1 = 2t · u mit ungeradem u
(
au ≡ 1 mod n
oder
i
u·2
a
≡ −1 mod n für ein i mit 0 ≤ i < t
I
I
I
I
n Primzahl ⇔ Zn Körper
In einem Körper hat die Gleichung x 2 = 1 genau zwei
Lösungen x = ±1
(allgemeiner: x 2 = 1 hat für n = p e (p ≥ 3 Primzahl) in Zn
genau die beiden Lösungen x = ±1)
wird in Z∗n ein Element z 6= ±1 mit z 2 = 1 gefunden, so ist n
keine Primzahl
beachte sukzessive Quadrierungen in Z∗n
2u
au mod n , a2u mod n , a2
3u
mod n , a2
t
mod n , . . . , a2 u mod n
Primzahltests
Beispiele
I
n = 25, n − 1 = 3 · 8, a = 7:
73 ≡ 18 mod 25
76 ≡ 24 mod 25
712 ≡ 1 mod 25
724 ≡ 1 mod 25
Test bringt keine Information! a = 7 ist kein MR-Zeuge.
Primzahltests
I
n = 25, n − 1 = 3 · 8, a = 2:
23 ≡ 8 mod 25
26 ≡ 14 mod 25
212 ≡ 21 mod 25
224 ≡ 16 mod 25
Test zeigt, daß 25 nicht prim ist! a = 2 ist MR-Zeuge.
Primzahltests
I
n = 2047 = 23 · 89, n − 1 = 2 · 1023, a = 2:
21023 ≡ 1 mod 2047
22046 ≡ 1 mod 2047
Test bringt keine Information! a = 2 ist kein MR-Zeuge.
Primzahltests
I
n = 2047 = 23 · 89, n − 1 = 2 · 1023, a = 3:
31023 ≡ 1565 mod 2047
32046 ≡ 1013 mod 2047
Test zeigt, daß 2047 nicht prim ist! a = 3 ist MR-Zeuge.
Primzahltests
I
n = 341 = 11 · 31, n − 1 = 4 · 85, a = 2
285 ≡ 32 mod 341
2170 ≡ 1 mod 341
2340 ≡ 1 mod 341
Test zeigt, daß 341 nicht prim ist! a = 2 ist MR-Zeuge.
Primzahltests
I
n = 561 = 3 · 11 · 17, n − 1 = 16 · 35, b = 2
235 ≡ 263 mod 561
270 ≡ 166 mod 561
2140 ≡ 67 mod 561
2280 ≡ 1 mod 561
2560 ≡ 1 mod 561
Test zeigt, daß 561 nicht prim ist! b = 2 ist MR-Zeuge.
In der Tat ist 561 die kleinste Carmichael-Zahl, also eine
Zahl, bei der es ausser den GGT-Zeugen keine weiteren
Fermat-Zeugen gibt! Man weiss erst seit 1994, dass es
unendlich-viele solche Zahlen gibt
(Alford, W.R.; Granville, A.; and Pomerance, C).
Siehe:
http : //mathworld.wolfram.com/CarmichaelNumber.html
Primzahltests
I
n = 2243, n − 1 = 2 · 1121, b = 2
21121 ≡ 2242 mod 2243
22242 ≡ 1 mod 2243
b = 2 ist kein MR-Zeuge für die Zusammengesetztheit von
2243. Solche Zeugen darf und kann es nicht geben, denn 2243
ist Primzahl!
Primzahltests
Beispiele für Zeugenmengen:
I
n = 13
Dzeugen(13) = [ ]
Ezeugen(13) = [ ]
Fzeugen(13) = [ ]
MRzeugen(13) = [ ]
Primzahltests
I
n = 14
Dzeugen(14) = [ 2, 7 ]
Ezeugen(14) = [ 2, 4, 6, 7, 8, 10, 12 ]
Fzeugen(14) = [ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 ]
MRzeugen(14) = [ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 ]
Primzahltests
I
n = 15
Dzeugen(15) = [ 3, 5 ]
Ezeugen(15) = [ 3, 5, 6, 9, 10, 12 ]
Fzeugen(15) = [ 2, 3, 5, 6, 7, 8, 9, 10, 12, 13 ]
MRzeugen(15) = [ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 ]
Primzahltests
I
n = 25
Dzeugen(25) = [ 5 ]
Ezeugen(25) = [ 5, 10, 15, 20 ]
Fzeugen(25) = [ 2, . . . , 6, 8, . . . , 17, 20, . . . , 23 ]
MRzeugen(25) = [ 2, . . . , 6, 8, . . . , 17, 20, . . . , 23 ]
Primzahltests
Vergleich der Grösse von Zeugenmengen
n D E F MR
2 0 0 0
0
3 0 0 0
0
2
4 1 1 2
5 0 0 0
0
6 2 3 4
4
0
7 0 0 0
8 2 3 6
6
9 1 2 6
6
10 2 5 8
8
12 4 7 10
10
14 2 7 12
12
15 2 6 10
12
Primzahltests
Vergleich der Grösse von Zeugenmengen
n D E F MR
16 3 7 14
14
18 4 11 16
16
18
20 4 11 18
21 2 8 16
18
22 2 11 20
20
24 6 15 22
22
25 1 4 20
20
24
26 2 13 24
27 2 8 24
24
28 4 15 24
24
Primzahltests
Vergleich der Grösse von Zeugenmengen
n D
30 6
.. ..
. .
105 6
.. ..
. .
169
..
.
1
..
.
561
..
.
6
..
.
1105
..
.
1729
..
.
E
21
..
.
F
28
..
.
MR
28
..
.
56
..
.
88
..
.
102
..
.
12 156
..
..
.
.
240 240
..
..
.
.
156
..
.
550
..
.
6 336 336 1074
..
..
..
..
.
.
.
.
6 432 432 1566
..
..
..
..
.
.
.
.
Primzahltests
I
Idee (probabilistischer) Primzahltests:
I
Gelingt es trotz intensiver (zufälliger) Bemühungen
nicht, einen Zeugen für die Zusammengesetztheit von
n aufzutreiben, wird man n für eine Primzahl halten
Annahme:
I
I
für n, a mit 1 < a < n ist die Un/Gültigkeit von A(n, a) leicht
zu überprüfen
ist n keine Primzahl, so sind Zeugen für die
Zusammengesetztheit von n häufig
Primzahltests
I
Probabilistisches Verfahren:
I
I
I
wähle zufällig Kandidaten k1 , k2 , . . . , kr mit 1 < ki < n und
überprüfe A(n, ki )(1 ≤ i ≤ r )
wird dabei mindestens ein Zeuge für die Zusammengesetztheit
von n gefunden, d.h. ¬A(n, ki ), so ist n in der Tat
zusammengesetzt
— diese Aussage ist korrekt!
wird kein Zeuge für die Zusammengesetztheit von n gefunden,
so wird n als Primzahl deklariert
— dies ist mit nur sehr geringer Wahrscheinlichkeit eine
falsche Entscheidung
Primzahltests
Diskussion der Tests:
I
Teilbarkeitstest
Unbrauchbar, da es Nicht-Primzahlen n mit nur zwei Teilern
(6= 1, n) gibt (Teilbarkeits-Zeugen)
I
Euklid-Test
Unbrauchbar, da es Nicht-Primzahlen n mit nur wenigen
Euklid-Zeugen gibt
I
Fermat-Test
Unbrauchbar, da es zusammengesetzte Zahlen n gibt mit
∀1<a<n : ggT(n, a) = 1 ⇒ an−1 ≡ 1(mod n)
d.h. alle Fermat-Zeugen sind schon Euklid-Zeugen
Primzahltests
I
Der Primzahltest von Miller-Rabin:
I
wähle (iteriert und zufällig) Zahlen
a ∈ Zn , a 6= {0, 1} mit ggT(n, a) = 1
I
(falls a mit ggT(n, a) 6= 1: sowieso fertig)
berechne an−1 mod n durch “schnelle Exponentiation”, d.h.
durch iteriertes Quadrieren und Multiplizieren:
j
a(n−1) div 2 für j = k, k − 1, k − 2, . . . , 1, 0,
I
wobei k = `(n − 1) + 1
falls auf diesem Weg eine Situation
z 7→ z 2 = 1 mit z 6= ±1
angetroffen wird: Zeuge für Zusammengesetztheit von n
gefunden!
Primzahltests
Miller Rabin (int n)
{
choose a ∈ [2 : n − 1] at random;
/* primes are odd except for 2, which is an odd prime :-) */
if (n == 2) return TRUE;
if (n == 1 || even(n)) return FALSE;
/* primes are relatively prime to a */
if (ggT(a, n) > 1) return FALSE;
/* compute z = an−1 #= 1 mod n using iterated squaring */
let (bk , . . . , b0 ) be the binary representation of n − 1;
int z = 1;
for (int i = k; i ≥ 0; i−−)
{
int x = z;
z = z 2 mod n;
/* primes allow only trivial solutions of x2 ≡ 1 mod p */
if ((z == 1) && (x #= 1) && (x #= n − 1)) return FALSE;
if (bi == 1) z = z · a mod n;
}
if (z #= 1 mod n) return FALSE;
/* z = an−1 */
return TRUE;
/* no witness found: in dubio pro reo */
}
Primzahltests
Beachte:
I ist n − 1 = 2t · u mit ungeradem u, so
I
sind die letzten t + 1 Werte von z beim Quadrieren und
Multiplizieren
2
au mod n , a2u mod n , a2
I
u
3
mod n , a2
u
t
mod n , . . . , a2 u mod n
sind die letzten t Operationen sind nur Quadrierungen
Primzahltests
Lemma:
I
Miller-Rabin-Zeugen sind häufig,
genauer:
ist n eine zusammengesetzte Zahl, so ist die Anzahl der
Miller-Rabin-Zeugen für diese Tatsache mindestens (n − 1)/2
zu diesem Zweck wird gezeigt:
I
Nicht-Zeugen sind Elemente von Z∗n (klar!)
I
Die Nicht-Zeugen bilden eine echte Untergruppe von Z∗n
I
Wegen des Satzes von Lagrange hat diese Untergruppe
≤ ]Z∗n /2 ≤ (n − 1)/2 Elemente
I
es gilt sogar (Beweis etwas aufwendiger):
die Untergruppe der Nicht-Zeugen hat ≤ ϕ(n)/4 Elemente
Primzahltests
I
der einfache Fall:
es gibt in Z∗n einen Fermat-Zeugen,
d.h. ein a ∈ Z∗n mit an−1 ≡
6 1 mod n
I
B = {b ∈ Z∗n ; b n−1 ≡ 1 mod n} ist eine Untergruppe von Z∗n
I
alle Nicht-Zeugen gehören zu B
I
wegen x ∈
/ B ist B eine echte Untergruppe von Z∗n
Primzahltests
I
der etwas weniger einfache Fall:
es gibt in Z∗n keine Fermat-Zeugen,
d.h. an−1 ≡1 mod n für alle a ∈ Z∗n
I
der einfache Unter-Fall des etwas weniger einfachen Falles:
n = p e mit Primzahl p > 2 und e > 2
I
Fakt: Z∗pe ist eine zyklische Gruppe
I
]Z∗pe = ϕ(p e ) = p e−1 (p − 1)
I
Ist a ∈ Z∗pe ein Element der Ordnung ϕ(p e ), so gilt
e
aϕ(p ) ≡ 1 (mod n) und an−1 ≡ 1 (mod n),
also ϕ(p e ) = p e−1 (p − 1) | p e − 1 : unmöglich!
Primzahltests
I
der etwas weniger einfache Unter-Fall des etwas weniger
einfachen Falles:
n = n1 · n2 mit n1 , n2 > 1 und ggT(n1 , n2 ) = 1
I
n − 1 = 2t · u mit ungeradem u, für a ∈ Z∗n betrachte
2
[a] = hau mod n, a2u mod n, a2
u
3
mod n, a2
u
t
mod n, . . . , a2 u mod ni
I
beachte: die letzte Komponente von [a] ist immer = 1;
I
sei j mit 0 ≤ j < t maximal mit der Eigenschaft, dass es ein
j
v ∈ Z∗n gibt v 2 u ≡ −1 mod n
I
B = {x ∈ Z∗n ; x 2 u ≡ ±1 mod n} =
6 ∅
Primzahltests
j
B ist eine Untergruppe von Z∗n , die alle Nicht-Zeugen enthält
B ist eine echte Untergruppe von Z∗n :
I
I
–
j
sei v ∈ Z∗n mit v 2 u ≡ −1 mod n
j
j
– ⇒ v 2 u ≡ −1 mod n1 und v 2 u ≡ −1 mod n2
– Konstruiere mittels Chinesischem Restesatz w ∈ Z∗n mit
w ≡ v mod n1 und w ≡ 1 mod n2
j
j
– ⇒ w 2 u ≡ −1 mod n1 und w 2 u ≡ 1 mod n2 ⇒ w ∈
/B
Primzahltests
Theorem (Miller, Rabin, 1976)
I
Der Miller-Rabin-Primzahltest beurteilt bei m Iterationen eine
zusammengesetzte Zahl n fälschlicherweise als Primzahl mit
einer Wahrscheinlichkeit < (1/2)m bei einer Laufzeit von
O(m · `(n)3 )
In der Terminologie der Komplexitätstheorie
Primes ∈ co-RP
wobei:
RP = random polynomial time
= Klasse der Probleme mit effizienten probabilistischen Entscheidungsverfahren mit einseitigem Fehler
(“biased Monte Carlo”)
Primzahltests
I
Zahlenbeispiel zur Effizienz des Miller-Rabin-Tests:
I
ε : Fehlerwahrscheinlichkeit des MR-Tests
I
Aufwand zum Testen einer k-stelligen Zahl ( log
I
Annahme:
106 arithmetische Operationen pro Sekunde, ε = 10−100
1
· k 3)
k = 30 ⇒
1 sec
k = 50 ⇒ 12.5 sec
k = 100 ⇒ 100 sec
Primzahltests
I
I
Ein wesentlich schwieriger darzustellendes und zu
begründendes Verfahren von Adleman und Huang (1992)
zeigt
Primes ∈ RP
Aus beiden Aussagen zusammen erhält man
Primes ∈ ZPP = RP ∩ co-RP
wobei:
ZPP = zero error random polynomial time
= Klasse der Probleme mit probabilistischen
Entscheidungsverfahren, die im Mittel effizient
sind
(“Las Vegas”)
Primzahltests
Weitere Informationen zur Komplexitätssituation für Primes
I
Primzahlen sind effizient verifizierbar (Pratt, 1975)
Primes ∈ NP
I
Zusammen mit dem offensichtlichen (!!) Primes ∈ co-NP
ergibt sich
Primes ∈ NP ∩ co-NP
Primzahltests
I
Miller hat 1976 gezeigt, dass Primzahlen deterministisch
mit Aufwand O(log5 n) erkannt werden können, denn
I
I
ist n keine Primzahl, dann ist kleinste MR-Zeuge für die
Zusammengesetztheit von n kleiner als 2 ln2 n (Bach, 1985)
Hierbei wird allerdings eine bislang unbewiesene Hypothese
des Zahlentheorie (ERH) verwendet!
Es gibt einen (in der Praxis!!) sehr effizienten
deterministischen Primzahltest von Adelman, Pomerance,
Rumeley (1983) mit Laufzeit
O((log n)c. log log log n )
I
Im August 2002 wurde von Agrawal, Kayal, Saxena das
lange offene Problem endlich gelöst:
Primes ∈ P
Primzahltests
I
Literaturhinweise:
I
I
I
R. Crandall, C. Pomerance,
Prime Numbers, A Computational Perspective,
Springer-Verlag, 2001.
M. Dietzfelbinger,
Primality Testing in Polynomial Time,
Springer Verlag 2004.
siehe auch Webseite zur Vorlesung
7.3
7.3.1
Probabilistische Komplexitätsklassen
Probabilistische Algorithmen
Probabilistische Algorithmen sind Algorithmen, die neben ihrer eigentlichen Eingabe
noch Zugriff zu Zufallszahlen oder Zufallsbits haben, mit denen der Ablauf einer Berechung gesteuert werden kann. Die Dauer einer Berechnung und das Resultat werden
damit zu Zufallsvariablen. Im folgenden wird es nur um Entscheidungsverfahren gehen,
also um Algorithmen zur Berechnung einer Indikatorfunktion
χL : A∗ → {0, 1}, d.h. χL (x) = 1 ⇔ x ∈ L,
wobei A ein endliches Alphabet ist und L ⊆ A∗ eine formale Sprache, durch die ein
Problem codiert wird.
Der Ablauf eines probabilistischen Algorithmus A zur Berechung von χL auf einem
Input x ∈ A∗ wird durch Bitstrings w ∈ Bp(|x|) = {0, 1}p(|x|) gesteuert, wobei p(.) ein
festes Polynom ist. A(x, w) bezeichne das Resultat der Ausführung von A auf dem Input
x ∈ An , wenn dabei w ∈ Bp(n) als Zufallsfolge (“Steuerfolge”) gewählt wird.
Für jeden Input x der Länge |x| = n kommen genau 2p(n) mögliche Steuerfolgen in Frage,
von denen pro Durchlauf je eine gleichverteilt zufällig ausgewählt wird. Man kann also
A als deterministischen Algorithmus auf der Eingabemenge
[
An × Bp(n)
n≥0
auffassen. Damit sind in Abhängigkeit von x und w prinzipiell vier Ereignisse möglich:
• E1,1 : χL (x) = 1 und A(x, w) = 1 (korrektes Resultat)
• E1,0 : χL (x) = 1 und A(x, w) = 0 (Fehler 1. Art)
• E0,1 : χL (x) = 0 und A(x, w) = 1 (Fehler 2. Art)
• E0,0 : χL (x) = 0 und A(x, w) = 0 (korrektes Resultat)
Für x ∈ L wird mit px die Wahrscheinlichkeit für einen Fehler erster Art und für x 6∈ L
mit qx die Wahrscheinlichkeit für einen Fehler zweiter Art bezeichnet, also:
o
1 n
px = p(n) ] w ∈ Bp(n) ; (x, w) ∈ E1,0
(x ∈ L),
2
o
1 n
(x 6∈ L).
qx = p(n) ] w ∈ Bp(n) ; (x, w) ∈ E0,1 .
2
Damit ist 1 − px die Wahrscheinlichkeit für ein korrektes Resultat bei Input x ∈ L
und 1 − px die Wahrscheinlichkeit für ein korrektes Resultat bei Input x 6∈ L. Die
Möglichkeit, dass sich ein probabilistischer Entscheidungs-Algorithmus für eine Sprache
L auf Inputs x ∈ L statistisch ganz anders verhält, als für Inputs x 6∈ L ist damit
175
ausdrücklich vorgesehen – insbesondere, dass (wie beim Miller-Rabin-Test) Fehler nur
einseitig auftreten!
Der stochastische Witz bei probabilistischen Algorithmen A besteht natürlich darin,
den Algorithmus mit gleichem input x mehrfach laufen zu lassen, um so statistisch
bessere Aussagen zu erhalten. Die m-fache Wiederholung von A mit (demselben!) Input
x berechnet also
(A(x, w(1) ), A(x, w(2) ), · · · , A(x, w(m) )) ∈ Bm
mit zufällig (unabhängig!) gewählten Steuerfolgen w(1) , w(2) , . . . , w(m) und die gewonnenen Werte können durchaus unterschiedlich sein. Was kann man in einem solchen Fall
schliessen? Da hängt von der Natur des Algorithmus A ab:
• Falls bekannt ist, dass der Algorithmus auf dem Input x nur einseitige Fehler
macht, also z.B.
– x ∈ L → A(x, w) = 0 mit Wahrscheinlichkeit px < 1,
– x 6∈ L → A(x, w) = 1 mit Wahrscheinlichkeit 0, d.h. qx = 0,
kann man bei Auftreten des Ereignisses A(x, w) = 1 mit Sicherheit auf “x ∈ L”
schliessen!
Iteriert man einen solchen Algorithmus k-mal, so kann man schliessen
– Falls in der Folge (A(x, w(j) ))1≤j≤k mindestens einmal eine “1” auftritt, ist
die Aussage “x ∈ L” mit Sicherheit richtig;
– Falls in der Folge (A(x, w(j) ))1≤j≤k keine “1” auftritt, ist die Aussage “x 6∈ L”
falsch mit einer Wahrscheinlichkeit pkx .
Solche Algorithmen mit einseitigem Fehler, bei denen die Fehlerwahrscheinlichkeit bei Iteration exponentiell schnell gegen 0 geht, nennt man Monte-CarloAlgorithmen (mit Bias). Beachte: hierbei muss keineswegs px < 1/2 gelten.
Monte-Carlo: der Algorithmus gibt zwar gelegentlich falsche Antworten, aber durch Iteration kann man die Wahrscheinlichkeit dafür schnell
beliebig klein machen.
• Falls der Algorithmus zweiseitige Fehler machen kann, ist die Situation komplizierter. Dabei muss man erst einmal annehmen, dass der Algorithmus “überwiegend”
korrekt antwortet:
– x ∈ L → A(x, w) = 0 mit Wahrscheinlichkeit px < 1/2,
– x 6∈ L → A(x, w) = 1 mit Wahrscheinlichkeit qx < 1/2.
In dieser Situation ist es naheliegend, sich Mehrheitsentscheidungen zunutze zu
machen. Um Patt-Situationen zu vermeiden, sei dabei die Anzahl der Iterationen
ungerade. Also
176
– Falls in der Folge (A(x, w(j) ))1≤j≤2m+1 mindestens (m + 1)-mal eine “1” auftritt, so sei “x ∈ L” die Antwort;
– Falls in der Folge (A(x, w(j) ))1≤j≤2m+1 mindestens (m + 1)-mal eine “0” auftritt, so sei “x 6∈ L” die Antwort.
Kann man auch in dieser Situation die Fehlerwahrscheinlichkeiten durch Iteration
schnell klein machen? Da muss man genauer hinschauen!
7.3.2
Bernoulli-Experimente
Das einfachste Zufallsexperiment ist der Wurf eine Münze mit zwei verschiedenen Resultaten “Kopf” oder “Zahl”. Dabei sei p mit 0 < p < 1 die Wahrscheinlichkeit dafür,
“Kopf” zu erhalten. Wenn die Münze “fair” ist, ist p = 1/2. Ansonsten ist die Münze
“unfair”. Iteriertes Münzwerfen mit derselben Münze (Stationarität!), bei denen sich
die Resultate verschiedenen Würfe nicht beeinflussen (Unabhängigkeit!), lassen sich dadurch beschreiben, dass man bei n Würfen die Menge der möglichen Ergebnisse mit dem
Raum Bn der Bitvektoren der Länge n identifiziert. Bnk bezeichne wieder die Menge der
Bitvektoren der Länge n mit Hamming-Gewicht (Anzahl der Einsen) k.
Für 0 ≤ p ≤ 1 und n ≥ 1 sei nun βn,p die Wahrscheinlichkeitsverteilung auf Bn , die für
a ∈ Bn durch
βn,p (a) = p||a|| (1 − p)n−||a|| = p|a|1 (1 − p)|a|0
definiert ist. Für eine Teilmenge A ⊆ Bn sei
X
βn,p (A) =
βn,p (a).
a∈A
Dann gilt insbesondere für 0 ≤ k ≤ n
βn,p (Bnk )
n k
=
p (1 − p)n−k .
k
Daher der Name Binomialverteilung (zum Parameter p) für diese Wahrscheinlichkeitsverteilung. Zwei wichtige Kenngrössen dieser Verteilung sind ihr Erwartungswert (Mittelwert) und ihre Varianz (Streuung)
X
X
n k
E(βn,p ) =
||a|| · βn,p (a) =
k·
p (1 − p)n−k = n · p,
k
a∈Bn
0≤k≤n
X
2
2
σ (βn,p ) =
(||a|| − E(βn,p )) · βn,p (a) = n · p(1 − p).
a∈Bn
Beim Münzwurfexperiment wird man also im Mittel bei n Würfen mit etwa n·p Auftreten
von “Kopf” rechnen können und σn,p2 = n · p(1 − p) ist ein Maß für die Streuung um
den Mittelwert, die dabei auftritt.
177
Für die Anwendung auf die probabilistischen Algorithmen betrachten wir nun ein Münzwurfexperiment mit der Wahrscheinlichkeit p < 1/2 für “Kopf” und fragen nach der
Wahrscheinlichkeit, dass bei (2m + 1)-maliger Auführung in der Mehrzahl der Fälle das
p-Ereignis (= falsche Aussage) auftritt:
X 2m + 1
2m+1
p2m+1−j (1 − p)j
errm,p = β2m+1,p (kak > m) = β2m+1,1−p (B≤m ) =
j
0≤j≤m
Es gibt verschiedene Möglichkeiten, diese Grösse abzuschätzen. Das Ziel ist dabei eine
Aussage über die nötige Anzahl 2m + 1 von Würfen zu bekommen, im diese Wahrscheinlichkeit unter eine gegebene Schranke δ zu drücken. Dafür sei ε = 1/2 − p > 0
und
1
1
1 − 4ε2
p(1 − p) =
− ε)
+ε =
.
2
2
4
1. Ganz elementar ergibt sich
errm,p
X 2m + 1
p2m+1−j (1 − p)j
=
j
0≤j≤m
X 2m + 1 p j
m
= [p(1 − p)] · p ·
j
1−p
0≤j≤m
2m
= [p(1 − p)] · p · 2
m
= p · (1 − 4ε2 )m .
2. Etwas aufwendiger ist die Ableitung, die auf der (einfach zu zeigenden) Rekursionsbeziehung
1
2m−1
2m
βp (B2m+1
≤m ) = βp (B≤m−1 ) + βp (Bm ) (1 − 2p)
2
aufsetzt und aus ihr
m X
1
2j
errm,p = − ε
[p(1 − p)]j
2
j
j=0
∞
X
2j
=ε
[p(1 − p)]j
j
j=m+1
herleitet. Nach einigen Umformungen und Abschätzungen erhält man
errm,p ≤
1 (1 − 4ε2 )m+1
p
.
4ε
π(m + 1)
3. Die Chebychev-Ungleichung der Wahrscheinlichkeitsrechnung besagt (bezogen
auf n Wiederholungen des Münzwurfs)
1 2
1
βn,p (kak − n · p ≥ t) ≤ 2 σn,p
= 2 n · p(1 − p)
t
t
178
Mit ε = 1/2 − p und t = n · ε) ergibt sich
n
βn,p kak ≥
= βn,p (kak ≥ n(p + ε))
2
≤ βn,p kak − n · p ≥ n · ε
≤
1 1 − 4ε2
.
n 4ε2
4. Eine schärferes Werkzeug der Wahrscheinlichkeitsrechnung ist die Chernov-Schranke,
die in diesem Fall besagt:
βn,p (kak ≥ np + t) ≤ e
2
t
− 2n(1−p)
(t > 0)
Mit t = n · ε ergibt sich
2
n
− ε
βn,p kak ≥
= βn,p (kak ≥ n(p + ε)) ≤ e 2n(1−p) .
2
Die Herleitung einer Aussage für die notwendige Anzahl Versuche, um die Fehlerwahrscheinlichkeit unter eine Schranke δ > 0 zu drücken, soll es den beiden ersten Abschätzungen vorgeführt werden:
1. Um mit 2m + 1 Iterationen eine Fehlerwahrscheinlichkeit errm,p < δ zu erreichen,
muss man
log(1/δ)
(1 − 4ε2 )m ≤ δ, d.h. m ≥
log(1/(1 − 4ε2 ))
haben. Eine simple Abschätzung zeigt
1
ln 2
≤ 2,
2
log(1/(1 − ε ))
4ε
sodass man sieht, dass
m≈
ln 2
· log(1/δ)
4ε2
Iterationen genügen.
2. Wählt man ein reelles x mit
√
ex x ≥
1
√ .
2δ π
und dann
x
e,
4ε2
so ergeben einige Umformaungen und Abschätzungen ebenfalls errm,p < δ.
m+1=d
179
7.3.3
Probabilistische Komplexitätsklassen
Bis hierhin wurde über die Effizienz der betrachteten Algorithmen noch garnichts ausgesagt. Um probabilistische Komplexitätsklassen zu definieren, muss man auch hierüber
Aussagen machen. Hier soll nur der Fall betrachtet werden, dass die Algorithmen immer terminieren und effizient sind in dem Sinne, dass der Aufwand für die Berechnung
von A(x, w) polynomiell von |x| abhängt. Man kann auch andere Szenarien betrachten,
z.B. Algorithmen, die im Mittel effizient sind, aber dabei im worst-case auch sehr lange
Laufzeit haben können oder evtl. auch garnicht terminieren – solange solche Ereignisse
nur genügend selten sind.
Unter dieser generellen Maßgabe polynomieller Laufzeit kann man nun die folgenden
Komplexitätsklassen definieren, die ein Problem (eine Sprache) L einer Klasse zuordnen,
wenn es einen Algorithmus A mit der jeweils definierenden Eigenschaft gibt:
P: polynomial time : = effizientes (deterministisches) Entscheiden
(
∀x ∈ L : px = 0
∀x 6∈ L : qx = 0
N P: nondeterministic polynomial time = effizientes Verifizieren
(
∀x ∈ L : px < 1
∀x 6∈ L : qx = 0
PP: probabilistic polynomial time = probabilistisches Entscheiden
(
∀x ∈ L : px < 1/2
∀x 6∈ L : qx < 1/2
RP: random polynomial time = effizientes probabilistisches Entscheiden mit einseitigem
Fehler (“biased Monte Carlo”)
(
∀x ∈ L : px < 1/2
∀x 6∈ L : qx = 0
BPP: bounded error probabilistic polynomial time = effizientes probabilistisches Entscheiden mit zweiseitigem Fehler (“unbiased Monte Carlo”)
(
∀x ∈ L : px < 1/2 − c
∃c > 0 :
∀x 6∈ L : qx < 1/2 − c
180
Die Komplexitätsklassen P, PP und BPP sind aufgrund ihrer symmetrische Definition
(bezogen auf Menge L und ihr Komplement) unter Komplementierung abgeschlossen.
Da die Definitionen von N Pund RP asymmetrisch sind (bezogen auf Menge L und ihr
Komplement), kann man eine solche Aussage nicht machen und man muss die Komplementärklassen definieren. Das ist eine Routinesache:
co-N P:
(
∀x ∈ L :
∀x 6∈ L :
co-RP:
(
∀x ∈ L :
∀x 6∈ L :
px = 0
qx < 1
px = 0
qx < 1/2
Zudem definiert man noch die “Las Vegas”-Klasse
ZPP = RP ∩ co-RP
Kommentare:
• Für Probleme der Klassen RP und co-RP lässt sich die Fehlerwahrscheinlichkeit
mittels Iteration exponentiell schnell klein machen. Is diesen Fällen kann die Forderung ∀xpx < 1/2 durch eine Forderung ∀xpx < c für irgendein c < 1 ersetzt
werden, ohne dass sich die klasse der damit erfassten Probleme ändert.
• Der Unterschied zwischen den Klassen PP und BPP ist mutmasslich erheblich!
die Tatsache, dass man für BPP fordert, dass die Fehlerwahrscheinlichkeiten uniform von 1/2 entfernt sind hat zur Folge, dass man durch eine geringe Anzahl von
Iterationen die Fehlerwahrscheinlichkeit uniform (d.h. für alle Inputs mit den gleichen Abschätzungen) beliebig klein machen kann. Wie wenige Iterationen genügen,
wurde im vorigen Abschitt erörtert. Eine entsprechende Folgerung für die Klasse
PP ist nicht zulässig!
• Probleme L der Klasse ZPP kann man dadurch angehen, dass man auf einem
Input x sowohl einen RP-Algorithmus A, als auch einen RP-Algorithmus B für
da Komplement Lc simultan laufen lässt. Dann kann man drei Möglichkeiten in
Betracht ziehen:
1. A antwortet “x ∈ L” – das ist dann zweifelsfrei korrekt!
2. B antwortet “x 6∈ L” – das ist dann zweifelsfrei korrekt!
3. A antwortet “x 6∈ L” und B antwortet “x ∈ L” – dies ist sowohl mit der
Tatsache “x ∈ L”, als auch mit der Tatsache “x 6∈ L” verträglich!
Beachte: die Situation A antwortet “x ∈ L” und B antwortet “x ∈ Lc ” kann nicht
vorkommen!
181
In den ersten beiden Fällen ist die Sache zweifelsfrei entschieden, im dritten Fall
wird man das Experiment wiederholen müssen usw. Hier passiert also folgendes:
das Algorithmenpaar (A, B) gibt zwar nie eine falsche Auskunft, aber es kann u.U.
sehr lange dauern, bis eine Entscheidung gefunden ist, in dem einer der ersten
beiden Fälle eintritt: die Laufzeit ist nur im Mittel, aber nicht im worst-case polynomiell beschränkt. Algorithmen dieser Art nennt man Las-Vegas-Algorithmen.
Las-Vegas: der Algorithmus gibt nie falsche Antworten, aber verweigert manchmal die Antwort; aber durch Iteration kann man die Wahrscheinlichkeit dafür schnell beliebig klein machen und so ein im Mittel
effizientes Verhalten erreichen.
Auf Grund der Definitionen ergeben sich Inklusionen, die in dem folgenden Diagramm
dargestellt sind, wobei zu betonen ist, dass man bisher in keinem Fall hat beweisen
können, dass diese Inklusionen echt sind!
PP
NP
BPP
co-NP
RP
NP & co-NP
co-RP
ZPP
P
Die damit verbundenen Fragestellungen gehören zu den wichtigsten ungelösten Probleme der Theoretischen Informatik, von denen drei nochmal explizit notiert werden
sollen:
182
1. Ist P = N P, d.h. sind alle Probleme, deren Lösungen man effizient
verifizieren kann, auch effizient entscheidbar?
2. Ist N P = co-N P, d.h. sind die Komplemente von NP-vollständigen, also effizient verifizierbaren Problemen selbst auch effizient
verifizierbar?
3. Was ist das Verhältnis von N Pund BPP zueinander? Besteht
eine Inklusion in einer der beiden Richtungen?
Man beachte, dass aus einer positiven Antwort für 1. sofort die positive Antwort für 2.
folgen würde, dass aber eine positive Antwort für 2. auch mit einer negativen Antwort
für 1. verträglich ist. Das Problem 3. ist deshalb interessant, weil man mit gutem Grund
die Klasse BPP mit der Klasse “für alle praktischen Zwecke effizient entscheidbaren
Probleme” identifizieren kann: durch wiederholte (im statistischen Sinne) unabhängige
Durchführung des Algorithmus kann man die Fehlerwahrscheinlichkeiten mit polynomiellem Aufwand in log(1/δ) unter jede noch so kleine positive Schranke δ drücken!
7.4
Public-key Kryptografie
7.4.1
Verschlüsselung durch Exponentiation
7.4.2
Public-key Verschlüsselung und Signaturen
7.4.3
Das RSA-Verfahren
Hinweis23
siehe separate Folien
7.4.4
Weitere Anwendungen der Exponentiation
siehe separate Folien
23
Historische Bemerkung: Das RSA-Verfahren bezieht seinen Namen von den drei Autoren der originalen Veröffentlichung: Ronald Rivest, Adi Shamir und Leonard Adleman. In ihrer 1978 publizierten
Arbeit A method for obtaining digital signatures and public key cryptosystems, Communications of the
ACM 21 (1978), 120–126, realisierten sie die seit 1976 von Wilfried Diffie, Martin Hellman und
Ralph Merkle propagierte Idee der public key cryptography. Diese Fakten beschreiben die Geschichte
aus der Sicht der öffentlichen, akademischen Forschung. In der Tat wurde die trapdoor -Idee bereits 1969
von James Ellis vom britischen Nachrichtendienst GCHQ erfunden und im Rahmen dieses Dienstes
von Clifford Cocks bereits 1973 mit einem Verfahren realisiert, das sehr grosse Ähnlichkeit mit dem
RSA-Verfahren aufweist. Aber das hat man erst sehr viel später erfahren....
183
Verschlüsselung durch Exponentiation (Pohlig, Hellman, 1976)
– p : eine (grosse) Primzahl
– e : Zahl 0 < e < p mit ggT(e, p − 1) = 1
– d Inverses von e in Z∗p−1 , d.h. d · e ≡ 1 mod p − 1 (= φ(p))
– M : numerisch codierter Text
– M in Blöcke Mi mit 0 < Mi < p zerlegen (i=1,2,3. . . )
– Codierung (encryption)
Mi 7→ Ci := Mie mod p
(i=1,2,3,. . . )
– Decodierung (decryption)
k·φ(p)+1
Ci 7→ Cid ≡ (Mie )d ≡ (Mi )e·d ≡ Mi
≡ Mi mod p
(i=1,2,3,. . . )
1
numerische Codierung
t
A
B
C
D
...
Y
Z
01
l
l
l
...
00
l
l
l
l
02
03
04
...
25
26
Parameter: p = 7951, e = 91, d = 961
Text: ENCRYPTION REGULATION
Numerisch codierter Text;
M = 05 14 03 18 25 16 20 09 15 14 00 18 05 07 21 12 01 20 09 15 14 00
Zerlegung in Blöcke mit je 4 Ziffern
0514 0318 2516 2009 1514 0018 0507 2112 0120 0915 1400
2
Verschlüsselung
C1
=
051491 mod 7951
91
=
2174
C2
=
0318
mod 7951
=
4468
C3
..
.
=
251691 mod 7951
..
.
=
7889
..
.
C11
=
140091 mod 7951
=
7114
Ciphertext
2174 4468 7889 6582 0924 5460 7868 7319 0726 2890 7114
Entschlüsselung
M1
=
2174961 mod 7951
961
=
514
M2
=
4468
mod 7951
=
318
M3
..
.
=
7889961 mod 7951
..
.
=
2516
..
.
M11
=
7114961 mod 7951
=
1400
3
Public-Key-Kryptographie
• Ziel: sicherer Informationsaustausch zwischen Teilnehmern
{Alice, Bob, Cesar, . . .} an einem öffentlichen Netz, bei dem die
transportierten (verschlüsselten) Daten abgehört werden können
• Klassisch (“symmetrische Kryptosysteme”, z.B. DES): jedes Paar hA, Bi
von Teilnehmern besitzt identische Schlüssel zum Verschlüsseln und
Entschlüsseln, die nur diesen bekannt sind
Problem: wie können A und B identische Schlüssel erhalten/erzeugen?
als nicht-technische Lektüre dringendst empfohlen:
S. Singh, Geheime Botschaften, dtv, 2001. (Engl.: The Code Book)
4
• Public-Key-Idee (“asymmetrisch”, W. Diffie, M. Hellman, 1976):
Schlüssel über das Netz selbst zugänglich machen
– Jeder Teilnehmer B erzeugt ein Paar hkE , kD i von Schlüsseln,
– kE wird von B öffentlich bekanntgegeben (“Telefonbuch”),
kD bleibt Geheimnis von B
– Will eine Teilnehmerin A am Netz eine Nachricht N in verschlüsselter Form
an B schicken, so
∗ besorgt sich A den Schlüssel kE (unverschlüsselt) aus dem Telefonbuch
∗ verschlüsselt N mittels kE zu E(N, kE ) mittels eines geeigneten
Verfahrens E und sendet E(N, kE ) zu B
∗ B erhält E(N, kE ) und entschlüsselt dies zu D(E(N, kE ), kD ) = N mit
Hilfe eines geeigneten Verfahrens D
– Sicherheit: mit vernünftigem Aufwand
∗ aus verschlüsselter Nachricht E(N, kE ) keine Rückschlüsse auf N
∗ aus der Kenntnis von kE keine Kenntnis von kD
möglich, auch wenn Verfahren E und D öffentlich bekannt sind
5
alternative Verwendung asymmetrischer Systeme:
Authentifizieren von (nicht geheimen) Nachrichten, falls
D(E(N, kE ), kD ) = N = E(D(N, kD ), kE )
– B benutzt seinen privaten Schlüssel kD um Nachricht N zu
“verschlüsseln”: D(N, kD ) (“Signatur”)
– B sendet hN, D(N, kD )i zu A
– A verschlüsselt die Signatur D(N, kD ) mit kE und vergleicht das Ergebnis
E(D(N, kD ), kE ) mit der Nachricht N
6
Das RSA-Verfahren
R. Rivest, A. Shamir, L. Adleman, A Method for Obtaining Digital Signatures
and Public Key Cryptosystems, Communications of the ACM, 21 (1978), 120–126
O.E.: Nachrichten sind als (Blöcke von) positiven ganzen Zahlen codiert
Jeder Teilnehmer am System
• wählt zwei grosse Primzahlen p und q (typisch: ≥ 100 Dezimalstellen)
• berechnet n = p · q und φ(n) = (p − 1)(q − 1)
• wählt eine grosse “zufällige” ungerade Zahl d mit 1 < d < φ(n) und
ggT(d, φ(n)) = 1
• berechnet e = d−1 mod φ(n)
• veröffentlicht das Paar kE = (e, n) als öffentlichen Schlüssel
• hält die Daten (d, p, q) geheim, privater Schlüssel kD = (d, n)
• Verschlüsselung: E(e,n) : Z∗n → Z∗n : N 7→ N e mod n
• Entschlüsselung: D(d,n) : Z∗n → Z∗n : C 7→ C d mod n
7
Demonstrationsbeispiel
Systemparameter:
p=
47
Primzahl
q=
59
Primzahl
n = p · q=
2773
(p − 1)(q − 1) = 2668
Eulers Funktion
d=
157
ggT(d, φ(n)) = 1
mod φ(n)=
17
mittels erweitertem EA
kE =
(17, 2773)
öffentlicher Schlüssel
kD =
(157, 2773)
privater Schlüssel
φ(n)=
e=d
−1
8
Text
ITS ALL GREEK TO ME
W. Shakespeare, Julius Cesar, 1. Akt, 2. Szene
numerisch codierter Text
0920 1900 0112 1200 0718 0505 1100 2015 0013 0500
Verschlüsselung
C1
C2
=
=
92017 mod 2773
1900
17
17
=
948
mod 2773
=
2342
C3
..
.
=
0112
mod 2773
..
.
=
1084
C10
=
050017 mod 2773
=
1665
Ciphertext
0948 2342 1084 1444 2663 2390 0778 0774 0219 1655
9
Entschlüsselung
Ciphertext
0948 2342 1084 1444 2663 2390 0778 0774 0219 1655
M1
M2
=
=
948157 mod 2773
2342
157
157
=
920
mod 2773
=
1900
M3
...
=
1084
mod 2773
...
=
0112
M10
=
1665157 mod 2773
=
0500
numerisch codierter Text
M = 0920 1900 0112 1200 0718 0505 1100 2015 0013 0500
Text
ITS ALL GREEK TO ME
10
Klassisches Beispiel 1
Parameter:
n = RSA-129 = 114381625757888867669235779976146612010218296721242362562
561842935706935245733897830597123563958705058989075147599290026879543541
e = 9007
Text:
ITS ALL GREEK TO ME
W. Shakespeare, Julius Cesar, 1. Akt, 2. Szene
numerisch codierter Text
09201900011212000718050511002015001305
verschlüsselter Text:
1999351314978051004523171227402606474232040170583914631037037174
0625971608948927504309920962672582675012893554461353823769748026
11
Klassisches Beispiel 2: das 100 $ - RSA -Problem
M. Gardner, “Mathematical Games - A New Kind of Cipher that
Would Take Millions of Years to Break”,
Scientific American, 237, 2 (1977), 120-124.
Parameter:
n = 114381625757888867669235779976146612010218296721242362562561842
935706935245733897830597123563958705058989075147599290026879543541
e = 9007
numerisch codierter Text:
9686961375462206147714092225435588290575999112457
4319874695120930816298225145708356931476622883989
628013391990551829945157815154
12
Faktorisierung von RSA-129
D. Atkins, M. Graff, A. K. Lenstra, P. Leyland et al.,
2. April 1994, mit Aufwand von ca. 5000 mips-Jahren, 8 Monate
Rechenzeit auf ≥ 600 workstations
Methode: “Multiple Polynomial Quadratic Sieve”
RSA-129 ist das Produkt der beiden Primzahlen
p = 3490529510847650949147849619903898133417764638493387843990820577
q = 32769132993266709549961988190834461413177642967992942539798288533
Zur Entschlüsselung benötigt man das Inverse d von e = 9007 modulo
φ(n) = φ(p · q) = (p − 1)(q − 1)
d = 1066986143685780244428687713289201547807099066339
3786280122622449663106312591177447087334016859746
2306553968544513277109053606095
13
Die Entschlüsselung
M 7→ M d mod n
wird mittels “Schneller Exponentiation” in Zn ausgeführt, wobei man die 426
Bit lange Binärdarstellung von d verwendet
100111011001111110010100110010001000001000001110100111100100110
010011110100111000000000000011111110100001101010110001011101111
010100001111101100000010000011101101010101111010101001111110110
110100001111110100000011110100110001011001011001101001010001100
100111010110000101110100101011010000011100000001110001110101010
011011101000111101001110001101011010101010010011101010001001111
000000100111010011000110111110101100100011001111
14
Nach Entschlüsselung
2008050013010709030023151804190001180500191721050
11309190800151919090618010705
Übersetzung in Text
THE MAGIC WORDS ARE SQUEAMISH OSSIFRAGE
15
Die Verschlüsselungsabbildung
N 7→ N e mod n
wird natürlich auch mittels “Schneller Exponentiation” in Z∗n ausgeführt,
wobei e = 9007 die Binärdarstellung
10001100101111
hat
16
Die 100$-Nachricht von Rivest, Shamir, Adleman war signiert mit Hilfe
der Entschlüsselungsabbildung:
1671786115038084424601527138916839824543690103235831121783503
8446929062655448792237114490509578608655662496577974840004057020373
Mittels Verschlüsselungsabbildung erhält man
06091819200019151222051800230914190015140500082114041805040004151212011819
im Klartext:
FIRST SOLVER WINS ONE HUNDRED DOLLARS
17
Korrektheit
• für die Hintereinanderausführung von Verschlüsselung und
Entschlüsselung
E(e,n)
D(d,n)
N −→ N e mod n −→ (N e )d mod n
für N ∈ Z∗n und e · d = 1 + k · φ(n)
gilt wegen des Satzes von Euler:
N ed ≡ N 1+k·φ(n) ≡ N · (N φ(n) )k ≡ N · 1 ≡ N mod n
18
Effizienz
• grosse Primzahlen p, q mittels randomisiertem Primzahltest gewinnen:
mittlere Anzahl der Versuche um eine `-stellige Primzahl zu finden ist
wegen Primzahlsatz ∈ Θ(`)
• Multiplikationen n = p · q und φ(n) = (p − 1)(q − 1)
• Exponent d zufällig wählen und mittels EA auf Teilerfremdheit mit φ(n)
testen
• Inverses e = d−1 mod φ(n) mittels erweitertem EA berechnen
• Ver- und Entschlüsselung mittels schneller Exponentiation (Quadrieren
und Multiplizieren)
19
Sicherheit
• Wenn es einem Angreifer gelingt, die Faktorisierung n = p · q zu ermitteln,
kann er auch d = e−1 mod φ(n) mittels EA berechnen
• Bislang keine wirklich effizienten Faktorisierungsalgorithmen bekannt
(aber: Quantencomputer? Algorithmus von Shor (1994))
• Ist es wirklich nötig, n zu faktorisieren, um RSA zu brechen?
(wenn man n und φ(n) kennt, kann man p und q berechnen! Wie?)
• RSA hat “Schwachstellen”, die man respektieren sollte (z.B. sehr kleine e
bzw. d, oder wenn p − 1 und q − 1 viele kleine Primteiler haben)
Empfohlene Lektüre:
D. Boneh, Twenty Years of Attacks on the RSA Cryptosystem,
Notices of the American Mathematical Society, vol. 46, 203–213, 1999.
http://www.ams.org/notices/199902/199902-toc.html
20
RSA-Aufgaben
• In einem RSA-System wird der Ciphertext 10 übertragen. Der öffentliche
Schlüssel ist (5, 35). Welches war die Nachricht?
Lösung:
– n = 35 = 5 · 7 ⇒ φ(n) = (5 − 1)(7 − 1) = 24
– e = 5 ⇒ d = 5−1 mod 24 = 5
– 105 mod 35 = 5 mod 35 ⇒ M = 5
• Ein RSA-System hat (31, 3599) als öffentlichen Schlüssel. Welches ist der
private Schlüssel?
Lösung:
– n = 3599 = 59 · 61 ⇒ φ(n) = 58 · 60 = 3480
– d = 31−1 mod 3480 = −499 mod 3480 = 3031 folgt aus eeA mit
Bézout-Beziehung
4 · 3480 − 449 · 31 = 1
– privater Schlüssel (3031, 3599)
21
Drei Anwendungen der schnellen Exponentiation
I
Schnelle Exponentiation berechnet für ganze Zahlen a, e, n
mit n ≥ 2, e ≥ 0, 0 ≤ a < n die Abbildung
(a, e, n) 7→ ae mod n
mit einem Aufwand von O (lge)(lgn)2 bit-Operationen.
Die Umkehrabbildung
(n, a, ae mod n) 7→ e
bezeichnet man als diskreten Logarithmus.
Das key-exchange-Schema von Diffie-Hellman
I A und B verständigen sich öffentlich über
I
I
I
I
I
I
I
eine sehr grosse (Prim-)Zahl p
eine Zahl b mit 2 ≤ b < p
A wählt eine sehr grosse Zahl m
B wählt eine sehr grosse Zahl n
A berechnet bA = b m mod p und schickt dies an B
B berechnet bB = b n mod p und schickt dies an A
A berechnet bBm mod p = b mn mod p
B berechnet bAn mod p = b mn mod p
A und B verfügen jetzt gemeinsam über die private
Information (den “Schlüssel”) b mn mod p
Ein Gegner müsste, um diesen Schlüssel zu berechnen, m oder
n kennen, also z.B.
(p, b, b m mod p) 7→ m
(schnell) berechnen können — und dies ist ein Fall des
“diskreten Logarithmus”
Das Kryptosystem von Shamir
I
I
A und B verständigen sich öffentlich über eine sehr grosse
Primzahl p
A will eine Nachricht M mit 1 < M < p an B schicken, die
geheim bleiben soll
I
I
A wählt (privat) eine Zahl a ∈ Z∗p−1 und berechnet a0 ∈ Z∗p−1
mit a · a0 = 1
B wählt (privat) eine Zahl b ∈ Z∗p−1 und berechnet b 0 ∈ Z∗p−1
mit b · b 0 = 1
I
Der Nachrichtenaustausch geht so vor sich:
1.
2.
3.
4.
I
A
B
A
B
schickt an
schickt an
schickt an
berechnet
B
A
B
:
:
:
:
F
C := M a mod p
D := C b mod p
0
E := D a mod p
b0
:= E mod p
Es gilt nun F = M, denn es ist
0
0
0 0
0 0
0 0
0 bb
mod p
F = E b = D a b = C ba b = M aba b = M aa
und die Behauptung folgt aus dem Satz von
Euler-Fermat, denn
a · a0 ≡ 1 mod φ(p) und b · b 0 ≡ 1 mod φ(p)
I
Um M zu ermitteln, müsste ein Gegner diskrete Logarithmen
(schnell) berechnen können.
Das public-key Kryptosystem von ElGamal
I
I
I
I
Alle Teilnehmer an dem System verständigen sich öffentlich
auf eine gemeinsam zu benutzende grosse Primzahl p und eine
Primitivwurzel modulo p, also eine Zahl g ∈∈ Z∗p derart, dass
jedes Zahl a ∈ Z∗p auf genau eine Weise als a = g e mit
0 ≤ e < p − 1 geschrieben werden kann.
Algebraisch gesagt: g ist ein erzeugendes Element der
zyklischen Gruppe Z∗p , d.h. Z∗p = hg i.
Jeder Teilnehmer A an dem System wählt eine Zahl xA mit
1 ≤ xA ≤ p − 1 als privaten Schlüssel
Jeder Teilnehmer berechnet yA := g xA mod p und gibt diese
Zahl als seinen öffentlichen Schlüssel bekannt
Wenn Teilnehmer A an Teilnehmer B eine geheimzuhaltende
Nachricht schicken will:
1. A wählt eine (zufällige) Zahl k mit 1 ≤ k < p
2. A berechnet den “Schlüssel” K := yBk mod p
3. A schickt an B das Paar (C1 , C2 ) von Zahlen mit
C1 = g k mod p und C2 = K · M mod p
4. B berechnet K mittels
K = yBk = g xB k = (g k )xB = C1xB mod p
5. B ermittelt M durch Division (mod P) von C2 durch K
I
Auch die Sicherheit dieses Systems beruht auf der
(vermuteten) Schwierigkeit, diskrete Logarithmen zu
berechnen.
7.4.5
Einwegfunktionen
Das Konzept der Einwegfunktion ist ein zentraler Begriff der modernen Kryptografie.
Anschaulich gesprochen soll dabei eine Funktion f : S → T die beiden folgenden Eigschaften haben
• f ist effizient (i.e., polynomial-time) berechenbar;
• die Umkehrfunktion24 z 7→ f −1 (z) von S für z = f (x) ∈ T soll es “normalerweise”
nicht oder nur sehr schwer möglich sein, ein y ∈ f −1 (z) zu berechnen.
Bei den Anwendungen in der Kryptografie kann man sich aber nicht einfach auf den
“Schwierigkeitsbegriff” im Sinn der NP-Vollständigkeit (beispielsweise) stützen. Dies ist
ein “worst-case” Konzept, welches nicht ausschliesst, dass die überwiegende Zahlen der
Instanzen “leicht” zu behandeln sind. Der Kryptograf muss darauf achten, dass sein
System praktisch nie, d.h. nur mit verschwindender Wahrscheinlickeit kompromittiert
werden kann. Dies wird in der Definition von Einwegfunktion formal ausgesprochen.
Definition 11.
1. Eine Funktion g : N → R≥0 heisst vernachlässigbar (negligible),
wenn für jedes positive Polynom r(k) (d.h.r(k) > 0 für alle k) gilt:
g(k) <
1
für alle hinreichend grossen k.
r(k)
2. Eine Funktion f : B∗ → B∗ ist eine (starke) Einwegfunktion, wenn gilt:
• f ist in Polynomialzeit berechenbar;
• für jeden PP-Algorithmus A ist
i
h
k 7→ Wkeit A(f (x), 1k ) ∈ f −1 (f (x)); x ∈R Bk
eine vernachlässigbare Funktion.
Das bedeutet: kein effizienter probabilistischer Algorithmus (im Sinne von PP) ist in der
Lage, die Funktion f bis auf verschwindend wenige Ausnahmen zu invertieren.
Bemerkung 13. Das Argument 1k , also die unäre Codierung der Zahl k, muss man bei
A explizit anführen, um pathologische Situationen zu vermeiden, die entstehen könnten,
wenn die Bitlänge des Arguments f (x) im Vergleich zu den k Bit von x viel zu klein ist.
Man will A eine Laufzeit gestatten, die mindestens polynomiell in k ist.
Im übrigen bedeutet die Notation x ∈R Bk , dass hierbei x zufällig (random) mit Gleichverteilung aus Bk gewählt wird.
24
Beachte: die Umkehrfunktion ist eine “Funktion” im üblichen Sinne nur dann, wenn f bijektiv ist,
was man aber nicht unbedingt voraussetzen möchte. Korrekt gesprochen ist das Urbild von z ∈ T unter
f die Teilmenge f −1 (z) = {y ∈ S; f (y) = z} von S, die leer, einelementig oder auch mehrelementig sein
kann. Die Konvention im letzten Fall ist die, dass man irgendein y ∈ f −1 (z) berechnen möchte.
193
Eine grundlegende Frage der Kryptografie ist diese:
Gibt es (starke) Einwegfunktionen?
Wie für so viele Fragen der Theoretische Informatik hat man auch hier trotz intensiver
Bemühungen noch keine Antwort. In der Praxis der Kryptografie hat man es meist
mit zwei Kandidaten zu tun, deren Einweg-Eigenschaften folgendermaßen formuliert
werden:
• Diskreter Logarithmus
Die diskrete Exponentiation ist gegeben durch
dexp : (p, g, x) 7→ (p, g, g x mod p)
wobei p Primzahl ist, g ein “primitives Element” von Z∗p , also hgi = Z∗p , und x ∈ Z∗p .
Die Umkehrfunktion, der diskrete Logarithmus, ist dann
dlog : (p, g, y) 7→ x mit y = g x mod p.
Die besten bislang bekannten Algorithmen für die Berechnung von dlog haben
eine Laufzeit von
1/3
2/3
ec(ln p) (ln ln p) .
DLA – die DL-Hypothese:
dexp ist eine Einwegfunktion, d.h. für jeden PP-Algorithmus A ist die
Erfolgswahrscheinlichkeit der Umkehrung
k 7→ Wkeit [A(p, g, y) = dlog(p, g, y)]
venachlässigbar.
Dabei beinhaltet die Wahrscheinlichkeit in Abhängigkeit von k eine zufällige Auswahl von k-bit Primzahlenp, zufälligen primitiven Elementen von Z∗p und eine
zufällige Auswahl der y ∈ Z∗p .
• Faktorisierung
Die Multiplikationfunktion für natürliche Zahlen
mult : (a, b) 7→ a · b
ist sicherlich keine Einwegfunktion in dem starken Sinne der obigen Definition,
denn es gibt – anschaulich gesprochen – zu viele Fälle, in denen man tatsächlich
natürliche Zahlen effizient faktorisieren kann. Im Hinblick auf die Erfahrungen, die
man mit RSA gemacht hat, betrachtet man statt dessen die Funktion
pmult : (p)q 7→ p · q
194
(p, q Primzahlen)
Die Umkehrfunktion ist dann die Faktorisierung
pfac : n 7→ (p, q) wobei p, q Primzahlen mit p · q = n
Die besten bislang bekannten Algorithmen für die Berechnung von pfac haben
eine Laufzeit von
1/3
2/3
ec(ln n) (ln ln n) .
FAA – die Faktorisierungs-Hypothese:
pmult ist eine Einwegfunktion, d.h. für jeden PP-Algorithmus A ist die
Erfolgswahrscheinlichkeit der Umkehrung
k 7→ Wkeit [A(n) = (p, q)]
venachlässigbar.
Dabei beinhaltet die Wahrscheinlichkeit in Abhängigkeit von k eine zufällige Auswahl von k-bit Primzahlen p, q.
Die beiden folgenden Resultate zeigen, wie diese Hypothesen mit grundlegenden Fragestellungen der Komplexitätstheorie zusammenhängen:
Theorem 31. Falls starke Einwegfunktionen existieren, gelten die folgenden Aussagen:
1. N P 6= P
2. N P \ BPP =
6 ∅
Beweisskizze: Es sei f :7→ B∗ → B∗ eine starke Einwegfunktion. Zu dieser definiert man
die Sprache
n
o
Lf = (x, y, 1k ) ; ∃u ∈ Bk : f (xu) = y .
Behauptet wird nun
Lf ∈ N P 6= P.
In der Tat: Lf ∈ N P ist auf Grund der Definition klar: jedes u ∈ Bk mit f (xu) = y ist
ein Zeuge für die Aussage (x, y, 1k ) ∈ Lf . d.h. die Menge Lf ist effizient verifizierbar, da
ja f (xu) effizient berechnet werden kann.
Um Lf ∈
/ P zu zeigen, wird das Gegenteil angenommen. Dann sei Mf ein deterministische
Turingmaschine mit polynomieller Laufzeit, die Lf entscheidet. Dann betrachte man den
folgenden Algorithmus A, dessen Ziel es ist, zu gegebenem Element f (x) ein Urbild zu
berechnen:
195
input(f (x), 1k )
z←ε
i←1
while i < k do
if M (z0, f (x), 1k−i ) = 1 then
z ← z0
else
z ← z1
end if
i←i+1
if f (z) = f (x) then
output(z)
end if
end while
Dieser Algorithmus A ist effizient und man mache sich klar, dass er ein z mit f (z) = f (x)
berechnet. Dann kann aber f keine starke Einwegfunktion sein!
.
.
Die zweite Aussage des Theorems beweist man ganz analog, aber nun mit einem effiziente
probabilistischen Algorithmus an Stelle der Turingmaschine.
Theorem 32. Falls DLA oder FAA gelten, so ist
(N P ∩ co-N P) \ P 6= ∅
Beweisskizze: Es wird FAA vorausgesetzt. Man betrachtet das Problem
Factor = {(N, k) ; N hat einen (Prim-)Faktor d mit 1 < d ≤ k}.
Dieses Problem gehört offensichtlich zu N P, denn jeder Faktor d der gesuchten Art ist
ja ein Zeuge für die Zugehörigkeit von (N, k) zu Factor.
Andererseite gehört Factor aber auch zu co-N P: man muss ja nur die Primfaktorisierung von N hinschreiben, die dann keinen Primfaktor ≤ k enthalten darf. Dass die
vorgebliche Primfaktorisierung aber tätsächlich eine Primfaktorisierung ist, kann man
wie bei der Methode von Pratt beim Nachweis von “Primes ∈ N P” verifizieren!
Die Feststellung
Factor ∈ N P ∩ co-N P
ist an sich schon bemerkenswert! Sie hat ja folgende Konsequenz:
ist Factor N P-hart, so gilt N P = co-N P
oder im Umkehrschluss
N P 6= co-N P
⇒ Factor ist nicht N P-vollständig
196
Da man nach überwiegender Expertenmeinung mit N P 6= co-N P rechnen sollte, ist also
mutmasslich (!) das Faktorisieren nicht so schwierig wie es N P-vollständige Probleme
sind!
Könnte man nun aber Factor effizient entscheidenl so könnte man mittels einfacher
Binärsuche in maximal log N Aufrufen eines solchen Entscheidungsverfahrens den kleinsten Primfaktor von N effizient berechnen: dann gilt aber FAA sicher nicht!
Aus FAA folgt somit Factor ∈
/ P und damit insgesamt
Factor ∈ (N P ∩ co-N P) \ P.
Der Begriff der starken Einwegfunktion (SOW) fordert sehr viel. Man hat sich überlegt,
wie man diese Forderungen sinnvoll abschwächen kann, um tatsächlich Einwegfunktionen
in dem schwächeren Sinn dingfest zu machen. Man kann das so formulieren, dass für
jeden probabilistischen Algorithmus die Misserfolgswahrscheinlichkeit bei Versuch, die
Umkehrung zu berechnen, nicht vernachlässigbar klein ist.
Definition 12. Eine Funktion F : B∗ → B∗ ist eine schwache Einwegfunktion (WOW),
wenn gilt
– f ist in Polynomialzeit berechenbar;
– es gibt ein positives Polynom r(k) mit:
i
h
k 7→ Wkeit A(f (x), 1k ) ∈
/ f −1 (f (x)); x ∈R Bk ≥
1
q(k)
für jeden PP-Algorithmus A und hinreichend großes k.
Jetzt kann man sich leicht davon überzeugen:
Satz 33. Wenn FAA gilt, so ist die Multiplikation mult(a, b) 7→ a · b eine schwache
Einwegfunktion.
Andererseits hat man folgendes überraschende Resultat:
Theorem 34. Starke Einwegfunktionen existieren genau dann, wenn schwache Einwegfunktionen existieren.
7.4.6
RSA und Komplexität
Betrachtet man die Frage der Sicherheit von RSA, so muss man einerseits die Exponentiation und die diskreten Logarithmen in Betracht ziehen, da die Verschlüsselung durch
die Abbildungen
RSAN,e : ZN → ZN : x 7→ xe mod N
erfolgt, andererseits mittels Faktorisierung von N = p · q das System kompromittiert
wird, da ein Angreifer dann die Information d mit d = e−1 mod (p − 1)(q − 1) berechnen
kann, die ihm das Entschlüsseln von Nachrichten ermöglicht.
197
Man bezeichnet die (geheime!) Zusatzinformation d, die das Umkehren der Abbildung
RSAN,e ermöglicht, als “Falltür” (trapdoor ) und spricht von den (Einweg-)Funktionen
RSAN,e als sog. trapdoor -Funktionen. Die genaue Definition soll hier nicht ausgebreitet
werden, das intuitive Verständnis sollte genügen. Wichtig ist aber, das hypothetische
Einweg-Verhalten zu formulieren
RSAA – die RSA-Hypothese:
RSAN,e ist eine Einwegfunktion, d.h. für jeden PP-Algorithmus A ist
die Erfolgswahrscheinlichkeit der Umkehrung
k 7→ Wkeit [A(N, e, RSAn,e (x)) = x]
venachlässigbar.
Dabei beinhaltet die Wahrscheinlichkeit in Abhängigkeit von k eine zufällige Auswahl
von N = p · q mit k-bit Primzahlen p, q, zufälligen e mit ggT(e, (p − 1)(q − 1) = 1 und
eine zufällige Auswahl der x ∈ ZN .
Unter dieser Annahme hat man es bei den RSAn,e tatsächlich mit Falltürfunktionen zu
tun.
Man beachte, dass man unter dem “Brechen” von RSA verschiedene Erfolge verstehen
kann:
1. Man berechnet aus dem öffentlichen Schlüssel (N, e) und einem verschlüsselten
Text C = M e mod N den Klartext M ;
2. Man berechnet aus dem öffentlichen Schlüssel (N, e) den privaten Exponenten d;
3. Man faktorisiert N = p · q.
Offensichtlich gilt: wenn man 3. kann, dann kann man auch 2., und wenn man 2. kann,
dann kann man auch 1. Es ist aber nicht ohne weiteres klar, ob auch die Umkehrschlüsse
zulässig sind! Immerhin gilt:
Theorem 35. Es gibt einen LasVegas-Algorithmus, der aus der Kenntnis von (N, e, d)
die Faktorisierung von N berechnet.
B eweisskizze: Dieser Algorithmus benutz die Idee der Primzahltests von Miller-Rabin
und die damit verbundene Effizienzaussage.
Da N = p · q das Produkt von zwei ungeraden Primzahlen ist, ist φ(N ) = (p − 1)(q − 1)
mindestens durch 22 = 4 teilbar. Die eigenschaft e · d ≡ 1 mod φ(N ) besagt, dass e · d − 1
eine Vielfaches von φ(N ) ist, also auch mindestens durch 4 teilbar. Man kann leicht a, b
mit e · d − 1 = 2a · b und ungeradem b berechnen. Man beachte, dass nach den Satz von
Euler
a
ggT(x, N ) = 1 ⇒ (xb )2 = xed−1 = 1
gilt. Betrachte nun folgenden Algorithmus:
198
wähle x ∈ ZN zufällig
if c = ggT(x, N ) > 1 then
return(c, N/c)
end if
berechne y = xb
berechne y 2 , y 4 , y 8 , . . .
i
i+1
if i < a gefunden mit y 2 6= 1 mod N und y 2 = 1 mod N then
i
c ← ggT(y 2 + 1, N )
return(c, N/c)
end if
Beachte: die Gleichung X 2 = 1 hat wegen N = p · q in ZN genau vier Lösungen: stösst
i
man auf ein ξ = y 2 mit ξ 6= −1 mod N und ξ 2 = 1 mod N , so liefert (ξ − 1)(ξ + 1) =
ξ 2 − 1 = 0 mod N die Faktorisierung von N . Und das geschieht bei zufälliger Wahl von
x mit einer Wahrscheinlichkeit ≥ 1/2!
Diesen Algorithmus kann man k-mal wiederholen und man wird dabei mit Wahrscheinlichkeit ≥ 1 − 2−k die Faktorisierung von N finden – im Mittel genügen also zwei
Durchläufe. Die erwartete Laufzeit bis zum Finden der Faktorisierung ist also ist also polynomiell in log N – der Algorithmus ist ein Las Vegas-Algorithmus.
Als Folgerung erhält man einen Hinweis auf einen Sicherheitsaspekt von RSA:
Folgerung 36. Wählt man bei RSA die Primzahlen p und q mit gleicher Bitlänge, so
kann man bei Kenntnis von (N, e, d) den Modul N deterministisch (!) effizient faktorisieren.
199
8
Schnelle Fouriertransformation
8.1
Zur Person: Joseph Fourier
Fourierreihen und Fouriertransformationen gehören zu den meistverwendeten Techniken
der Mathematik und ihrer Anwendungen überhaupt. Ein spezieller Algorithmus aus diesem Bereich ist die “schnelle Fouriertransformation”, und man kann sagen – Superlative
sind gefährlich, aber trotzdem – dass dies ist einer der wichtigsten und erfolgreichsten Algorithmen der Angewandten Mathematik überhaupt ist. Bevor von diesem Algorithmus
die Rede sein wird, soll kurz auf die Anfänge hingeweisen werden.
8.1.1
Sein Leben
Jean Baptiste Joseph Fourierwar ein bedeutender französischer Mathematiker im ersten Drittel des 19. Jahrhunderts. Er wurde am 21. März 1768 in Auxerre geboren und
starb am 16. Mai 1830 in Paris. Aus ärmlichen Verhältnissen stammend, bekommt er
dennoch eine gute Schulbildung und fällt früh als hochbegabter (und ehrgeiziger!) Schüler
auf. Besonderes Talent für die Mathematik und die Physik zeigt er auch schon früh, will
aber eigentlich zum Militär, genauer gesagt: zur Artillerie. Da er nicht adelig ist, hat
er keine Chancen. Für einige Zeit geht er in ein Kloster, verlässt es aber mit Ausbruch
der französischen Revolution wieder. Er begeistert sich für deren Ideale, ist aktiv in Revolutionskommittees tätig und führt in dieser Zeit der revolutionären Fraktionskämpfe
ein aufregendes und gefährliches Leben: angeblich rettet ihn nur der Tod Robespierres
selbst vor der Guillotine.
Sei 1794 ist Fourier Student an der neugeschaffenen Eliteinstitution der Ecole Normale und bald unterrichtet er selber Mathematik und Physik an der ebenso renommierten
Ecole Polytechnique. 1797 wird er sogar Nachfolger von Lagrange. Dann aber nimmt er
von 1798 bis 1801 als wisserschaftlicher Berater und Administrator an Napoleons Ägyptenfeldzug teil und ist später noch jahrelang mit der Auswertung der archäologischen
Arbeiten befasst.
Von 1802 bis 1815 ist Fourier Präfekt des Dépatements Isère (mit Sitz in Grenoble)
– auf ausdrücklichen Wunsch Napoleons! – und ist “tagsüber Präfekt, nachts Physiker
und Mathematiker”. Ab 1804 arbeitet er intensiv am Problem einer mathematischen
Beschreibung der Wärmeleitung in festen Körpern – das sollte sein wissenschaftliches
Hauptarbeitsgebiet werden und bleiben. Am 21. Dezember 1807 hält er darüber erstmals vor der Akademie der Wissenschaften in Paris. Dies kann man als die Geburtsstunde
der Fouriertheorie bezeichnen, auch wenn sein Vortrag von den Mitgliedern der Akademie
nicht gut aufgenommen wird: seine Behauptungen gehen weit über das hinaus, was einige
der besten Mathematiker dieser Zeit (Lagrange, Laplace, Legendre...) akzeptieren
konnten: letztlich erweitert er den Funktionsbegriff deutlich über das hinaus, was man
im 18 Jh. darunter verstand. Die Akademie akzeptiert seine Arbeit nicht zur Publikation,
200
gibt ihm aber eine zweite Chance: sie stellt 1809 für das Jahr 1812 als Preisaufgabe genau
das Problem, mit dem sich Fourier beschäftigt. Am 16. Dezember 1811 gibt Fourier eine
umfangreiche Arbeit ab und erhält tatsächlich den Preis. Aber veröffentlicht wird diese
Arbeit auch nicht – wegen derselben Bedenken. Nach etlichen politischen Wirrungen
um die Endphase der Napoleon-Ära geht Fourier wieder nach Paris, wird Mitglied der
Akademie der Wissenschaften und 1822 sogar deren Sekretär auf Lebenszeit. In diesem
Jahr erscheint auch sein Hauptwerk
Théorie analytique de la chaleur,
in dem die beiden unveröffentlichen Arbeiten von 1807 und 1811 wesentliche Bestandteile
sind, das ganze Gebiet und die Methodik noch weiter und tiefer dargestellt werden.
Sein inzwischen unbestrittener Ruf und die Tatsache, dass auch Mathematiker wie
Cauchy und Poisson seine Methoden übernehmen und weiterführen, bringen ihm auch
noch die Mitgliedschaft in der Académie francaise (erklärtermaßen eine Form der “Unsterblichkeit”) und der Royal Society ein.
Fouriers Hauptwerk, die Théorie analytique de la chaleur, gehört zu den unbestrittenen Klassikern der der Mathematischen Physik, ja der wissenschaftlichen Literatur
überhaupt: Kenner25 zählen es neben Werken wie den Elementen von Euklid, den Philosophiae naturalis Principia mathematica von Newton, der Introductio in analysin
infinitorum von Euler oder den Disquisitiones arithmeticae von Gauss, zu den “30
Büchern der Mathematik, die die Welt verändert haben”.
1891 schreibt Henri Poincaré, der um diese Zeit neben David Hilbert bedeutendste
Mathematiker:
La théorie de la chaleur de Fourier est un des premiers exemples de l’application
de l’analyse à la physique; en partant d’hypothèses simples qui ne sont
autre chose que des faits expérimentaux, Fourier en déduit une série des
conséquences dont l’ensemble constitue une théorie complète et cohérente.
Les résultats qu’il a obtenus sont certes intéressants par eux-mêmes, mais ce
qu’il est plus encore est la méthode qu’il a employé pour y parvenir et qui
servira toujours de modèle à tous ceux qui voudront cultiver une branche
quelconque de la physique mathématique. J’ajouterai que le livre de Fourier
a une importance capitale dans l’histoire des mathématiques et que l’analyse
pure lui doit peut-être plus encore que l’analyse appliquée.
25
J.-J. Samueli, J.-C. Boudenot, Trente livres de mathématiques qui ont changé le monde, Ellipses,
2006.
201
8.1.2
Seine Leistungen
Eine ganz kurze Skizze soll nut andeuten, worum es geht. Fourier studiert die Wärmeleitungsgleichung, die partielle Differentialgleichung
2
∂
∂
∂2
∂2
+ 2 + 2 T = k2 T
2
∂x
∂y
∂z
∂t
für eine räumliche und zeitliche Temperaturverteilung T = T (x, y, z, t) in einem Festkörper.
Der Faktor k 2 beschreibt die Wärmeleitfähigkeit des untersuchten Körpers.
Fourier versucht einfache Fälle analytisch zu lösen (nebenbei: er experimentiert auch
intensiv und nimmt die Experimente als Ausgangpunkt und Prüfsteine für seine Methoden). Der Fall eines homogenen Stabes der Länge a lässt sich beschreiben durch die
eindimensionale Gleichung
∂2
∂
T (x, t) = k 2 T (x, t)
2
∂x
∂t
mit einer beliebigen (!) Anfangsverteilung
f (x) = T (x, 0)
und den Randbedingungen
T (0, t) = 0 = T (a, t)
(t > 0).
Ein Ansatz, genannt Separation der Variablen,
T (x, t) = φ(x) · ψ(t)
führt auf die beiden gewöhnlichen Differentialgleichungen
φ00 (x) = λ k 2 φ(x)
mit φ(0) = 0 = φ(a)
0
ψ (t) = λ ψ(t)
Die erste Gleichung ist eine Schwingungsgleichung, die wegen der Randbedingungen die
harmonischen Schwingungen
πν sin
·x
ν = 1, 2, 3, . . .
a
als Basislösungen hat; dabei muss jeweils
λν =
πν 2
ak
sein. Die zweite Gleichung hat eine Exponentialfunktion als Lösung, sodass man insgesamt
πν X
T (x, t) =
bν · e−λν t · sin
·x
a
ν≥1
202
erhält, wobei sich die Koeffizienten (bν )ν≥1 aus der Anfangsbedingung für t = 0
πν X
bν · sin
f (x) = T (x, 0) =
·x
a
ν≥1
bestimmen lassen müssten.
Nach vielen Ansätzen und Versuchen und harter Arbeit findet Fourier schliesslich den
Ausdruck, den man in der Folge als Fourierkoeffizienten bezeichnet:
Z
πν 2 a
bν =
f (x) · sin
· x dx.
a 0
a
Fouriers Leistung ist garnicht so sehr diese Formel (sie findet sich übrigens schon früher
in Papieren von Euler, die erst nach seinem Tod herausgegeben wurden und von denen
man nicht weiss, ob Fourier davon Kenntnis hatte), sondern die viel weiter gehende
und grundsätzliche Folgerung, dass sich jede beliebige Funktion f (x) mit Periode a, d.h.
f (x + a) = f (x) für alle x ∈ R als unendliche Reihe (Fourierreihe) von harmonischen
Schwingungen schreiben lässt:
X
X
f (x) =
an · cos(ω n x) +
bn · sin(ω n x)
n≥0
mit
2
an =
a
Dabei ist ω =
2π
a
Z
0
a
n≥1
f (x) · cos (ω n x) dx,
2
bn =
a
Z
0
a
f (x) · sin (ω n x) dx.
die “Grundfrequenz” und die Funktionen
{ cos (ω n x) }n≥0 ∪ { sin (ω n x) }n≥1
sind die “Obertöne”. Diese Funktionen agieren als “Basisfunktionen” im Vektorraum
der a-periodischen Funktionen. Aber Vorsicht! Die Summen sind unendlich, es handelt
sich nicht einfach um eine gewöhnliche Vektorraumbasis!26
Man kann dies auch mit Hilfe von komplexen Exponentialfunktionen darstellen:
Z
X
1 a
iωnx
f (x) e−i ω n x dx
f (x) =
cn e
mit cn =
a 0
n∈Z
und in diesem Fall spielen die Exponentialfunktionen
i ω n x
e
n∈Z
26
Tatsächlich ist die Frage der Konvergenz dieser Fourierreihen (in welchem Sinne und gegen welchen
Grenzwert?) ein Grundsatzproblem, das die Mathematiker bis weit ins 20. Jh. intensiv beschäftigt hat:
da war Fourier in seinen Behauptungen wohl doch etwas “kühn”, seine frühen Kritiker haben das
vielleicht geahnt. Die “rigorose” Durcharbeitung der Analysis, die dann insbesondere mit dem Namen
Cauchy (1789–1859) verbunden ist, ist ja auch ein Reflex dieser Schwierigkeiten. Viele der berühmtesten
Mathematiker des 19. und 20 Jh. haben dazu beigetragen.
203
die Rolle der “Basisfunktionen” und die Formel für cn ist Ausdruck der Orthogonalität
dieser Funktionen:
(
Z e
a falls n = m,
ei ω n x e−i ω m x =
0 sonst.
0
Für trigonometrischen Funktionen lässt sich diese Orthogonalität analog formulieren.
An dieser Stelle soll das Revolutionäre an Fouriers Arbeit herausgehoben werden: das
ist die Ausdehnung des “Funktionsbegriffes”! Aus der Tatsache, dass die Integralformeln
für die Koeffizienten auch dann einen Sinn ergeben, wenn die Fuktion f (x) der Anfangsverteilung eine “wilde” Funktion ist in dem Sinn, dass sie nicht “durch eine Formel gegeben” ist, dass sie stückweise stetig sein kann, also Sprünge enthalten kann usw., erweitert
er den analytisch handhabbaren Funktionsgbegriff des 18. Jh., bei dem eine “anständige” bereits durch ihr lokales Verhalten bestimmt ist (Stichwort: Taylorentwicklung), ganz
massiv. Dazu kommt natürlich, dass die unbedingte Verankerung in der experimentellen
physikalischen Erfahrung seinen mathematischen Grenzüberschreitungen Glaubwürdigkeit verleiht. Das sind eben nicht nur “rein-mathematische” Spekulationen.
In seiner preisgekrönten Arbeit von 1811 und in seinem Buch untersucht Fourier dann
auch den Fall der Wärmeleitung in einem Stab der Länge a, wenn a gegen unendlich
strebt. Das führt ihn darauf, dass die Summationen der unendlichen Fourierreihen im
Limes durch Integrale ersetzt werden müssen. Er findet die berühmte Inversionsformel
Z ∞
Z ∞
2π i s x
f (x) =
e
f (y) e−2π i s y dy ds.
−∞
−∞
Das ist so zu lesen: “Basisfunktionen” sind nun die Funktionen e2π i s x s∈R und die “beliebige” Funktion f (x) wird dargestellt als Überlagerung von solchen Basisfunktionen,
wobei der Koeffizient, die “Amplitude” von e2π i s x in dieser Darstellung die Fouriertransformierte
Z ∞
b
f (s) =
f (y) e−2π i s y dy
−∞
ist. Unter geeigneten Einschränkungen auf der Raum der betrachteten Funktionen ist
die Abbildung der Fouriertransformation
Z ∞
b
F : f (x) 7→ f (s) =
f (y) e−2π i s y dy
−∞
eine bijektive Transformation, d.h., man kann sagen, dass eine Funktion f ebensogut
durch ihren Werteverlauf f (x) (x ∈ R) im “Ortsbereich”, wie durch ihre Fouriertransformierte fb(s) (s ∈ R) im “Frequenzbereich” gegeben ist! Dabei ist die Rücktransformation
F −1 : fb 7→ f im wesentlichen (bis auf ein Vorzeichen) wieder eine Fouriertransformation.
Das Interesse an dieser Transformation rührt her von der Tatsache, dass man manche
Eigenschaften einer Funktion in dem einen Bereich leichter erkennbar und manipulierbar
sind, als in dem anderen. Dies trifft insbesondere zu auf das “Falten” oder “Filtern” von
Funktionen, das schon im Abschnitt 2.1.7 angesprochen wurde.
204
8.2
Klassische Fouriertransformation
8.3
Diskrete Fouriertransformation (DFT)
8.4
Schnelle Fouriertransformation (FFT)
8.5
Schnelle Multiplikation von Polynomen
8.6
Beispiele in Maple
8.6.1
Modulare Polynomarithmetik: Evaluation und Interpolation
8.6.2
Komplexe FFT in Maple
8.6.3
Beispiel zur Schnellen Fouriertransformation
siehe separate Folien
205
Schnelle Fourier-Transformation (FFT)
Jean Baptiste Joseph Fourier (1768–1830)
Schnelle Fourier-Transformation (FFT)
Fourier-Transformation klassisch
Fourier-Transformation klassisch (z.B. Signalverarbeitung):
I
Fouriers Idee: Darstellung von (periodischen) Funktionen
als Überlagerung von einfachen periodischen Schwingungen
verschiedener Frequenz und Intensität
I
Dualität: Schwingungsphänomene (Wellenausbreitung) lassen
sich darstellen sowohl im “Ortsbereich” als auch im
“Frequenzbereich”
I
Fourier-Transformation: Übergang von einer
Funktionsdarstellung im Ortsbereich zu einer Darstellung im
Frequenzbereich (und umgekehrt)
I
Wichtige Anwendung: Filterung
Schnelle Fourier-Transformation (FFT)
Fourier-Transformation klassisch
I
Fouriertransformation
F : f (x) 7→ F (s) =
I
Rücktransformation
Finv : F (s) 7→ f (x) =
I
Z
∞
−∞
Z
f (x) e −2πi·s·x dx = F [f ] (s)
∞
−∞
F (s) e 2πi·s·x ds = Finv [F ] (x)
inverse Beziehung — spektrale Zerlegung
Z ∞ Z ∞
−2πi·s·y
f (x) = Finv [F [f ]] (x) =
f (y ) e
dy e 2πi·s·x ds
−∞
−∞
Die Funktion x 7→ f (x) ist dargestellt als Überlagerung
(Linearkombination) der periodischen Funktionen
(“harmonischen Schwingungen”) x 7→ e 2πi·s·x mit Frequenz
2πs. Das innere Integral ist deren “Intensität”.
Schnelle Fourier-Transformation (FFT)
Fourier-Transformation klassisch
I
Faltung
(f (x), g (x)) 7→ (f ⊗ g )(x) =
Z
∞
−∞
f (y ) · g (x − y ) dy
Faltungsoperationen verwendet man, um Merkmale der einer
gegebenen Funktion f mittels geeigneter “Test”-Funktionen g
zu erkennen und zu bewerten.
I
Faltungstheorem
F [f ⊗ g ] (s) = F [f ] (s) · F [g ] (s)
Konsequenz: die Faltung im “Ortsbereich” kann auch im
“Frequenzbereich” durchgeführt werden.
Schnelle Fourier-Transformation (FFT)
Fourier-Transformation klassisch
Beweis des Faltungstheorems
Z ∞
F [f ⊗ g ] (s) = F
f (y ) · g (x − y ) dy (s)
−∞
Z ∞ Z ∞
=
f (y ) · g (x − y ) dy e −2πi·s·x dx
−∞
−∞
Z ∞
Z ∞
−2πi·s·x
=
f (y )
g (x − y ) e
dx dy
−∞
−∞
Z ∞
Z ∞
−2πi·s·z −2πi·s·y
=
f (y )
g (z) e
e
dz dy
−∞
−∞
Z ∞
Z ∞
−2πi·s·z
=
f (y )
g (z) e
dz e −2πi·s·y dy
−∞
−∞
= F [f ] (s) · F [g ] (s)
Schnelle Fourier-Transformation (FFT)
Fourier-Transformation klassisch
I
Schema des Faltungstheorems
Faltung im
Ortsbereich
F : (f (x), g (x))
↓⊗
F:
(f ⊗ g )(x)
−→F
−→Finv
punktweise Multiplikation
im Frequenzbereich
F f (s), F g (s)
↓·
F f (s) · F g (s)
Schnelle Fourier-Transformation (FFT)
Fourier-Transformation klassisch
I
typische Anwendung des Faltungstheorems
Faltung im
Ortsbereich
F:
(f (x), g (x))
Finv :
(f ⊗ g )(x)
↓⊗
−→F
punktweise Multiplikation
im Frequenzbereich
F f (s), F g (s)
←−Finv
↓·
F f (s) · F g (s)
Schnelle Fourier-Transformation (FFT)
Darstellungen von Polynomen
I
Analogie: Darstellung von Polynomen
I
I
K[X ] : Ring der Polynome in einer Variablen X und mit
Koeffizienten im Körper K
übliche Koeffizienten-Darstellung
a(X ) =
n
X
ai X i
i=0
I
I
I
↔ ha0 , a1 , a2 , . . . , an−1 , an i ∈ Kn+1
K[X ]≤n : Vektorraum der Polynome vom Grad ≤ n
hat als Standardbasis die n + 1 Polynome X i (0 ≤ i ≤ n)
algebraische Sicht: ha0 , a1 , a2 , . . . , an−1 , an i ist die Darstellung
von a(X ) bezüglich der Standardbasis
der Vektorraum K[X ]≤n hat noch viele andere (und nützliche!)
Basen
Schnelle Fourier-Transformation (FFT)
Darstellungen von Polynomen
I
Auswertung von Polynomen an einer Stelle y ∈ K:
Ly : K[X ]≤n → K :
a(X ) 7→ a(y ) = an y n + an−1 y n−1 + · · · + a1 y + a0
= (. . . (an y + an−1 ) y + · · · + a1 ) y + a0
I
praktisches Verfahren: Horner-Schema (optimal!)
benötigt n Multiplikationen und n Additionen in K
I
algebraisch: die Auswertungsabbildung Ly an der Stelle y ∈ K
ist ein Ring-Homomorphismus (Verträglichkeit mit Addition
und Multiplikation)
Schnelle Fourier-Transformation (FFT)
Darstellungen von Polynomen
I
simultane Auswertung an mehreren (verschiedenen) Stellen
y = (y0 , y1 , y2 , . . . , yn ) ∈ Kn+1
Ly : K[X ]≤n → Kn+1 :
a(X ) 7→ hLy0 (a(X )), Ly1 (a(X )), Ly2 (a(X )), . . . , Lyn (a(X ))i
= ha(y0 ), a(y1 ), a(y2 ), . . . , a(yn )i
I
praktisches Verfahren: (n + 1)-mal Horner-Schema
benötigt n(n + 1) Multiplikationen und n(n + 1) Additionen in
K (das ist nicht notwendig optimal!)
I
algebraisch: die Auswertungsabbildung Ly an den Stellen
y = (y0 , y1 , y2 , . . . , yn ) ∈ Kn+1 ist ein Ring-Homomorphismus
(Verträglichkeit mit Addition und Multiplikation)
Schnelle Fourier-Transformation (FFT)
Darstellungen von Polynomen
I
Rekonstruktion durch InterpolationP
ein Polynom n-ten Grades a(X ) = ni=0 ai X i ist
durch seine Werte a(yi ) (0 ≤ i ≤ n) an n + 1 verschiedenen
Stellen y = (y0 , y1 , y2 , . . . , yn ) eindeutig bestimmt
[Bem.: dies gilt über einem Körper mit mindestens n + 1 Elementen]
denn das lineare Gleichungssystem mit Vandermonde-Matrix


   
a0
a(y0 )
1 y0 y02 . . . y0n
1 y1 y 2 . . . y n  a1  a(y1 )
1
1  



 ·  ..  =  .. 
 .. ..
..



. .

.
. 
.
|
1 yn yn2 . . . ynn
{z
}
Vn (y0 , y1 , . . . , yn )
an
a(yn )
hat eine eindeutig bestimmte Lösung wegen
Y
det Vn (y0 , y1 , . . . , yn ) =
(yj − yi ) 6= 0
0≤i<j≤n
Schnelle Fourier-Transformation (FFT)
Darstellungen von Polynomen
I
Lösung des Gleichungssystems mittels Gauss-Elimination
erfordert O(n3 ) Operationen in K
I
Effizienter: Interpolationsformel von Lagrange
mit O(n2 ) Operationen
a(X ) =
n
X
i=0
a(yi ) · ei (X )
wobei
ei (X ) =
I
Qj6=i
0≤j≤n (X
Qj6=i
0≤j≤n (yi
(
1
d.h. ei (yj ) =
0
− yj )
− yj )
falls i = j
falls i =
6 j
Die Polynome ei (X ) (0 ≤ i ≤ n) sind linear unabhängig und
bilden eine Basis des Vektorraums K[X ]≤n .
Schnelle Fourier-Transformation (FFT)
Darstellungen von Polynomen
I
schematisch
Ly =Auswert.
ha0 , a1 , . . . , an−1 , an i
I
−−−−−−−−→
ha(y0 ), a(y1 ), . . . , a(yn−1 ), a(yn )i
←−−−−−−−−
L−1
y =Interpol.
Folgerung: Ly ist ein Isomorphismus von Vektorräumen
K[X ]≤n
'
|K × K ×
{z· · · × K}
n+1 Faktoren
Schnelle Fourier-Transformation (FFT)
Darstellungen von Polynomen
I
Für ein Objekt “Polynom vom Grad ≤ n” sind
I
Koeffizientendarstellung
ha0 , a1 , . . . , an−1 , an i
I
Wertedarstellung
ha(y0 ), a(y1 ), . . . , a(yn−1 ), a(yn )i
I
Darstellungen in verschiedenen Basen des VR K[X ]≤n .
Die Transformationen zwischen diesen Basen heissen
“Auswertung” und “Interpolation”.
Schnelle Fourier-Transformation (FFT)
Modulare Arithmetik für Polynome
Reminiszenz: Chinesischer Restesatz, modulare Arithmetik
I Die Beziehung
Auswertung ↔ Interpolation
für Polynome erinnert nicht zufällig an den Chinesischen
Restesatz für ganze Zahlen — es ist eine völlig analoge
Situation im Bereich der Polynome
I
Für Polynome über einem Körper K gilt die Divisioneigenschaft
a(X ) = b(X ) · q(X ) + r (X )
I
wobei r (X ) = 0 oder deg r (X ) < deg b(X ).
Man schreibt:
r (X ) = a(X ) mod b(X ) und b(X ) | a(X ), falls r (X ) = 0
I
Grösste gemeinsame Teiler, Eindeutigkeit der “Prim-Zerlegung
(“irreduzible” Polynome) funktionieren analog zu Z.
Schnelle Fourier-Transformation (FFT)
Modulare Arithmetik für Polynome
I
Algebraisch formuliert: K[X ] ist ein “euklidischer Ring”.
I
Insbesondere: es gibt im Ring K[X ] einen euklidischen
Algorithmus zur Berechnung grösster gemeinsamer Teiler
I
Alle Folgerungen (z.B. Bézout-Beziehung) ergeben sich daraus
exakt wie im Falle des Ringes Z.
I
Der euklidische Algorithmus für Polynome ist der Algorithmus
der Polynomarithmethik schlechthin — auch für viele
Anwendungen (z.B. effiziente Decodierverfahren für
fehlerkorrigierende “zyklische” Codes)
I
Wenn Sie mehr wissen wollen: besuchen Sie meine
Vorlesungen über “Computeralgebra”!
Schnelle Fourier-Transformation (FFT)
Modulare Arithmetik für Polynome
I
Spezialfall der Polynomdivision: Auswertung
I
Auswertung eines Polynoms a(X ) an einer Stelle y ist
gleichbedeutend mit Division von a(X ) durch b(X ) = X − y :
a(X ) = (X − y ) · q(X ) + a(y )
d.h.
a(X ) mod (X − y ) = a(y )
I
Es gilt also
Ly : K[X ]≤n → K : a(X ) 7→ a(y ) = a(X ) mod (X − y )
Schnelle Fourier-Transformation (FFT)
Modulare Arithmetik für Polynome
I
Konstruktion von “Faktorringen” des Polynomringes
I
I
Ansatz identisch zum Fall Z → Zn : a 7→ a mod n
Jedes Polynom b(X ) ∈ K[X ] definiert eine Äquivalenzrelation
(sogar ‘Kongruenz”)
f (X ) ∼b(X ) g (X ) ↔ b(X ) | f (X ) − g (X )
I
Ist der Grad deg b(X ) = n, so kann man K[X ]<n mit einer
Multiplikation versehen
(f (X ), g (X )) 7→ (f ∗b(X ) g )(X ) = f (X ) · g (X ) mod b(X )
I
Mit ∗b(X ) und der üblichen Addition wird K[X ]<n zu einem
Ring: K[X ]/(b(X ))
Schnelle Fourier-Transformation (FFT)
Modulare Arithmetik für Polynome
I
Ein “Chinesischer Restesatz” für simultane Kongruenzen von
Polynomen gilt völlig analog zum Fall für ganze Zahlen:
I
Sind a(X ), b(X ) teilerfremde Polynome, so gilt
K[X ]/(a(X ) · b(X )) ' K[X ]/(a(X )) × K/(b(X ))
(Isomorphismus von Ringen)
Die algorithmische Realisierung des Isomorphismus geschieht
wieder
– Auswertung: mittels Polynomdivision
– Interpolation: mittels euklidischem Algorithmus für Polynome
I Entsprechend kann man die Aussage im Fall mehrer zueinander
teilerfremder Polynome formulieren.
I
Schnelle Fourier-Transformation (FFT)
Modulare Arithmetik für Polynome
I
Chinesischer Restesatz für Produkte von linearen Polynomen
I
Sind y0 , y1 , . . . , yn ∈ K verschiedene Elemente,
so sind die Polynome X − y0 , X − y1 , . . . , X − yn paarweise
teilerfremd. Daher:
n
Y
K[X ]/ (X − yi ) ' K[X ]/(X − y0 ) × · · · × K[X ]/(X − yn )
|
{z
}
|
{z
}
i=0
'K
'K
|
{z
} |
{z
}
Kn+1
K[X ]≤n
I
als Isomorphismus von Ringen, der realisiert wird durch die
simultane Auswertungsabbildung Ly mit y = (y0 , y1 , . . . , yn ).
Diskrete Fouriertransformation ist ein Spezialfall hiervon!
Schnelle Fourier-Transformation (FFT)
Modulare Arithmetik für Polynome
I
Polynommultiplikation mittels Auswertung und Interpolation
I
Gegeben Polynome a(X ), b(X ) ∈ K[X ]<n in
Koeffizientendarstellung
a(X ) =
n−1
X
ai X i
b(X ) =
i=0
I
bi X j
i=0
Berechne die Koeffizientendarstellung des Produkts
a(X ) · b(X ) = c(X ) =
ci =
2n−1
X
ci X i
i=0
i
X
j=0
I
n−1
X
aj · bi−j (0 ≤ i ≤ 2n − 1)
als Operation auf Vektoren (Faltung, convolution)
ha0 , . . . , an−1 i, hb0 , . . . , bn−1 i
7→ hc0 , . . . , c2n−1 i = a ∗ b
|
{z
} |
{z
}
|
{z
}
a
b
c
Schnelle Fourier-Transformation (FFT)
Modulare Arithmetik für Polynome
I
I
traditionelle Lösung:
Faltungsformel direkt berechnen→ O(n2 ) Operationen in K
alternative Lösung mittels “modularer Arithmetik”
I
Polynome a(X ) und b(X ) an 2n Stützstellen
y = (y0 , . . . , y2n−1 ) auswerten
a = ha0 , . . . , an−1 i 7→ Ly (a) = ha(y0 ), . . . a(y2n−1 )i
b = hb0 , . . . , bn−1 i 7→ Ly (b) = hb(y0 ), . . . b(y2n−1 )i
I
Multiplikation der Funktionswerte an den 2n Stützstellen yi
c(yi ) = a(yi ) · b(yi ) (0 ≤ i < 2n)
I
Rekonstruktion von c(X ) durch die Funktionswerte an den
Stützstellen
c = hc0 , . . . , c2n−1 i = L−1
y hc(y0 ), . . . , c(y2n−1 )i
I
Aufwand dieses Verfahrens: O(n2 ) Operationen in K
Schnelle Fourier-Transformation (FFT)
Modulare Arithmetik für Polynome
I
Schema der Polynommultiplikation mittels modularer
Arithmetik
Faltung im
Koeffizientenbereich
(a, b)
↓∗
c
Auswertung
Interpolation
K[X ]<n × K[X ]<n
↓∗
K[X ]<2n
komponentenweise Multiplikation im Wertebereich
−→L
y
←−
L−1
y
−→L
y
←−
L−1
y
(ha(yi )i, hb(yi )i)
↓·
hc(yi )i = ha(yi ) · b(yi )i
K2n × K2n
↓·
K2n
Schnelle Fourier-Transformation (FFT)
Diskrete Fourier-Transformation
I
Diskrete Fourier-Transformation
I
I
I
I
I
Ursprünglich Approximation der kontinuierlichen
Fouriertransformation für numerische Berechnungen
Durchbruch bei der praktischen Verwendung durch Entdeckung
der “Schnellen Fourier-Transformation” (FFT) durch Cooley
und Tukey1 — gehört seitdem zu den meistverwendeten
Algorithmen überhaupt
Das FFT-Prinzip war schon Gauss bekannt (Notiz in seinem
Tagebuch) und wurde auch später mehrmals entdeckt und
publiziert2
Durchbruch aber erst als Computer-Verfahren
DFT bedeutet: Auswertung an “Einheitswurzeln” , d.h.
Lösungen der Gleichungen X n = 1 in C
1
J. W. Cooley and J. W. Tukey, An algorithm for the machine calculation
of complex Fourier series, Mathematics of Computation 19 (1965)
2
C. Runge, R. König Vorlesungen über Numerisches Rechnen, Springer
(1924)
Schnelle Fourier-Transformation (FFT)
Diskrete Fourier-Transformation
I
Die Gleichung X n = 1 hat in C genau n Lösungen
ωn0 , ωn1 , ωn2 , . . . , ωnn−1
2π
2π
2πi/n
+ i · sin
wobei ωn = e
= cos
n
n
(“primitive” n-te Einheitswurzel)
I
Diese “n-ten Einheitswurzeln” bilden eine zyklische Gruppe
Rn der Ordnung n unter der Multiplikation.
(Zn , +) → (Rn , ·) : k 7→ ωnk
ist ein Isomorphismus.
I
I
Aussagen über Z und Zn übertragen sich auf die Gruppen Rn
n|m =⇒ Rn ⊆ Rm
Schnelle Fourier-Transformation (FFT)
Diskrete Fourier-Transformation
I
Beispiele
I
I
I
n = 2 : ω2 = −1
R2 = {1, −1}
√
n = 3 : ω3 = (−1 + i · 3)/2
(
√
√ )
−1 + i · 3 −1 − i · 3
R3 = 1,
,
2
2
n = 4 : ω4 = i
R4 = {1, i, −1, −i} = R2 ∪ {±i}
I
n=5:
√
√ p
√
5−1+i 2 5+ 5
ω5 =
(√ 4
√ p
√
√
√ p
√ )
5−1±i 2 5+ 5 − 5−1±i 2 5− 5
R5 = {1} ∪
,
4
4
Schnelle Fourier-Transformation (FFT)
Diskrete Fourier-Transformation
I
n=6:
√
1+i · 3
ω6 =
( 2
√
√
√
√ )
1 + i · 3 −1 + i · 3
−1 − i · 3 1 − i · 3
R6 = 1,
,
, −1,
,
2
2
2
2
√
1±i · 3
= R2 ∪ R3 ∪ {
}
2
I
n=7
R7 = {1} ∪ cos
kπ
7
± i sin
kπ
7
;1≤k ≤3
Schnelle Fourier-Transformation (FFT)
Diskrete Fourier-Transformation
I
n=8
1+i
ω8 = √
2
R8 = R4 ∪
I
n=9
ω8 , ω83 , ω85 , ω87
R9 = R3 ∪ cos
± i sin
kπ
9
1±i
= R4 ∪ ± √
2
kπ
9
; k ∈ {1, 2, 4}
Schnelle Fourier-Transformation (FFT)
Diskrete Fourier-Transformation
I
n = 10
R10 = R2 ∪ R5 ∪ cos
I
± i sin
kπ
10
; k ∈ {1, 3}
n = 11
R11 = {1} ∪ cos
I
kπ
10
kπ
11
± i sin
kπ
11
;1≤k ≤5
n = 12
ω12 =
√
3+i
2
R12 = R4 ∪ R6 ∪
( √
3±i
±
2
)
Schnelle Fourier-Transformation (FFT)
Diskrete Fourier-Transformation
R XX
" 1 H
X
H XXXX
"
H
XXX
"
HH
XXX
"
X
"
H
H
"
R2 X
R3
R5
X
X
@
XX%X C
@
% XC XXX
XXX
@
%
C
@ %
R4
H
R8
HH
H
R6
L
L
HH L
H L
R12
R9
R10
R7
R11
Schnelle Fourier-Transformation (FFT)
Diskrete Fourier-Transformation
I
(Komplexe) Diskrete Fouriertransformation der Ordnung n:
ha0 , a1 , . . . , an−1 i → ha(ωn0 ), a(ωn1 ), . . . , a(ωnn−1 )i
DFTn,ω :
Cn → C n
wobei a(X ) =
I
Pn−1
i=0
ai X i
DFTn,ω ist simultane Auswertung von Polynomen ∈ C[X ]<n
an den n-ten Einheitswurzeln
DFTn,ω = Lhω0 ,ω1 ,...,ωnn−1 i
n
n
Schnelle Fourier-Transformation (FFT)
Diskrete Fourier-Transformation
I
DFT als lineare Transformation

a0
a1
a2
..
.







 aj

 ..
 .
an−1
I


1
1



1



.

.
 7→ 
.



1

.

.

.
|
1
ωn
ωn2
..
.
1
ωn2
ωn4
..
.
...
...
...
..
.
1
ωnj
ωn2j
..
.
...
...
...
..
.
ωni
..
.
ωn2i
..
.
...
..
.
ωnij
..
.
...
..
.
1 ωnn−1
2(n−1)
j(n−1)
ωn
. . . ωn
...
{z
Vn (ωn0 , ωn1 , ωn2 , . . . , ωnn−1 )


a0
a1 

a2 


.. 
 .. 

. 
 . 

i(n−1)  
ωn
  aj 

.. 
 . 
.   .. 
(n−1)2
an−1
ωn
}
1
ωnn−1 

2(n−1)  
ωn

Beachten: ωn hat die Ordnung n in Rn , also ωni·j = ωni·j mod n
Schnelle Fourier-Transformation (FFT)
Diskrete Fourier-Transformation
I
n=2
DFT2 =
I
n=3
1
1
1 −1
#

 

1 1
1
1 1
1
DFT3 =  1 ω3 ω32  =  1 ω3 ω32 
1 ω32 ω34
1 ω32 ω3
mit ω3 =
I
"
√
−1+i· 3
, ω32
2
=
√
−1−i· 3
2
n=4



1 1 1 1
1 1 1 1
1 1
1
1
 1 i i 2 i 3   1 i i 2 i 3   1 i −1 −i


DFT4=
 1 i 2 i 4 i 6 = 1 i 2 i 0 i 2 = 1 −1 1 −1
1 i3 i6 i9
1 i3 i2 i1
1 −i −1 i




Schnelle Fourier-Transformation (FFT)
Diskrete Fourier-Transformation
I
n=5



DFT5 = 


1
1
1
1
1
1
ω5
ω52
ω53
ω54
1
1
1
ω52 ω53 ω54
ω54 ω56 ω58
ω56 ω59 ω512
ω58 ω512 ω516
mit
ω5 =
√


 
 
=
 
 
1
1
1
1
1
1
ω5
ω52
ω53
ω54
1
ω52
ω54
ω5
ω53
1
ω53
ω5
ω54
ω53
1
ω54
ω53
ω52
ω5






√ p
√
5−1+i 2 5+ 5
4
Schnelle Fourier-Transformation (FFT)
Diskrete Fourier-Transformation
I
n=6

1
1
1
1
1
1



DFT6=



1
ω6
ω62
ω63
ω64
ω65
1
ω62
ω64
ω66
ω68
ω610
1
ω63
ω66
ω69
ω612
ω615
1
ω64
ω68
ω612
ω616
ω620
mit
√
1+i · 3
2 √
−1 − i · 3
ω64 =
= −ω6
2
ω6 =
1
ω65
ω610
ω615
ω620
ω625
 
 
 
 
=
 
 
 

1
1
1
1
1
1
1 ω6 ω62 −1 ω64 ω65 

1 ω62 ω64 
1 ω62 ω64

1 −1
1 −1
1 −1 

1 ω64 ω62 
1 ω64 ω62
1 ω62 ω6
1 ω65 ω64
√
−1 + i · 3
2√
1−i · 3
ω65 =
= −ω62
2
ω62 =
Schnelle Fourier-Transformation (FFT)
Diskrete Fourier-Transformation
I
n=8

mit





DFT8 = 






1
1
1
1
1
1
1
1
1 ω8
i ω83 −1 ω85 −i ω87 

1
i −1 −i
1
i −1 −i 

1 ω83 −i ω8 −1 ω87
i ω85 

1 −1
1 −1
1 −1
1 −1 

1 ω85
i ω87 −1 ω8 −i ω83 

1 −i −1
i
1 −i −1
i 
1 ω87 −i ω85 −1 ω83
i ω8
1+i
ω8 = √
2
−1 − i
ω85 = √
= −ω8
2
√
−1 + i
√
= ω8 − 2
2
√
1−i
ω87 = √ = ω8 − i · 2
2
ω83 =
Schnelle Fourier-Transformation (FFT)
Faktorisierung der DFT-Matrizen
I
Faktorisierung von DFT4
I
I
Spalten vertauschen

1
1
1
1
 1
i
−1
−i
DFT4 = 
 1 −1
1 −1
1 −i −1
i



1
1
1
1


i −i 
 7→  1 −1
 = DFT
]4

 1
1 −1 −1 
1 −1 −i
i
Blockstruktur erkennen

 
1
1
1
1
 1 −1
 DFT2
i −i 

=
 1
1 −1 −1  
DFT2
1 −1 −i
i
1 0
DFT2
0 i −1 0
DFT2
0 −i




Schnelle Fourier-Transformation (FFT)
Faktorisierung der DFT-Matrizen
I
Faktorisierung von DFT4
I
Faktorisierung erkennen


1 0
 I2
0 i 
DFT2


]
DFT 4 = 
·
1 0
02
I2
−
0 i
02
DFT2
wobei I2 = Einheitsmatrix, 02 = Nullmatrix
Schnelle Fourier-Transformation (FFT)
Faktorisierung der DFT-Matrizen
I
Faktorisierung von DFT8
I
Spalten in DFT8 vertauschen

1
1
1
 1
i
−1

 1 −1
1

 1 −i −1
]8 = 
DFT
 1
1
1

 1
i
−1

 1 −1
1
1 −i −1

1
1
1
1
1
−i ω8 ω83 ω85 ω87 

−1
i −i
i −i 

i ω83 ω8 ω87 ω85 

1 −1 −1 −1 −1 

−i ω85 ω87 ω8 ω83 

−1 −i
i −i
i 
i ω87 ω85 ω83 ω8
Schnelle Fourier-Transformation (FFT)
Faktorisierung der DFT-Matrizen
I
Faktorisierung von DFT8
I
I
Blockstruktur erkennen


 DFT4



]
DFT 8 = 



 DFT4










1
ω8
ω84
ω82
ω85
ω86



 · DFT4 



3

ω8 





 · DFT4 


ω87
Faktorisierung erkennen
I4 D4
DFT4
]
DFT 8 =
·
I4 −D4
04
04
DFT4
Schnelle Fourier-Transformation (FFT)
Faktorisierung der DFT-Matrizen
I
Faktorisierung von DFT2n


] 2n
DFT

 DFT

n



=




 DFTn

=





In Dn
In −Dn





1
ω2n
..
.
n−1
ω2n
n
ω2n
n+1
ω2n
..


 · DFTn

.
2n−1
ω2n
DFTn
0n
·
0n
DFTn














 · DFTn 


Schnelle Fourier-Transformation (FFT)
Faktorisierung der DFT-Matrizen
I
Dabei ist



Dn = 




n
−Dn = ω2n
· Dn = 


1
ω2n
..
.
n−1
ω2n
n
ω2n
n+1
ω2n
..





.
2n−1
ω2n





Schnelle Fourier-Transformation (FFT)
Faktorisierung der DFT-Matrizen
I
Beachte: in der Gleichung
I
D
DFT
0
n
n
n
n
] 2n =
DFT
·
In −Dn
0n
DFTn
I
I
] 2n 4n2 Koeffizienten 6= 0
hat die Matrix DFT
haben die Matrizen auf der rechten Seite 4n + 2n2
Koeffizienten 6= 0
I
FFT: diese Zerlegungsidee rekursiv durchführen
I
Folgerung: Reduktion der Anzahl der Koeffizienten 6= 0 von
O(n2 ) auf O(n log n)
Schnelle Fourier-Transformation (FFT)
Faktorisierung der DFT-Matrizen
I
FFT: der entscheidende “divide-and-conquer”-Trick:
Rückführung von DFT2n,ω2n auf DFTn,ω2
2n
I
ω = ω2n : primitive 2n-te Einheitswurzel, d.h.
R2n = {1 = ω 0 , ω, ω 2 , . . . , ω 2n−1 }
I
2
η = (ω2n ) = ωn : primitive n-te Einheitswurzel, d.h.
Rn = {1 = η 1 , η, η 2 , . . . , η n−1 }
I
I
Inklusion: Rn ⊂ R2n
Genauer: unter der Abbildung x 7→ x 2 wird R2n 2-zu-1 auf Rn
abgebildet:
ω k , ω n+k 7→ η k (0 ≤ k < n)
Schnelle Fourier-Transformation (FFT)
FFT
I
Polynomialer Ansatz zur FFT
I
Zerlegung von Polynomen nach Parität der Exponenten
a(X ) =
2n−1
X
ai X i
↔
ha0 , a1 , . . . , a2n−2 , a2n−1 i = a
a2i X i
↔
ha0 , a2 , . . . , a2n−4 , a2n−2 i = a[0]
a2i+1 X i
↔
ha1 , a3 , . . . , a2n−3 , a2n−1 i = a[1]
i=0
a[0] (X ) =
n−1
X
i=0
a[1] (X ) =
n−1
X
i=0
I
es gilt
a(X ) = a[0] (X 2 ) + X · a[1] (X 2 )
Schnelle Fourier-Transformation (FFT)
FFT
I
und daher für 0 ≤ k < 2n:
a(ω k )
I
= a[0] (ω 2k ) + ω k · a[1] (ω 2k )
+ ω k · a[1] (η k )
=
a[0] (η k )
[0] k−n
= a (η
) + ω k · a[1] (η k−n )
(0 ≤ k < n)
(n ≤ k < 2n)
Folgerung:
DFT2n,ω (a) = DFTn,η (a[0] ) o
nωk DFTn,η (a[1] )
I
o
nωk ist die “butterfly”-Operation
[0] k a(ω k )
1 ωk
a (η )
=
n+k
k
a(ω )
1 −ω
a[1] (η k )
(0 ≤ k < n)
Schnelle Fourier-Transformation (FFT)
FFT
a0
a1
[0]
a2
a3
a2k
a2n−2
a2k+1
[1]
[1]
[0]
an−1
[0]
a0
a1
[0]
α1
[0]
αk
[0]
αn−1
[1]
α0
[1]
α1
!
"ω 0
!
"ω 1
!
" k
ω
αk
αn−1
[0]
a0
a1
[0]
α0
ak
DFT(n)
α0
α1
[1]
an−1
[1]
αn−1
αn+k
α2n−1
ak
αk
αn
αn+1
[0]
(α0 , . . . , αn−1 ) = FFT((a0 , a2 . . . , a2n−4 , a2n−2 ), n/2, ω 2 );
[1]
[1]
(α0 , . . . , αn−1 )
= FFT((a1 , a3 . . . , a2n−3 , a2n−1 ), n/2, ω 2 );
for (k = 0; k < n; k ++)
[0]
[1]
αk = αk + ω k · αk ;
for (k = n; k < 2n; k ++)
[0]
}
[1]
[1]
!
"ωn−1
FFT (real a[], int n, complex ω)
{
if (n == 1) return (a0 );
else
{
}
[1]
DFT(n)
Schnelle Fourier-Transformation (FFT)
FFT
[0]
a2n−1
αk = αk−n + ω k · αk−n ;
return (α0 , α1 , . . . , α2n−2 , α2n−1 );
iterativer und paralleler Implementierung der FFT eine wichtige Rolle.
Das nachfolgende Programm FFT (in Maple-pseudocode) realisiert die Idee
der schnellen Fourier-Transformation:
Schnelle Fourier-Transformation (FFT)
FFT
FFT := proc (A,k)
n := 2^k;
if k=0 then RETURN(A) fi;
omega_n := exp(2*Pi*I/n);
omega := 1;
a_0 := [A[0],A[2],...,A[n-2]];
a_1 := [A[1],A[3],...,A[n-1]];
y_0 := FFT(a_0,k-1);
y_1 := FFT(a_1,k-1);
for t from 0 to (n/2)-1 do
y[t] := y_0[t] + omega*y_1[t];
y[t+(n/2)] := y_0[t] - omega*y_1[t];
omega := omega*omega_n
od;
RETURN(y);
end;
Anhand dieses Programms, bei dem der Parameter k die jeweilige Ordnung
angibt (entsprechend Listenlänge n = 2k ), kann man nun leicht die Komplexität,
Schnelle Fourier-Transformation (FFT)
gemessen in Operationen im Körper der komplexen Zahlen, abschätzen. Man
FFT
hat nur zu beachten, daß die for t ... do Schleife eine Aufwand erfordert, der
a0
+
+ 21
+
α0
+
+
α1
•
-
+
α2
•
-
+
α3
•
-
α4
•
-
α5
•
-
α6
•
-
α7
ω20
a1
•
a2
ω40
+
ω20
a3
•
a4
-
ω41
+
ω20
a5
•
a6
+
ω81
-
+
ω40
+
ω20
a7
•
-
ω80
ω41
•
-
•
-
ω83
ω82
Schnelle Fourier-Transformation (FFT)
FFT
I
Komplexität der FFT
I
I
F (n) : Anzahl der komplexen arithmetischen Operationen zur
Berechnung von DFT (n) mittels FFT
“divide-and-conquer”-Rekursionsgleichung
F (2n) = 2 · F (n) + O(n) ,
I
Lösung:
F (n) ∈ Θ(n · log n)
F (1) = 0
Schnelle Fourier-Transformation (FFT)
FFT
I
Umkehrabbildung
DFT (n)−1 = “Interpolation” an den Stellen ωnk ∈ Rn
I
Inverses der Vandermonde-Matrix von DFT (n)
Vn = Vn (ωn0 , ωn1 , . . . , ωnn−1 ) = ωnij 0≤i,j<n
ist
1
Vn (ωn 0 , ωn 1 . . . , ωn n−1 ) =
n
1 ij
ωn
n
=
0≤i,j<n
1 −ij
ω
n n
0≤i,j<n
wobei ωn = e −2πi/n = ωn−1
I
Beweis: für 0 ≤ i, k < n gilt
n−1
X
j=0
ωnij · ωn jk =
n−1
X
j=0
ωnij · ωn−jk =
n−1
X
ωn(i−k)j
j=0
(
n
=
0
i =k
i 6= k
Schnelle Fourier-Transformation (FFT)
FFT
I
Folgerung:
I
Die Rücktransformation DFT (n)−1 ist
— bis auf banale Änderungen:
ωn durch ωn−1 ersetzen und alles durch n dividieren —
I
I
die gleiche Operation wie DFT (n)
DFT (n)−1 kann also ebenfalls mit Θ(n log n) komplexen
Operationen berechnet werden
Man kann die gleichen Programme/Hardware verwenden
Schnelle Fourier-Transformation (FFT)
FFT
I
Anwendung: Multiplikation (“Faltung”) von zwei Polynomen
a, b ∈ C[X ]<n nach dem Schema der modularen Arithmetik
I
jeweils 2n Auswertungen mittels FFT
k
k
a(ω2n
), b(ω2n
) (0 ≤ k < 2n)
I
2n komplexe Multiplikationen
k
k
k
c(ω2n
) = a(ω2n
) · b(ω2n
) (0 ≤ k < 2n)
I
Interpolation mittels FFT-Rücktransformation
2n−1
0
c(X ) = DFT (2n)−1 ([c(ω2n
), . . . , [c(ω2n
)])
erfordert 3 · Θ(2n · log 2n) + O(2n) ∈ Θ(n · log n) komplexe
Operationen, ist also deutlich schneller als das klassische
O(n2 )-Verfahren
Schnelle Fourier-Transformation (FFT)
FFT
I
Ergänzende Bemerkungen
I
FFT kombiniert zwei Prinzipien algebraischer Natur:
– Domain-Transformation (Koeffizientendarstellung vs.
Wertedarstellung) mittels Evaluation ↔ Interpolation
– Rekursive Struktur der Einheitswurzeln als Lösungen von
X n = 1 und damit als Elemente einer zyklischen Gruppe
I Zahlreiche Varianten und Variationen über Ringen, die
genügend viele Einheitswurzeln enthalten, darunter
– Ringe Zn für geeignete n
– endliche Körper (bestehen vollständig aus Einheitswurzeln!)
– andere Zerlegungen als nach Zweierpotenzen
I Beim Rechnen über C: Rundungsfehler, numerische Stabilität?
Andere Ringe/Körper mit exakter Arithmetik oft vorteilhaft
I Schnellstes bekanntes Multiplikationsverfahren für ganze
Zahlen (Schönhage-Strassen, O(n log n log log n)) beruht
auf FFT über Ringen Z2k +1
Modulare Polynomarithmetik: Evaluation und Interpolation
Zwei Polynome f(X) und g(X) vom Grad ≤ 3 sollen miteinander multipliziert werden. Das
Produkt h(X) = f(X) g(X) ist ein Polynom vom Grad ≤ 7.
>
f := X -> 5*X^3+3*X^2-4*X+3;
>
f := X → 5 X 3 + 3 X 2 − 4 X + 3
g := X -> 2*X^3-5*X^2+7*X-2;
>
g := X → 2 X 3 − 5 X 2 + 7 X − 2
h := unapply(expand(f(X)*g(X)),X);
h := X → 10 X 6 − 19 X 5 + 12 X 4 + 37 X 3 − 49 X 2 + 29 X − 6
Um h(X) nach dem Schema von Evaluation und Interpolation zu berechnen, genügen also 8
Interpolationsstellen, die im Prinzip beliebig gewählt werden könnnen.
Die Interpolationspunkte:
>
points := [seq(X,X=0..7)];
points := [0, 1, 2, 3, 4, 5, 6, 7]
Die Werte der Polynome f(X) und g(X) an den Interpolationspunkten:
>
valuesf := map(f,points);
>
valuesf := [3, 7, 47, 153, 355, 683, 1167, 1837]
valuesg := map(g,points);
valuesg := [−2, 2, 8, 28, 74, 158, 292, 488]
Die Werte des Polynoms h(X) sind die Produkte der entsprechenden Werte von f(X) und g(X)
>
zip((x,y)-> x*y,valuesf,valuesg);
[−6, 14, 376, 4284, 26270, 107914, 340764, 896456]
Durch Interpolation erhält man das gesuchte Polynom:
> interp(points,%,X);
10 X 6 − 19 X 5 + 12 X 4 + 37 X 3 − 49 X 2 + 29 X − 6
Man hätte die Interpolationspunkte auch zufällig wählen können. Beispielsweise mit Hilfe eines
Zufallsgenerators. Man muss sich dann nur vergewissern, dass die Punkte paarweise
verschieden sind.
> die := rand(-99..99);
die := proc()
local t;
global seed ;
seed := irem(a ∗ seed , p) ;
t := seed ;
to concats do seed := irem(a ∗ seed , p) ; t := s ∗ t + seed end do ;
irem(t, divisor ) + offset
end proc
>
randpoints := [seq(die(),X=0..7)];
>
randpoints := [−85, −55, −37, −35, 97, 50, 79, 56]
valuesf := map(f,randpoints);
valuesf := [−3048607, −822577, −249007, −210557, 4591207, 632303, 2483605, 887267]
valuesg := map(g,randpoints);
>
>
>
valuesg := [−1264972, −348262, −108412, −92122, 1778978, 237848, 955424, 335942]
zip((x,y)-> x*y,valuesf,valuesg);
[3856402494004, 286472311174, 26995346884, 19396931954, 8167656246446,
150392003944, 2372895823520, 298070250514]
interp(randpoints,%,X);
10 X 6 − 19 X 5 + 12 X 4 + 37 X 3 − 49 X 2 + 29 X − 6
Bei der Diskreten Fouriertransformation der Ordnung n wählt man als Interpolationspunkte
die sogenannten n-ten Einheitswurzeln in der komplexen Ebene . Das sind die n Lösungen der
Gleichung X n = 1, diese liegen auf dem Einheitskreis; es handelt sich um die n (verschiedenen)
Potenzen der sogenannten ”primitiven” n-ten Einheitwurzel e2πi/n .
Im Falle des Beispiels arbeitet man mit $n=8$.
> dftpoints := [solve(X^8=1)];
1√
1 √ 1√
1 √
1√
1 √ 1√
1 √
dftpoints := [−I, I, −1, 1, −
2 − I 2,
2 + I 2, −
2 + I 2,
2 − I 2]
2
2
2
2
2
2
2
2
Die Liste der 8 Punkte ist nicht in fortlaufenen Potenzen geordnet. Um das explizit zu machen:
>
omega8 := (1+I)/sqrt(2);
1 1 √
ω8 := ( + I) 2
2 2
>
dftpoints := [seq(evalc(omega8^k),k=0..7)];
1√
1 √
1√
1 √
1√
1 √
1√
1 √
dftpoints := [1,
2 + I 2, I, −
2 + I 2, −1, −
2 − I 2, −I,
2 − I 2]
2
2
2
2
2
2
2
2
Die Polynome f(X) und g(X) und des Produktes h(X) haben an diesen Stellen komplexe Werte.
>
valuesf := map(evalc,map(f,dftpoints));
>
9√
1√
9√
1√
2+3+I(
2 + 3), −9 I,
2+3+I(
2 − 3), 5,
2
2
2
2
9√
1√
9√
1√
2 + 3 + I (−
2 + 3), 9 I, −
2 + 3 + I (−
2 − 3)]
2
2
2
2
valuesg := map(evalc,map(g,dftpoints));
>
5√
9√
5√
9√
2−2+I(
2 − 5), 3 + 5 I, −
2−2+I(
2 + 5), −16,
2
2
2
2
5√
9√
5√
9√
−
2 − 2 + I (−
2 − 5), 3 − 5 I,
2 − 2 + I (−
2 + 5)]
2
2
2
2
valuesh := map(evalc,map(h,dftpoints));
valuesf := [7, −
valuesg := [2,
11 √
85 √
11 √
85 √
2 − 18 + I (−59 +
2), 45 − 27 I, −
2 − 18 + I (59 +
2),
2
2
2
2
11 √
85 √
11 √
85 √
−80, −
2 − 18 + I (−59 −
2), 45 + 27 I,
2 − 18 + I (59 −
2)]
2
2
2
2
valuesh := [14,
Die Werte von h(X) erhält man auch durch Bildung der Produkte der entsprechenden Werte
von f(X) und g(X)
>
zip((x,y)-> evalc(x*y),valuesf,valuesg);
85 √
11 √
85 √
11 √
2 − 18 + I (−59 +
2), 45 − 27 I, −
2 − 18 + I (59 +
2), −80,
2
2
2
2
11 √
85 √
11 √
85 √
−
2 − 18 + I (−59 −
2), 45 + 27 I,
2 − 18 + I (59 −
2)]
2
2
2
2
[14,
Die Berechnung (der Koeffizienten) von h(X) kann man in diesem Fall statt durch
Interpolation viel einfacher durch Anwendung der inversen Fouriertransformation machen.
Dazu interpretiert man die Folge der Funktionswerte als Koeffizienten eines Polynoms H(X).
(Jetzt kommt es auf die richtige Reihenfolge an!)
>
convert(zip((x,y)->x*y,valuesh,[seq(X^k,k=0..7)]),‘+‘);
85 √
11 √
2 − 18 + I (−59 +
2)) X + (45 − 27 I) X 2
2
2
85 √
11 √
2 − 18 + I (59 +
2)) X 3 − 80 X 4
+ (−
2
2
11 √
85 √
+ (−
2 − 18 + I (−59 −
2)) X 5 + (45 + 27 I) X 6
2
2
11 √
85 √
+(
2 − 18 + I (59 −
2)) X 7
2
2
H := unapply(%,X);
14 + (
>
11 √
85 √
2 − 18 + I (−59 +
2)) X + (45 − 27 I) X 2
2
2
11 √
85 √
+ (−
2 − 18 + I (59 +
2)) X 3 − 80 X 4
2
2
11 √
85 √
+ (−
2 − 18 + I (−59 −
2)) X 5 + (45 + 27 I) X 6
2
2
11 √
85 √
+(
2 − 18 + I (59 −
2)) X 7
2
2
H := X → 14 + (
Die Auswertung geschieht wiederum an den achten Einheitswurzeln, nun aber im umgekehrten
Durchlaufungssinn:
>
inversedftpoints :=[seq(evalc(omega8^(-k)),k=0..7)];
>
inversedftpoints :=
1√
1 √
1√
1 √
1√
1 √
1√
1 √
[1,
2 − I 2, −I, −
2 − I 2, −1, −
2 + I 2, I,
2 + I 2]
2
2
2
2
2
2
2
2
valuesH := map(expand,map(evalc,map(H,inversedftpoints)));
valuesH := [−48, 232, −392, 296, 96, −152, 80, 0]
Nach Divisions durch den Skalierungsfaktor 8 erhält man in der Tat die Koeffizienten des
Polynoms h(X).
>
map(x->1/8*x,%);
[−6, 29, −49, 37, 12, −19, 10, 0]
Im Beispielfall n=8 kann man exakt rechnen, da ω8 mittels Wurzeln exakt ausgedrückt werden
kann. Das ist im allgemeinen nicht mehr der Fall und man muss die Rechnungen (sofern man
nicht in endliche Körper und Ringe ausweicht) mit Fliesskamma-Arithmetik, also mit
Rundungsfehlern behaftet, durchfhren. Zur Illustration folgt das gleiche Beispiel mit der in
Maple eingebauten FFT-Funktion.
Komplexe FFT in Maple
Liste der Koeffizienten des Polynoms f(X):
>
fcoeffs := array([seq(coeff(f(X),X,k),k=0..7)]);
fcoeffs := [3, −4, 3, 5, 0, 0, 0, 0]
Die Koeffizienten müssen in Real- und Imaginärteile zerlegt werden:
>
reell := fcoeffs;
reell := fcoeffs
>
imag := array([0$8]);
imag := [0, 0, 0, 0, 0, 0, 0, 0]
Durchführung der DFT der Ordnung 8 = 23 mittels FFT:
>
FFT(3,reell,imag);
8
Man erhält im Frequenzbereich die Liste der Werte auch nach Real- und Imaginärteil getrennt:
>
Freell := copy(reell):
>
print(reell);
>
>
[7.000000001, −3.363961017, 0., 9.363961017, 4.999999999, 9.363961017, 0.,
−3.363961017]
Fimag := copy(imag):
print(imag);
[0, −3.707106773, 8.999999995, 2.292893219, 0., −2.292893219, −8.999999995,
3.707106773]
Mittels inverser Fouriertransformation sollten sich die Koeffizienten von f(X) wiederherstellen
lassen. Das gelingt nur bis auf Rundungsfehler!
>
iFFT(3,reell,imag);
8
>
op(reell);
>
[3.000000000, −3.999999992, 2.999999998, 4.999999989, 0., −.2500000000 10−8 ,
.2500000000 10−8 , .6250000000 10−8 ]
op(imag);
[0., −.7500000000 10−9 , 0., −.5000000000 10−9 , 0., .7500000000 10−9 , 0., .5000000000 10−9
]
FFT der Koeffizientenliste von g(X):
>
gcoeffs := array([seq(coeff(g(X),X,k),k=0..7)]);
>
reell := gcoeffs;
gcoeffs := [−2, 7, −5, 2, 0, 0, 0, 0]
reell := gcoeffs
>
imag := array([0$8]);
imag := [0, 0, 0, 0, 0, 0, 0, 0]
>
FFT(3,reell,imag);
>
>
Greell := reell:
print(reell);
>
>
[2, 1.535533906, 3., −5.535533906, −16, −5.535533906, 3., 1.535533906]
Gimag := imag:
print(imag);
8
[0, −1.363961031, −5., −11.36396102, 0, 11.36396102, 5., 1.363961031]
Punktweise Multiplikation im Frequenzbereich:
>
Fcoeffs := zip((x,y) -> x+I*y,Freell,Fimag);
>
>
Fcoeffs := [7.000000001, −3.363961017 − 3.707106773 I, 0. + 8.999999995 I,
9.363961017 + 2.292893219 I, 4.999999999 + 0. I, 9.363961017 − 2.292893219 I,
0. − 8.999999995 I, −3.363961017 + 3.707106773 I]
Gcoeffs := zip((x,y) -> x+I*y,Greell,Gimag);
Gcoeffs := [2, 1.535533906 − 1.363961031 I, 3. − 5. I, −5.535533906 − 11.36396102 I,
−16, −5.535533906 + 11.36396102 I, 3. + 5. I, 1.535533906 + 1.363961031 I]
Hcoeffs := zip((x,y)-> evalc(x*y),Fcoeffs,Gcoeffs);
Hcoeffs := [14.00000000, −10.22182538 − 1.104076406 I, 44.99999998 + 26.99999998 I,
−25.77817454 − 119.1040761 I, −79.99999998 − 0. I,
−25.77817454 + 119.1040761 I, 44.99999998 − 26.99999998 I,
−10.22182538 + 1.104076406 I]
Vergleich mit der Fouriertransformierten (in floats) H(X) der Produktpolynoms h(X):
> evalf(H(X));
>
14. − (10.22182541 − 1.10407638 I) X + (45. − 27. I) X 2
− (25.77817459 − 119.1040764 I) X 3 − 80. X 4
− (25.77817459 + 119.1040764 I) X 5 + (45. + 27. I) X 6
− (10.22182541 + 1.10407638 I) X 7
Hreal := map(x->Re(x),Hcoeffs);
>
Hreal := [14.00000000, −10.22182538, 44.99999998, −25.77817454, −79.99999998,
−25.77817454, 44.99999998, −10.22182538]
Himag := map(x->Im(x),Hcoeffs);
Himag := [0., −1.104076406, 26.99999998, −119.1040761, −0., 119.1040761,
−26.99999998, 1.104076406]
Rücktransformation mittels der Werte von H(X):
> iFFT(3,Hreal,Himag);
8
> op(Hreal);
[−5.999999982, 28.99999992, −48.99999991, 36.99999992, 11.99999998, −18.99999992,
9.999999938, .5000000000 10−7 ]
>
op(Himag);
[0., −.3750000000 10−8 , 0., .6250000000 10−8 , 0., .3750000000 10−8 , 0., −.6250000000 10−8
]
Vergleich mit dem Produktpolynom h(X)
>
h(X);
10 X 6 − 19 X 5 + 12 X 4 + 37 X 3 − 49 X 2 + 29 X − 6
Beispiel zur Schnellen Fourier-Transformation
O x := Array([-1,-1,-1,-1,1,1,1,1]); # real parts of data
x := K1 K1 K1 K1 1 1 1 1
O y := Array([0,0,0,0,0,0,0,0]); # imaginary parts of data
y := 0 0 0 0 0 0 0 0
O FFT(3,x,y): # transform data
O x;
0 K2.000000001 0. K1.999999999 0 K1.999999999 0. K2.000000001
O y; # imaginary parts of transformed data
0 4.828427122 0. 0.828427124 0 K0.828427124 0. K4.828427122
O zip((a,b)->a+b*I, x, y): convert(%, list);
0, K2.000000001 C 4.828427122 I, 0. C 0. I, K1.999999999 C 0.828427124 I, 0,
K1.999999999 K 0.828427124 I, 0. C 0. I, K2.000000001 K 4.828427122 I
O iFFT(3,x,y): # check results
O x;
K1.000000000, K0.9999999990, K0.9999999995, K0.9999999985, 1.000000000,
0.9999999990, 0.9999999995, 0.9999999985
O y;
0., 2.500000000 10-10, 0., K2.500000000 10-10, 0., K2.500000000 10-10, 0.,
-10
2.500000000 10
O y := map(fnormal, y);
y := 0. 0. 0. K0. 0. K0. 0. 0.
Glättung einer verrauschten harmonischen Schwingung durch Faltung mit einer
Gaussverteilung
Definition einer Störfunktion (Rauschen)
O noise := stats[random, normald]:
Harmonische Schwingung mit überlagertem Rauschen
O re_data := Array([seq(sin(0.0625*k)+0.1*noise(),
k=1..2^8)]);
1 .. 256 Array
Data Type: anything
re_data :=
Storage: rectangular
Order: Fortran_order
O im_data := Array([seq(0, k=1..2^8)]):
O xcoords := Array([seq(0.0625*k, k=1..2^8)]):
Grafische Darstellung
O plotdata := convert(zip((a,b)->[a,b], xcoords,
re_data), list):
O plot(plotdata, style=POINT);
1,0
0,5
0
2
4
6
8
10
12
K0,5
K1,0
Definition einer Gaussfunktion zur Faltung (Kern,kernel)
O re_kernel := Array([seq(exp(-100.0*(k/2^8)^2),
k=1..2^8)]):
14
16
O im_kernel := Array([seq(0, k=1..2^8)]):
FFT in den Frequezbereich von verrauschten Daten und Kern
O FFT(8, re_data, im_data):
O FFT(8, re_kernel, im_kernel):
Punktweise Multiplikation der transformierten Daten
O data := zip((a,b)->(a+b*I), re_data, im_data):
O kernel := zip((a,b)->(a+b*I), re_kernel, im_kernel):
O newdata := zip((a,b)->a*b, data, kernel):
O new_re_data := map(Re, newdata):
O new_im_data := map(Im, newdata):
Rücktransformation mittels inverser FFT
O iFFT(8, new_re_data, new_im_data):
Grafische Drastellung der geglätteten Daten
O plotdata := convert(zip((a,b)->[a,b], xcoords,
new_re_data), list):
O plot(plotdata, style=POINT);
15
10
5
0
K5
K10
K15
2
4
6
8
10
12
14
16
8.7
8.7.1
FFT-basierte Multiplikation von sehr großen ganzen Zahlen
Vorbemerkungen
Die Zahl p sei eine Primzahl. Dann gilt:
– Der Ring Zp ein Körper.
– Die Gruppe der Einheiten Up = Z×
p ist eine zyklische Gruppe: es gibt ein ω mit
1 < ω < p mit ordp (ω) = p − 1, d.h.
hωi = 1, ω, ω 2 , . . . , ω p−1 = {1, 2, . . . , p − 1}.
ω heisst primitives Element von Z×
p.
– Der Satz von Fermat besagt, dass die Elemente von Z×
p die p − 1 Lösungen der
Gleichung X p−1 = 1 in Zp sind:
Rp−1 (Zp ) = hωi = 1, ω, ω 2 , . . . , ω p−1 = {1, 2, . . . , p − 1}.
– Für jedes k ∈ Z gilt
ordp (ω k ) =
ordp (ω)
p−1
=
,
ggT(k, ordp (ω))
ggT(k, p − 1)
also für jeden Teiler n von p − 1:
ωk
Insbesondere gilt
n
= 1 ⇔ ordp (ω k ) | n ⇔ ggT(k, p − 1) |
p−1
n
ordp (ω k ) = p − 1 ⇔ ggT(k, p − 1) = 1,
d.h. es gibt φ(n − 1) solche primitiven Elemente in Zp .
– Ist n ein Teiler von p − 1, so hat die Gleichung X n = 1 in Zp die n Lösungen
Rn (Zp ) = {1, η, η 2 , . . . , η n−1 } mit η = ω (p−1)/n .
– Beispiel: p = 13. Es gilt
a 1 2 3 4 5 6 7 8 9 10 11 12
ord13 (a) 1 12 3 6 4 12 12 4 3 6 12 2
235
Die φ(12) = 4 primitiven Elemente sind ω = 2, 6, 7, 11. Die Einheitswurzeln gruppieren sich so:
R12 (Z13 ) = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}
R6 (Z13 ) = {1, 3, 4, 9, 10, 12}
R4 (Z13 ) = {1, 5, 8, 12}
R3 (Z13 ) = {1, 3, 9}
R2 (Z13 ) = {1, 12}
R1 (Z13 ) = {1}
– Beispiel: p = 17. Es gilt
a 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
ord17 (a) 1 8 16 4 16 16 16 8 8 16 16 16 4 16 8 2
Die φ(16) = 8 primitiven Elemente sind {3, 5, 6, 7, 10, 11, 12, 14}. Die Einheitswurzeln gruppieren sich so:
R16 (Z17 ) = {1, 2, 3, . . . , 16}
R8 (Z17 ) = {1, 2, 4, 8, 9, 13, 15, 16}
R4 (Z17 ) = {1, 1, 4, 13, 16}
R2 (Z17 ) = {1, 16}
R1 (Z17 ) = {1}
8.7.2
DFT über Zp
Die Definitioon der Diskreten Fouriertransformation der Ordnung n über einem Körper
Zp , wobei n ein Teiler von p − 1 ist, wird von der Beobachtung geleitet, dass die beiden
muliplikativen Gruppen
Rn (C) = hωn i = {1, ωn , ωn2 , . . . , ωnn−1 } mit ωn = e2πi/n
als Untergruppe von C, und
Rn (Zp ) = hηi = {1, η, η 2 , . . . , ηnn−1 }
(p−1)/n
mit η = ωn
als Untergruppe von Zp , isomorph sind – es sind zyklische Gruppen der
Ordnung n –, sich also in allen für die Definition einer Fouriertransformation benötigten
Eigenschaften völlig gleich verhalten. Unterschiede gibt es gleichwohl, und die sollen
explizit festgehalten werden
236
• Während der Körper C Lösungen von X n = 1 für alle n ≥ 1 enthält, kann ein
Körper Zp nur mit Lösungen dieser Gleichung für solche n aufwarten, die Teiler
von p − 1 sind.
• Das konkrete Rechen in C ist Rechnen mit Floatingpointzahlen,also (bis auf seltene Ausnahmen) mit Rundungsfehlern behaftet. In den Körpern Zp rechnet man
dagegen immer exakt!
– Definition: Ist p ein Primzahl und gilt n | p − 1, so ist die Diskrete Fouriertransformation der Ordnung n über Zp definiert durch
DFTn,η : Znp → Znp : a = (a0 , a1 , . . . , an−1 ) 7→ A(1), A(η), A(η 2 ), . . . , A(η n−1 )
wobei η = ω (p−1)/n ist für ein primitives Element ω von Z×
p.
Man sagt: der Körper Zp unterstützt die Diskrete Fouriertransformation der Ordnung n.
– Beachte: Znp ist ein Vektorraum der Dimension n über dem Körper Zp . DFTn,η ist
eine lineare Transformation, deren Matrix, wie im komplexen Fall, die Vandermonde-Matrix V (1, η, η 2 , . . . , η n−1 ) ist.
Die Aussagen über die inverse Transformation sind ganz analog zum komplexen
Fall.
– Definition Die zyklische Faltung von Vektoren aus Znp ist definiert durch
(a0 , . . . , an−1 ) ∗n (b0 , . . . , bn−1 ) = (c0 , . . . .cn−1 )
|
{z
} |
{z
} |
{z
}
a
mit ck =
X
b
i+j=k mod n
c
ai · bj (0 ≤ k < n)
– Beispiel: In Z5 und mit n = 4:
(1, 0, 0, 1) ∗4 (1, 1, 3, 2) = (2, 4, 0, 3)
denn es ist
(1 + X 3 )(1 + X + 3X 2 + 2X 3 ) = 1 + X + 3X 2 + 3X 3 + X 4 + 3X 5 + 2X 6
– Satz (Faltungstheorem):
DFTn,η (a ∗n b) = DFTn,η (a) · DFTn,η (b)
Das Produkt auf der rechten Seite ist die komponentenweise Multiplikation von
Vektoren.
237
Zum
betrachte man
der beiden Polynome A(X) =
Pn−1Beweis
Pn−1die Multiplikation
i
j
i=0 ai X und B(X) =
j=0 bj X .


2n−2
X
X

A(X) · B(X) =
ai · bj  X k
k=0
=
X
k<n
=
X
k<n
=
X
k<n
|


i+j=k
X
i+j=k


X
i+j=k



ai · bj  X k +

2n−2
X
k=n


ai · bj  X k + X n ·
X
i+j=k mod n
{z
C(X)

X
i+j=k
X
k<n


ai · bj  X k

X
i+j=k+n
ai · bj  X k +(X n − 1) ·
}

ai · bj  X k
X
k<n


X
i+j=k+n

ai · bj  X k ,
Pn−1
ck X k gerade die Koeffizienten der zyklischen
wobei das Polynom C(X) = k=0
Faltung c = a ∗n b als Koeffizienten hat. Setzt man nun η ` für die Variable X ein,
so erhält man
A(η ` ) · B(η ` ) = C(η ` ) (0 ≤ ` < n). – Folgerung:
a ∗n b = DFT−1
n,η (DFTn,η (a) · DFTn,η (b))
– Folgerung: Falls n = 2t ist, kann man DFTn,η und DFT−1
n,η mittels FFT realisieren,
ganz analog wie im Komplexen.
Insbesondere kann man dann a ∗n b mit dreimaliger Anwendung von FFTn,η berechnen, was einen Aufwand von O(n log n) Operationen im Körper Zp erfordert.
Um das machen zu können, muss n = 2t ein Teiler von p − 1 sein, d.h. die Primzahl
p muss von der Form
n = k · 2t + 1
sein. Man benennt solche Primzahlen gelegentlich als “Fourier-Primzahlen”.
– Beispiel: p = 17 = 16 + 1 = 24 + 1 ist Primzahl und es gilt
Z×
17 = h3i, d.h. ord17 (3) = 16.
Z17 unterstützt DTF der Ordnungen 16,8,4,2:
32 = 9 ⇒ ord17 (9) = 8
34 = 13 ⇒ ord17 (13) = 4
38 = 16 ⇒ ord17 (16) = 2
238
– Beispiel Will man eine DFT der Ordnung 25 realisieren, benötigt man eine Primzahl der Form k · 25 + 1:
1 · 25 + 1 = 33
ist keine Primzahl,
3 · 25 + 1 = 97
ist Primzahl.
2 · 2 + 1 = 65
ist keine Primzahl,
5
Man muss also mindestens p = 97 wählen. ω = 5 ist ein primitives Element von
Z×
97 , d.h. ord97 (5) = 96. Z79 unterstützt DTF der Ordnungen 32,16,8,4,2:
53 = 28 ⇒ ord97 (28) = 32
56 = 8 ⇒ ord97 (8) = 16
512 = 64 ⇒ ord97 (64) = 8
524 = 22 ⇒ ord97 (22) = 4
548 = 96 ⇒ ord97 (96) = 2
8.7.3
Der “three primes”-Algorithmus
Es wird nun ein Verfahren beschrieben, wie man mit Hilfe von Fouriertransformation
über Körpern Zp sehr grosse (aber nicht beliebig grosse!) ganze Zahlen multiplizieren
kann.
• Es sei s eine natürliche Zahl mit s ≤ 62. Die zu multiplizierenden Zahlen a und b
s−1
seien < 264·2 , d.h. als Basis-64-Zahlen geschrieben ist
a=
α
X
i=0
64 i
ai 2
, b=
β
X
bj 264
j=0
j
, mit 0 ≤ ai , bj < 264 .
Es ist dann α, β < 2s−1 . Mit
A(X) =
α
X
ai X , B(X) =
i
i=0
β
X
bj X j
j=0
werden die zugehörigen Polynome bezeichnet.
• Die Multiplikation der beiden Polynome schreibt sich als


α+β
X
X

A(X) · B(X) = C(X) =
ai · bj  X k ,
k=0
239
|
i+j=k
{z
ck
}
und es gilt
a · b = A(264 ) · B(264 ) = C(264 ).
Die Summen, die die ck beschreiben, haben wegen α, β < 2s−1 maximal 2s−1
Terme, von denen jeder < 264 · 264 = 2128 ist. Dies liefert die Abschätzung
0 ≤ ck < 2s−1 · 2128 ≤ 2189 (0 ≤ k ≤ α + β).
• Es seien nun p1 , p2 , p3 drei Primzahlen mit
263 < pi < 264 (i = 1, 2, 3),
und damit
23·63 = 2189 < p1 · p2 · p3 .
Das bedeutet nach dem chinesischen Restesatz, dass die Koeffizienten ck durch ihre
drei Reste
ck mod pi (i = 1, 2, 3)
eindeutig bestimmt sind!
• Es sei nun
t = dlog(1 + α + β)e.
Aus den obigen Abschätzungen folgt, dass t ≤ s ist.
Man kann also für i = 1, 2, 3 die ck mod pi (0 ≤ k ≤ α + β) mittels FFT der
Ordnung 2t (zyklische Faltung) über dem Körper Zpi berechnen.
Um das durchzuführen, benötigt man Elemente ηi ∈ Zpi der Ordnung 2t , d.h. es
muss 2t | pi − 1 gelten.
• Man wählt die Primzahlen pi so, dass 2s | pi − 1 gilt, d.h.
pi = ki · 2s + 1
(i = 1, 2, 3).
Weiter sei ωi ein Element der Ordnung 2s in Zpi . Dann leistet
ηi = ωi2
s−t
(i = 1, 2, 3)
das Verlangte!
• Wichtig: diese Daten (pi , ωi )i=1,2,3 müssen nur ein einziges Mal berechnet werden!
Dann kann man sie immer wieder verwenden!
• Gesucht sind alsi drei Primzahlen p1 , p2 , p3 der Form
pi = ki · 2s + 1
(i = 1, 2, 3)
für die zusätzlich noch
263 < pi < 26 4
240
gilt. Es handelt sich also um Primzahlen, die gerade in ein Maschinenwort eines
64-bit-Prozessors passen. Die Arithmetik modulo pi ist also auch aus dieser Sicht
völlig unproblematisch.
Im Hinblick auf die Anwendung soll s möglichst gross sein, aber s ≤ 62 ist natürlich
zu berücksichtigen.
Zu den pi (i = 1, 2, 3) muss man jeweils auch noch ein ωi der Ordung 2s finden.
• Experimentieren mit Maple zeigt sehr schnell: das maximale s für das drei solche
Primzahlen noch existieren, ist s = 57. Hier sind die Daten: es gibt 5 Primzahlen
der gesuchten Art (aufgeführt ist jeweils das kleinste Element ωi der Ordnung 257 ):
p1 = 71 · 257 + 1 = 10232178353385766913
p2 = 75 · 257 + 1 = 10808639105689190401
p3 = 95 · 257 + 1 = 13690942867206307841
p4 = 108 · 257 + 1 = 15564440312192434177
p5 = 123 · 257 + 1 = 17726168133330272257
56
• Fazit: Man kann Zahlen a, b < 264·2
ω1 = 287
ω2 = 149
ω3 = 55
ω4 = 64
ω5 = 493
62
= 22 , d.h. Zahlen deren Bitlänge bis zu
259 byte, d.h. 536.870.912 Gigabyte,
betragen kann, mit 9 FFT’s der Ordnung 2t (= zyklische Faltung von Vektoren
der Länge 2t mit 64-bit-Koeffizienten) mit O(t · 2t ) Maschinenwortoperationen
multiplizieren. Dabei ist t = dlog(1 + α + β)e die Inputgrösse der Operanden,
gemessen in 64-bit-Wörtern.
241
Zugehörige Unterlagen
Herunterladen