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