Algorithmen I Prof. Jörn Müller-Quade 26.04.2017 Institut für theoretische Informatik Web: https://crypto.iti.kit.edu/index.php?id=799 (Folien von Peter Sanders) KIT Institut für Theoretische Informatik 1 Organisatorisches: Tutorien I wöchentlich, ab nächster Woche Einteilung mittels Webinscribe https://webinscribe.ira.uka.de/ I WebInscribe seit gestern freigeschaltet I WebInscribe wird am 27.04, 18 Uhr geschlossen I Bitte tragen Sie sich unbedingt bis dahin ein! I WebInscribe teilt Sie so ein, dass Sie keine Terminkonikte haben! I Erinnerung: Übungsblattabgabe zu Zweit möglich I I Partner müssen im gleichen Tutorium sein Tragen Sie sich bitte mit ihrem/r Partner/in als Lerngruppe im WebInscribe ein! KIT Institut für Theoretische Informatik 2 Organisatorisches: 1. Mai & Mailingliste I Der 1. Mai (Montag) ist ein Feiertag I Tutorien an diesem Tag fallen daher aus I Bitte besuchen Sie in dieser Woche ein anderes Tutorium I Hinweis: Mailingliste auf der Website. Melden Sie sich bitte an! I Website: https://crypto.iti.kit.edu/index.php?id=799 KIT Institut für Theoretische Informatik 3 Erinnerung VL 24.04.2017 I Amuse Geule: Langzahlmultiplikation I I Gegeben: Langzahlen a, b (jeweils aus n Ziern bestehend) Gesucht: Produkt p = a · b (bis zu 2n Ziern) I Basisoperationen: Ziernaddition (mit Übertrag), Ziernmult. I Erster Schritt: Langzahladdition mit I Multiplikation Langzahl mit Zier: I Schulmultiplikation: O n2 I Rekursive Multiplikation: n n Ziernadditionen Ziernmult., n Ziernadd. Ziernoperationen O n2 Ziernoperationen KIT Institut für Theoretische Informatik 4 Karatsuba-Ofman Multiplikation[1962] Beobachtung: (a1 + a0 )(b1 + b0 ) = a1 b1 + a0 b0 + a1 b0 + a0 b1 Function recMult(a, b) assert a und b haben n Ziern, if n = 1 then return a · b sei k = dn/2e a1 · B k + a0 k Schreibe als b1 · B + b0 c11 := recMult(a1 , b1 ) c00 := recMult(a0 , b0 ) Schreibe a b als return c11 · B 2k + (recMult((a1 + a0 ), (b1 + b0 )) − c11 − c00 )B k +c00 KIT Institut für Theoretische Informatik 5 Zurück zur Langzahlmultiplikation I Zierngröÿe ↔ Hardware-Fähigkeiten z. B. 64 Bit I Schulmultiplikation für kleine Eingaben I Assembler, SIMD,. . . 0.4 Karatsuba, n = 2048 Karatsuba, n = 4096 0.3 0.2 0.1 4 8 16 32 64 128 256 512 1024 recursion threshold KIT Institut für Theoretische Informatik 6 Skalierung school method Karatsuba4 Karatsuba32 10 1 I Asymptotik setzt sich durch Implementierungsdetail 0.1 time [sec] I Konstante Faktoren oft 0.01 0.001 0.0001 1e-05 24 26 28 210 212 214 n KIT Institut für Theoretische Informatik 7 Blick über den Tellerrand I Bessere Potenzen durch Aufspalten in mehr Teile I Schnelle Fourier Transformation O(n) Multiplikationen von O(log n)-Bit Zahlen I [Schönhage-Strassen 1971]: Bitkomplexität O(n log n log log n) ∗ I [Fürer 2007]: Bitkomplexität 2O(log n) n log n I Praxis: Karatsuba-Multiplikation ist nützlich für Zahlenlängen aus der Kryptographie I GnuPG, OpenSSL verwenden Karatsuba (ab best. Bitlänge) ( Iterierter Logarithmus: log ∗ n= 0 falls ∗ 1 + log log n n≤1 sonst KIT Institut für Theoretische Informatik 8 (Asymptotische) Algorithmenanalyse Gegeben: Ein Programm Gesucht: Laufzeit T (I ) (# Takte), eigentlich für alle Eingaben I (!) (oder auch Speicherverbrauch, Energieverbrauch,. . . ) Erste Vereinfachung: Worst case: T (n) = max|I |=n T (I ) (Später mehr: average case, best case, die Rolle des Zufalls, mehr Parameter) T(n) Instanzen mit |I|=n KIT Institut für Theoretische Informatik 9 Zweite Vereinfachung: Asymptotik O(f (n)) = {g (n) : ∃c > 0 : ∃n0 ∈ N+ : ∀n ≥ n0 : g (n)≤c · f (n)} höchstens Ω (f (n)) = {g (n) : ∃c > 0 : ∃n0 ∈ N+ : ∀n ≥ n0 : g (n)≥c · f (n)} mindestens Θ(f (n)) = O(f (n)) ∩ Ω (f (n)) genau o(f (n)) = {g (n) : ∀c > 0 : ∃n0 ∈ N+ : ∀n ≥ n0 : g (n)≤c · f (n)} weniger ω(f (n)) = {g (n) : ∀c > 0 : ∃n0 ∈ N+ : ∀n ≥ n0 : g (n)≥c · f (n)} mehr KIT Institut für Theoretische Informatik 10 O-Kalkül Rechenregeln Schludrigkeit: implizite Mengenklammern. Lese `f (n) = E ' als `{f (n)} ⊆ E ' cf (n) ∈ Θ(f (n)) für jede positive Konstante c k ∑ ai ni ∈ O(nk ) i=0 f (n) + g (n) ∈ Ω (f (n)) , f (n) + g (n) ∈ O(f (n)) falls g (n) = O(f (n)) , O(f (n)) · O(g (n)) = O(f (n) · g (n)) . u. s. w. KIT Institut für Theoretische Informatik 11 Maschinenmodell: RAM (Random Access Machine) S 1 2 Program Control R 1 2 load ... ... store <>= +−*/&v~ k Θ (log Space) Moderne (RISC) Adaption des von Neumann-Modells [von Neumann 1945] KIT Institut für Theoretische Informatik 12 Register S 1 2 Program Control R 1 2 load ... ... store <>= +−*/&v~ k Θ (log Space) k (irgendeine Konstante) R1 ,. . . ,Rk für Speicher (kleine) ganze Zahlen KIT Institut für Theoretische Informatik 13 Hauptspeicher S 1 2 Program Control R 1 2 load ... ... store <>= +−*/&v~ k Θ (log Space) Unbegrenzter Vorrat an Speicherzellen S[1], S[2]. . . für (kleine) ganze Zahlen KIT Institut für Theoretische Informatik 14 Speicherzugri S 1 2 Program Control R 1 2 load ... ... store <>= +−*/&v~ k Θ (log Speicher) Ri := S[Rj ] lädt Inhalt von Speicherzelle S[Rj ]:= Ri speichert Register Ri S[Rj ] in Register in Speicherzelle Ri . S[Rj ]. KIT Institut für Theoretische Informatik 15 Rechnen S 1 2 Program Control R 1 2 load ... ... store <>= +−*/&v~ k Θ (log Space) Ri := Rj R` Registerarithmetik. `' ist Platzhalter für eine Vielzahl von Operationen Arithmetik, Vergleich, Logik KIT Institut für Theoretische Informatik 16 Bedingte Sprünge S 1 2 Program Control R 1 2 load ... ... store <>= +−*/&v~ k Θ (log Space) JZ j, Ri Setze Programmausführung an Stelle j fort falls Ri = 0 KIT Institut für Theoretische Informatik 17 Kleine ganze Zahlen? Alternativen: Konstant viele Bits (64?): theoretisch unbefriedigend, weil nur endlich viel Speicher adressierbar endlicher Automat Beliebige Genauigkeit: viel zu optimistisch für vernünftige Komplexitätstheorie. Beispiel: zu einer Zahl mit ≈ 2n n-maliges Quadrieren führt Bits. OK für Berechenbarkeit Genug um alle benutzten Speicherstellen zu adressieren: bester Kompromiss. KIT Institut für Theoretische Informatik 18 Algorithmenanalyse im RAM-Modell Zeit: Ausgeführte Befehle zählen, d. h. Annahme 1 Takt pro Befehl. Nur durch späteres O(·) gerechtfertigt! Ignoriert Cache, Pipeline, Parallelismus. . . Platz: Etwas unklar: I letzte belegte Speicherzelle? I Anzahl benutzter Speicherzellen? I Abhängigkeit von Speicherverwaltungsalgorithmen? Hier: Es kommt eigentlich nie drauf an. KIT Institut für Theoretische Informatik 19 Mehr Maschinenmodell Cache: schneller Zwischenspeicher I begrenzte Gröÿe kürzlich/häug zugegriene Daten sind eher im Cache I blockweiser Zugri Zugri auf konsekutive Speicherbereiche sind schnell Parallelverarbeitung: Mehrere Prozessoren unabhängige Aufgaben identizieren ··· mehr in TI, Algorithmen II, Programmierparadigmen,. . . KIT Institut für Theoretische Informatik 20 Mehr Maschinenmodell S 1 2 Caches Program Control R 1 2 ... k ... Netzwerk KIT Institut für Theoretische Informatik 21 Pseudocode just in time Beispiel: Class Complex(x, y Number Number r := x i:= y : Number) of Number √ Function abs : Number return r 2 + i 2 Function add(c 0 : Complex) : Complex return Complex(r + c 0 .r , i + c 0 .i) KIT Institut für Theoretische Informatik 22 Design by Contract / Schleifeninvarianten assert: Aussage über Zustand der Programmausführung Vorbedingung: Bedingung für korrektes Funktionieren einer Prozedur Nachbedingung: Leistungsgarantie einer Prozedur, falls Vorbedingung erfüllt Invariante: Aussage, die an vielen Stellen im Programm gilt Schleifeninvariante: gilt vor / nach jeder Ausführung des Schleifenkörpers Datenstrukturinvariante: gilt vor / nach jedem Aufruf einer Operation auf abstraktem Datentyp Hier: Invarianten als zentrales Werkzeug für Algorithmenentwurf und Korrektheitsbeweis. KIT Institut für Theoretische Informatik 23 Beispiel (Ein anderes als im Buch) Function power(a : R; n0 : N) : R p =a : R; r =1 : R; n=n0 : N while n > 0 do if n is odd then n−− ; r := r · p else (n, p):= (n/2, p · p) return r KIT Institut für Theoretische Informatik 24 Beispiel (Ein anderes als im Buch) Function power(a : R; n0 : N) : R assert n0 ≥ 0 and ¬(a = 0 ∧ n0 = 0) // Vorbedingung // p n r = an0 p =a : R; r =1 : R; n=n0 : N while n > 0 do invariant p n r = an0 // Schleifeninvariante (*) if n is odd then n−− ; r := r · p else (n, p):= (n/2, p · p) assert r = an0 // (*)∧n = 0 −→Nachbedingung return r KIT Institut für Theoretische Informatik 25 Rechenbeispiel: 2 5 p =a = 2 : R; r =1 : R; n=n0 = 5 : N while n > 0 do if n is odd then n−− ; r := r · p else (n, p):= (n/2, p · p) Iteration p r n pn r 0 2 1 5 32 1 2 2 4 32 2 4 2 2 32 3 16 2 1 32 4 16 32 0 32 // 5 · 1 = 25 2 KIT Institut für Theoretische Informatik 26 Beispiel Function power(a : R; n0 : N) : R assert n0 ≥ 0 and ¬(a = 0 ∧ n0 = 0) // Vorbedingung // p n r = an0 p =a : R; r =1 : R; n=n0 : N while n > 0 do invariant p n r = an0 // Schleifeninvariante (*) if n is odd then n−− ; r := r · p else (n, p):= (n/2, p · p) assert r = an0 // (*)∧n = 0 −→Nachbedingung return r neues n Fall n ungerade: Invariante erhalten wegen z }| { p n r = p n − 1 pr |{z} neues r KIT Institut für Theoretische Informatik 27 Beispiel Function power(a : R; n0 : N) : R assert n0 ≥ 0 and ¬(a = 0 ∧ n0 = 0) // Vorbedingung p =a : R; r =1 : R; n=n0 : N // p n r = an0 while n > 0 do invariant p n r = an0 // Schleifeninvariante (*) if n is odd then n−− ; r := r · p else (n, p):= (n/2, p · p) assert r = an0 // (*)∧n = 0 −→Nachbedingung return r neues n Fall n n gerade: Invariante erhalten wegen p z}|{ = (p · p) n/2 | {z } neues p KIT Institut für Theoretische Informatik 28 Programmanalyse Die fundamentalistische Sicht: Ausgeführte RAM-Befehle zählen einfache Übersetzungsregeln z}|{ −→ Pseudocode Idee: O(·)-Notation Maschinenbefehle vereinfacht die direkte Analyse des Pseudocodes. I T (I ; I 0 ) = T (I ) + T (I 0 ). I T (if C then I else I 0 ) ∈ O(T (C ) + max(T (I ), T (I 0 ))). I T (repeat I until C ) ∈ O(∑i T (i -te Rekursion Iteration)) Rekurrenzrelationen KIT Institut für Theoretische Informatik 29 Schleifenanalyse Summen ausrechnen Das lernen Sie in Mathe Beispiel: Schulmultiplikation KIT Institut für Theoretische Informatik 30 Eine Rekurrenz für Teile und Herrsche Für positive Konstanten a, b , c , d , ( a r (n) = cn + dr (n/b) 1 1 a falls falls 2 n/b ... ... 1 a n = bk n=1 n>1 n cn n/b 1 a sei 1 a für ein Basisfall teile und herrsche. 1 d ... ... n/b ... ... ... ... k ∈ N. 1 a 2 1 a k KIT Institut für Theoretische Informatik 31 Master Theorem (Einfache Form) Für positive Konstanten a, b , c , d , ( a r (n) = cn + dr (n/b) sei falls falls n = bk n=1 n>1 für ein k ∈ N. Basisfall teile und herrsche. Es gilt Θ(n) r (n) ∈ Θ(n log n) Θ nlogb d Übung: dasselbe gilt, wenn wir beliebige r (n) = cn + dr (dn/be) für n>1 falls falls falls d <b d =b d > b. n∈N zulassen und setzen. KIT Institut für Theoretische Informatik 32 Beweisskizze Auf Ebene i haben wir di Probleme @ n/b i = b k−i i n d d · c · i = cn b b i ad k KIT Institut für Theoretische Informatik 33 Beweisskizze Fall d <b geometrisch schrumpfende Reihe −→ erste Rekursionsebene kostet konstanten Teil der Arbeit k−1 d i ∈ Θ(n) r (n) = a| {z · d } + cn · ∑ i=0 b o(n) | {z } k O(1) d=2, b=4 KIT Institut für Theoretische Informatik 34 Beweisskizze Fall d =b gleich viel Arbeit auf allen k = logb (n) Ebenen. r (n) = an + cn logb n ∈ Θ(n log n) d=b=2 KIT Institut für Theoretische Informatik 35 Beweisskizze Fall d >b geometrisch wachsende Reihe −→ letzte Rekursionsebene kostet konstanten Teil der Arbeit k−1 k r (n) = ad + cn · ∑ i=0 beachte: log b d b i ∈ Θ nlogb d log d d k = 2k log d = 2k log b log d = b k log b = b k logb d = nlogb d d=3, b=2 KIT Institut für Theoretische Informatik 36 Master Theorem Beispiele Für positive Konstanten a, b , c , d , ( a r (n) = cn + dr (n/b) sei falls falls n = bk n=1 n>1 für ein k ∈ N. Basisfall teile und herrsche. schon gesehen, kommt noch, allgemeinerer Fall d < b: Median bestimmen d = b: mergesort, quicksort d > b: rekursive Multiplikation, Karatsuba-Ofman-Multiplikation KIT Institut für Theoretische Informatik 37