LDS – Exkurs: Rechnen… Prof. Dr. Wolfram Conen Version 1.2 Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 1 Schauen Sie sich um… Computer und Netzwerke sind überall! Sie ermöglichen ein feingesponnenes Geflecht komplexer menschlicher Aktivitäten: Erziehung, Geschäftsleben, Unterhaltung, Forschung, Produktion, Gesundheitsmanagement, menschliche Kommunikation, selbst Kriegsführung Es gibt zwei wichtige technologische Grundlagen dieser faszinierenden Entwicklung: Die offensichtlichere: die atemberaubende Geschwindigkeit, mit der uns Fortschritte in Mikroelektronik und Chip-Design immer schnellere Hardware bringen Die „verstecktere“ Grundlage: Eine intellektuelle Unternehmung, die einen wesentliche Treibstoff für die fortschreitende Computer-Revolution bietet: Die Suche nach effizienten Algorithmen It‘s a fascinating story. Gather ‚round and listen close. [Sanjoy Dasgupta, Christos Papadimitriou und Umesh Vazirani in „Algorithms“, 1.ed, McGraw-Hill, 2008] Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 2 Schauen Sie sich um… Die Suche nach effizienten Algorithmen … wird Thema in ADS…aber auch in LDS werden wir schon (mathematisch motivierte) Ausflüge dorthin unternehmen…zum Beispiel im folgenden. Wir werden uns mit Zahlen beschäftigen und rechnen lernen … und mit Hilfe von Primzahlen unseren Freunden (ziemlich) sichere Emails senden Und natürlich werden wir das so genau anschauen, dass sie selbst „per Hand“ verschlüsseln können werden! Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 3 Algorithmen mit Zahlen Im folgenden werden zwei sehr alte Probleme eine zentrale Rolle spielen: Faktorisierung: Gegeben sei eine Zahl N, stelle sie dar als Produkt ihrer Primfaktoren Prüfen der Primzahleigenschaft: Gegeben sei eine Zahl N, bestimme, ob sie eine Primzahl ist Faktorisierung ist ein „hartes“ Problem: der schnellste bisher bekannte Algorithmus benötigt einen Zeitaufwand, der exponentiell ist zur Zahl der Bits, die N kodieren. Zum Testen der Primzahleigenschaft existiert hingegen ein effizienter Algorithmus (ausführbar mit einem Zeitaufwand, der sich durch ein Polynom abschätzen läßt) Aber mehr dazu später. Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 4 Algorithmen mit Zahlen Eine elementare Eigenschaft von Dezimalzahlen: Die Summe von drei beliebigen einstelligen Zahlen ist höchsten zweistellig. Prüfen wir das: Die größte einstellige Zahl ist 9 9+9+9 = 27, die Aussage stimmt also offensichtlich Diese Aussage gilt für Zahlen zu jeder Basis b >= 2 Deshalb können wir beim Addieren zweier Zahlen, egal, wie sie repräsentiert sind, diese immer rechtsbündig untereinander schreiben und dann von rechts nach links ziffernweise addieren und einen (immer) EINSTELLIGEN Übertrag (0 ist auch erlaubt) mitführen, der beim nächsten Durchgang hinzu addiert wird (und wieder nur zu einem einstelligen Übertrag beiträgt, s. unsere Aussage oben). Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 5 Algorithmen mit Zahlen Aber was war noch mal eine Basis b? Dezimalzahlen, z.B. 234, lassen sich wie folgt als Summe von Potenzen zur Basis 10 darstellen: 234 = 4*100 + 3*101 + 2*102 Zur Erinnerung: x0 ist immer 1, x1 ist immer x, also gilt auch für x=10: 101 = 10 102 = 10*10 = 100 10y = 10…0 = 1 mit genau y Nullen, y >= 0 Die Zahl, die durch 234 im Dezimalsystem repräsentiert wird, lässt sich aber auch zu anderen Basen darstellen Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 6 Algorithmen mit Zahlen 234 im Dezimalsystem ist… 14*161 + 10*160 = EA im Hexadezimalsystem Basis 16, klar. Dann braucht man aber auch 16 Ziffern… …also nimmt man noch A (für 10), B (11), C(12), D(13), E (14), F (15), hinzu Das Hexadezimalsystem wird ihnen noch oft begegnen, weil die „Wortbreite“ in Computersystemen regelmäßig durch 8 teilbar ist (früher 8 Bit, später 16, dann 32, heute oft 64) – und in 8 Bit genau 256, also 16*16, Werte passen – genauer: die Zahlen von 0 bis 255, oder, Hexadezimal, von 00 bis FF (FF = 15*161 + 15 = 255) Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 7 Algorithmen mit Zahlen 234 im Dezimalsystem ist… 192 + 40 + 2 = 3*82 + 5*81 + 2*80 = 352 im Oktalsystem Basis? Klar, 8 Von Dieben im Mittelalter erfunden, weil denen regelmässig beide Daumen abgehackt wurden (zur Strafe…) Auch praktisch, wenn die Wortbreite nur bei 3 Bit (bzw. 6) liegt Denn dann kann man nur die Werte 0..7 kodieren (bei 6-Bit wird man dann zweistellig 00..77) Und das sind genau die Ziffern im Oktalsystem Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 8 Algorithmen mit Zahlen Was meint denn „Wortbreite“? Rechts ist der Speicher ihres Computers Die einzelnen „Speicherzellen“ lassen sich einzeln adressieren Hier z.B. 0, 1, 2, 3 Und die „Breite“ der Zelle meint die „Wortbreite“ (des Speichers), hier wird die Zahl der „Bits“ gezählt, die in eine Zelle passen Der Prozessor kann intern sogar eine andere Breite haben, als der Speicher 0: 0111001100010011 1: 0111001110010011 2: 0111001100010000 3: 0111001100011111 Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 9 Algorithmen mit Zahlen Und was sind „Bits“? Das sind die „kleinsten“ Informationseinheiten im Rechner, sie sind „an“ oder „aus“, „wahr“ oder „falsch“, 1 oder 0 Mit Bits kann man unsere Zahl 234 auch darstellen – in der sogenannten Binärdarstellung (binär = zweiwertig): 23410 = 111010102 Wie kommt man drauf? 0: 0111001100010011 1: 0111001110010011 2: 0111001100010000 3: 0111001100011111 Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 10 Algorithmen mit Zahlen 234 = 128 + 64 + 32 + 8 + 2 = 1*27 + 1*26 + 1*25 + 0*24 + 1*23 + 0*22 + 1*21 + 0*20 = 11101010 binär Mit 8 Bit kann man also wieviele Zahlen repräsentieren? Genau: Bei jedem Bit kann man sich zwischen 0 und 1 entscheiden, mit einem Bit hat man also 2 Wahlmöglichkeiten… … mit zwei Bits kommen noch mal jeweils zwei Möglichkeiten hinzu, also insgesamt 2*2 = 4, usw. … bei 8 Bit sind es dann: 2*2*2*2*2*2*2*2 = 28 = 256 Wieviel sind es bei 16 Bit? Wieviel bei 32? Wieviel bei 64? 65.536, 4.294.967.296, viele… (ca. 1,844674407371 * 1019) Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 11 Algorithmen mit Zahlen Die Frage nach den Wahlmöglichkeiten als Entscheidungsbaum – aber nur für 3 Bit… Sie müssen drei Fragen mit „Ja“ oder „Nein“ beantworten, wieviele mögliche Kombinationen von Antworten gibt es? Erste Frage: Sind sie reich? Ja (=1) Nein (=0) Innere Knoten Zweite: Sind sie schlau? 1 0 0 1 Blätter Dritte: Sind sie schön? 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 1 1 0 0 1 0 1 0 0 1 0 0 1 0 0 0 Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 8 = 23 12 Algorithmen mit Zahlen Auf der ersten Ebene (engl. Level) sind 20 Knoten, auf der zweiten doppelt so viele, also 21, auf der dritten wieder doppelt so viele, also 22, und auf der vierten Ebene 23 ... auf der n-ten Ebene sind also 2n-1 Knoten. Das gilt IMMER für vollständige Binärbäume (vollständig meint: jede Ebene ist vollständig besetzt). Vorsicht übrigens: oft spricht man auch von einer „Tiefe“ oder „Höhe“ eines Baumes, und die zählt man meist ab 0 (unser Baum hätte dann die Tiefe 3 gehabt) und der oberste Knoten, die sogenannte Wurzel, wäre auf Tiefe 0 gewesen. Wieviele Knoten hat ein vollständiger Binärbaum insgesamt? Anzahl Knoten = Anzahl innere Knoten + Anzahl Blätter = (1 + 2 + 4) + 8 = (23 – 1) + 23 = 24 – 1 = 16 – 1 = 15 Allgemein für vollständige Binärbäume mit Höhe h also: 2h+1 - 1 Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 13 Algorithmen mit Zahlen Wie findet man die binäre Darstellung einer Dezimalzahl? Nehmen wir das Beispiel 234. Was suchen wir? Wir suchen eine Darstellung der Zahl 234 als SUMME VON ZWEIERPOTENZEN Formal: wir suchen nach Zahlen x0, x1, x2, ... mit 234 = x0* 20 + x1* 21 + x2* 22 + ... unter den Nebenbedingungen: xi aus {0,1} Erste Beobachtung: es gibt eine „kleinste“ Zweierpotenz 2k, für die gilt 2k <= 234 < 2k+1 Hier ist das für 27 = 128 (denn 128 = 27 <= 234 < 28 = 256) Ab k sind also alle weiteren Koeffizienten xk+1, xk+2, ... gleich 0 zu setzen. Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 14 Algorithmen mit Zahlen Wie findet man die binäre Darstellung einer Dezimalzahl? Wir haben jetzt also einen Koeffizienten gefunden, nämlich x7 = 1, denn 128 ist EINMAL in 234 enthalten. Damit können wir unsere Suche eingrenzen: wir suchen nach Zahlen x0, x1, x2, x3, x4, x5, x6 mit 234 = x0* 20 + x1* 21 + x2* 22 + x3* 23 + x4* 24 + x5* 25 + x6* 26 + 1 * 27 unter den Nebenbedingungen: xi aus {0,1} Jetzt wenden wir unsere erste Beobachtung auf 234 – 27= 234 – 128 = 106 an: es gilt 64 = 26 <= 106 < 27 = 128, also ist x6 = 1. Ebenso ist dann x5 = 1, denn 32 = 25 <= 106 – 64 (= 42) < 64 = 26 x4 ist hingegen 0 (denn 24 = 16 > 10), aber x3 = 1 (mit 23 <= 10 < 24) x2 ist wieder 0 (denn 22 = 4 > 2), x1= 1 (mit 21 = 2), und x0 dann wieder 0. Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 15 Algorithmen mit Zahlen Wie findet man die binäre Darstellung einer Dezimalzahl? Insgesamt ergibt sich also 234 = 0 * 20 + 1 * 21 + 0* 22 + 1 * 23 + 0* 24 + 1* 25 + 1* 26 + 1 * 27 = 2 + 8 + 32 + 64 + 128 = 128 + 64 + 32 + 8 + 2 = 27 + 26 + 25 + 23 + 21 234 ist in Binärdarstellung also 11101010, das entspricht den Koeffizienten x7 x6 x5 x4 x3 x2 x1 x0 (Achtung, wir betrachten nur positive Zahlen!) Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 16 Algorithmen mit Zahlen Wie findet man die binäre Darstellung einer Dezimalzahl? Etwas sehr Ähnliches als Algorithmus („Holzhammer-Methode“): INPUT: Gegeben eine natürliche Zahl n ein Dezimaldarstellung OUTPUT: Die Zahl n in Binärdarstellung 1. Suche die „kleinste“ Zweierpotenz 2k, für die gilt 2k <= n < 2k+1 2. Halte dieses k fest. Merke dir: xk = 1. Setze n‘ = n - 2k 3. Laufe von i = k-1 bis i = 0. 1. Prüfe, ob n‘ < 2i. Falls JA, setze xi = 0, sonst setze xi = 1 und n‘ = n‘-2i 4. Gib xk xk-1 xk-2 ... x0 aus. Für 234 würden wir also zuerst 2i und damit k=7 finden und dann alle kleineren Zweierpotenzen „von groß nach klein“ prüfen, ob sie im Rest enthalten sind (und gegebenenfalls den Rest verkleinern) Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 17 Einige Zweierpotenzen Wenden Sie den Algo bitte für 888 an (Hinweis: idealerweise können sie die folgende Tabelle auswendig) 20 21 22 23 24 25 26 27 1 2 4 8 16 32 64 128 28 29 210 211 212 213 214 215 256 512 1024 2048 4096 8192 16384 32768 216 217 218 219 220 221 222 223 65536 131072 262144 524288 1048576 2097152 4194304 8388608 Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 18 Algorithmen mit Zahlen Eingabe: n = 888 Schritt 1: 2k = 29 = 512 Schritt 2: k = 9, x9 = 1, n‘ = 888 – 512 = 376 Schritt 3 (Schleife), siehe rechts: Schritt 4, Ausgabe: 1101111000 i 2i xi n‘ neu 8 256 1 120 7 128 0 - 6 64 1 56 5 32 1 24 4 16 1 8 3 8 1 0 2 4 0 - 1 2 0 - 0 1 0 - Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 19 Algorithmen mit Zahlen Im Algorithmus fand sich die folgende Zeile: 1. Suche die „kleinste“ Zweierpotenz 2k, für die gilt 2k <= n < 2k+1 Das könnte man auch in der Schleife wiederholt ausführen (für neue n‘) – und die xi zwischen den gefundenen ks 0 setzen. Dann hätte man eine Variante des Algorithmus, die genauer unserer ursprünglichen Beschreibung entspricht (aber etwas komplizierter aufzuschreiben wäre) Uns interessiert aber jetzt: wie finden wir den diese Zweierpotenz? z.B. durch SUCHE (dazu werden wir noch einiges hören) ...oder durch Anwenden des Zweierlogarithmus: log2 x ist die Zahl mit der man 2 potenzieren muss, um x zu erhalten. Wenn wir von dieser Zahl die Nachkommastellen abschneiden, haben wir unser k. Beispiel: log2 888 = 9,7944158663501, Nachkomma abschneiden: 9 Aber: auch das muss man erstmal berechnen!! Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 20 Algorithmen mit Zahlen Eine weitere Option ist es, die Zahl fortgesetzt durch 2 zu teilen, bis man die größte Zweierpotenz gefunden hat und so das k zu bestimmen. Machen wir das einmal für 234: 234 / 2 = 117 117 / 2 = 58 Rest 1 58 / 2 = 29 29 / 2 = 14 Rest 1 14 / 2 = 7 7 / 2 = 3 Rest 1 3 / 2 = 1 Rest 1 1 / 2 = 0 Rest 1 Wir können also 234 7mal erfolgreich durch 2 teilen und behalten ab und an einen Rest zurück – d.h. 27 ist in 234 enthalten, aber nicht 28. Und weiter? Jetzt könnten wir 27 von 234 abziehen und wieder fortgesetzt durch 2 teilen…usw., wie im (modifizierten) Algorithmus vorgeschlagen. Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 21 Algorithmen mit Zahlen Aber ... das ist gar nicht nötig, denn wir haben einen weiteren Algorithmus „entdeckt“, mit dem wir die Binärrepräsentation bestimmen können. 234 / 2 = 117 117 / 2 = 58 Rest 1 58 / 2 = 29 29 / 2 = 14 Rest 1 234 lässt sich glatt durch 2 teilen, also ist 20 = 1 nicht als Faktor in der Binärrepräsentation von 234 enthalten. 21 = 2 ist 117mal in 234 enthalten. 117 lässt sich nicht glatt durch 2 teilen (also lässt sich 234 nicht glatt durch 4 teilen), also ist 21 = 2 als Faktor enthalten. 58 lässt sich glatt durch 2 teilen (also lässt sich 232 glatt durch 8 teilen), also ist 22 nicht als Faktor enthalten. 29 lässt sich nicht glatt durch 2 teilen (also lässt sich 232 nicht glatt durch 16 teilen), also ist 23 = 8 als Faktor enthalten. s. nächste Folie Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 22 Algorithmen mit Zahlen 14 / 2 = 7 14 lässt sich glatt durch 2 teilen (also lässt sich 224 glatt durch 32 teilen), also ist 24 = 16 nicht enthalten. 7 / 2 = 3 Rest 17 lässt sich nicht glatt teilen (also lässt sich 224 nicht glatt durch 64 teilen), also ist 25 = 32 enthalten. 3 / 2 = 1 Rest 13 lässt sich nicht glatt teilen (also lässt sich 192 nicht glatt duch 128 teilen), also ist 26 = 64 enthalten. 1 / 2 = 0 Rest 11 lässt sich nicht glatt teilen (also lässt sich 128 nicht glatt durch 256 teilen), also ist 27 = 128 enthalten. Fertig! Wir haben die Repräsentation gefunden: 11101010 das sind genau die Reste, die wir beim Teilen durch 2 gefunden haben, der oberste Rest steht ganz rechts usw. Auch das ergibt wieder einen Algorithmus (ohne Suche und Logarithmen, nur elementares Teilen durch 2!). Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 23 Algorithmen mit Zahlen Hier noch eine Erklärung für den Algorithmus des fortgesetzten Teilens, den wir gerade kennengelernt haben. Wenn wir 11101010 fortgesetzt jeweils eine Stelle nach rechts schieben (shiften) würden, würden rechts genau die Reste herausfallen, die wir gerade bestimmt hatten (auch in der gleichen Reihenfolge). Das ist aber auch keine Überraschung: Das Anhängen einer 0 an eine Binärzahl (Links-Shift) entspricht dem Multiplizieren mit 2, das Shiften nach rechts entspricht dem Teilen durch 2 (und die herausfallende Zahl bringt den Rest) – eben das, was wir gerade gemacht haben. Noch ein kleiner Hinweis: in fast allen Programmiersprachen gibt es die Shiftoperation, die man dort auch auf ganze Zahlen anwenden kann, z.B. auf 234. So kann man auch die Binärrepräsentation von 234 erzeugen (kleines Problem: wann Aufhören mit dem Shiften? Wortbreite! Und wie die gleich herausfallende Stelle herausfinden – oft wird nur das Shiftergebnis zurückgeliefert, nicht die herausgeschobene Stelle? Prüfen, ob rechtes Bit gesetzt ist, z.B. durch Ver-Unden mit einer 1) Der Rechner teilt übrigens nicht durch 2, sondern shiftet einfach die interne Binärrepräsentation der Zahl, die er ja ohnehin „vorhält“. Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 24 Algorithmen mit Zahlen Addition, s. oben: Deshalb können wir beim Addieren zweier Zahlen, egal, wie sie repräsentiert sind, diese immer rechtsbündig untereinander schreiben und dann von rechts nach links ziffernweise addieren und einen (immer) EINSTELLIGEN Übertrag (0 ist auch erlaubt) mitführen, der beim nächsten Durchgang hinzu addiert wird… 10101010 + 11010111 Ü 1111111- ---------------------= 110000001 0 0 0 0 1 1 1 1 (Additionsregeln) 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 -------------------------------00 01 01 10 01 10 10 11 Die 8 binären Rechenregeln für Addition. Die erste Stelle wird in die Übertragszeile eingetragen, die zweite in die Ergebniszeile. Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 25 Multiplikation 1 1 0 1 (=13 dezimal) * 1 0 1 1 (=11 dezimal) ---------------------1101 (1101 mal 1, kein Shift) 1101 (1101 mal 1, 1 Links-Shift) 0000 (1101 mal 0, 2 Links-Shift) 1101 (1101 mal 1, 3 Links-Shift) ---------------------1 0 0 0 1 1 1 1 (=143 dezimal) Ungefähre Kosten: Wenn beide Zahlen n Bits lang sind, dann entstehen n Zwischenreihen mit einer Länge bis zu 2n Bits. Wenn wir jetzt zwei Zeilen addieren und dann das Zwischenergebnis zur nächsten Zeile addieren, dann haben wir „ungefähr“ n-1 mal O(n) Bits zu addieren, in Summe O(n2). Zum O-Kalkül: siehe 2. Semester, theoretische Informatik / ADS. Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 26 Multiplikation einmal anders Eine Methode, die bereits Al Kwarizmi (der Namensgeber für den Begriff „Algorithmus“) im 9. Jahrhundert nach Christi kannte und in einem Buch veröffentlichte: Um zwei Dezimalzahlen x und y zu multiplizieren, schreibe sie zunächst direkt nebeneinander. Wiederhole dann das folgende: Teile die erste Zahl durch 2, runde das Ergebnis ab (abschneiden der Nachkommastelle ,5) und verdopple die zweite Zahl fortlaufend. Tue dies, bis die erste Zahl zur 1 wurde. Streiche dann alle Zeilen, in denen die erste Zahl gerade (=even) war und addiere die übrigen Zeilen auf. Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 11 * 13 5 26 2 52 1 104 ---------143 27 Multiplikation einmal anders 1011 * 1101 = 11 * 13 | 1 5 26 | 1 2 52 | 0 1 104 | 1 ------------143 1101 1101 0000 1101 ---------------------10001111 (=13) (=26) (=104) (=143) Hier simulieren wir also die „normale“ Multiplikation, allerdings, ohne die Binärrepräsentation der 11 zu kennen (die erzeugen wir aber nebenbei „von rechts nach links“) Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 28 Multiplikation einmal anders y x 11 * 13 5 26 2 52 1 104 ---------143 Multiplikationsregel für zwei ganze Zahlen x und y, y >=0: 2(x * xy/2y), falls y gerade x*y = {x + 2(x * xy/2y), falls y ungerade 0 , falls y = 0 Hier schneidet xy/2y die Nachkommastelle von y/2 ab Man nennt das die floor-Funktion; ceiling gibt es auch, es rundet nach oben auf die nächstgrößere ganze Zahl auf, allerdings nicht, wenn die Ausgangszahl schon ganzzahlig ist. Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 29 Multiplikation als Pseudo-Code function multiply(x,y) Input: Zwei ganze n-Bit Zahlen x,y mit y >= 0 Output: Das Produkt der Eingabezahlen if y=0: return 0 z = multiply(x, xy/2y) if y is even (gerade): return 2z else: return x + 2z Beispielausführung s. Übung Aufwand ist übrigens wieder O(n2) Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 30 Division Was bedeutet es, eine nicht-negative ganze Zahl x durch eine positive ganze Zahl y, y 0, zu dividieren? Gesucht ist ein Quotient q und ein Rest r, so dass: x = y*q + r Nebenbedingung: 0 <= r < y Beispiel: 17 / 5 = 2*5 + 7? Falsch: r > y 17 / 5 = 3*5 + 2? Korrekt. Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 31 Division als Pseudo-Code function divide(x,y) Input: Zwei ganze n-Bit Zahlen x,y mit y >= 1 Output: Quotient q und Rest r von x / y if x=0: return (q,r) = (0,0) (q,r) = divide(xx/2y,y) q = 2*q, r = 2*r if x is odd (ungerade): r = r + 1 if r >= y: r = r-y, q = q+1 return (q,r) Aufwand ist übrigens wieder O(n2) Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 32 Modulare Arithmetik Wenn man wiederholt addiert oder multipliziert, können große Zahlen entstehen - manchmal umgeht man das, in dem man die Zahl auf 0 zurücksetzt: Beim Zählen der Stunden setzen wir 24 und 0 gleich und beginnen erneut usw. Wir definieren: x modulo N sei der Rest, der bleibt, wenn x durch N geteilt wird, d.h. falls x = q*N+r mit 0<=r<N, dann gilt: x modulo N = r Mit Bezug zu modulo N kann man jetzt sagen: zwei Zahlen x,y sind äquivalent, wenn sie den gleichen Rest beim Teilen durch N erzeugen, also wenn x modulo N = y modulo N, oder, gleichwertig: N teilt (x-y) glatt, also ohne Rest Genau dann schreiben wir auch: x ´ y (mod N) Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 33 Modulare Arithmetik Beispiel: 253 ´ 13 (mod 60), denn 253 = 4*60 + 13, also Rest 13 13 = 0*60 + 13, wieder Rest 13 also 253 mod 60 = 13 mod 60 Oder anders: 253 – 13 = 240, 240 = 4*6 + 0, also läßt sich (253-13) glatt durch 60 teilen. Das gilt natürlich auch für (13-253) = -240 Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 34 Modulare Arithmetik Modulare Arithmetik (z.B. modulo N) limitiert den Wertebereich für die Ergebnisse der arithmetischen Operation, im Beispiel auf [0,..,N-1]. Sobald man an die Grenzen stößt, beginnt man wieder auf der anderen Seite. Man kann aber auch sagen, dass modulare Arithmetik mit allen ganzen Zahlen umgeht, diese allerdings in N sogenannte Äquivalenzklassen unterteilt. Für jede Klasse gilt: {i + kN: k 2 Z} mit 0 <= i < N. Wenn N=3 gilt (also wir „modulo 3“ rechnen), dann gibt es 3 Äquivalenzklassen … -9 -6 -3 0 3 6 9 … (Rest 0) … -8 -5 -2 1 4 7 10 … (Rest 1) … -7 -4 -1 2 5 8 11 … (Rest 2) Für jedes Zahlenpaar x,x‘ in einer der Klassen gilt: x ´ x‘ (mod N) Aus Sicht der „modulo N“-Operation sind die Zahlen x und x‘ nicht unterscheidbar. Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 35 Modulare Arithmetik Man kann immer noch rechnen (Ersetzungsregel) Falls x ´ x‘ (mod N) und y ´ y‘ (mod N), dann x + y ´ x‘ + y‘ (mod N) x * y ´ x‘ * y‘ (mod N) Praktische Anwendung: sie wollen alle Folgen einer Staffel ihrer Lieblingsserie direkt hintereinander schauen (z.B. House), und sie wollen um Mitternacht damit beginnen. Um wieviel Uhr sind sie fertig? (den Tag ignorieren wir mal ;) Es gibt 25 Episoden, jede dauert 3 Stunden (oops), also sind sie um (25 * 3) mod 24 Uhr fertig. Nun ist 25 ´ 1 (mod 24), also gilt mit der Regel oben 1 * 3 = 3 mod 24, also um 3 Uhr am morgen. mit 25 *3 = 75 = 3*24 + 3 wären sie natürlich zum gleichen Ergebnis gekommen – sie mußten aber nie die vergleichsweise großen Zahlen 75 und 72 bestimmen. Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 36 Modulare Arithmetik Die üblichen Gesetze gelten auch „modulo“: x + (y + z) ´ (x + y) + z (mod N) x * y ´ y * x (mod N) x (y + z) ´ x * y + x * z (mod N) Die erste ist die Assoziativitätsregel, die zweite die Kommutativitätsregel, die dritte die Distributivitätsregel. Gemeinsam mit der Ersetzungsregel von der letzten Folie ermöglicht das, dass jedes Zwischenresultat bei „modulo“-Rechungen durch die Restbildung (also eine „modulo“-Operation) vereinfacht werden kann. Das werden wir noch nutzen (auch in der Klausur!) Rechnen sie bitte: (278 * 35 * 17 * 78) modulo 13 Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 37 Asymmetrische Verschlüsselung Wir brauchen SCHLÜSSELPAARE, z.B. s und s‘ s‘ kann entschlüsseln, was s verschlüsselt … … und umgekehrt. Wie geht so etwas? Nehmen wir einen sehr einfachen Schlüssel, um das Alphabet A,..,Z zu verschlüsseln: Jedem Buchstaben ist eine Zahl zwischen 0 und 25 zugeordnet, wir nehmen eine sehr einfache Zuordnung: A/0, B/1, C/2, D/3, E/4, …, Z/25 Unsere Schlüssel s und s‘ rechnen auf dieser Repräsentation als Zahl: s(x) = (x + 3) modulo 26 s‘(x) = (x – 3) modulo 26 Test: F ! 5: s(5) = 8, s‘(8) = 5 Z ! 25: s(25) = 2, s‘(2) = 25 Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 38 Asymmetrische Verschlüsselung Die Schlüssel: s(x) = (x + 3) modulo 26 s‘(x) = (x – 3) modulo 26 s(GELSENKIRCHEN) = JHOVHQNLUFKHQ s‘(JHOVHQNLUFKHQ) = GELSENKIRCHEN s‘(GELSENKIRCHEN) = DBIPBKHFOZEBK s(DBIPBKHFOZEBK) = GELSENKIRCHEN Verschlüsseln sie: INFORMATIK mit s und s‘ X Y Z|A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z|A B C Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 39 Asymmetrische Verschlüsselung Die Idee ist klar: Was der eine Schlüssel tut, nimmt der andere zurück… Er „invertiert“ jeweils, was der andere Schlüssel tat Wir suchen also ein Paar aus Operation und hierzu inverser Operation … und natürlich können die nicht so einfach sein, wie unser Schlüsselpaar gerade Es wird noch ein wenig anderes funktionieren: Wir legen Operationen fest und suchen nach Zahlen (nach 3, um genau zu sein), die dann in den Operationen verwendet werden und deren Effekte sich jeweils invers zu einander verhalten Genau das haben wir eben auch gemacht: Die Operation war Addition. s addierte 3 und s‘ das Inverse von 3 bzgl. der Addition, also -3. Genauso gut hätten wir multiplizieren können (z.B. mit 5 und 1/5, allerdings dann ohne etwa abzuschneiden ;) Wir werden zwei Zahlen nutzen, die beim Potenzieren unter modulo bezüglich einer dritten Zahl die Eigenschaft haben, invers zueinander zu sein. Prof. Dr. W. Conen, FH Gelsenkirchen, Version 1.2 40