Übung 1 - TU Chemnitz

Werbung
Theoretische Informatik SS 04
Übung 1
Aufgabe 1
Es gibt verschiedene Möglichkeiten, eine natürliche Zahl n zu codieren. In der unären Codierung hat man nur ein Alphabet mit einem Zeichen - sagen wir die 1 - zur Verfügung und die
Zahl n wird durch n aufeinanderfolgende Einsen dargestellt, also z.B. ist 11111 die Codierung
der Zahl 5. Bei der binären Codierung wird (ähnlich wie bei der geläufigeren dekadischen
Schreibweise) die Zahl n geschrieben als n = a k 2k + ak−1 2k−1 + . . . + a0 20 , wobei ai ∈ {0, 1}
für i = 0, . . . , k und k geeignet gewählt ist - also wird hier die Zahl 5 als 101 eincodiert.
a) Was sind die Binärcodierungen der Zahlen 13, 19, 22 und 37?
Lösung:
5
13
19
22
37
= 4+1
= 8+4+1
= 15 + 2 + 1
= 16 + 4 + 2
= 32 + 4 + 1
=22 + 20
=23 + 22 + 20
=24 + 21 + 20
=24 + 22 + 21
=25 + 22 + 20
= [101]2
= [1101]2 ]
= [10011]2
= [10110]2
= [100101]2
b) Wie viele Bits werden zur Binärcodierung der Zahl n benötigt?
Lösung:
Zunächst betrachten wir einige Beispiele:
Zahl
1
2
3
4
5
6
7
8
Binärdarstellung
[1]2
[10]2
[11]2
[100]2
[101]2
[110]2
[111]2
[1000]2
Logarithmus
0
1
1, . . .
2
2, . . .
2, . . .
2, . . .
3
Anzahl Stellen
1
2
2
3
3
3
3
4
Vermutung: Es werden blog nc + 1 Bits zur Binärcodierung der Zahl n benötigt.
Begründung: n = [1 . . . . . .]2
| {z }
k+1 Stellen
−→ kleinste Zahl mit k + 1 Stellen:
[100 . . . . . . 0] 2 = [2k ]10
|
{z
}
−→ größte Zahl mit k + 1 Stellen:
[111 . . . . . . 1] 2 = [2k+1 − 1]10
|
{z
}
k+1 Stellen
k+1 Stellen
1
=⇒ 2k+1 > n ≥ 2k
=⇒ log(2k+1 ) = k + 1 > log(n) ≥ k = log(2k )
=⇒ blog nc = k
=⇒ blog nc + 1 = k + 1 (#Stellen)
Es werden also blog nc + 1 Bits zur Binärcodierung der Zahl n benötigt.
Aufgabe 2
In der Vorlesung wurde eine Turing-Maschine mit vier Zuständen z 0 , z1 , z2 , ze vorgestellt,
welche zu einer Binärcodierung gegebener natürlicher Zahlen n die 1 addiert (Schöning, Seite
83).
a) Was genau macht diese Turing-Maschine in den Zuständen z 0 , z1 und z2 ?
Lösung:
Zu einer Binärzahl x ∈ {0, 1}∗ , ist 1 zu addieren. Die Turingmaschine M ist gegeben durch:
M = ({z0 , z1 , z2 , ze }, {0, 1}, {0, 1, 2}, δ, z0 , 2, {ze })
δ
z0
z1
z2
0
(z0 , 0, R)
(z2 , 1, L)
(z2 , 0, L)
1
(z0 , 1, R)
(z1 , 0, L)
(z2 , 1, L)
2
(z1 , 2, L)
(ze , 1, N )
(ze , 2, R)
Bedeutung der Zustände:
z0 : Schreib-/Lesekopf über letztem Zeichen (am weitesten rechts) der Eingabe
positionieren.
Gehe nach rechts, bis zum ersten Blank, ohne den Bandinhalt zu verändern. Gehe dann in
Zustand z1 und eine Stelle nach links. (Beim Verlassen von Zustand z 1 steht der SchreibLesekopf also auf dem niederwertigsten Bit der Eingabe.)
z1 : Eingabestring durch Addition von 1 manipulieren.
Schreibe 0 und gehe nach links, bis die am weitesten rechts liegende 0 in der Eingabe oder
ein Blank gefunden wird. Wird eine 0 gefunden, so schreibe 1 und gehe in Zustand z 2 sowie
nach links; schreibe bei Blank 1 und gehe in den Endzustand, da der Schreib-/Lesekopf in
diesem Falle auf der ersten Stelle des Ergebnisstrings steht.
z2 : Schreib-/Lesekopf über erstem Zeichen (am weitesten links) der Ausgabe
positionieren.
Laufe nach links bis das erste Blank gelesen wird, ohne den Bandinhalt zu verändern. Wird
ein Blank gelesen, so gehe nach rechts und in den Endzustand.
ze : STOPP
2
b) Geben Sie eine Turing-Maschine an, die bei der Eingabe einer natürlichen Zahl n ≥ 1 in
Binärcodierung die 1 von n subtrahiert. Ausgabe soll also n − 1 in Binärcodierung sein,
wobei zu Beginn und Ende der Berechnung der Schreib-/Lesekopf am Anfang (also über
dem am weitesten links stehenden Bit) der Ein- bzw. Ausgabe steht.
Lösung:
Die TM unterscheidet sich von der in Aufgabe a) angegebenen lediglich in der Wahl der
Zustandsüberführungsfunktion δ und der Zustandsmenge Z = {z 0 , z1 , z2 , z3 , ze }.
δ
z0
z1
z2
z3
0
(z0 , 0, R)
(z1 , 1, L)
(z2 , 0, L)
(z3 , 2, R)
1
(z0 , 1, R)
(z2 , 0, L)
(z2 , 1, L)
(ze , 1, N )
2
(z1 , 2, L)
(z3 , 2, R)
(ze , 0, N )
Bedeutung der Zustände:
z0 : Schreib-/Lesekopf über letztem Zeichen der Eingabe positionieren.
Gehe nach rechts, bis zum ersten Blank, ohne den Bandinhalt zu verändern. Gehe dann in
Zustand z1 und eine Stelle nach links. (Beim Verlassen von Zustand z 1 steht der SchreibLesekopf also auf dem niederwertigsten Bit der Eingabe.
z1 : Eingabestring durch Subtraktion von 1 manipulieren.
Schreibe 1 und gehe nach links, bis die am weitesten rechts liegende 1 in der Eingabe
gefunden wird. 1 Schreibe 0 und gehe in Zustand z2 sowie nach links.
z2 : Schreib-/Lesekopf über erstem Zeichen der Ausgabe positionieren.
Laufe nach links bis das erste Blank gelesen wird, ohne den Bandinhalt zu verändern. Wird
ein Blank gelesen, so gehe nach rechts und in den Zustand z 3 .
z3 : Entfernen führender Nullen
Ersetze 0 durch Blank und gehe nach rechts. Wird 1 gelesen, so schreibe 1 und wechsle
in den Endzustand ze . Beim Lesen von Blank ist klar, dass es sich beim Ergebnis um die
Zahl 0 handelt - es wurde als fälschlicherweise ein 0 zu viel gelöscht, die wieder geschrieben
wird. Anschliessend erfolgt ein Wechsel in den Endzustand.
ze : STOPP
Aufgabe 3
Geben Sie eine Turing-Maschine an, die eine in Binärcodierung gegebene natürliche Zahl n ≥ 1
mit der Zahl 2 multipliziert. Der Schreib-/Lesekopf soll sich zu Anfang und Ende der Berechnung jeweils auf dem ersten Bit (der größten Zweierpotenz zugeordnet) der Darstellung von
n befinden. Beschreiben Sie kurz die Funktion der einzelnen Zustände.
Lösung:
1
Eine 1 gibt es wegen n ≥ 1 immer.
3
Die Turingmaschine M ist gegeben durch:
M = ({z0 , z1 , ze }, {0, 1}, {0, 1, 2}, δ, z0 , 2, {ze })
δ
z0
z1
0
(z0 , 0, R)
(z2 , 0, L)
1
(z0 , 1, R)
(z1 , 1, L)
2
(z1 , 0, L)
(ze , 2, R)
Bedeutung der Zustände:
z0 : Eingabestring durch Anfügen einer 0 manipulierten.
Gehe nach rechts, bis zum ersten Blank, ohne den Bandinhalt zu verändern. Schreibe dann 0
und gehe in Zustand z1 sowie eine Stelle nach links.
z1 : Schreib-/Lesekopf über ersten Zeichen des Ergebnisses positionieren.
Laufe nach links bis das erste Blank gelesen wird, ohne den Bandinhalt zu verändern. Gehe
dann nach rechts und in den Endzustand.
ze : STOPP
Aufgabe 4
Geben Sie eine Turing-Maschine an, die zwei natürliche Zahlen n und m addiert. Eingabe sind
dabei die Zahlen n und m, getrennt durch das Zeichen #. Ausgabe soll die Zahl n + m sein.
Der Schreib-/Lesekopf soll dabei zu Beginn und Ende der Berechnung am Anfang (also über
dem am weitesten links stehenden Zeichen) der Ein- bzw. Ausgabe stehen, wenn
a) die Zahlen n und m in unärer Codierung vorliegen und das Arbeitsalphabet
Γ = {1, #, 2} ist,
Lösung:
Idee: # durch 1 überschreiben, dafür am Ende eine 1 durch Schreiben eines Blank löschen.
Die Turingmaschine M ist gegeben durch:
M = ({z0 , z1 , z2 , ze }, {1, #}, {1, #, 2}, δ, z0 , 2, {ze })
δ
z0
z1
z2
1
(z0 , 1, R)
(z2 , 2, L)
(z2 , 1, L)
#
(z0 , 1, R)
-
2
(z1 , 2, L)
−
(ze , 2, R)
b) Die Zahlen n und m liegen in binärer Codierung vor und das Arbeitsalphabet ist Γ =
{0, 1, #, 2} (Sie müssen hier die Turing-Maschinen nicht exakt angeben, sondern skizzieren, was bei der Wahl der Zustände zu beachten ist).
4
Lösung:
Idee: Wir nutzen die Turing-Maschinen von Aufgabe 2. Dabei wird in jedem Durchlauf
von m die 1 subtrahiert und zu n addiert. Diese Vorgehensweise ist zwar außerordentlich
ineffizient wenn die Laufzeit betrachtet wird, jedoch wesentlich einfacher handhabbar als
Addition mit Übertrag. In diesem Falle müssen anfallende Überträge in den Zuständen
gespeichert werden, so dass die Zustandsüberführungsfunktion δ ein nicht unerhebliches
Ausmaß erreicht.
In der Eingabe soll o.B.d.A. n links und m rechts stehen (. . . 2n#m2 . . .). Die Turingmaschine M ist dann gegeben durch:
M = ({z0 , z1 , z2 , z3 , z4 , z5 , z6 , z7 , z8 , ze }, {0, 1, #}, {0, 1, #, 2}, δ, z0 , 2, {ze })
δ
z0
z1
z2
z3
z4
z5
z6
z7
z8
0
(z0 , 0, R)
(z1 , 0, R)
(z2 , 0, R)
(z3 , 1, L)
(z4 , 0, L)
(z6 , 1, L)
(z6 , 0, L)
(z7 , 2, L
(z8 , 0, L)
1
(z0 , 1, R)
(z2 , 1, R)
(z2 , 1, R)
(z4 , 0, L)
(z4 , 1, L)
(z5 , 0, L)
(z6 , 1, L)
(z8 , 1, L)
#
(z1 , #, R)
(z5 , #, L)
z8 , 2, L)
-
2
(z7 , 2, L)
(z3 , 2, L)
(z0 , 1, R)
(z0 , 2, R)
(ze , 2, R)
Bedeutung der Zustände:
z0 :
z1 :
z2 :
z3 :
z4 :
z5 :
z6 :
z7 :
z8 :
ze :
Schreib-/Lesekopf über dem linkesten Zeichen von m positionieren u. in z 1 wechseln.
Test, ob m > 0; wechsle in Zustand z7 falls m = 0, in z2 sonst.
Schreib-/Lesekopf über dem rechtesten Zeichen von m positionieren u. in z 3 wechseln.
Von m 1 subtrahieren u. in z4 wechseln.
Schreib-/Lesekopf über dem rechtesten Zeichen von n positionieren u. in z 5 wechseln.
Zu n die 1 addieren u. in z6 wechseln; jedoch in z0 , wenn linkes Ende von n erreicht.
Schreib-/Lesekopf über dem linkesten Zeichen von n positionieren u. in z 0 wechseln.
m (bei m = 0 u. # mit Blank überschreiben u. in den Zustand z 8 wechseln.
Schreib-/Lesekopf über dem ersten Zeichen von n positionieren u. in z e wechseln.
STOPP
5
Herunterladen