3. Übungsblatt

Werbung
M∪Φ
X
Lehrstuhl
Übungen zur Vorlesung
Mathematik für Informatiker I
Wintersemester 2016/2017
Prof. Dr. Knut Hüper, Thorsten Reichert
Aufgabenblatt Nr. 3
31.10.2016
(20 Punkte. Abzugeben bis 7.11.2016 um 12:00 Uhr)
Hausaufgaben
Aufgabe 3-1: Hashfunktionen
Sei S die Menge aller Strings (der Einfachheit halber nehmen wir hier an, dass ein String eine beliebig
lange Zeichenfolge bestehend aus den Buchstaben des deutschen Alphabets ist). Sei Weiterhin Hexn
die Menge der Hexadezimalzahlen mit höchstens n Ziffern (d.h. jedes Element h ∈ Hexn lässt sich als
n-Tupel (a0 , . . . , an−1 ) mit ak ∈ {0, . . . , 9, A, B, C, D, E, F } schreiben. Vorangestellte 0er sind explizit
erlaubt). Eine Hashfunktion ist eine Funktion
hash : S −→ Hexn
für ein festes n. Ein Beispiel für eine Hashfunktion ist der Secure Hash Algorithm (SHA). SHA
(genauer, die Version SHA256, die wir im Folgenden mit SHA meinen) bildet z.B. den String
Hashfunktionen bilden Strings auf Hexadezimalzahlen ab
auf die 64-stellige Hexadezimalzahl
D531980AA3196B019002D4D445B34988015DE589BF233FA61AE04CD06F1BCBA3
ab (Sie können das online auf http://passwordsgenerator.net/sha256-hash-generator/ ausprobieren).
SHA ist also eine Funktion SHA : S −→ Hex64 . Eine entscheidende Eigenschaft von “sicheren” Hashfunktionen ist, dass es praktisch sehr schwierig ist, zwei unterschiedliche Strings s1 6= s2 ∈ S zu finden,
zu denen SHA den gleichen Hashwert erzeugt, also SHA(s1 ) = SHA(s2 ) gilt (man spricht hier von
Hash-Kollisionen). Wir wollen zunächst zeigen, dass solche Hash-Kollisionen tatsächlich existieren:
i) Bestimmen Sie die Mächtigkeit der Menge S
(1 Punkt)
ii) Entscheiden Sie, ob |Hex64 | = ∞ oder |Hex64 | < ∞ gilt
(1 Punkt)
iii) Argumentieren Sie anschaulich, warum Funktionen f : A −→ B von einer unendlich großen Menge
(|A| = ∞) in eine endlich große Menge (|B| < ∞) niemals injektiv sein können
(2 Punkte)
1
iv) Warum folgt aus der Tatsache, dass SHA nicht injektiv ist, die Existenz von Hash-Kollisionen?
(2 Punkte)
Hashfunktionen erzeugen eine Relation auf der Menge aller Strings S, definiert durch
s1 ∼ s2 :⇐⇒ SHA(s1 ) = SHA(s2 )
Wir wollen nun zeigen, dass ∼ eine Äquivalenzrelation ist:
v) Zeigen Sie, dass ∼ reflexiv ist
(1 Punkt)
vi) Zeigen Sie, dass ∼ symmetrisch ist
(1 Punkt)
vii) Zeigen sie, dass ∼ transitiv ist
(1 Punkt)
N
Schließlich besitzt Hex64 als Teilmenge von
die übliche Ordnungsrelation ≤. Wir können aus ≤
eine Relation / auf der Menge aller Strings S einführen:
s1 / s2 :⇐⇒ SHA(s1 ) ≤ SHA(s2 )
/ ist aufgrund von Hash-Kollisionen keine Totalordnung, erfüllt aber trotzdem fast alle Eigenschaften
dieser:
viii) Zeigen Sie, dass / reflexiv ist
(1 Punkt)
ix) Zeigen Sie, dass / transitiv ist
(1 Punkt)
x) Zeigen Sie, dass für alle s1 , s2 ∈ S stets s1 / s2 oder s2 / s1 gilt
(1 Punkt)
xi) Zeigen Sie, dass / nicht antisymmetrisch ist
(2 Punkte)
Hinweis: Die drei Aufgabenblöcke können weitestgehend alleinstehend bearbeitet werden. Lediglich im
dritten Block müssen Sie aus dem ersten Block verwenden, dass Hash-Kollisionen existieren.
Aufgabe 3-2: Verkettung von Funktionen
Seien A, B, C und D Mengen. Seien weiterhin drei Funktionen f : A −→ B, g : B −→ C und
h : C −→ D gegeben. Zeigen Sie, dass
h ◦ (g ◦ f ) = (h ◦ g) ◦ f
gilt. Benutzen Sie dazu, dass zwei Funktionen p : A −→ D und q : A −→ D genau dann gleich sind,
wenn ∀a ∈ A : p(a) = q(a) eine wahre Aussage ist.
Hinweis: Obige Gleichung beschreibt das Assoziativitätsgesetz für Monaden in funktionalen Programmiersprachen, wie z.B. Haskell, siehe https://wiki.haskell.org/Monad_laws.
(3 Punkte)
Aufgabe 3-3: Knobelaufgabe: Berechenbare Funktionen
Seien A, B Mengen. Eine Funktion f : A −→ B heißt berechenbar, wenn ein Algorithmus (mit endlich
vielen Codezeilen) existiert, der Inputs aus A akzeptiert und zu jedem möglichen Input a ∈ A genau
den Funktionswert f (a) ausgibt. Ein Beispiel für eine berechenbare Funktion ist square :
−→
: n 7−→ n2 . Eine Implementierung des dazugehörigen Algorithmus in C/C++ könnte wie folgt
aussehen:
N
N
int square(int n) {
return n * n;
}
2
(Wir ignorieren hier, dass int’s nur endlich große Zahlen beschreiben können)
Für die eigentliche Aufgabe betrachten wir eine Funktion f : −→ {0, 1}, die wie folgt definiert ist:
N
n-mal
z }| {
f (n) soll 1 sein, wenn die Zahlenfolge 0 . . . 0 in den Dezimalstellen von π vorkommt, und
0 wenn nicht.
Falls Sie π nicht kennen: Sie müssen nur wissen, dass π eine Zahl mit unendlich vielen Dezimalstellen
ist. Auf http://www.angio.net/pi/piquery können Sie die ersten 200 Millionen Dezimalstellen von π
durchsuchen und so z.B. feststellen, dass 0000 das erste mal an der 13390. Dezimalstelle auftaucht.
Damit gilt also f (4) = 1.
Zeigen Sie, dass die Funktion f berechenbar ist.
(3 Punkte)
3
Herunterladen