Das Zeithierarchietheorem besagt, dass es zu jeder "vernünftigen" Komplexitätsfunktion $t: \N \rightarrow \N$ ein Entscheidungsproblem $L \subseteq \Sigma^*$ gibt, dass man in Zeit $t$ 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 $M$ zu speichern (also die Funktion $\delta$); (2) ein Band, um den Zustand von $M$ zu speichern; (3) um den akzeptierenden Zustand $\qaccept$ von $M$ zu speichern; (4) und (5) um das Band von $M$ 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 $\enc(M)$ durchgehen und die Länge $l$ des längsten Bandzeichen bestimmen. Wir verwenden dann auf Band (4) immer Blöcke der Länge $l$ für ein $M$-Zeichen und separieren diese durch eine Markierung $\texttt{#}$. Auch das Band (3) können wir uns sparen: den akzeptierenden Zustand von $M$ 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 $M$ simuliert. Es ist aber ziemlich einfach zu sehen, dass man Codierung und Simulation ganz analog für $k$-Band-Turingmaschinen durchführen kann. Die entsprechende Turingmaschine hat dann allerdings $k+2$ Bänder: $k$ Arbeitsbänder, eins für den Zustand von $M$ und eins für $\enc(M)$. Darüberhinaus hatten wir in Kapitel 7.7 gesehen, dass wir als Codierungsalphabet $\Sigma$ selbst nehmen können, also $\enc(M) \in \Sigma^*$, solange $\Sigma$ mindestens zwei Zeichen enthält.

Theorem Für jedes Alphabet $\Sigma$ mit mindestens zwei Zeichen und jedes $k \geq 1$ gibt es eine Turingmaschine $U$ mit $k+2$ Bändern, die folgendes kann: sei $M$ eine beliebige $k$-Band-Turingmaschine mit Eingabealphabet $\Sigma$ und sei $x \in \Sigma^*$. Dann gilt

\begin{align*} f_{U} (\enc(M)x) = f_M(x) \ . \end{align*}

Weiterhin gilt: wenn $M$ auf $x$ innerhalb von $s$ Schritten terminiert, dann terminiert $U$ auf $\enc(M)x$ innerhalb von

\begin{align*} C \cdot |\enc(M)| \cdot (|x| + s) \end{align*}

Schritten. Das $C$ ist hier eine absolute Konstante, hängt also weder von $M$ noch von $\Sigma$ ab.

Dass es so ein $U$ gibt, hatten wir ja schon gesehen. Gehen wir aber noch einmal die Zeitschranke durch. In einer vorbereitenden Phase bestimmt $U$ die Länge $l$ des längsten Bandzeichen von $M$. Dann schreibt es das Eingabewort $x_1 x_2 \dots x_n$ als Folge von Blöcken der Länge $l$ auf das Arbeitsband. Zellen in einem Block, die nicht verwendet werden, werden mit einem $\texttt{-}$ gefüllt. Hier ein Beispiel für den Fall $l=4$:

\begin{align*} \texttt{#}x_1 \texttt{-} \texttt{-} \texttt{-} \texttt{#} x_2 \texttt{-} \texttt{-} \texttt{-} \texttt{#} x_3 \texttt{-} \texttt{-} \texttt{-} \texttt{#} \cdots \texttt{#} x_n \texttt{-} \texttt{-} \texttt{-} \texttt{#} \end{align*}

Diese Vorbereitungsphase benötigt maximal $C \cdot |\enc(M)| \cdot |x|$ Schritte. Um nun einen Schritt von $M$ zu simulieren, müssen wir das gerade gelesene $M$-Zeichen $z$ auf Band 2 schreiben, so dass dann dort $\enc(q)\texttt{,}\enc(z)$ steht. Das braucht $l+1$ Schritte. Als nächstes müssen wir $\delta_M(q,z)$ bestimmen, müssen wir $\enc(M)$ durchgehen und den Eintrag für $\enc(q)\texttt{,}\enc(z)$ suchen, was maximal $2 \cdot |\enc(M)|$ 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 $C \cdot |\enc(M)|$ Schritte.

Untere Schranken für Zeitkomplexität

Wir wollen nun eine Sprache definieren, die wir in $t(n)$ Schritten entscheiden können aber nicht deutlich schneller. Wir erinnern uns an $\halt$, die von der universellen Turingmaschine $U$ akzeptierte Sprache:

\begin{align*} \halt := L(U) =\{ \enc(M) w \ | \ M \textnormal{ akzeptiert } w\} \ . \end{align*}

und davon abgeleitete "Diagonalisierungssprache"

\begin{align*} \negdiag := \{ \enc(M) \in \Sigma^* \ | \ \enc(M) \enc(M) \not \in \halt\} \end{align*}

Wir haben gesehen, dass $\negdiag$ nicht entscheidbar ist. Nun wollen wir eine Version von $\negdiag$, die in $t$ Schritten entscheidbar ist, aber nicht in sehr viel weniger. Dafür definieren wir uns ein Halteproblem mit Zeitbudget.

Definition (Zeitbudgetiertes Halteproblem). Sei $\Sigma$ ein endliches Alphabet. Wir definieren die Sprache \begin{align*} \bhalt := \{ \enc(M) 1^b 0 x \ | \ U \textnormal{ akzeptiert $\enc(M)x$ innerhalb von $b$ Schritten} \} \end{align*} Mit $1^b$ bezeichnen wir die Folge von $n$ vielen $1$en. Des Weiteren ist $M$ eine $k$-Band-Turingmaschine mit Eingabealphabet $\Sigma$ und $x \in \Sigma^*$ und $U$ die universelle Turingmaschine, die selbst $k+2$ Bänder hat. Wir sollten strenggenommen also $\bhalt_{\Sigma,k}$ definieren, unterlassen dies aber der Lesbarkeit halber.

Bitte erinnern Sie sich daran, dass unsere Codierung $\enc(M)$ immer mit dem Sonderzeichen $\texttt{;}$ endet, oder besser gesagt: mit der Codierung von $\texttt{;} \in \Lambda$ über dem Alphabet $\Sigma$ selbst. Eine Turingmaschine kann also, gegeben ein Eingabewort $\enc(M)1^b 0 x$, dieses in die Bestandteile $\enc(M)$, $1^b$, $0$ und $x$ zerlegen. Die $0$ dient dazu, das "Budget" $1^b$ vom "inneren Eingabewort" $x$ abzugrenzen.

Beobachtung $\bhalt \in \TIME_{k+3}(n)$.

Beweis. Wir nehmen die universelle Turingmaschine $U$, die $k$-Band-Turingmaschinen simulieren kann, und statten sie mit einem Stoppuhrband aus. Sie hat nun also $k+3$ Bänder. Sei $n = |\enc(M)| + b + 1 + |x|$ die Länge des Eingabewortes. In $O(n)$ Schritten sorgt sie dafür, dass auf dem Eingabeband das Wort $\enc(M)x$ steht und auf dem Stoppuhrband das Budget $1^b$. Nun lassen wir die universelle Turingmaschine $U$ laufen, nur dass wir in jedem Schritt den Kopf auf dem Stoppuhrband nach rechts verschieben. Wenn $U$ 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 $b$ Schritte verbraucht und lehnen ab. Wir brauchen insgesamt $O(n+b) = O(n)$ Schritte.

\(\square\)

Sei nun $t: \N \rightarrow \N$ eine monoton steigende Funktion mit $t(n) \geq n$. Wir definieren eine Zeitbudgetierte Version der Diagonalisierungssprache:

\begin{align*} \bnegdiag := \{ \enc(M)1^m \ | \ \enc(M)1^{b} 0 \enc(M) 1^m \not \in \bhalt, \ b = t(|\enc(M)|+m) \} \end{align*}

Behauptung (nicht ganz korrekt). $\bnegdiag \in \TIME_{k+3}(t)$.

Sei $n := |\enc(M) + m|$ die Länge des Inputwortes. Wir können $\bnegdiag$ entscheiden, indem wir aus $\enc(M)1^m$ den String $\enc(M)1^b 0 \enc(M) 1^m$ berechnen und dann die Turingmaschine für $\bhalt$ laufen lassen, welche $k+3$ Bänder hat und selbst $O(2|\enc(M)| + b + 1 + m) = O(|\enc(M)| + b) = O(b)$ Schritte braucht. Die Vorbereitungsphase braucht ungefähr so lange, wie wir brauchen, um $b = t(|\enc(M)+m|) = t(n)$ zu berechnen. Übliche Zeitschranken $t$, die uns interessieren, wären zum Beispiel $n \log n$, $n^2$, $2^n$, $n!$ oder $n^n$. All diese stellen kein Problem dar. Insgesamt sind wir auf der sicheren Seite, wenn wir die Funktion $t$ selbst in $O(t)$ Schritten berechnen können.

Definition Eine Funktion $t: \N \rightarrow \N$ heißt zeitkonstruierbar, wenn es eine Turingmaschine gibt, die aus dem Eingabewort $1^n$ das Ausgabewort $1^{t(n)}$ berechnet und selbst maximal $O(t(n))$ Schritte läuft.

Behauptung (jetzt korrekt). Sei $t: \N \rightarrow \N$ zeitkonstruierbar, monoton steigend und $t(n) \geq n$. Dann gilt $\bnegdiag \in \TIME_{k+3}(t)$.

So weit, so gut. Wonach wir allerdings aus sind, ist ein Beweis, dass $\bnegdiag$ nicht signifikant schneller zu berechnen ist.

Lemma Sei $s: \N \rightarrow \N$ eine Funktion mit $s(n) \geq n$ und $s = o(t)$, also $\lim_{n \rightarrow \infty} \frac{s(n)}{t(n)} = 0$. Dann gilt $\bnegdiag \not \in \TIME_k(s)$.

Beweis. Wir nehmen an, es gäbe eine Turingmaschine $M$, die $\bnegdiag$ in Zeit $s$ entscheidet und leiten einen Widerspruch her. Sei $x := \enc(M)$. Wir wählen eine natürliche Zahl $m$, deren genauen Wert wir weiter unten diskutieren und setzen $b := t(|x| + m)$. Wir fragen uns nun: ist $x1^m \in \bnegdiag$?

\begin{align*} x1^m \in \bnegdiag & \Longleftrightarrow \enc(M) 1^b 0 x1^m \not \in \bhalt \\ &\Longleftrightarrow U \textnormal{ akzeptiert $\enc(M)x1^m$ nicht innerhalb von $b$ Schritten} \end{align*}

Langsam nun. Sei $n := |\enc(M)|+m$ die Länge des Wortes $x1^m$. Nach Annahme terminiert $M$ auf dem Eingabewort $x1^m$ innerhalb von $s(n)$ Schritten. Wenn $U$ die Maschine $M$ simuliert, braucht sie nach Theorem 8.1.1 höchstens $C \cdot |\enc(M)| \cdot (n + s(n))$ Schritte. Da $s(n) \geq n$ gilt, sind dies höchstens $2C \cdot |\enc(M)| \cdot s(n) = 2C \cdot |\enc(M)| \cdot s(|x|+m)$ Schritte. Da $\lim_{n \rightarrow \infty} \frac{s(n)}{t(n)} = 0$ ist, ist auch

\begin{align*} \lim_{m \rightarrow \infty }\frac{2C \cdot |\enc(M)| \cdot s(|x|+m)}{t(|x|+m)} = 0 \ . \end{align*}

Wenn wir also $m$ hinreichend groß wählen, dann ist dieser Bruch kleiner als $1$, und die Simulation terminiert also innerhalb von

\begin{align*} 2C \cdot |\enc(M)| \cdot s(|x|+m) \leq t(|x|+m) = b \end{align*}

Schritten. Das heißt, dass die universelle Turingmaschine $U$ das Wort $\enc(M)x1^m$ innerhalb von $b$ Schritten ablehnt, wenn sie es überhaupt irgendwann ablehnt. Also schließen wir weiter:

\begin{align*} x1^m \in \bnegdiag & \Longleftrightarrow \enc(M) 1^b 0 x1^m \not \in \bhalt \\ &\Longleftrightarrow U \textnormal{ akzeptiert $\enc(M)x1^m$ nicht innerhalb von $b$ Schritten} \\ &\Longleftrightarrow U \textnormal{ lehnt $\enc(M)x1^m$ innerhalb von $b$ Schritten ab} \tag{weil $b$ groß genug}\\ &\Longleftrightarrow U \textnormal{ lehnt $\enc(M)x1^m$ ab} \\ & \Longleftrightarrow M \textnormal{ lehnt $x1^m$ ab} \\ \end{align*}

und da ist er, der Widerspruch: $x1^m \in \bnegdiag \Longleftrightarrow f_M(x1^m) = \texttt{reject}$, entgegen unserer Annahme, dass $M$ die Sprache $\bnegdiag$ entscheidet. \(\square\)

Zusammenfassend erhalten wir die "Rohversion" des Zeithierarchiesatzes:

Theorem(Zeithierarchiesatz, Rohversion). Seien $s, t: \N \rightarrow \N$ zeitkonstruierbare Funktionen mit $s(n) \geq n$ und $s \in o(t)$ (also $\lim_{n \rightarrow \infty} s(n)/t(n) = 0$). Dann gilt

\begin{align*} \TIME_k(s) \subsetneq \TIME_{k+3}(t) \end{align*}

für alle $k \geq 1$.

Zusammen mit der Simulation von $k$-Band-TMs durch $2$-Band-TMs, also folgt nun

\begin{align*} \TIME(s) \subsetneq \TIME_2(s \log s) \subsetneq \TIME_5(t \log t) \end{align*}

oder, alternativ ausgedrückt:

Theorem (Zeithierarchiesatz). Seien $s, t: \N \rightarrow \N$ mit $s(n) \geq n$ und $s \log s \in o(t)$. Dann gilt $\TIME(s) \subsetneq \TIME(t)$.

Bitte beachten Sie, dass wir diese Version nicht vollständig bewiesen habe, da ich die effizientere Simulation einer $k$-Band-Turingmaschine durch eine $2$-Band-Turingmaschine, also $\TIME_k(t) \subseteq \TIME_2(t \log t)$ nicht erklärt habe. Mit der ineffiziten, also $\TIME_k(t) \subseteq \TIME_1(t^2)$, erhalten wir einen Zeithierarchiesatz solange $s^2 \in o(t)$ ist.

Übungsaufgabe Zeigen Sie, dass $n \mapsto n^2$ und $n \mapsto 2^n$ zeitkonstruierbar sind.