Theoretische Informatik Prof. Dr. Juraj Hromkovič http://www.ita.inf.ethz.ch/theoInf16 Departement Informatik Lösungsvorschläge – Blatt 2 Zürich, 7. Oktober 2016 Lösung zu Aufgabe 4 (a) Wir geben zunächst für jedes n ∈ N − {0} ein Pascal-Programm an, das wn erzeugt: begin k:= n; k:= 2*k; j:= 1; for i:=1 to j:=2*j; l:= 1; for i:=1 to l:=2*l; for i:=1 to write(0); for i:=1 to write(1); end. k do j do l do l do Dieses Programm berechnet zunächst k = 2n und verwendet dann eine Schleife, um 2n j = 2k = 22n zu berechnen. In einer weiteren Schleife berechnet es dann l = 2j = 22 . 2n Anschliessend gibt es in der dritten Schleife l = 22 Nullen und in der vierten Schleife 2n l = 22 Einsen aus. Wenn wir die Operation ^ für die Exponentiation zulassen (dies ist nicht ursprüngliche Pascal-Syntax, wir wollen diese Notation aber im Folgenden verwenden, um die Programme lesbarer darzustellen), erzeugt auch das folgende Programm das Wort wn : begin k:= n; k:= 2^(2^(2*k)); for i:=1 to k do write(0); for i:=1 to k do write(1); end. Der einzige Teil des Maschinencodes dieses Programms, der von wn abhängt, ist die Darstellung von n in der zweiten Zeile. Der restliche Programmcode hat eine konstante Länge. Also ist die binäre Länge dieses Programms dlog2 (n + 1)e + c für eine Konstante c. Damit lässt sich die Kolmogorov-Komplexität von wn von oben abschätzen durch K(wn ) ≤ dlog2 (n + 1)e + c ≤ log2 n + c + 1 für eine Konstante c. Man beachte hierfür, dass für jedes n ≥ 1 gilt, dass dlog2 (n + 1)e ≤ 1 + log2 n: Falls n keine Zweierpotenz ist, gilt dlog2 (n + 1)e = dlog2 (n)e, und für n = 2m ist dlog2 (n + 1)e = m + 1 = 1 + log2 n. 2n Die Länge von wn ist |wn | = 2 · 22 . Also gilt log2 |wn | = 22n + 1. Wir können diese Gleichung jetzt verwenden, um log2 n in Abhängigkeit von |wn | auszudrücken, es gilt log2 |wn | = 22n + 1 ⇐⇒ 22n = log2 |wn | − 1 ⇐⇒ 2n = q log2 |wn | − 1 1 log2 (log2 |wn | − 1) 2 ⇐⇒ log2 n = log2 log2 (log2 |wn | − 1) − 1 . ⇐⇒ n = Es ergibt sich somit eine obere Schranke von K(wn ) ≤ log2 log2 (log2 |wn | − 1) + c für die Kolmogorov-Komplexität von wn . (b) Wir definieren die Zahlenfolge y1 , y2 , y3 , . . . durch yn = 23n für alle n ∈ N − {0}. √ Offenbar gilt yn < yn+1 und n = log2 3 yn für alle n. Die Binärdarstellung von yn ist eine Eins gefolgt von 3n Nullen, also Bin(yn ) = 1(0)3n . Nun konstruieren wir für jedes yn ein Pascal-Programm Cn , das Bin(yn ) erzeugt: begin k:= 3*n; write(1); for j:=1 to k do write(0); end. In diesem Programm wird zuerst der Wert k = 3n berechnet und die Ausgabe 1 erzeugt. Anschliessend werden in der for-Schleife entsprechend viele Nullen in der Ausgabe erzeugt. Der Teil des Maschinencodes von Cn , der von yn abhängt, ist nur die Darstellung von n. Der Maschinencode für die Darstellung des restlichen Programmteils hat nur eine konstante Länge, während die binäre Kodierung von n die Länge dlog2 (n + 1)e ≤ log2 n + 1 hat. Damit folgt K(yn ) ≤ log2 n + c √ ≤ dlog2 log2 3 yn e + c für eine Konstante c. Lösung zu Aufgabe 5 Offenbar erzeugen alle drei Programme An , Bn und Cn jeweils die Ausgabe wn . Die oberen Schranken für die Kolmogorov-Komplexität von wn ergeben sich aus der Länge der Darstellung der jeweiligen Programme im Maschinencode. Der einzige Teil der Programme, dessen Darstellungslänge variabel ist, ist die Angabe des Parameters n. Dieser benötigt eine Länge von dlog2 (n + 1)e. Der Rest der Programme ist für alle n gleich, hat also eine konstante Länge. Im Programm An kommt der Parameter n zweimal vor, also hat sein Maschinencode eine Länge von 2dlog2 (n + 1)e + cA für eine Konstante cA . Damit liefert An eine obere Schranke von K(wn ) ≤ 2dlog2 (n + 1)e + cA für die Kolmogorov-Komplexität von wn . Das Programm Bn enthält den Parameter n einmal, liefert also eine Schranke von K(wn ) ≤ dlog2 (n + 1)e + cB für eine Konstante cB . Das Programm Cn enthält den Parameter n dreimal, liefert also eine Schranke von K(wn ) ≤ 3dlog2 (n + 1)e + cC für eine Konstante cC . Lösung zu Aufgabe 6 Das Intervall [2n , 2n+1 − 1] enthält 2n natürliche Zahlen der binären Länge n + 1. Weil die binären Darstellungen dieser Zahlen alle mit einer führenden 1 beginnen, kann man sie identifizieren mit den Wörtern der Länge n über dem binären Alphabet Σbool . Es bleibt also zu zeigen, dass es unter den 2n Wörtern der Länge n mindestens 2n − 2n−i Wörter w gibt mit K(w) ≥ n − i. Die Anzahl der unterschiedlichen Programme der Länge kleiner als n − i ist höchstens n−i−1 X 2j = 2n−i − 2 , j=1 da es für jede Länge nicht mehr Maschinencodes als nichtleere Binärstrings geben kann. Also gibt es maximal 2n−i − 2 Wörter w mit K(w) < n − i. Für die Anzahl m der Wörter w in (Σbool )n mit K(w) ≥ n − i gilt also m ≥ 2n − (2n−i − 2) > 2n − 2n−i .