Blatt 9

Werbung
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
Herunterladen