Algorithmische Zahlentheorie und Public Key Kryptographie (Forster) Mitgeschrieben von Bernhard Weiß Mitschrift aus dem SoSe 2009 1 INHALTSVERZEICHNIS I Inhaltsverzeichnis 1 Fibonacci-Zahlen 1.1 Schneller Algorithmus zur Berechnung der Fibonacci Zahlen . . . . . 1 1 2 Der Euklidische Algorithmus 3 Inhaltsverzeichnis 1 1 Fibonacci-Zahlen Definition 1 Die Fibonacci-Zahlen werden rekursiv definiert durch: fib(0) := 0 fib(1) := 1 fib(n + 2) := fib(n + 1) + fib(n) fib(n) 0 1 1 2 3 5 8 13 21 34 n 0 1 2 3 4 5 6 7 8 9 Matrix Schreibweise: fib(n + 1) 1 1 fib(n) = fib(n) 1 0 fib(n − 1) 1 1 A := 1 0 fib(n + 1) n fib(1) =A fib(n) fib(0) fib(n) fib(0) = An wobei fib(−1) = 1 fib(n − 1) fib(−1) fib(1) fib(0) =E fib(0) fib(−1) Satz 1 Es gilt: n fib(n + 1) fib(n) 1 1 n =A = fib(n) fib(n − 1) 1 0 Korollar 2 fn+1 fn−1 − fn2 = (−1)n Insbesondere sind fn+1 , fn teilerfremd. gcd(fn+1 , fn ) = 1 1.1 Schneller Algorithmus zur Berechnung der Fibonacci Zahlen Satz 3 Sei G eine Halbgruppe mit Einselement (multiplikativ geschrieben) Sei nPeine natürliche Zahl mit Binär Darstellung n = di=0 bi 2i , bi ∈ {0, 1}, bd = 1 abgekürzt: n = (bd , . . . b0 )2 Für ein Element x ∈ G kann die Potenz xn mit hächstens 2d Multiplikationen in G Bemerkung 1 Das Naive Ferfahren zur berechnung von xn benötigt n − 1 Multiplikationen. Exponentielle Komplexität in Anzahl von Stellen von n. Das Schnelle Verfahren hat Lineare Komplexität 2 1 FIBONACCI-ZAHLEN Beweis nk := (bd , . . . , bd−k )2 n0 = 1; nd = n Wir berechnen der Reihe nach xni ( 2nk falls bd−k−1 = 0 nk+1 = 2nk + 1 falls bd−k−1 = 1 Sei xi := xni Dann ist(x0 = x falls bd−k−1 = 0 x2k xk+1 = 2 xk · x falls bd−k−1 = 1 Daraus folgt Behauptung. Explizite Formel für die Fibonacci Zahlen Ansatz zur Lösung der Rekursionsgleichung: fn+2 = fn+1 + fn Ansatz: fn = λn ( λ geeignet) ⇔λ2 = λ +q 1 ⇔λ2 − λ − 1 = 0 √ 1 2 1 λ1/2 = 21 ± + 1 = (1 ± 5) 2 2 Jede Linearkombination xn = c1 λn1 +c2 λn2 Ergibt eine Lösung der Rekursiongleichung. Wähle c1 und c2 so dass die Anfangsbedinungen x0 = 0, x1 = 1 erfüllt sind. n n Dann gilt fib(n) √ = c1 λ1 + c2 λ2 ∀n ≥ 0 1 λ1 = 2 (1 + 5) =: g Goldener Schnitt λ2 = − g1 = 1 − g Es ergibt sich: n ) fib(n) = √15 (g n − (−1) gn Es folgt: gn fib(n) = round( √ ) 5 Satz 4 1. fib(2n − 1) = fib(n)2 + fib(n − 1)2 2. fib(2n) = fib(n)2 + 2 fib(n) fib(n − 1) fn+1 fn 1 1 n Beweis = A ,A = fn fn−1 1 0 2n n n Aus A = A A folg f2n+1 f2n fn+1 fn fn+1 fn = f2n f2n−1 fn fn−1 fn fn−1 ⇒f2n = fn fn+1 + fn−1 fn ⇒ fn f (fn + fn−1 )fn−1 fn 2 f2n−1 = fn2 + fn−1 3 2 Der Euklidische Algorithmus Definition 2 Für ganze Zahlen x, y definiert man: x|y∃q ∈ Z : x = qy Bemerkung 2 1. y|0∀y ∈ Z 2. 0|x ⇔ x = 0 3. z|y&y|x ⇒ z|x 4. y|x&x|y ⇔ x = ±y In diesem heißen x, y assoziiert Beweis „⇐„: Trivial „⇒„: Falls x = 0 folgt mit 2., dass y = 0 (y = 0 ⇒ x = 0 analog) Sei also nun x 6= 0 6= y y|x ⇒ x = q2 y x|y ⇒ y = q1 x ⇒x = q2 q1 x q1 ,q2 ∈Z Mit Kürzungssatz: 1 = q2 q1 =⇒ q1 = q2 = ±1 5. y|x1 & y|x2 ⇒ y|(λ1 x1 + λ2 x2 ) ∀λ1 , λ2 ∈ Z 6. y|1 ⇔ y = ±1 7. 1|x∀x ∈ Z Definition 3 (Größter gemeinsamer Teiler) Eine ganze Zahl d heißt größter gemeinsamer Teiler der ganzen Zahlen x, y ⇔ 1. d|x&d|y (gemeinsamer Teiler) 2. ∀d0 gemeinsamer Teiler von x, y ⇒d0 |d Bezeichnung: gcd(x, y) meistens wird er nichtnegative Repräsentatn gewählt. Satz 5 Der größte gemeinsame Teiler zweier ganzer Zahlen ist (im Falle der existenz) bis aufs Vorzeichen Eindeutig bestimmt. Beweis Sind d1 , d2 zwei gcd so folgt aus definition: d1 |d2 &d2 |d1 ⇒d1 = ±d2 4 2 DER EUKLIDISCHE ALGORITHMUS Bemerkung 3 gcd(x, y) = gcd(y, x) gcd(x, 0) = |x| gcd(x, 1) = 1 gcd(x, x) = |x| Definition 4 Für ganze Zahlen x, y bezeichne: T (x, y) die Menge aller gemeinsamer Teiler von x und y Lemma 1 Seien x, y, λ ∈ Z Dann gilt: T (x, y) = T (x − λy, y) Satz 6 Je zwei ganze Zahlen x, y esitzen einen größten gmeinsamen Teiler. Dieser Kann durch den nachfolgenden Algorithmus berechnet werden. Beweis ObdA x 6= 0, y 6= 0, x > 0, y > 0 x0 := x, x1 := y Sukzessive Teilung mit Rest, bis der Rest null wird. x0 = q1 x1 + x2 0 < x2 < x1 x1 = q2 x2 + x3 0 < x3 < x2 .. . xk−2 = qk−1 xk−1 + xk 0 < xk < xk−1 xk−1 = qk xk + 0 Das Verfahren bricht nach endlich vielen Schritten ab. Behauptung: xk ist gcd von x1 und x2 Beweis (der Behauptung) Aus dem Hilfssatz folgt: T (x0 , x1 ) = T (x2 , x1 ) = T (x3 , x2 ) = . . . = T (0, xk ) ⇒Behauptung Bemerkung 4 (zur Komplexität des Eukl. Algor.) Worst case: Bestimmung des gcd zweier aufeinandererfolgender Fibonaccizahlen.: fn+1 = fn + fn−1 fn = fn−1 + fn−2 .. . f2 = f1 + f0 |{z} =0 Inbesondere: gcd(fn+1 , fn ) = 1 Da die Fibonacci-Zahlen exponentiell mit dem Index wachsen, folgt: 5 n = O(log fn ) Also gilt für den Euklidischen Alg.: Für die Anzahl der Schritte k gilt: k = O(log |y|) Die Anzahl der Nötigen Schritte wird durch eine Lineare Funktion der Stellenzahl von min(|x|, |y|) nach oben abgeschätzt. ⇒Lineare Komplexität Satz 7 (Satz von Bézout) Seien x, y ∈ Z und d = gcd(x, y) ⇒∃λ, µ ∈ Z : d = λx + µy Korollar 8 Zwei ganze Zahlen x, y sind genau dann teilerfremd (d.h. gcd(x, y) = 1) ⇔∃λ, µ ∈ Z : 1 = λx + µy Beweis (Satz von Bézout) Mittels Erweiterten Euklidischen Algor. x0 = q 1 x1 + x2 .. . xi−1 = qi xi + xi+1 xi = xi+1 xi+1 + xi+2 .. . Wir zeigen Induktiv, dass sich alle xi als ganzzahlige Linearkombination xi = λi x0 + µi x1 schreiben Lassen. Induktionsanfang: x0 = 1x0 + 0x1 x1 = 0x0 + 1x1 Induktionsschritt: xi−1 = λi−1 x0 + µi−1 x1 xi = λi x0 + µi x1 Aber xi+1 = xi−1 − qi xi (λi+1 , µi+1 ) = (λi−1 , µi−1 ) − qi · (λi , µi )