Einführung in die Theoretische Informatik Dalitz 3.2 3.3 Prof. Dr. Christoph Dalitz Hochschule Niederrhein Skript zur Vorlesung THI – Version 0.7 Zusammenfassung Während die meisten Teilbereiche der Informatik sich der handwerklichen Frage widmen, wie ein konkretes Problem mit bestimmten konkreten Hilfsmitteln gelöst werden kann, stellt die theoretische Informatik die philosophische Frage, welche Probleme überhaupt mit Rechnern gelöst werden können und wie man diese Probleme klassifizieren kann. Dieses Script gibt eine Einführung in die Themen Berechenbarkeit, Komplexität und formale Sprachen. 1 2 3 Mathematische Allgemeinbildung 0.1 Definition, Aussage, Satz . . . 0.2 Beweismethoden . . . . . . . 0.2.1 Gegenbeispiel . . . . . 0.2.2 Direkter Beweis . . . 0.2.3 Indirekter Beweis . . . 0.2.4 Induktionsbeweis . . . Analyse eines Algorithmus . . . . . . . . Komplexitätsklassen . . . . . . . . . . . 3.3.1 Polynomial versus Exponentiell . 3.3.2 Klassenüberblick . . . . . . . . . 3.3.3 Die Klasse P . . . . . . . . . . . 3.3.4 Die Klasse N P . . . . . . . . . . 3.3.5 Eigenschaften der Klasse N P . . 3.3.6 NP-Vollständigkeit . . . . . . . . 3.3.7 Weitere NP-vollständige Probleme Version Datum 0.5 2004.03.17 0.6 2005.02.10 . . . . . . 2 2 4 4 4 5 5 Einführung 1.1 Rechner Input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Was sind Probleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 7 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Berechenbarkeit 2.1 Berechenbarkeitsbegriff . . . . . . . . . . . . . . . . . . 2.2 Existenz unlösbarer Probleme . . . . . . . . . . . . . . 2.3 Turing Maschinen . . . . . . . . . . . . . . . . . . . . . 2.4 Turing-Maschinen und Computer . . . . . . . . . . . . . 2.5 Turing-Berechenbarkeit . . . . . . . . . . . . . . . . . . 2.6 Das Halteproblem . . . . . . . . . . . . . . . . . . . . . 2.6.1 Codierung von Turing-Maschinen als Binärstring 2.6.2 Das spezielle Halteproblem . . . . . . . . . . . 2.6.3 Das allgemeine Halteproblem . . . . . . . . . . 2.7 Weitere unentscheidbare Probleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 9 9 10 11 11 12 12 13 14 15 Komplexität 16 3.1 Maße für Komplexität . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1 FH Niederrhein . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 17 17 19 19 21 23 24 26 Version und Änderungen Inhaltsverzeichnis 0 THI 0.7 2007.07.11 Autor Änderung Dalitz Ersterstellung Kap. 1-3 aus Mitschrift Karsten Dalitz Anpassung Definition Landau-Symbole an Definition aus GDI (Rethmann) Dalitz Korrektur kleinerer Tippfehler 0 Mathematische Allgemeinbildung 0.1 Definition, Aussage, Satz Definitionen beschreiben Objekte und Begriffe. Sie sind im Prinzip willkürlich wählbar, aber: • sollen sinnvoll sein, d.h. tatsächlich Objekte beschreiben, mit denen man arbeiten will • sollen allgemein sein, d.h. nur die wesentlichen abstrakten Eigenschaften erfassen Oft ist das Finden geeigneter Definitionen ein schwieriger Prozess (Beispiel: Wahrscheinlichkeitsgrundlagen: >300 Jahre). Eine gefundene Definition ist oft nicht unmittelbar einsichtig. Als Beispiel dafür betrachten wir die Definition der “Mächtigkeit” (“Größe”) einer Menge. Definition 0.1 (gleichmächtige Mengen) Zwei Mengen heißen gleichmächtig (gleich groß), wenn es eine Eins-zu-Eins-Abbildung (Bijektion) zwischen ihnen gibt. Tipps bei Verständnisschwierigkeiten: a) Anhand einfacher Beispiele die anschauliche Bedeutung erfassen b) Versuchen, eine eigene “naive” Definition zu formulieren 2 FH Niederrhein THI Aussage 1 ist “hinreichend und notwendig” für Aussage 2 (Um solch eine “Äquivalenzaussage” zu beweisen, müssen immer beide Richtungen bewiesen werden!) Dalitz FH Niederrhein THI Dalitz d) Die Aussage für die Gleichheit von Mengen A, B : A = B beinhaltet zwei Teilaussagen: A ⊆ B und B ⊇ A (beide müssen bewiesen werden) Äquivalenzaussagen können gegebenenfalls auch als alternative Definitionen verwendet werden. Z.B. können die Begriffe “endlich” und “unendlich” auf verschiedene Arten definiert werden. gleichmächtig (Paarbildung geht auf) nicht gleichmächtig (Paarbildung geht nicht auf) Abbildung 1: Anwendung der Definition “gleichmächtiger” Mengen c) Schwächen der eigenen Definition finden um einzusehen, warum eine “komplizierte” Definition gewählt wurde Anwendung auf Definition der “Mächtigkeit”: Definition 0.2 (endlich und unendlich) Eine Menge A heißt endlich, wenn es eine Zahl n ∈ N gibt, so dass A gleichmächtig zu {1, 2, . . . , n} ist. Andernfalls heißt A unendlich Satz 0.1 Eine Menge ist unendlich ⇔ Es gibt eine echte Teilmenge, die gleichmächtig zur Menge selber ist. Manche Autoren verwenden Satz 0.1 als Definition der Unendlichkeit. Dann wird die Definition 0.2 zu einer (beweisbaren) Aussage. zu a) siehe Abb. 1 zu b) “naive” Definition: “gleiche Anzahl Elemente” zu c) Die naive Definition klappt nicht bei unendlichen Mengen! ⇒ Ungeeignet, weil nicht allgemein genug Oft ist nicht klar, ob eine Aussage wahr oder falsch ist. Wenn man eine Vermutung über den Wahrheitswert hat, kann man versuchen, dies zu beweisen. Als wahr bewiesene Aussagen heißen Satz oder Theorem. Sätze, die nur zum Beweis anderer Sätze dienen, werden manchmal auch Hilfssatz oder Lemma genannt. Über definierte Objekte und Begriffe werden mathematische Aussagen gemacht. Aussagen sind wahr oder falsch. 0.2 Beweismethoden Beispiele für Aussagen: 5 ∗ 3 = 10 Die Mengen A und B sind gleich groß. 0.2.1 Gegenbeispiel Ein Gegenbeispiel zeigt, dass eine Aussage falsch ist. Es reicht, ein einziges Gegenbeispiel anzugeben. Beispiele für keine Aussagen: 1 + 20 Sei A eine Menge. So kann die Aussage “Jede ungerade Zahl ist eine Primzahl” durch das Gegenbeispiel: “33 ist durch 3 teilbar und ungerade” widerlegt werden. Typische Formen von Aussagen: a) Aussage 1 ⇒ Aussage 2 d.h. Aussage 1 “ist hinreichend” für Aussage2 0.2.2 b) Aussage 1 “ist notwendig” für Aussage 2 heißt: wenn A2 gilt, dann muss auch A1 gelten, d.h. A2 ⇒ A1 Beginne mit den Voraussetzungen und folgere mit Hilfe als wahr bekannter Aussagen die Behauptung. c) Aussage 1 ⇔ Aussage 2 Aussage 1 gilt “genau dann wenn” Aussage 2 gilt Als Beispiel wolle wir die de Morgansche Regel A ∪ B = A ∩ B beweisen. Dazu sind zwei Aussagen zu zeigen: 3 Direkter Beweis 4 Dalitz THI FH Niederrhein a) A ∩ B ⊆ A ∪ B Dalitz THI Gesamtsumme: 2+2+2=6 b) A ∩ B ⊇ A ∪ B FH Niederrhein Gesamtsummme: 1+3+1+1=6 Beweis von a): x∈A∪B ⇒ x∈ / A∪B ⇒x∈ / A und x ∈ /B ⇒ x ∈ A und x ∈ B ⇒ x∈A∩B Beweis der Umkehrung b): Übung Abbildung 2: Summe der ausgehenden Kanten b) Nimm an, dass die Aussage(n) wahr ist und folgere daraus, dass die Aussage(n + 1) wahr ist Als Beispiel wollen wir einen einfachen Satz über Graphen beweisen (siehe Abb. 2). 0.2.3 Satz 0.2 Die Gesamtsumme der an allen Knoten eines Graphen ausgehenden Kanten ist gerade. Indirekter Beweis Nimm an, dass eine Aussage falsch ist (d.h. das Gegenteil ist richtig) und folgere daraus eine falsche Aussage. Typisches Beispiel: Folgerung, dass es nicht regnet, weil ein Eintretender trocken ist. Aussage: S sei eine endliche Teilmenge einer unendlichen Menge U . Daraus folgt: T = U \ S ist unendlich. Beweis durch Widerspruch: Beweis durch Induktion über die Anzahl der Kanten: a) 0 Kanten ⇒ Summe=0, also gerade b) Die Summe sei gerade; für jede weitere hinzugefügte Kante kommen zwei Enden hinzu. Damit bleibt die Summe der Kanten gerade. Ein anderes Beispiel aus der Informatik ist der Beweis für die Korrektheit des Zwei-PhasenSperrprotokolls zur Nebenläufigkeitskontrolle (vgl. Vorlesung “Datenbanksysteme”). Voraussetzungen wie in der oben genannten Aussage, d.h. S ⊆ U , U ist unendlich und |S| = n ∈ N Annahme: T = U \S ist endlich, d. h. |T | = m ⇒ |U | = n + m wegen U = T ∪ S und T ∩ S = ∅ (⇔ T = U \ S) ⇒ Die Aussage “U ist endlich” führt zum Widerspruch zur Voraussetzung. √ / Q. Einen Ein anderes, aus der Schulmathematik bekanntes Beispiel ist der Beweis, dass 2 ∈ indirekten Beweis für diese Aussage findet man in [3] Kap. 0.4. 0.2.4 Induktionsbeweis Der Induktionsbeweis ist bei Aussagen über induktiv definierte Mengen, z.B. N, anwendbar. Induktive Definition von N: • 0∈N • mit n ∈ N ist auch n + 1 ∈ N Beweisverfahren: a) Zeige, dass die Aussage für n = 0 wahr ist (ggf. auch n = 1 oder n = 2 . . .) 5 6 Dalitz THI FH Niederrhein Dalitz THI Σ1 1 Einführung Σ2 y1 1.1 Rechner Input x y2 y3 Abbildung 3: In einer Relation können einem x-Wert mehrere y-Werte zugeordnet sein. Rechner bekommen als Input Strings (Wörter) über einem Alphabet und geben auch wieder Strings aus. Dazu wollen wir ein paar grundlegende Begriffe definieren. x Ein Alphabet Σ ist eine endliche Zeichenmenge. Beispiele: Σ1 = {a, b, . . . , z}, Σ2 = {0, 1} −→ Algorithmus −→ y Beispiel a) Primfaktorzerlegung von n ∈ N Ein String (oder Wort) x ist eine endliche Zeichenfolge über einem Alphabet. Beispiele: x1 = abrakadabra, x2 = 0010 Σ1 = {0, 1, . . ., 9} x = Dezimaldarstellung von n Σ2 = {0, 1, . . ., 9, |} (“|” = Trennzeichen) y = a1 |a2 | . . . |ak Die Länge eines Strings, symbolisch |x|, ist die Anzahl der Zeichen. Beispiele: |x1 | = 11, |x2 | = 4 Der Leerstring ε (griechischer Buchstabe “epsilon”) ist der String der Länge Null. Zwei Strings x und y können konkateniert werden. Das Ergebnis z ist wieder ein String. Schreibweisen: z = xy FH Niederrhein xx . . . x} = xk | {z k-mal Eine Permutation des Ergebnisses ist möglich, es gibt deshalb mehrere mögliche Antworten y zu x. Dieses Problem ist formulierbar als Relation R auf Σ∗1 × Σ∗2 (Abb. 3): (x, y) ∈ R ⇔ y ist Primfaktorzerlegung von x In diesem Fall kann die Relation eindeutig gemacht werden, indem die Faktoren im Ergebnis der Größe nach sortiert werden (Satz von der eindeutigen Primfaktorzerlegung). Dann ist das Problem als Funktion f : Σ∗1 → Σ∗2 formulierbar. Es gilt |xy| = |x| + |y| Die Menge aller Strings über einem Alphabet Σ wird mit Σ∗ bezeichnet. Anmerkungen: Beispiel b) Primzahltest a) Σ∗ ist abzählbar unendlich (Übung) b) Die Menge aller Teilmengen (“Potenzmenge”) von Σ ist etwas anderes als Σ∗ . Insbesondere ist die Potenzmenge(Σ) für endliches Σ endlich, die Menge aller Strings aber unendlich, weil keine Grenze für die Stringlänge festgelegt ist. ∗ ∗ Eine Sprache L ist eine Teilmenge von Σ , d.h. irgendeine Menge von Strings über Σ (L ⊆ Σ ). Beispiele für Sprachen: a) Menge aller C-Programme. Dabei ist das Alphabet Σ = {a − z, A − Z, ; , . . .} b) Menge der Primzahlen Σ = {0, 1} L = {x|x ist Binärdarstellung einer Primzahl} 1.2 Was sind Probleme Σ1 = {0, 1, . . . , 9} Σ2 = {0, 1} x = Dezimaldarstellung von n ∈ N y = 0, wenn x faktorisierbar; y = 1, wenn x Primzahl Dieses Problem ist formulierbar als Funktion f : Σ∗1 → {0, 1} Beispiel a) ist ein Suchproblem. Beispiel b) ist ein Entscheidungsproblem. Der Primzahltest kann als Entscheidungsvariante des Suchproblems Primfaktorzerlegung aufgefasst werden. Im allgemeinen ist die Suchvariante eines Problems komplexer als die Entscheidungsvariante. So ist z.B. für den Primzahltest ein polynomialer Algorithmus bekannt [8], für die Primfaktorzerlegung jedoch nicht. Für wiederum andere Beispiele lässt sich zeigen, dass die Suchvariante nicht “wesentlich” komplexer als die Entscheidungsvariante ist (siehe [5] Kap. 3.6). Entscheidungsprobleme können als Spracherkennung interpretiert werden, d.h. für ein gegebenes x ∈ Σ∗ ist gefragt, ob x ∈ L. In dieser Vorlesung beschränken wir uns meist auf Entscheidungsprobleme. Ein Problem besteht darin, zu einem gegebenen Inputstring x ∈ Σ∗1 (Frage) eine Outputstring y ∈ Σ∗2 (Antwort) zu ermitteln: 7 8 Dalitz THI FH Niederrhein 2 Berechenbarkeit Dalitz THI FH Niederrhein Annahme: es gibt Abzählung f1 : 0 0 1 0 0 1 1 0 0 0 . . . f2 : 0 1 0 0 0 0 0 0 1 0 . . . f3 : 1 0 0 0 1 0 0 0 1 0 . . . .. . 2.1 Berechenbarkeitsbegriff siehe Folien Kap2a dort wird auch die Churchsche These erläutert. Konstruiere nun eine weitere Funktion fneu nach folgender Regel: fneu (xk ) 6= fk (xk ) 2.2 Existenz unlösbarer Probleme Wir zeigen: Es gibt mehr Probleme als Algorithmen. Dazu machen wir lediglich die Annahme, dass sich Algorithmen in irgendeiner Programmiersprache formulieren lassen. D.h. wir gehen vom “Software-Ansatz” aus (“WHILE/GOTO-Berechenbarkeit”), machen aber keine Annahme über die konkret benutzte Programmiersprache. Algorithmus = Programm = String über einem Alphabet Σ Satz 2.1 Die Menge Σ∗ aller Strings über einem Alphabet Σ ist abzählbar unendlich: card(Σ∗ ) = card(N) d.h. es gibt eine Eins-zu-Eins-Zuordnung (Bijektion) zwischen Σ∗ und den natürlichen Zahlen. Beweis: Übung Satz 2.2 Die Menge F aller Funktionen F := {f : Σ∗ → {0, 1}} ist größer als die Menge der Strings über Σ: card(F) > card(Σ∗ ). Im obigen Beispiel wäre also fneu : 101 . . .. Dann ist fneu verschieden von allen fk aber fneu ∈ F. Das ist ein Widerspruch zur Annahme, dass (fk ) eine Aufzählung von F ist. Als Konsequenz aus Satz 2.2 können wir schließen, dass es mehr Entscheidungsprobleme als Algorithmen (Programme) gibt, denn {alle Programme} ⊆ Σ∗ . 2.3 Turing Maschinen Alan Turing (1937): allgemeines Rechnermodell unendliches Band als Speicher Kontrolleinheit # # a1 a2 endliche Zustandsmenge # a3 # # beweglicher Schreib− und Lesekopf Bemerkungen: a) F ist die Menge der Entscheidungsprobleme b) Da F größer ist als eine abzählbare Menge, sagt man auch: F ist überabzählbar. Beweisidee: • Nimm an, es gäbe eine Bijektion Σ∗ ↔ F • Konstruiere mit dem Cantorschen Diagonalverfahren ein f ∈ F, das nicht zugeordnet ist • ⇒ Widerspruch (indirekter Beweis) Wegen Satz 2.1 existiert eine Abzählung x1 , x2 , x3 , . . . der Strings in Σ∗ . Eine gegebene Funktion f ∈ F kann also als Folge von 0 und 1 notiert werden: f: Σ Γ⊇Σ ] ∈ Γ \ Σ, das heißt ] ∈ /Σ Q q0 ∈ Q F ⊆Q Bemerkungen: a) Das Blank-Symbol wird je nach Autor unterschiedlich dargestellt: in [4] durch B, in [3] durch , in [2] und [1] durch Beweis: x1 x2 x3 x4 0 0 1 0 Inputalphabet: Bandalphabet: Blank-Zeichen: Zustandsmenge: Startzustand: Endzustände: ... b) typischerweise ist F = {qaccept , qreject }, . . . c) q0 hat nichts mit der Eingabe zu tun, sondern ist der Zustand, in dem die Maschine vor dem Lesen des ersten Inputzeichens ist. Ein Arbeitsschritt der Turing-Maschine im Zustand q ∈ Q: 9 10 Dalitz THI FH Niederrhein Dalitz THI FH Niederrhein • Lies a ∈ Γ aus der Bandzelle Nur a) ist eine brauchbare Berechnung. • Schreibe b ∈ Γ in die Bandzelle Definition 2.1 (Turing-berechenbar) Eine Funktion f : Σ∗ −→ Σ∗ heißt Turing-berechenbar, wenn es eine Turing-Maschine gibt, die für alle x in endlich vielen Schritten f (x) berechnet. • Gehe eine Zelle nach rechts oder eine Zelle nach links • Gehe über in den Zustand q 0 ∈ Q wird formal beschrieben durch die Übergangsfunktion δ: δ: (q, a) −→ (q 0 , b, x) δ: Q × Γ −→ Q × Γ× {L, R} Definition 2.2 (entscheidbar) Eine Sprache L ⊆ Σ∗ heißt entscheidbar (decidable), wenn ihre charakteristische Funktion 1 für x ∈ L χL (x) = 0 für x ∈ /L berechenbar ist. wobei x= Übertragung auf Sprachen bzw. Entscheidungsprobleme: L für Bewegung nach links R für Bewegung nach rechts Bemerkungen: Eine Turing-Maschine wird also definiert durch das Tupel (Q, Σ, Γ, δ, q0 , F ). Beispiel (Vergleichsoperator): siehe Folien Kap2b a) Semi-entscheidbare (recognizable, rekursiv aufzählbare) Sprache: Für x ∈ / L darf die Turing-Maschine loopen. 2.4 Turing-Maschinen und Computer b) Unentscheidbar heißt nicht, dass alle Instanzen des Problems unlösbar sind, sondern: Es gibt keinen Algorithmus (Turing-Maschine), der alle Instanzen löst. siehe Folien Kap2c 2.6 Das Halteproblem 2.5 Turing-Berechenbarkeit Alternativen bei der Anwendung einer Turing-Maschine auf einen Input x ∈ Σ∗ : a) nach endlich vielen Schritten wird ein Endzustand erreicht und das Ergebnis ausgegeben Gegeben ist eine Turing-Maschine und ein Input. Kommt diese Turing-Maschine in endlich vielen Schritten zum Halt? Im Folgenden wird gezeigt, dass dieses allgemeine Halteproblem unentscheidbar ist. Vorgehen: • Codierung für Turing-Maschinen mit Σ = {0, 1} b) die Berechnung läuft ewig (Loop) • Betrachte das spezielle Halteproblem (Input zur Turing-Maschine ist ihr eigener Code) und zeige Unentscheidbarkeit • Führe das spezielle Halteproblem durch Reduktion auf das allgemeine Halteproblem zurück. Wenn spezielles Problem unlösbar, dann auch das allgemeine. 2.6.1 Codierung von Turing-Maschinen als Binärstring Σ = {0, 1} Q = {q1 , q2 , . . . , qk } Γ = {a1 , a2 , . . . , am } = {0, 1, ], a4 , . . . , am } Richtungen = {L, R} =: {D1 , D2 } 11 k, m ∈ N beliebig 12 Dalitz THI FH Niederrhein Dalitz THI FH Niederrhein Codierung eines Übergangs der Übergangsfunktion δ: δ(qi , aj ) = (qk , al , Dm ) → 0i 10j 10k 10l 10m Die Übergangsfunktion δ wird durch endlich viele solcher Zuordnungen beschrieben. Das führt insgesamt zu endlich vielen Codes {C1 , C2 , . . . , Cn }. In der Gesamtcodierung müssen diese Codes durch ein Trennzeichen getrennt werden, das in den Ci nicht vorkommen kann, z.B. “11”. Damit ergibt sich die Codierung der Turing-Maschine C1 11C2 11 . . . Cn−1 11Cn Satz 2.3 Das spezielle Halteproblem Hspez ist unentscheidbar. Bemerkungen: a) Ein Programm auf seinen eigenen Code anzusetzen ist nichts Anrüchiges (Beispiel: Compiler). b) Das heißt nicht, dass das Halteproblem für eine konkrete gegebene Turing-Maschine unentscheidbar ist, sondern dass es keinen Algorithmus gibt, der das Problem allgemein löst. Bemerkungen: a) Dies ist ein mögliches Codierungsschema. Andere Autoren verwenden andere Schemen. Wesentlich für die folgenden Überlegungen ist nur, dass es eine Codierung gibt. Beweis (indirekt) von Satz 2.3: Angenommen Hspez wäre entscheidbar durch eine Turing-Maschine M, d.h. 0 wenn Mx (x) nicht hält Ausgabe von M : 1 wenn Mx (x) hält b) Die Codierung einer Turingmaschine wird manchmal auch die Gödelnummer der Turingmaschine genannt. c) Unser Codierungsschema ist nicht eindeutig: pro Turing-Maschine sind mehrere Codierungen möglich. Erweitere nun M zu M0 wie folgt: d) Umgekehrt ist aber eine Turing-Maschine durch ihre Codierung eindeutig beschrieben M0 : • δ ist festgelegt Daraus folgt: • card(Γ) und card(Q) lassen sich ermitteln (Übung) % 0 −→ Halt und 0 ausgeben & 1 −→ Endlosschleife Ausgabe von M0 : Was leistet die Codierung? • Zeigt, dass es abzählbar unendlich viele Turing-Maschinen gibt 0 wenn Mx (x) nicht hält ansonsten Endlosschleife M0 hat auch eine Codierung x0 . Dann gilt: • Programmcode einer Turing-Maschine M0 angesetzt auf x0 hält ⇔ M angesetzt auf x0 gibt 1 aus ⇔ Mx0 angesetzt auf x0 hält nicht ⇔ M0 angesetzt auf x0 hält nicht • Codierung selbst kann von Algorithmen (Turing-Maschinen) bearbeitet werden Nicht jeder String x ∈ {0, 1}∗ ist Codierung einer Turing-Maschine (siehe Übung). Wir können aber formal jedem String x ∈ {0, 1}∗ eine Turing-Maschine zuweisen: M, wenn x Codierung von M ist Mx := M̂, wenn x keine Codierung einer Turing-Maschine ist wobei M̂ die Turing-Maschine ist, die für jeden Input sofort hält und nichts ausgibt. x −→ M Dies ist ein Widerspruch und somit kann die Annahme nicht stimmen, dass es die Turing-Maschine M gibt. 2.6.3 Das allgemeine Halteproblem Das allgemeine Halteproblem wird definiert durch die Sprache 2.6.2 Das spezielle Halteproblem Hallg := {x]y | x, y ∈ {0, 1}∗ und Mx mit Input y hält} Das spezielle Halteproblem ist die Frage, ob eine Turing-Maschine mit ihrer eigenen Codierung als Input zum Halt kommt. Es ist also definiert durch die Sprache Hspez := {x ∈ {0, 1}∗ mit Mx angesetzt auf x hält} 13 14 Dalitz THI FH Niederrhein Dalitz THI Unterschied zum speziellen Halteproblem: Input ist nicht nur der eigene Code, sondern kann jeder beliebige String sein. 3 Komplexität Satz 2.4 Das allgemeine Halteproblem Hallg ist unentscheidbar. 3.1 Maße für Komplexität FH Niederrhein Bei einem Algorithmus interessiert: Beweis: a) Laufzeit (Time Complexity) = Anzahl der Arbeitsschritte einer Turing-Maschine Wäre Hallg eintscheidbar, dann auch Hspez , was aber im Widerspruch zu Satz 2.3 steht. Denn eine Turing-Maschine, die Hallg entscheidet, kann auch Hspez entscheiden, indem ihr als Input x]x übergeben wird. b) Speicherbedarf (Space Complexity) = Anzahl benötigter Bandzellen der Turing-Maschine + Anzahl der “Speicherzellen” in der Kontrolleinheit Die Komplexität hängt vom konkreten Inputstring x ab. Bemerkungen zum Beweisverfahren: • Allgemeine Methode der Reduktion eines Problems auf ein anderes • Ein Spezialfall würde als unentscheidbar gezeigt, dann ist die allgemeinere Situation erst recht unentscheidbar. Man schreibt auch Hspez ≤ Hallg , d.h. die Lösung von Hallg kann zur Lösung von Hspez verwendet werden. time = time(x) space = space(x) Interessant ist das Verhalten im schlimmsten Fall (worst case) und mittleren Fall (average case). Diese Werte hängen von der Eingabegröße n = |x| ab. timewc (n) := max{time(x) mit |x| = n} X timeac (n) := P (x) · time(x) x∈Σ∗ mit |x|=n 2.7 Weitere unentscheidbare Probleme Problem beim “average case” ac: Wahrscheinlichkeitsverteilung P(x). Typischerweise wird eine Gleichverteilung angenommen. Das muss in der Praxis nicht die tatsächliche Verteilung sein, z.B. sind die Folgen beim Sortieren oft teilsortiert. siehe Folien Kap2d Bemerkungen: a) Manchmal interessiert die Anzahl einer bestimmten Operation, z.B. beim Sortieren die Anzahl der Vergleiche oder die Anzahl der Wertzuweisungen. b) Aufpassen bei der Eingabegröße, z.B. ist bei der Primfaktorzerlegung von z ∈ N die Eingabegröße (Bitlänge) n = log2 (z) Speziell von Interesse ist die Komplexität eines Algorithus für große Eingaben, also das asymptotisches Verhalten für n → ∞. Formal wird dieses Verhalten erfasst mit den Landau-Symbolen Groß-O und Θ Groß-Theta Beispiel: 15 f (n) = 6n2 + 2n2 + 20n + 45 ∈ O(n3 ) n→∞ heißt: “f ∼ const · n3 oder schwächer” 16 Dalitz THI FH Niederrhein Diese Notation vergleicht das asymptotische Verhalten von zwei Funktionen miteinander. Definition 3.1 (Landau-Symbole) Für f, g : N −→ R+ gilt f (n) ∈ O(g(n)), wenn es ein c, n0 ∈ N gibt, so dass f (n) ≤ c · g(n) für alle n ≥ n0 Für f, g : N −→ R+ gilt f (n) ∈ Θ(g(n)), wenn es ein c1 , c2 , n0 ∈ N gibt, so dass c1 · g(n) ≤ f (n) ≤ c2 · g(n) für alle n ≥ n0 Groß-O entspricht also einer asymptotischen Abschätzung nach oben und Θ einer asymptotischen “Gleichheit”. Tatsächlich sind die Landau-Symbole etwas allgemeiner als die asymptotische Gleichheit: es gilt zwar f (n) < ∞ ⇒ f (n) ∈ O(g(n)) g(n) f (n) 0 < lim < ∞ ⇒ f (n) ∈ Θ(g(n)) n→∞ g(n) lim n→∞ Dalitz THI FH Niederrhein Wie große Probleme sind in derselben Zeit bei doppelter Rechenleistung lösbar? √ √ 2t = 2n2 = ( 2n)2 = a( 2n) = 2 · 2m = 2m+1 = b(m + 1) Bei a werden die Eingaben bei einer Verdoppelung der Rechenleistung vielfach größer, bei b nur um ein Bit. Dies legt die Bewertung nahe, dass polynomiale Laufzeiten effizient und exponentielle Laufzeiten ineffizient (intractable) sind. Definition 3.2 Eine Laufzeit f (n) heißt polynomial, wenn f (n) ∈ O(nk ) für irgendein k ≥ 0. k Gilt dagegen f (n) ∈ Θ(2cn ) für irgendwelche c, k > 0, so heißt die Laufzeit exponentiell. Bemerkungen: a) 2cn wächst stärker als jede Potenz, d.h. nk =0 für alle c, k > 0 2cn b) Die Basis ist im exponentialen Verhalten egal, denn lim n→∞ aber die Umkehrung gilt nicht (Übung). Beispiele: 0 2cn = ac n 3 2 a) f (n) = 5n + 2n + 7 Es ist f (n) ∈ O(n3 ) f (n) ∈ / O(n2 ) 20 f (n) ∈ O(n ) f (n) ∈ Θ(n3 ) b) Logarithmus: f (n) ∈ O(log2 n) ⇐⇒ f (n) ∈ O(log10 n) denn: logb n = log2 n/ log2 b (Übung) ⇒ Die Basis kann bei O-Notation weggelassen werden. 3.2 Analyse eines Algorithmus c) Damit sind nicht alle möglichen Laufzeitverhalten abgedeckt: so gibt es noch Laufzeiten 2 zwischen polynomial und exponentiell (z.B. O(2log (n) ) und überexponentielle Laufzeiten. Exponentiale Laufzeiten treten meist beim Brute-Force Vorgehen auf, d.h. beim Durchprobieren aller möglichen Lösungen. Ein typisches Beispiel ist die Primfaktorzerlegung: Input (Binärdarstellung von z ∈ N) der Länge n entspricht der Zahl z ≈ 2n . Alles durchzuprobieren heißt: O(2n ) Schritte. Ein großer Vorteil der groben Einteilung der Algorithmen in “polynomiale” und “exponentielle” besteht darin, dass diese Eintilung nicht vom Maschinenmodell abhängt. Satz 3.1 (Erweiterte Churchsche These) Alle “vernünftigen” Rechnermodelle, mit denen jeder berechenbare Funktion implementiert werden kann, sind polynomial äquivalent, d.h. sie können wechselseitig in polynomialer Zeit simuliert werden. siehe Folien Kap3a 3.3 Komplexitätsklassen 3.3.1 (siehe Übung) Bemerkungen: a) Beispielsweise kann eine Ein-Band Turing-Maschine in O(n2 ) eine Mehr-Band TuringMaschine simulieren. Polynomial versus Exponentiell Vergleiche zwei Algorithmen mit den Laufzeiten a(n) = n2 und b(n) = 2n . In einer gegebener Zeit kann ein Rechner insgesamt t Arbeitsschritte durchführen: b) “Nichtdeterministische” Maschinen (vgl. Literatur) sind nicht “vernünftig” bzw. nicht realistisch. t = a(n) = b(m) = n2 = 2m 17 18 Dalitz THI FH Niederrhein Dalitz THI c) Wie die Churchsche These selber ist auch diese Erweiterung nicht beweisbar, da der Begriff des “venünftigen Rechnermodells” nicht wohldefiniert wird. 3 5 1 3.3.2 4 Abbildung 4: Graph mit einem Pfad von Knoten 1 zum Knoten 5 2 Klassenüberblick siehe Folien Kap3b 3.3.3 FH Niederrhein 1 2 3 4 Die Klasse P Definition 3.3 (Klasse P) P = {alle Sprachen, die in polynomialer Zeit (Turing-) entscheidbar sind} 1 0 0 1 0 2 0 0 1 0 3 1 1 0 1 4 0 0 1 0 als String: Zeile1 ’\n’ Zeile2 . . . (Bei ungerichteten Graphen ist genau genommen nur das obere Dreieck erforderlich.) Vorteile: Das heißt für L ∈ P existiert eine Turing-Maschine, die für alle x ∈ Σ∗ mit |x| = n in O(nk ) Schritten entscheidet, ob x ∈ L. • eleganter Der Nachweis von “L ∈ P ” erfolgt durch Angabe eines solchen polynomialen Algorithmus: • verallgemeinerbar auf gerichtete und gewichtete Graphen • leichter auszuwerten 1) Angabe der High-Level Schritte des Algorithmus und zeigen, dass die Anzahl dieser Schritte O(nk ) ist. “Vernünftige” Codierung: Stringlänge ist Polynom in Anzahl der Knoten m. Damit kann die Laufzeitangabe in m erfolgen. 2) Zeigen, dass jeder der High-Level Schritte in O(nl ) Schritten einer (Mehrband TuringMaschine realisiert werden kann. Beispiel für ein Problem in P ⇒ Gesamtlaufzeit O(nl ∗ nk ) = O(nn+l ) P AT H = {< G, s, t > |G ist ein Graph mit einem Pfad von s nach t} Idee: Notation für die Inputcodierung: < · >, z.B. < n > = Binärcodierung von n (n ∈ N abstraktes Objekt (Zahl)) Viele Probleme beziehen sich auf Graphen. Wie kann ein Graph codiert werden? Erinnerung: Graph = Knoten (nodes) und Kanten (edges) • Pfad hat höchstens eine Länge m • Markiere nacheinander alle Knoten, die von s aus in Pfaden der Länge 1, 2, . . . , m erreichbar sind Algorithmus auf den Input < G, s, t >: Codierung eines Graphen mit m Knoten: 1) Markiere s 2) Wiederhole bis nichts Neues mehr markiert wird: 3 1 Prüfe alle Knoten; wenn eine Kante (a, b) vom markierten a zum unmarkierten b existiert, dann markiere b. 4 2 Lösung 1: Knoten + Kanten: 4, (1, 3)(2, 3)(3, 4) P maximale Anzahl der Kanten: m−1 k=1 k = Lösung 2: Matrix m × m 19 3) Wenn t markiert ist: accept; sonst: reject Analyse der “High-Level” Schritte: m(m−1) 2 = m 2 1), 3) werden jeweils nur einmal ausgeführt 2) wird höchstens m-mal ausgeführt, da jedesmal mindestens ein Knoten markiert wird. ⇒ High-Level O(m) 20 Dalitz THI FH Niederrhein Dalitz THI FH Niederrhein Analyse der Einzelschritte: 1), 3) erfordern jeweils nur einmal lesen: O(m) (zu Position gehen) 2) Betrachte die Implementierung mit einem Matrix-Input: 1 Kante suchen: O(m2 ) m-mal durchführen ⇒ O(m3 ) Insgesamt ergibt sich eine Laufzeit von O(m · m3 ) = O(m4 ). Die Gesamtlaufzeit ist also polynomial, d.h. P AT H ∈ P . 3.3.4 Die Klasse N P 5 2 4 Abbildung 5: Graph mit einer 4er-Clique bestehend aus den Knoten 1,3,4,5 1) Angabe eines Zertifikats c Definition 3.4 (Verifier) Ein Verifier einer Sprache L ⊆ Σ∗ ist ein Algorithmus V mit L = {x ∈ Σ∗ | V akzeptiert < x, c > für irgendeinen String c ∈ Σ∗ } Mit anderen Worten: Ein Verifier erkennt eine Sprache L, indem er zusätzlich ein Zertifikat c als Beleg für die Mitgliedschaft von x in L als Input erhält. Beispiel a) UHAMPATH 2) Angabe eines Verifiers 3) Nachweis, dass der Verifier bei gegebenem < x, c > in O(|x|k ) bestätigt, dass x ∈ L Beispiel a) CLIQU E = {< G, k > | G ist Graph mit k-Clique} Eine Clique sind Knoten, die alle paarweise miteinander verbunden sind. Eine kClique ist eine Clique mit k Knoten (siehe Abb. 5). 1) Zertifikat: Clique siehe Folien Kap3c 2) Verifier: Prüfe, ob alle Paare in der Clique miteinander verbunden sind Beispiel b) Nichtprimzahlen COM P OSIT ES = {< z > irgendwelche 1 < p, q, ∈ N} 3 | N 3 z ist keine Primzahl, d.h. z = p · q für Zertifikat: ein Faktor p von z Verifier: Test ob z durch p teilbar ist Die Laufzeit eines Verifiers wollen wir nur in der Länge n = |x| (nicht in |c|) messen. Das heißt ein polynomialer Verifier hat eine Laufzeit O(|x|k ). Definition 3.5 (Klasse N P ) N P = {alle Sprachen, für die es einen Verifier mit polynomialer Laufzeit gibt} Bemerkungen: • Diese Definition ist die “moderne” Definition. 3) Laufzeit des Verifiers: m Knoten =⇒ | < G, k > | = O(m2 ) mit | < G > | = O(m2 ) und | < k > | = O(log m) Anzahl der Knoten in der Clique: k ≤ m = O(k 2 ) Anzahl der Kanten in der Clique: k2 = k(k−1) 2 Für jede Kante in der Clique muss der Input G gescannt werden, ob eine Kante vorhanden ist. ⇒ O(m2 ∗ m2 ) = O(m4 ) ⇒ CLIQU E ∈ N P Beispiel b) Jedes Problem in P ist auch in NP. L ∈ P ⇒ es gibt einen polynomialen Algorithmus A, der für x ∈ Σ∗ entscheidet, ob x ∈ L. Wir können also wählen: • Ältere Bücher verwenden meist die historische Definition über “nichtdeterministische” Turingmaschinen, von der auch die Bezeichung “NP” stammt: “Nichtdeterministische Polynomialzeit”. Zertifikat = ε (Leerstring) Verifier = A • Moderne und historische Definition von N P sind äquivalent (Beweis siehe [3]). Damit haben wir den folgenden Satz bewiesen. ⇒ L ∈ NP Nachweis, dass eine Sprache L ∈ N P : 21 22 Dalitz THI FH Niederrhein Dalitz THI NP− vollständig Satz 3.2 P ⊆ NP NP P 3.3.5 FH Niederrhein P = NP = NP− vollständig Eigenschaften der Klasse N P Frage: Ist das Erkennen einer Sprache L ∈ N P beliebig aufwändig? Antwort: Nein! Satz 3.3 k Jedes L ∈ N P kann in höchstens exponentieller Laufzeit O(2αn ) erkannt werden. P NP Σ∗ 3 x → Algorithmus Wie viele Zertifikate sind aber durchzuprobieren? Weil der Verifier innerhalb seiner Laufzeit das Zertifikat c lesen muss (|c| Schritte) muss die Länge des Zertifikats durch α · nk beschränkt sein. Die Anzahl aller möglichen Zertifikate ist also (beim Alphabet {0,1}) k durch 2α·n beschränkt. Als Gesamtlaufzeit des Brute-Force Algorithmus ergibt sich also k k k k O nk · 2αn = O 2log(n ) · 2αn = O 2αn +k log(n) αnk was O(2 0 NP Abbildung 6: Verhältnisse der Komplexitätsklassen zueinander Intuitiv sollte P 6= N P sein. Betrachte nämlich die Komplementbildung L := Σ∗ \L. Für L ∈ P gilt auch L ∈ P, denn: Alternative Beweise: a) Da es für jedes x ∈ L ein Zertifikat c für die Mitgliedschaft gibt, kann die Mitgliedschaft mittels Durchprobieren aller Zertifikate geprüft werden (Brute-Force Verfahren). Die Überprüfung jedes einzelnen Zertifikats geht mit dem polynomialen Verifier in O(nk ) Schritten (n = |x| sei die Länge des Inputstrings). P % 1 für x ∈ L & 0 für x ∈ L mit Laufzeit O(|x|k ) Damit aber z.B. U HAM P AT H ∈ P , müssten wir in polynomialer Zeit verifizieren können, dass ein Graph keinen Hamiltonschen Pfad enthält. Die Überprüfung der Nichtexistenz sollte schwieriger sein als die Überprüfung der Existenz. Die Sprachen, deren Komplement in N P liegt, fasst man in einer eigenen Komplexitätsklasse coN P zusammen. Frage: Gibt es Kandidaten L ∈ N P aber eventuell L ∈ / P? Antwort: Ja! NP-vollständige Probleme. Abhängig von der Antwort auf die Frage, ob P 6= N P gibt es also die in Abb. 6 dargestellten Alternativen. 3.3.6 NP-Vollständigkeit 0 ) enspricht für ein geeignetes k > k. b) Benutze die historsiche Defintion über polynomiale nichtdeterministische TuringMaschinen und zeige, dass eine nichtdeterministische Turing-Maschine mit O(nk ) Schritk ten durch eine normale Turing-Maschine mit höchstens O(2cn ) Schritten simuliert werden kann. c) Benutze die Existenz NP-vollständiger Probleme (s.u.), für die exponentielle Entscheidungsalgorithmen bekannt sind. Frage: Gibt es entscheidbare Sprachen, die nicht in NP sind? Antwort: Ja! Man kann nämlich zeigen, dass Turing-Maschinen echt mehr Sprachen erkennen können, wenn man ihnen eine größere Laufzeitkomplexität zubilligt (Time-Hierarchie-Theorem, siehe [3]). Frage: Gibt es Probleme in N P , die nicht in P liegen? Antwort: Ungeklärt! (siehe [6] und [7]) 23 Definition 3.6 (polynomiale Reduktion) Die Sprache A ⊆ Σ∗ heißt polynomial reduzierbar auf die Sprache B ⊆ Σ∗ , symbolisch A ≤p B, wenn es eine in polynomialer Zeit berechenbare Funktion f : Σ∗ → Σ∗ gibt mit x ∈ A ⇐⇒ f (x) ∈ B für alle x ∈ Σ∗ . Wenn B einen Entscheidungsalgorithmus Decide hat, dann kann A wie folgt entschieden werden: Σ∗ 3 x −→ Construct −→ f (x) −→ Decide Satz 3.4 A ≤p B und B ∈ P =⇒ A ∈ P Beweis: 24 % Ja: & Nein: f (x) ∈ B =⇒ x ∈ A f (x) ∈ / B =⇒ x ∈ /A Dalitz THI FH Niederrhein A wird entschieden durch Decide(Construct(x)) | {z } f (x) k a) Construct hat eine polynomiale Laufzeit O(n ) mit n = |x| b) Decide hat eine polynomiale Laufzeit O(nm ) mit n = |f (x)| b) m a) ⇒ |f (x)| = O(|x|k ) ⇒ Decide(Construct(x)) hat die Laufzeit O((|x|k ) = O(|x|m∗k ), also polynomial. Dalitz THI a) Suche ein ähnliches Problem B 0 in einer Liste NP-vollständiger Probleme b) Zeige, dass B 0 ≤p B Einmal muss man aber für ein Problem die NP-Vollständigkeit direkt zeigen. Im Jahre 1971 erfolgte dies von C OOK und L EVIN für das Satisfiability Problem für Boolsche Ausdrücke. Boolsche Variablen: x ∈ {true, f alse} ≡ {1, 0} Boolsche Operatoren: ∨ (AND) ∧ (OR) · (NOT) ∧ 0 1 0 0 0 1 0 1 Beispiele: ∗ a) ∅ ≤p A für jede Sprache A 6= Σ (Beweis: Übung) b) Sei L ∈ P . Dann gilt für jede Sprache A 6= ∅ und A 6= Σ∗ : L ≤p A (Beweis: Übung) c) HAM P AT H ≤p U HAM P AT H siehe Folien Kap3d Definition 3.7 (NP-Vollständigkeit) Eine Sprache B heißt NP-vollständig, wenn 1) B ∈ N P 2) A ≤p B für alle A ∈ N P ⇒ ⇒ L ≤p B P = NP Satz 3.4 ⇒ 0 = 1 1 = 0 φ = (x ∧ y) ∨ (x ∧ z) Eine Boolsche Formel φ ist erfüllbar, wenn es Werte für ihre Variablen gibt, so dass φ = 1 sein kann. Das obige Beispiel ist erfüllbar durch Beweis: aus der Definition der NP-Vollständigkeit folgt L ∈ NP ∨ 0 1 0 0 1 1 1 1 Eine Boolsche Formel φ ist ein Ausdruck bestehend aus Boolschen Variablen und Operatoren. Beispiel: oder oder Das heißt, die Komplexität aller Probleme in NP ist mit einem NP-vollständigen Problem verknüpft. Insbesondere gilt Satz 3.5 B ist NP-vollständig und B ∈ P FH Niederrhein L∈P Wie beweist man NP-Vollständigkeit für eine Sprache B ∈ NP? Wenn man schon ein NPvollständiges Referenzproblem R hat, dann reicht es zu zeigen R ≤p B. Es gilt nämlich Satz 3.6 R ist NP-vollständig und R ≤p B ∈ NP ⇒ B ist NP-vollständig. x = 0, y = 1, z = 0 x = 1, y = 0, z = 1 ... Definition 3.8 (Satisfiability Problem) SAT = {< φ > | φ ist erfüllbare Boolsche Formel} Satz 3.7 (Cook-Levin) Das Satisfiability Problem ist NP-vollständig. Beweisskizze: siehe Folien. Zwei alternative Beweise sind in [3] gegeben. 3.3.7 Weitere NP-vollständige Probleme siehe Folien Kap3e Bemerkung: Die Voraussetzung B ∈ NP ist notwendig wegen Bedingung 1) der NP-Vollständigkeit. Beweis: R sei NP-vollständig und R ≤p B ⇒ für alle A ∈ N P ist A ≤p R und R ≤p B ⇒ A ≤p B weil “≤p ” transitiv ist (Übung) Praktisches Vorgehen bei einem Kandidaten B ∈ N P : 25 26 Dalitz THI FH Niederrhein Referenzen Index [1] Asteroth, Baier: Theoretische Informatik. Pearson Studium 2002 (1. Auflage) [2] Schöning: Theoretische Informatik - kurzgefasst. Spektrum 2000 (4. Auflage) [3] Sipser: Introduction to the Theory of Computation. PSW Publishing 1997 (1. Auflage) [4] Hopcroft, Motwani, Ullmann: Introduction to Automata Theory, Languages and Computation. Addison Wesley 2001 (2. Auflage) [5] Wegener: Theoretische Informatik - eine algorithmenorientierte Einführung. Täubner 1999 (2. Auflage) [6] Liste wichtiger offener mathematischer Probleme: http://www.claymath.org/prizeproblems/ [7] Reith, Vollmer: Wer wird Millionär? Komplexitätstheorie: Konzepte und Herausforderungen. c’t 2001/7 p. 240-251 [8] Matthes: Algebra, Kryptologie und Kodierungstheorie. Fachbuchverlag Leipzig 2003 (1. Aufglage) Alphabet, 7 Asymptotik, 17 average case, 16 polynomial reduzierbar, 25 polynomiale Laufzeit, 18 polynomiale Reduktion, 24 Primfaktorzerlegung, 18 Probleme, 7 Bandalphabet, 10 Boolsche Formel, 26 Brute-Force, 18, 23 Q (Zustandsmenge), 10 Cantorsches Diagonalverfahren, 9 charakteristische Funktion, 12 Churchsche These, 9 erweitert, 18 coNP (Komplexitätsklasse), 24 Cook-Levin Theorem, 26 recognizable, 12 rekursiv aufzählbar, 12 Satisfiability Problem, 26 semi-entscheidbar, 12 Σ, 7 Σ∗ , 7 Sprache, 7 entscheidbar, 12 String, 7 Länge, 7 leerer, 7 Suchproblem, 8 δ (Übergangsfunktion), 11 Entscheidungsproblem, 8 ε (Leerstring), 7 exponentielle Laufzeit, 18 Γ (Bandalphabet), 10 Gödelnummer, 13 Graph, 19 Θ (Landau-Symbol), 17 Turing Maschine, 10 Turing-berechenbar, 12 Halteproblem, 12 allgemeines, 14 spezielles, 13 Übergangsfunktion, 11 unendlich überabzählbar, 9 abzählbar, 9 unentscheidbar, 12 Komplexitätsmaße, 16 Landau-Symbole, 17 Menge der Primzahlen, 7 endlich, 4 Mächtigkeit, 2 Verifier, 21 worst case, 16 Zertifikat, 21 Zustandsmenge, 10 NP (Komplexitätsklasse), 21 NP-vollständig, 25 O (Landau-Symbol), 17 P (Komplexitätsklasse), 19 27 28