9.1 Das Zeithierarchietheorem
Das Zeithierarchietheorem besagt, dass es zu jeder "vernünftigen" Komplexitätsfunktion
ein Entscheidungsproblem gibt, dass man in Zeit entscheiden kann,
aber nicht deutlich schneller. Was "vernünftig" bedeutet, wird weiter unten klar werden.
Wir betrachten noch einmal genauer die universelle Turingmaschine aus
Kapitel 7.5. Unsere Implementierung hatte insgesamt
fünf Bänder verwendet: (1) ein Band, um die Regeln von zu speichern (also die Funktion
);
(2) ein Band, um den Zustand von zu speichern; (3) um den akzeptierenden Zustand
von
zu speichern; (4) und (5) um das Band von zu simulieren. Für letzteres hatten wir
zwei Bänder
verwendet, weil das uns erlaubte, effizient Zeichen einzufügen statt einfach zu
überschreiben.
Wie wir aber gesehen hatten, können wir (4) und (5) mit einem Band bewältigen, indem wir zu
allererst
die Codierung durchgehen und die Länge des längsten Bandzeichen bestimmen. Wir
verwenden dann auf Band (4) immer Blöcke der Länge für ein -Zeichen und separieren diese
durch eine
Markierung . Auch das Band (3) können wir uns sparen: den akzeptierenden Zustand
von können wir gleich am Anfang von (1) schreiben, ohne das die Simulation dadurch
nennenswert teurer würde. Wir kommen also mit drei Bändern aus.
Allerdings hatten wir uns nur überlegt, wie man
Einband-Turingmaschinen simuliert. Es ist aber ziemlich einfach zu sehen, dass man
Codierung und Simulation ganz analog für -Band-Turingmaschinen durchführen kann.
Die entsprechende Turingmaschine hat dann allerdings Bänder: Arbeitsbänder,
eins für den Zustand von und eins für . Darüberhinaus hatten wir in
Kapitel 7.7 gesehen, dass wir als Codierungsalphabet
selbst nehmen können, also , solange mindestens zwei
Zeichen enthält.
Theorem 9.1.1 Für jedes Alphabet mit mindestens zwei
Zeichen
und jedes gibt es eine Turingmaschine mit Bändern, die folgendes kann:
sei eine beliebige -Band-Turingmaschine mit Eingabealphabet und sei .
Dann gilt
Weiterhin gilt: wenn auf innerhalb von Schritten terminiert, dann
terminiert auf innerhalb von
Schritten. Das ist hier eine absolute Konstante, hängt also weder von noch
von ab.
Dass es so ein gibt, hatten wir ja schon gesehen. Gehen wir aber noch einmal die
Zeitschranke durch. In einer vorbereitenden Phase bestimmt die Länge des längsten
Bandzeichen von . Dann schreibt es das Eingabewort als Folge
von Blöcken der Länge auf das Arbeitsband. Zellen in einem Block, die nicht verwendet
werden,
werden mit einem gefüllt. Hier ein Beispiel für den Fall :
Diese Vorbereitungsphase benötigt maximal Schritte. Um nun einen
Schritt von zu simulieren, müssen wir das gerade gelesene -Zeichen auf Band 2
schreiben, so dass dann
dort steht. Das braucht Schritte.
Als nächstes müssen wir bestimmen, müssen
wir durchgehen und den Eintrag für suchen, was
maximal Schritte benötigt. Dann müssen wir den Schritt ausführen, also
den neuen Zustand auf Band 2 schreiben, das neue Zeichen in den Block auf dem Arbeitsband
eintragen und den Kopf bewegen. All das benötigt maximal Schritte.
Untere Schranken für Zeitkomplexität
Wir wollen nun eine Sprache definieren, die wir in Schritten entscheiden können aber
nicht deutlich schneller. Wir erinnern uns an , die von der universellen Turingmaschine
akzeptierte Sprache:
und davon abgeleitete "Diagonalisierungssprache"
Wir haben gesehen, dass nicht entscheidbar ist. Nun wollen
wir eine Version von , die in Schritten entscheidbar ist,
aber nicht in sehr viel weniger. Dafür definieren wir uns ein Halteproblem mit
Zeitbudget.
Definition 9.1.2 (Zeitbudgetiertes
Halteproblem).
Sei ein endliches Alphabet. Wir definieren die Sprache
Mit bezeichnen wir die Folge von vielen en.
Des Weiteren ist eine -Band-Turingmaschine mit Eingabealphabet und und
die universelle Turingmaschine, die selbst Bänder hat. Wir sollten strenggenommen
also
definieren, unterlassen dies aber der Lesbarkeit halber.
Bitte erinnern Sie sich daran, dass unsere Codierung immer mit dem Sonderzeichen
endet, oder besser gesagt: mit der Codierung von über
dem Alphabet selbst. Eine Turingmaschine kann also, gegeben ein Eingabewort , dieses
in die Bestandteile , , und zerlegen. Die dient dazu, das "Budget"
vom "inneren Eingabewort" abzugrenzen.
Beweis.
Wir nehmen die universelle Turingmaschine , die -Band-Turingmaschinen simulieren kann,
und statten sie mit einem
Stoppuhrband aus. Sie hat nun also Bänder. Sei die Länge
des Eingabewortes.
In Schritten sorgt sie dafür, dass auf dem Eingabeband das Wort steht und
auf dem Stoppuhrband das Budget .
Nun lassen wir die universelle Turingmaschine laufen, nur dass wir in jedem Schritt den
Kopf auf dem Stoppuhrband nach rechts verschieben. Wenn hält, dann hält unsere
Turingmaschine auch und gibt das gleiche Ergebnis aus. Wenn wir das Ende des Stoppuhrbandes
erreicht haben, haben wir unsere Schritte verbraucht und lehnen ab. Wir brauchen
insgesamt
Schritte.
Sei nun eine monoton steigende Funktion mit .
Wir definieren eine Zeitbudgetierte Version der Diagonalisierungssprache:
Behauptung 9.1.4 (nicht ganz
korrekt). .
Sei die Länge des Inputwortes.
Wir können entscheiden, indem wir aus den String
berechnen und dann die Turingmaschine für laufen lassen,
welche Bänder hat und selbst
Schritte
braucht. Die Vorbereitungsphase braucht ungefähr so lange, wie wir brauchen, um zu berechnen.
Übliche Zeitschranken , die uns interessieren, wären zum Beispiel , , ,
oder . All diese stellen kein Problem dar. Insgesamt sind wir auf der sicheren
Seite, wenn wir die Funktion selbst in Schritten berechnen können.
Definition 9.1.5 Eine Funktion heißt
zeitkonstruierbar, wenn es eine Turingmaschine gibt, die aus dem Eingabewort
das Ausgabewort berechnet und selbst maximal Schritte läuft.
Behauptung 9.1.6 (jetzt korrekt). Sei
zeitkonstruierbar, monoton steigend und . Dann gilt
.
So weit, so gut. Wonach wir allerdings aus sind, ist ein Beweis, dass nicht
signifikant schneller zu berechnen ist.
Lemma 9.1.7 Sei eine Funktion mit
und
, also . Dann
gilt .
Beweis.
Wir nehmen an, es gäbe eine Turingmaschine , die in Zeit entscheidet und
leiten einen Widerspruch her. Sei . Wir wählen eine natürliche Zahl ,
deren genauen Wert wir weiter unten diskutieren und setzen . Wir fragen uns
nun: ist ?
Langsam nun. Sei die Länge des Wortes .
Nach Annahme terminiert auf dem Eingabewort innerhalb von
Schritten. Wenn die Maschine simuliert, braucht sie
nach Theorem 8.1.1 höchstens
Schritte.
Da gilt, sind dies höchstens Schritte.
Da ist, ist auch
Wenn wir also hinreichend groß wählen, dann ist dieser Bruch kleiner als ,
und die Simulation terminiert also innerhalb von
Schritten.
Das heißt, dass die universelle Turingmaschine das Wort innerhalb von
Schritten ablehnt,
wenn sie es überhaupt irgendwann ablehnt. Also schließen wir weiter:
und da ist er, der Widerspruch: , entgegen unserer Annahme, dass die Sprache entscheidet.
Zusammenfassend erhalten wir die "Rohversion" des Zeithierarchiesatzes:
Theorem 9.1.8(Zeithierarchiesatz, Rohversion).
Seien
zeitkonstruierbare Funktionen mit und
(also ). Dann gilt
für alle .
Zusammen mit der Simulation von -Band-TMs durch -Band-TMs folgt nun
oder, alternativ ausgedrückt:
Theorem 9.1.9 (Zeithierarchiesatz).
Seien mit und . Dann gilt
.
Bitte beachten Sie, dass wir diese Version nicht vollständig bewiesen habe, da ich
die effizientere Simulation einer -Band-Turingmaschine durch eine -Band-Turingmaschine,
also nicht erklärt habe. Mit der ineffiziten, also
, erhalten wir
einen Zeithierarchiesatz solange ist.
Übungsaufgabe 9.1.1
Zeigen Sie, dass und zeitkonstruierbar sind.