Kapitel 2: Zahlentheoretische Algorithmen Gliederung 1. 2. 3. 4. 5. 2/3, Folie 1 Asymptotische Notationen Zahlentheoretische Algorithmen Sortierverfahren String Matching Ausgewählte Datenstrukturen © 2009 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen Kapitel 2: Zahlentheoretische Algorithmen Gliederung des Abschnitts Algorithmische Fragestellungen ! Fahrplan • • • einfache algorithmische Fragestellung Berechnung von modularen Potenzen der größte gemeinsame Teiler und die Berechnung von modularen Inversen ... das ist das aus Sicht der Vorlesung wichtige Unterkapitel ... wir diskutieren nur solche algorithmische Fragestellungen die im Zusammenhang mit dem Kryptosystem von Rabin eine wichtige Rolle spielen 2/3, Folie 2 © 2009 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen Kapitel 2: Zahlentheoretische Algorithmen Einfache algorithmische Fragestellungen ! Aufgabenstellungen • es seien a und b ganze Zahlen • • • bestimme das Produkt von a und b bestimme den Rest von a bei Teilung durch b bestimme die Binärdarstellung der Zahl b ... uns interessieren Algorithmen zur Lösung dieser Aufgaben und deren Komplexität (/* Anzahl der Elementaroperationen in Abhängigkeit von der Länge der Dezimaldarstellung der gegebenen Zahlen */) 2/3, Folie 3 © 2009 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen Kapitel 2: Zahlentheoretische Algorithmen Einfache algorithmische Fragestellungen ! Bestimmung des Produkts von a und b 7641 * 8512 61128000 3820500 76410 15282 ... wir wissen bereits, daß die Multiplikation von a und b nach der Schulmethode im „worst case“ die Komplexität O(n2) hat, wobei n das Maximum der Länge von a und b ist 61128000 3820500 91692 61128000 3912192 65040192 2/3, Folie 4 © 2009 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen Kapitel 2: Zahlentheoretische Algorithmen Einfache algorithmische Fragestellungen ! Bestimmung des Restes bei Teilung von a durch b ... es wird a gemäß der Schulmethode durch b geteilt (/* den zu zu bestimmenden Rest erhält man quasi nebenbei */) 17915 : 43 ... die Division von a durch b nach der Schulmethode hat dieselbe Komplexität wie die Multiplikation nach der Schulmethode 17 0 179 172 ... das Bestimmen des Rests von a bei Teilung durch b gemäß Schulmethode hat im „worst case“ die Komplexität O(n2) hat, wobei n das Maximum der Länge von a und b ist 71 43 285 258 27 (/* = 17915 mod 43 */) 2/3, Folie 5 © 2009 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen Kapitel 2: Zahlentheoretische Algorithmen Einfache algorithmische Fragestellungen ! Bestimmung der Binärdarstellung einer Zahl a ... es wird a wird sukzessive halbiert, wobei die Stellen nach dem Komma abgeschnitten werden (/* die zu bestimmende Binärdarstellung von a erhält man quasi nebenbei */) 7641 (/* = a /) 3820 1910 955 477 238 119 59 29 14 7 3 1 2/3, Folie 6 ... man benötigt im „worst case“ nicht mehr als 4*n Divisionen durch 2, wobei n die Länge von a ist ... das Bestimmen der Binärdarstellung von a hat im „worst case“ die Komplexität O(n2), wobei n die Länge von a ist bin(a) = 1110111011001 © 2009 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen Kapitel 2: Zahlentheoretische Algorithmen Einordnung ! Zur Erinnerung • bei der Verwendung des Kryptosystems von Rabin hat offenbar der Empfänger der verschlüsselten Nachricht (/* Charly B. */) die mit Abstand komplexeren Berechnungen durchzuführen (/* Lucie muß nur die Zahl k mit k ! m2 mod pq bestimmen, was einfach ist */) ! Entschlüsselung (/* Schritt 1 */) • 2/3, Folie 7 Charly B. bestimmt zunächst natürliche Zahlen mp < p und mq < q mit mp ! k(p+1)/4 mod p und mq ! k(q+1)/4 mod q © 2009 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen Kapitel 2: Zahlentheoretische Algorithmen Bestimmung modularer Potenzen ! Aufgabenstellung • • es seien x, y und z natürliche Zahlen bestimme r = xy mod z • es sei n das Maximum der Länge von x, y und z ... wir wollen r bestimmen und interessieren uns für die „worst case“ Komplexität des verwendeten Algorithmus in Abhängigkeit von n 2/3, Folie 8 © 2009 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen Kapitel 2: Zahlentheoretische Algorithmen Bestimmung modularer Potenzen ! Naive Herangehensweise (/* Beispiel + Analyse */) • es seien x = 7, y = 11 und z = 23 • • berechne r‘ = 7*7*7*7*7*7*7*7*7*7*7 (/* r‘ = 1977326743 */) berechne r mit r = r‘ mod 23 (/* r = 22 */) ... zur Berechnung von r‘ benötigt man 10 Multiplikationen ... wenn y die Länge n hat, dann benötigt man mindestens 10n-1 viele Multiplikationen um r‘ zu bestimmen ... die naive Herangehensweise hat im „worst case“ die Komplexität !(10n) und ist offenbar hoffnungslos langsam 2/3, Folie 9 © 2009 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen Kapitel 2: Zahlentheoretische Algorithmen Bestimmung modularer Potenzen ! Andere Herangehensweise (/* Beispiel */) • es seien x = 7, y = 11 und z = 23 • berechne bin(y) = 1011 • • • • berechne r0 berechne r1 berechne r2 berechne r3 • • setze r‘0 = r0, r‘1 = r1, r‘2 = 1 und r‘3 = r3 berechne r = r‘0*r‘1*r‘2*r‘3 mod 23 (/* r = 2*/) = 7 mod 23 (/* = 71 mod 23; also r0 = 7 */) = r0*r0 mod 23 (/* = 72 mod 23; also r1 = 3 */) = r1*r1 mod 23 (/* = 74 mod 23; also r2 = 9 */) = r2*r2 mod 23 (/* = 78 mod 23; also r3 = 12 */) ... zur Berechnung von r benötigt man 6 Multiplikationen sowie 7 Berechnungen von Resten bei Teilung durch 23 (/* man berechnet r‘‘1 = r‘0*r‘1 mod 23, dann r‘‘2= r‘‘1*r‘2 mod 23 und am Ende r = r‘‘3*r‘4 mod 23 */) 2/3, Folie 10 © 2009 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen Kapitel 2: Zahlentheoretische Algorithmen Bestimmung modularer Potenzen ! Andere Herangehensweise (/* Beispiel, Begründung */) 2/3, Folie 11 • es seien x = 7, y = 11 und z = 23 • da bin(y) = 1011 ist, gilt y = 1+2+8 • also gilt: 711 = 7(1+2+8) = 71*72*78 • also gilt: 711 ! 71*72*78 mod 23 ! (71*72 mod 23) * (78 mod 23) © 2009 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen Kapitel 2: Zahlentheoretische Algorithmen Bestimmung modularer Potenzen ! Andere Herangehensweise (/* allgemeine Vorgehensweise */) • • 2/3, Folie 12 es seien x, y, z natürliche Zahlen es sei n das Maximum der Länge von x, y und z 1. berechne bin(y) = xk,...,x1,x0 2. berechne • r0 = a mod z • r1 = r0*r0 mod z ... • rk = rk-1* rk-1 mod z (/* = a1 mod z */) (/* = a2 mod z */) (/* = a2k mod z */) 3. für i = 0, ...,k setze r‘i = ri, falls xi = 1, und r‘i = 1, sonst 4. berechne r = r‘0*r‘1*...*r‘k mod z (/* schrittweise */) © 2009 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen Methode des fortgesetzten Quadrierens Kapitel 2: Zahlentheoretische Algorithmen Bestimmung modularer Potenzen ! Andere Herangehensweise (/* Analyse */) • • es seien x, y, z natürliche Zahlen es sei n das Maximum der Länge von x, y und z ... Schritt 1 hat im „worst case“ die Komplexität O(n2) ... Schritt 2 hat im „worst case“ die Komplexität O(n3) (/* die Länge der Binärdarstellung von y hat höchstens die Länge 4n */) ... Schritt 3 hat „worst case“ die Komplexität O(n) ... Schritt 4 hat „worst case“ die Komplexität O(n3) ... unter Verwendung der Methode des fortgesetzten Quadrierens erhält man Verfahren zum Bestimmen der modularen Potenzen, die im „worst case“ die Komplexität O(n3) hat 2/3, Folie 13 © 2009 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen Kapitel 2: Zahlentheoretische Algorithmen Einordnung ! Entschlüsselung (/* Schritt 2 */) • • Charly B. bestimmt ganze Zahlen zp und zq mit zpp + zqq = 1 Charly B. bestimmt die natürlichen Zahlen s1,t1 < pq mit s1 ! (zpp*mq + zqq*mp) mod pq und t1 ! (zpp*mq - zqq*mp) mod pq sowie die Zahlen s2 = pq - s1 und t2 = pq - t1 ... die Bestimmung der Zahlen zp und zq müssen wir uns genauer ansehen ... s1, t1, s2 und t2 zu bestimmen, ist wiederum einfach 2/3, Folie 14 © 2009 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen Kapitel 2: Zahlentheoretische Algorithmen Einordnung ! Eine einfache Beobachtung • • es seien p und q Primzahlen es sei zp und zq ganze Zahlen mit zpp + zqq = 1 es gilt offenbar: zpp ! 1 mod q und zqq ! 1 mod p ... zp ist die multiplikative Inverse von p modulo q ... zq ist die multiplikative Inverse von q modulo p ... mit Hilfe einer Erweiterung des Euklidschen Algorithmus zum Bestimmen des größten gemeinsamen Teilers zweier Zahlen p und q kann man die gesuchten multiplikativen Inversen „schnell“ bestimmen 2/3, Folie 15 © 2009 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen Kapitel 2: Zahlentheoretische Algorithmen Vorüberlegung ! Zentraler Begriff: Größter gemeinsamer Teiler • • • es seien a, b und c ganze Zahlen c ist ein gemeinsamer Teiler von a und b, falls c sowohl a als auch b teilt c ist der größte gemeinsame Teiler von a und b, wenn es kein c‘ > c gibt, welches ebenfalls gemeinsamer Teiler von a und b ist ... wir bezeichnen ggT(a,b) den größten gemeinsamen Teiler von a und b ! Einige einfache Eigenschaften • für alle a, b und n gilt: • • 2/3, Folie 16 ggT(a,b) = ggT(b,a) = ggT(a,|b|) ggT(a,0) = ggT(a,n*a) = |a| © 2009 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen Kapitel 2: Zahlentheoretische Algorithmen Vorüberlegung ! Eine wichtige Eigenschaft • es seien a und b ganze Zahlen • Dann gilt: ggT(a,b) = ggT(b,r) mit r = a mod b ... zum Beweis dieser Eigenschaft genügt es zu zeigen, daß für jede Zahl t gilt: t ist gemeinsamer Teiler von a und b ist gdw. t ist gemeinsamer Teiler von b und r Begründung: a = xt, b = yt und r = a mod b xt = cyt + r und damit r = (x - cy)*t b = xt und r = yt 2/3, Folie 17 © 2009 Prof. Steffen Lange - HDa/FbI a = cxt + yt und damit a = (cx + y)*t - Effiziente Algorithmen Kapitel 2: Zahlentheoretische Algorithmen Vorüberlegung ! Der Euklidsche Algorithmus • es seien a und b ganze Zahlen Prozedur Euklid ( a,b ) { if ( b == 0 ) return(a); else { r = a mod b; return(Euklid(b,r)); } } Beispiel: a = 27, b = 33 2/3, Folie 18 © 2009 Prof. Steffen Lange - HDa/FbI - Euklid(27,33) = Euklid(33,27) = Euklid(27,6) = Euklid(6,3) = Euklid(3,0) =3 Effiziente Algorithmen Kapitel 2: Zahlentheoretische Algorithmen Vorüberlegung ! Der Euklidsche Algorithmus (/* Analyse */) • es seien a und b ganze Zahlen mit a > b und n das Maximum der Länge der Zahlen a und b • offenbar hat jede Ausführung des else-Zweigs die Komplexität O(n2) Offene Frage: Wie oft wird die Prozedur Euklid(.,.) aufgerufen? • es seien (a0,b0),(a1,b1), (a2,b2) die Parameter, die bei den ersten drei Aufrufen der Procedure Euklid(.,.) übergeben werden • offenbar gilt: • • • a = a0 > b = b0 = a1 > b1 = a2 > b2 a0 = c0b0 + b1 mit c0 ! 1 und a1 = c1b1 + b2 mit c1 ! 1 also gilt: b0 = a1 = c1b1 + b2 mit c1 ! 1 also gilt b0 ! b1 + b2 > 2b2 2/3, Folie 19 © 2009 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen Kapitel 2: Zahlentheoretische Algorithmen Vorüberlegung ! Der Euklidsche Algorithmus (/* Analyse, cont */) • es seien (a0,b0),(a1,b1), ..., (ak,bk) die Parameter, die bei den Aufrufen der Prozedur Euklid(.,.) übergeben werden • analog (/* zu ersten drei Aufrufen */) kann man ganz allgemein zeigen, daß gilt: b2 > 2b4 und b4 > 2b6 und und b6 > 2b8 ... • folglich halbiert sich bei jedem zweiten Aufruf der Prozedur Euklid(.,.) der Wert des zweiten Übergabeparameters da die Prozedur Euklid(.,.) nur aufgerufen wird, wenn der zweite Übergabeparameter ungleich 0 ist, gibt es höchstens O(log(b)) viele Prozeduraufrufe • ... folglich gibt es nur O(n) viele Prozeduraufrufe (/* es gilt log(b) " 4n */) und demzufolge hat die Prozedur Euklid(.,.) im „worst case“ die Komplexität O(n3) 2/3, Folie 20 © 2009 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen Kapitel 2: Zahlentheoretische Algorithmen Vorüberlegung ! Ein anderer Blick auf den größten gemeinsamen Teiler • es seien a und b ganze Zahlen und es sei n = ggT(a,b) • Dann gilt: ggT(a,b) = min ( { s ! 1 | s " L } ) mit L = { xa+yb | x,y " Z } ... also läßt sich n als Linearkombination von a und b darstellen • es seien s ! 1 das minimal Element in L und x und y so gewählt, daß s = ax + yb gilt Teil 1: man kann zeigen, daß ggT(a,b) auch ein Teiler von s ist ... also gilt ggT(a,b) " s Teil 2: man kann zeigen, daß s sowohl ein Teiler von a als auch von b ist ... also gilt s " ggT(a,b) 2/3, Folie 21 © 2009 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen Kapitel 2: Zahlentheoretische Algorithmen Vorüberlegung ! Der Berlekampsche Algorithmus • es seien a und b ganze Zahlen Prozedur Berlekamp ( a,b ) { if ( b == 0 ) return(a,1,0); else { r = a mod b; (d,x‘,y‘) := Berlekamp(b,r); x = y‘; y = x‘ - (a Div b)*y‘; return((d,x,y)) } } ... offenbar gilt d = ggT(a,b) 2/3, Folie 22 © 2009 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen Kapitel 2: Zahlentheoretische Algorithmen Vorüberlegung ! Der Berlekampsche Algorithmus (/* Beispiel */) • a = 27, b = 33 Berlekamp(27,33) = ( , , ) Berlekamp(33,27) = ( , , ) Berlekamp(27,6) = ( , , ) Berlekamp(6,3) = ( , , ) Berlekamp(3,0) = ( 3,1,0 ) 2/3, Folie 23 © 2009 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen Kapitel 2: Zahlentheoretische Algorithmen Vorüberlegung ! Der Berlekampsche Algorithmus (/* Beispiel, cont */) • a = 27, b = 33 Berlekamp(27,33) = ( 3,5,-4 ) Berlekamp(33,27) = ( 3,-4,5 ) Berlekamp(27,6) = ( 3,1,-4 ) Berlekamp(6,3) = ( 3,0,1 ) Berlekamp(3,0) = ( 3,1,0 ) 2/3, Folie 24 © 2009 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen Kapitel 2: Zahlentheoretische Algorithmen Vorüberlegung ! Der Berlekampsche Algorithmus (/* Analyse */) • es seien a und b ganze Zahlen mit a > b und n das Maximum der Länge der Zahlen a und b ... die Prozedur Berlekamp(.,.) hat offenbar im „worst case“ dieselbe Komplexität wie die Prozedur Euklid(.,.); also ebenfalls O(n3) • die Korrektheit beweist man induktiv ... wenn Berlekamp(a,b) = (d,x,y) gilt , so soll sowohl d = ggT(a,b) als auch x*a + y*b = ggT(a,b) gelten ... das d = ggT(a,b) gilt ist uns schon klar 2/3, Folie 25 © 2009 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen Kapitel 2: Zahlentheoretische Algorithmen Vorüberlegung ! Illustration (/* Korrektheit */) Berlekamp(27,33) = ( 3,5,-4 ) 3 = 5*27 + (-4)*33 Berlekamp(33,27) = ( 3,-4,5 ) 3 = (-4)*33 + 5*27 Berlekamp(27,6) = ( 3,1,-4 ) 3 = 1*27 + (-4)*6 Berlekamp(6,3) = ( 3,0,1 ) Berlekamp(3,0) = ( 3,1,0 ) 3 = 0*6 + 1*3 3 = 1*3 + 0*0 ... wollen unter anderem zeigen, daß klar ist, daß 3 = 1*27 + (-4)*6 gelten muß, wenn bekannt ist, daß 3 = 0*6 + 1*3 gilt 2/3, Folie 26 © 2009 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen Kapitel 2: Zahlentheoretische Algorithmen Vorüberlegung ! Der Berlekampsche Algorithmus (/* Korrektheit */) • es seien (a0,b0),(a1,b1), ..., (ak,bk) die Parameter, die bei den Aufrufen der Prozedur Berlekamp(.,.) übergeben werden • da bk = 0 und Berlekamp(ak,bk) = (ak,1,0) gilt, folgt ak = 1*ak + 0*bk • • es sei Berlekamp(ai+1,bi+1) = (ak,x‘,y‘) und ak = x‘*ai+1 + y‘*bi+1 (/* IV */) außerdem gilt ai+1 = bi und bi+1 = r mit r = ai mod bi • • es sei Berlekamp(ai,bi) = (ak,x,y) mit x = y‘ und y = x‘ - (ai div bi)*y‘ es ist zu zeigen, daß x*ai + y*bi = ak gilt (/* IB */) x*ai + y*bi = = = = = 2/3, Folie 27 © 2009 Prof. Steffen Lange - HDa/FbI y‘*ai + (x‘ - (ai div bi)*y‘)*bi y‘*ai + x‘*bi - (ai div bi)*y‘)*bi x‘*bi + y‘*(ai - (ai div bi)*bi) x‘*bi + y‘*r x‘*ai+1 + y‘*bi+1 = ak - Effiziente Algorithmen Kapitel 2: Zahlentheoretische Algorithmen Bestimmung multiplikativer Inverser ! Einordnung • • es seien p und q Primzahlen es sei zp und zq ganze Zahlen mit zpp + zqq = 1 • um zp und zq (/* die gesuchten multiplikativen Inversen */) zu bestimmen, genügt es die Prozedur Berlekamp(.,.) mit den Parametern a = p und b = q aufzurufen als Ergebnis erhält man ganze Zahlen x und y, so daß xa + by = ggT(a,b) gilt da p und q Primzahlen sind gilt ggT(a,b) = 1 demnach gilt zp = x und zq = y • • • 2/3, Folie 28 © 2009 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen Kapitel 2: Zahlentheoretische Algorithmen Fazit ! Komplexität der Entschlüsselung beim Kryptosystem von Rabin • • die „zentralen“ Schritte (/* Schritt 1 und Schritt 2 */) haben jeweils im „worst case“ die Komplexität O(n3) alle anderen Schritte haben im „worst case“ die Komplexität O(n2) ... also kann Charly B. die verschlüsselte Nachricht in moderater Zeit, d.h. im „worst case“ in Zeit O(n3) entschlüsseln 2/3, Folie 29 © 2009 Prof. Steffen Lange - HDa/FbI - Effiziente Algorithmen