Rheinische Friedrich-Wilhelms-Universität Bonn Institut für Informatik I Prof. Dr. Rolf Klein, A. Grüne, Dr. T. Kamphans, M. Köhler, Dr. E. Langetepe Informatik III, WS 2006/07, Blatt 9 Abgabe: Montag, 15.01., 11.00-11.10 Uhr vor Hörsaal D Aufgabe 1 Schätzen Sie für die folgenden Prozeduren (Eingabe: zwei Arrays A, B, n := |A|, m := |B|) möglichst genau die Laufzeiten in O-Notation ab. Geben Sie auch die Laufzeiten der einzelnen Schritte an! (Ein Array der Größe k läßt sich in Zeit O(k log k) sortieren.) Machtwas1(A, B): FOR i := 1 TO m DO FOR j := 1 TO n DO IF A[j] == B[i] THEN gib j aus Machtwas2(A, B): Sortiere A FOR i := 1 TO m DO ℓ := 1; r := |A|; WHILE ℓ< r DO k := ℓ+r ; 2 IF B[i] == A[k ] THEN gib k aus; ℓ := r; IF B[i] < A[k ] THEN r := k − 1; IF B[i] > A[k ] THEN ℓ := k + 1; a) (2 Punkte) Analysieren Sie ’Machtwas1’ ! b) (3 Punkte) Analysieren Sie ’Machtwas2’ ! c) (1 Punkt) Welche Gesamtlaufzeit ergibt sich für ’Machtwas2’, wenn n < m gilt? bitte wenden Postanschrift: Universität Bonn Institut für Informatik I Römerstr. 164, D-53117 Bonn Telefon: (02 28) 73–4333 Fax: (02 28) 73–4321 Email: {gruene,kamphans,koehler,langetepe}@informatik.uni-bonn.de Aufgabe 2 In der Vorlesung wurde das Modell der Random Access Machine (RAM) eingeführt. Sie sollen nun zwei kleine Programme für dieses Maschinenmodell schreiben. Ihr Programm soll in folgender Form aufgeschrieben werden, wie dieses Programm, das testet ob a > b, a = b oder a < b gilt: 1 READ 0 // Speichere die Zahl a vom Eingabeband im Register 0 2 READ 1 // Speichere die Zahl b vom Eingabeband im Register 1 3 SUB 1 // Berechne a − b 4 JGTZ 10 // Wenn a − b > 0 gilt, dann ist a > b 5 JZERO 8 // Wenn a − b = 0 gilt, dann ist a = b 6 WRITE =-1 // Da hier a − b < 0 gilt, muss a < b sein, daher schreibe eine -1 auf das Band 7 JUMP 11 // Gehe zum Ende 8 WRITE =0 // Fall a = b 9 JUMP 11 // Gehe zum Ende 10 WRITE =1 // Falle a > b 11 HALT // Fertig Ihre Programme müssen ebenfalls kommentiert sein! a) (2 Punkte) Schreiben Sie eine Funktion MOD i, die die Modulo Funktion berechnet, dass heißt c(0) := c(0) mod c(i). Versuchen Sie dabei ohne Hilfsregister auszukommen, indem sie nur mit Subtraktionen und Sprüngen arbeiten. Sie dürfen dabei voraussetzen, dass sowohl c(0) > 0 als auch c(i) > 0 gilt und brauchen daher keine Sonderfälle abzufangen. Die Zahlen stehen bereits in den Registern drin, es muss nichts dabei vom Eingabeband eingelesen werden oder auf das Ausgabeband geschrieben wrden. Versuchen Sie mit weniger als 10 Zeilen auszukommen. b) (4 Punkte) Schreiben Sie einen Primzahltest, der für eine Zahl n testet, ob diese Prim ist. Dieser Primzahltest muss nicht optimiert sein. Für die Modulo Funktion dürfen Sie die Funktion aus Teil a) verwenden. Dabei muss die Zahl n vom Eingabeband gelesen werden und am Ende soll auf dem Ausgabeband eine 1 stehen, wenn n prim ist und eine 0, wenn n nicht prim ist. Sie dürfen voraussetzen, dass n ≥ 2 gilt. Versuchen Sie mit weniger als 20 Zeilen auszukommen. Aufgabe 3 Beweisen Sie folgende, für das RSA-Verfahren wichtige Aussagen formal. a) (2 Punkte) Für alle a, b, n ∈ IIN gilt: ((a mod n)(b mod n) mod n) = ab mod n b) (2 Punkte) Für alle natürlichen Zahlen a, n > 1 gilt: a und n teilerfremd ⇔ ∃b ∈ IIN : ab mod n = 1 (Sie können die Korrektheit des erweiterten Euklid. Algorithmus voraussetzen.) 2 c) (2 Punkte) Für alle Primzahlen p, q > 1 gilt: Φ(pq) = (p − 1)(q − 1) Aufgabe 4 Betrachten Sie das folgende Optimierungs-Problem: Gegeben sei ein Graph G = (V, E). Bestimme eine Knotenmenge V ′ ⊆ V , so dass folgende Bedingungen gelten: 1. ∀(v, w) ∈ E : v ∈ V ′ oder w ∈ V ′ 2. |V ′ | ist minimal unter allen Knotenmengen V ′ ⊆ V , die 1. erfüllen. Es soll also eine minimale überdeckende Knotenmenge (Vertex Cover) berechnet werden. a) (2 Punkte) Zeigen Sie, dass der folgende einfache Algorithmus eine Knotenmenge V ′ bestimmt, die die Bedingung 1. erfüllt. Ueberdeckung(V, E) : V ′ := {} WHILE (E 6= ∅) DO (u, v) := getEdge(E) V ′ := {u, v} ∪ V ′ FORALL ((v1 , v2 ) ∈ E) DO IF (v1 = u ∨ v2 = v ∨ v2 = u ∨ v1 = v) THEN E := E \ {(v1 , v2 )} ENDIF ENDFORALL ENDWHILE RETURN V ′ Die Operation getEdge gibt eine beliebige Kante aus E zurück. Die Schleife FORALL durchläuft alle Kanten. b) (2 Punkte) Sei Vmin die Lösung des Optimierungs-Problem. Beweisen Sie, dass die Menge V ′ = Ueberdeckung(V, E) aus Aufgabenteil a) im schlimmsten Fall nur 2 × |Vmin| viele Knoten enthält. c) (2 Punkte) Nehmen Sie an, G = (V, E) sei ein Baum. Ein Baum ist ein zusammenhängender zykelfreier Graph, d.h. es gibt für einen Knoten v keine Kantenfolge (v, u1 ), (u1, u2 ), . . . , (ui, ui+1), (ui+1 , v) aber je zwei verschiedene Knoten sind durch genau eine Kantenfolge verbunden. Zeigen Sie, dass das Optimierungsproblem für einen Baum B in polynomieller Laufzeit (Anzahl Elementarschritte) gelöst werden kann. 3