So. PNP, NP-Vollständigkeit. Erstmal wichtige organisatorische Nachricht.
Seit gestern, glaube ich. Gibt CCC-Tickets. Holt euch
eure Tickets. Wir haben ja letztes Jahr beim CCC.
Echt jetzt? Zwei, drei, vier. Okay,
CCC, großartiges Event, ist immer am CCH,
am Dammtor. Vier Tage Nerd-Kongress mit Bällebad und jeder Menge
spannende Vorträge und so.
Unbedingt hingehen
Und wenn ihr es euch leisten könnt, holt euch ein Support-Artikel,
dann ist das für die Leute ein bisschen günstiger,
die sich eben dann den vollen Preis nicht leisten können.
Großartiges Event, ich bin auf jeden Fall wieder da.
Jetzt zum eigentlichen heute. P-N-P, N-P-Vollständigkeit.
Wer hat Fragen zu P und N-P?
Ist euch das klar?
Was ist P
Genau. P sind all die Sprachen, die wir im Pudding
in mir der Zeit und deterministisch entscheiden können. Genau,
ich kriege eine Eingabe der Länge N und dann habe ich für irgendeinen Polynom P,
P von N viele Schritte Zeit, um zu sagen,
ob die Eingabe eine Jahrenstanz oder eine Nein-Instanz ist.
Perfekte Antwort, sehr gut. Ja. Ja,
man formuliert irgendwie, kann man den Polynom mit der Werderzeit quantifizieren.
Ja, NP kann man in polemieller Zeit verifizieren. Für NP gibt es einen Verifikationsalgorithmus,
das sich bei Vorgabe bei Vorlage der Eingabe der Länge N noch ein Zertifikat habe,
das von der Länge so in N hoch C ist,
für Engelkonstante C,
also nur polemiell lang in der eigentlichen Eingabe
Und dann gibt es noch ein anderes Publinomen,
sodass sich N hoch D viele Schritte brauchen darf,
um zu verifizieren mit dem Zertifikat,
ob die Eingaben eine Jahrenstanz ist oder nicht.
Oder anders formuliert, der gleiche Satz wie eben von ihm,
nur dass wir sagen, statt deterministisch, nicht deterministisch.
Ich habe nicht deterministisch viel Zeit mit einem Polymnialzeitalgorithmus,
das Problem zu entscheiden, ja oder nein zu sagen.
Das ist P, das ist NP. Und der Grund,
warum wir die heutige Vorlesung machen, ist,
weil wir jetzt ganz viele Probleme kennen, die NP sind.
Und ihr kennt aber auch jede Menge Probleme, für die
wir irgendwie nicht zeigen können, dass die NP sind.
Für die können wir dann meistens zeigen, dass die
ein NP sind. Einige Probleme sind noch schlimmer,
das klammern wir mal heute aus, sondern wir wissen jetzt,
okay, es gibt ganz viele Probleme,
die sind nicht in P,
sondern die sind in Enky
Oder scheinbar. Und wir haben aber keine Möglichkeit zu zeigen,
dass die tatsächlich nicht in P sind. Deswegen versuchen wir jetzt,
das Nächstbeste zu machen, wenn wir das nicht ganz konkret zeigen können,
dann versuchen wir wenigstens zu sagen, es ist sehr,
sehr, sehr, sehr, sehr wahrscheinlich,
dass die nicht in P sind.
Und dafür brauchen wir diese ganze Theorie der NP Vollständigkeit. Und die Idee ist,
dass man nachher sagen kann, es gibt all diese Probleme,
von denen ich schon weiß,
dass sie oder von denen andere Leute schon gezeigt haben,
dass die NP vollständig sind,
an denen man an denen teilweise Experten
schon seit ein paar Jahrzehnten oder Jahrhunderten arbeiten
Und jetzt kommt ihr mit einem neuen Problem, das bisher sich noch keiner angeguckt hat.
Und ihr kommt irgendwie auf keinen P-Algorithmus. Und wenn ihr jetzt zeigen könnt,
dass das auch NP vollständig ist, dann könnt ihr eben sagen,
wenn man das jetzt schnell lösen könnte,
dann auch all diese anderen Probleme,
an denen Leute schon seit ein paar Jahrzehnten arbeiten.
Ergo ist es sehr, sehr unwahrscheinlich, dass dieses Problem
mein neues Problem jetzt tatsächlich in P lösbar wäre.
Das ist die Kernidee bei dieser NP-Vollständigkeit. Dazu braucht man
Begriffe wie Reduktion, um ein Problem, ein anderes umzuwandeln.
Da schwingt er schon so ein bisschen mit,
wenn man irgendwie diese ganzen Probleme vergleichen will. Genau,
da muss man irgendwie irgendwie irgendwie Vollständigkeit einführen und dann brauchen wir irgendwas,
um zeigen zu können,
dass ein neues Problem tatsächlich NP vollständig ist
Das ist so die Roadmap für heute. Erstes Ding,
was ist eine Reduktion? Ich habe zwei Sprachen,
L1L2. Oder wer jetzt gerade nicht in Sprachen denken will,
denkt irgendwie ein Problem. Ich habe zwei Probleme,
L1 und L2. Also zum Beispiel Erfüllbarkeitsprobleme der Aussagenlogik und die Frage,
ob ein Graph zwischen zwei Knoten einen längsten Pfad hat.
So zwei Probleme. Und jetzt sagt die Reduktion hier,
L1 ist dann im Polyumnialzeit auf L2 reduzierbar,
wenn ich so eine Funktion F habe, die eben in Polynialzeit berechenbar ist.
Sprich, ich habe irgendwie einen Algorithmus,
der in P abläuft
Mit der folgenden wichtigen Eigenschaft. Wenn X in L1 ist,
dann soll Ephonics in L2 sein. Und es steht hier genau dann,
wenn, sprich, wenn X nicht in L1 ist,
dann soll F von X auch nicht in L2 sein.
Das heißt, was dieser Reduktionsalgorithmus tut, ist,
ihr gebt ihm als Eingabe eine Instanz,
von der ihr wissen wollt, ist die in L1 drin oder nicht.
Zum Beispiel eine außerlogische Form. Ist die erfüllbar oder nicht
? Jetzt arbeitet der Algorithmus irgendwie rum und es kommt so
eine Ausgabe F von X raus.
Und von dieser Ausgabe wisst ihr dann,
dass es genau dann eine Jahrinstanz,
wenn die vorherige Eingabe X-Ebene erfüllbare Aussagen logische Formel waren,
in dem Beispiel
zu bleiben
Das ist die ganze Idee. Sprich, eine Eingabe umwandeln und wieder
eine Ja- oder eine 9-Instanz rauskriegen. Idee ist dann,
wenn ihr zum Beispiel keinen Algorithmus habt, um L1 zu lösen.
Aber ihr habt vielleicht einen, um L2 zu lösen.
Wenn ihr jetzt eine Reduktion angeben könnt, dann könnt ihr
einfach hintereinander erst die Reduktion ausführen und dann L2 lösen.
Und dann habt ihr damit auch L1 gelöst.
Deswegen Reduktion. Ihr habt das Problem, L1 zu lösen,
quasi darauf reduziert, das Problem L2 zu lösen.
Ja, und das Ganze soll eben hier im Polyumialzeit ablaufen,
diese Reduktion. Warum sehen wir gleich noch?
Und Kurznotation ist dann eben hier L1,
kleiner gleich
Die Idee hier mit dem Kleiner Gleichdies eben auch, weil man sagt,
L1 kann jetzt nicht schwieriger sein als L2. Deswegen so kleinergleichen,
also kleiner, gleichbezogen auf Schwierigkeit quasi,
weil man dann sagen kann, naja,
wenn L1 schwieriger wäre als L2, das kann überhaupt nicht passieren,
weil dann würde ich einfach die Reduktion anwenden und dann L2 lösen,
dann habe ich es genauso einfach.
Wobei sich hier schwierig und nicht schwierig eben auf Polynomialzeit bezieht,
dass man eben sagt,
wenn es für L1 jetzt nur ein Exponentialzeitalgorithmus gibt,
aber für L2 ein Polynomialzeitalgorithmus,
dann brauche ich diesen Exponentialzeitalgorithmus gar nicht anwenden,
sondern ich mache einmal die Reduktion in Polymonialzeit
und dann löse ich L2 in Polynonialzeit,
dann habe ich
einen Polynonialzeitalgorithmus für
Sehen wir gleich auch noch mal im Detail, aber so,
um einmal zu illustrieren, warum man hier kleiner gleich schreibt.
Das hat quasi was mit Schwierigkeit des Lösens, des Problems
zu tun. Genau. Dann kurz ein paar Anmerkungen.
Hier sieht man ja irgendwie, hier wird gesagt,
L1L-2 sollen aus 0-1 Stern sein.
Das kann man allgemeiner fassen. Uns reicht eigentlich immer 0-1 Stern,
aber allgemeiner kann man irgendwie zwei Alphabete,
Sigmar Stern und Gamma Stern nehmen und sich dann eben die Reduktion von Sigmar Stern nach Gamma Stern einführen.
Und was man auch nicht zwingend machen muss, ist,
dass die Reduktion in Polymialzeit
laufen muss
Da kann man sich irgendwie auch was anderes überlegen,
wenn man dann zum Beispiel hier P vollständige Probleme einführen will.
Hast du als kurzen Exkurs, wenn dich das interessiert,
könnt ihr das mal nachlesen, das wäre eher so für Vertiefungsveranstaltungen,
aber dass ihr das mal gesehen habt,
wir brauchen eigentlich nur dieses 0-1-Stern,
weil wir ja sagen,
alle Instanzen kodieren wir halt irgendwie binär,
also über dem Alphabet 0-1 und da braucht man die anderen Sachen hier nicht.
Aber so streng genommen kann man das einführen. So,
Verbildlichung von dieser Reduktion. Ich habe jetzt hier irgendwie dieses
Eingabealphabet-Siegmar Stern oder eben auch 0-1 Stern und dieses,
ah, das ist jetzt meine eine Sprache L1.
Das ist so die, das Problem, was ich lösen will,
die grünen Punkte sind quasi ja Instanzen,
die roten Punkte sind Nein-Instanzen
Also wenn ihr jetzt bleibt bei diesem Erfüllbarkeitsproblem der Aussagenlogik,
dann würde man jetzt sagen, innerhalb von diesem A,
da sind all die Formen, die erfüllbar sind,
außerhalb sind all die Formen, die unerfüllbar sind.
Was die Reduktion jetzt machen soll, ist,
die Ja-Instanzen, von dem ein Problem A hier,
die werden halt abgebildet auf Ja-Instanzen von dem anderen Problem.
Und die 9-Instanzen werden eben auf 9-Instanzen abgebildet.
Das ist so die hauptsächliche Idee bei dieser Reduktion,
dass Jans das auf Ja-Instanzen, 9-Instanzen auf 9-Instanzen abgebildet werden.
Und dass man dann eben die gleiche Antwort auf die Fragen
hat, ob XNA ist oder ob Aphone XNB ist.
Seht ihr ja irgendwie an den ganzen Pfeilen,
wenn ihr hier irgendwie eine Instanz habt und ihr könnt da Ja sagen,
dann wisst ihr auch, dass die Instanz,
von der ihr gekommen seid,
dass das eine Jahrinstanz sein muss.
Und bei 9-Instanzen
eben genauso
Und da noch einmal explizit,
sieht man hier ja auch bei den Pfeilen irgendwie mehrere Jahre anstanzen können,
hier auf die gleiche Jahrinstanz gehen,
mehrere Nein-Instanzen können auf die gleiche Nein-Instanz gehen.
Ich muss auf der rechten Seite nicht alle Jahrinstanzen erwischen,
ich muss auf der rechten Seite nicht alle Nein-Instanzen erwischen,
das ist alles nicht wichtig.
Das Einzige, was gefordert wird, ist,
die Reduktion soll in Queen IVI-Zeit gehen. Ja,
Instanzen auf Jahrinstanzen abbinden, Nein-Instanzen auf Night Instanzen.
Fertig. Klar
Warum macht man das? Da habe ich vorhin einmal schon angedeutet,
weil man jetzt eben sagen könnte,
wenn ich jetzt L2 lösen kann, kann ich auch L1 lösen.
Und da steckt es drin. Ich habe jetzt diese zwei
Sprachen L1L2 und ich habe eine Reduktion von L1 auf L2.
Und dann sagt man, wenn L2 jetzt in P ist,
dann ist auch L1 in P. Und die Kernidee dabei ist,
dass man sagt, naja, ich führe einmal die Reduktion aus und danach löse ich halt mein L2-Problem.
Und dann kann ich eben, weil ich ja weiß,
X ist in L1 genau dann, wenn Aphonix L2 ist,
kann ich das einfach benutzen, um zu sagen,
dann muss X eben auch in L1 sein.
Und das Hauptkernproblem dabei ist, sich einmal zu überlegen,
dass man tatsächlich im Pulin im Jahrzeit bleibt, wenn man diese beiden Polynomen hintereinander ausführt.
Das sieht man auch relativ einfach,
aber einmal im Detail hier exerziert, also wenn ich,
das hier weiß ich, ich weiß,
es gibt diese Reduktion, L1 nach L2. Das heißt,
es gibt so eine Reduktionsfunktion F mit eben der Eigenschaft X ist in L1 genau dann,
wenn F von X in L2 ist und ich weiß,
F ist in Polymialzeit berechenbar.
Dann weiß ich noch, dass L2 in P ist,
das ist ja auch gegeben, das heißt,
es gibt irgendeinen Algorithmus A2,
der L2 eben in Polymialzeit entscheidet.
Jetzt bastel ich mir einen Algorithmus, der L1 entscheidet.
Der macht folgendes, der kriegt eine Eingabe X,
dann berechnet er jetzt F von X und dann nutzt er A2,
um zu entscheiden,
ob F von X in L2 ist
Und wegen dieser Eigenschaft hier oben, Fhone X ist in L2 genau dann,
wenn X in L1 ist, weiß ich,
wenn er hier Ja sagt, also wenn A2 Ja sagt,
dann muss auch A1 Ja sagen,
wenn A2 Nein sagt, muss auch A1 Nein sagen.
Sprich, der Algorithmus ist korrekt, wenn Effolix in L2 ist,
dann ist X in L1. Problem noch, man muss noch zeigen, dass das tatsächlich im Polymarzeit abläuft.
Ich weiß, L2 ist im Polymarzeit, ich weiß,
die Reduktion ist im Puni im Jahr, ist halt,
ich weiß es noch nicht zwingend bei dem Algorithmus A1. Oben steht da nochmal,
warum arbeitet der in Polymarzeit,
diese Reduktion F kann ja im Polymarzeit berechnet werden,
das heißt,
es gibt irgendwie so eine konstante C,
sodass ich bei Vorlage von X eben irgendwie F von X
in O von X C Zeit
berechnen kann
Und die Ausgabe F von X,
die ist von der Länge ja auch höchstens in X hoch C.
Wenn ich X hoch C Schritte mache, kann meine Ausgaben
nicht länger werden. Das heißt, die maximale Länge,
die ich da irgendwie produzieren kann, ich tausend Schritte mache,
kann die Ausgabe auch nur tausend Items lang sein,
länger kann die nicht werden. Naja,
dann ist die Laufzeit von A2,
wenn die jetzt hier durch N hoch D beschränkt ist,
dann kommt da jetzt also etwas von der Länge,
F von X Betrag rein und dann bin ich irgendwie in F von X hoch D,
da F von X in Ofen X hoch C,
jetzt bin ich hier irgendwie ein X
hoch 10 mal
Auch wieder ein Polynom, ne? Und dann habe ich
insgesamt, zuerst habe ich ja diese X-OC-Schritte gebraucht,
um das Fphone X zu berechnen.
Jetzt brauche ich nochmal X, so zehnmal D-Schritte,
um zu gucken, ob Aphone XNA 2 ist.
Dann brauche ich also insgesamt irgendwie X-OC plus, X-O-C-mal D-Schritte.
Was dann eben in U von X-Suchtzimmer D ist.
Und da C&D-Konstanten sind, ist das wieder ein Polynom, ne?
Ergo, wenn ich so eine Reduktion habe und ich sagen kann,
L2 ist MP,
dann weiß ich auch L1 ist MP.
Das ist das, was ich eben quasi erzählt habe oder
bewiesen habe. Und jetzt kommen noch zwei Sachen,
wenn ich so ein Algorithmus B habe und ich rufe so
einen anderen Polynialzeitalgorithmus A als Unterroutine auf,
was ich ja im Grunde genommen eben gemacht habe.
Ich habe ihn halt einmal aufgerufen. Allgemein gilt,
wenn ich dir eine konstante Anzahl von Malen aufrufe,
ist der gesamte Algorithmus immer noch in P.
Wenn ich B aber polinuiell oft aufrufe, dann kann der entstehende Algorithmus
eine exponentielle Laufzeit haben, keine Pullin mehr oder mehr.
Warum? Was kann passieren? Vorher rufe ich den irgendwie einmal auf,
dann ist alles Gute, dann war ich irgendwie bei diesem,
haben wir gesagt, irgendwie die Ausgabe ist XOC lang.
Genau, und dann tue ich die rein in diesen N-Hoch-D-Algorithmus
und dann bin ich irgendwie ein X-Hoch-C mal-D, das ist super.
Wenn ich das eine konstante Anzahl von Malen mache,
ist auch immer noch super. Jetzt sage ich,
wenn ich das Pullin-Mail oft mache, ist es nicht mehr super.
Warum? Was kann passieren? Wenn die,
nehmen wir mal, ihr habt einen Algorithmus,
der seine Ausgabe in Endquadrat vielen Schritten produziert
Was passiert? Wenn ihr, ihr produziert eine Ausgabe in
Endquadrat vielen Schritten und nehme mal an die Ausgabe,
dass der wirklich alles braucht, um auch diese Ausgabe zu produzieren.
Also die Ausgabe ist auch Endquadrat lang.
Ich habe einen Algorithmus, der braucht Endquadrat viele Schritte.
Die Ausgabe, die er produziert, ist Endquadrat lang.
Jetzt nehme ich diese Ausgabe und packe die da wieder rein.
Wie groß ist jetzt die Ausgabe? Genau, Endhof 4.
Ja, habe ich auch erst einmal reingesteckt.
Jetzt nehme ich die und tue die da wieder rein.
Wie groß wird es jetzt
Ja, jetzt nehme ich das, tu das da wieder rein.
Wie groß wird es jetzt? Bitte?
Wie groß wird es? 16, ne? 2,
4, 8, 16, wir kennen das Muster,
32, 64, 128 und so weiter, ne?
Das heißt, wenn ich das da polymiell oft rein tue,
dann kriege ich einen Algorithmus, der irgendwie einen N hoch,
zwei OP von N läuft.
Nicht mehr polymiell. Blöde Sache. Deswegen kriegen wir dann
eine exponentielle Laufzettel. Normalerweise passiert sowas nicht,
weil man ja meistens so Sachen hat wie irgendwie,
wenn die Unterroutine Endquadrat viele Schritte hat und dann liefert die mir vielleicht einen bötchen Wert zurück,
so, ne?
Dann mache ich das Endquadrat viele Schritte und dann sagt die mir,
ja oder nein? Und damit mache ich irgendwas,
selbst wenn ich die jetzt polymiell oft aufrufe,
bin ich irgendwie ein P von Endmahl-Endquadrat
Da passiert nichts. Aber wenn ich halt dieses,
wenn ich irgendwie eine Ausgabe habe, die dann auch wieder
premiere lang ist und ich stecke die da immer wieder rein,
dann dläht sich das halt exponentiell auf.
Deswegen geht das streng genommen nicht. Also wenn ihr jetzt
irgendwie eine Reduktion konstruiert, dürft ihr gerne unter Routinen haben,
die auch premiere lange laufen, die irgendwie konstant oft aufruft.
Wenn ihr irgendwie anfangt, die pulliniell oft aufzurufen,
müsst ihr halt gucken, was ihr da genau macht.
Da müsst ihr irgendwie eventuell genauer analysieren, was passiert.
Eo. Genau, da nochmal zur Nachbereitung die Anmerkung.
Wenn ich jetzt irgendwie so ein Problem L1 durch ein anderes lösen will,
dann kann ich eben so eine Reduktion angeben und habe damit
dann eben auch einen Algorithmus für L1 gefunden,
dem erst die Reduktion machen und dann L2 lösen
Und das könnten wir jetzt benutzen, um NP Vollständigkeit einzuführen.
Also, nächste Fudios. SABsus, höchstens so schwierig wie B,
daher diese Notation, genau. Jetzt wird es auch klar,
weil wenn ich B jetzt in Polymialzeit lösen kann, dann kann ich auch A in Polymialzeit lösen.
Das heißt, A ist höchstens so schwierig wie B,
wenn es nämlich so echt schwieriger wäre,
also so asynthote schlimmer als ein Polynom, sprich ein Ex-Polynom,
Potenzialalgorithmus oder sowas, dann würde ich den gar nicht benutzen,
sondern ich mache das Verfahren,
was wir eben in dem Beweis ganz allgemein hatten.
Ich meine, erst die Reduktion an und löse es dann.
Und jetzt ist die Idee, wenn ich jetzt jede Sprache
aus NP auf eine neue Sprache L reduzieren kann.
Dann weiß ich, L ist mindestens so schwierig wie ganz NP.
Ja, weil wenn ich El jetzt schnell lösen könnte,
könnte ich auch alles in NP schnell lösen.
Und das macht dann dieses LNP sehr unwahrscheinlich,
weil dann eben P gleich NP gelten würde und in NP sind eben all diese ganzen Probleme drin,
über die man schon seit ein paar Jahrzehnten oder Jahrhunderten nachdenkt.
Großartige Idee. Wenn man sagt, okay,
ich kann keinen unteren Schranken zeigen,
dann probiere ich einfach was herzustellen, sodass ich zeigen kann,
dass mein neues Problem mindestens so schwierig ist,
wie eine ganze Facette an anderen Problemen, an dem andere Leute schon ganz lange arbeiten.
Was ist das Problem dabei? Ich meine,
es wäre schön, wenn ich jetzt ein MP,
ich werde diese Probleme nachher, diese, würde ich sagen,
hier reduziert man jede Sprache aus LP auf in der Neusprache L,
dann ist L mindestens so schwierig wie ganz NP.
Also ist L quasi charakteristisch für die Schwierigkeit von L,
deswegen nennt man so ein Problem dann nachher irgendwie schwierig oder
ihrem NP vollständig, wenn es dann ein NP ist.
Was ist dabei das Problem? Ich meine,
es ist ja schön, so eine Definition gleich zu haben,
aber was ist das Problem
Was müsstet ihr denn machen,
wenn ich euch jetzt so eine Sprache L gebe oder euch gebe,
in neuer Arbeit tritt irgendwie so eine Sprache L auf und ihr denkt irgendwie so,
ja, vielleicht ist die ja NP vollständig.
Was müsste man denn jetzt machen? Genau,
und ich müsste alle Sprachen aus NP auf L reduzieren,
das sind ziemlich viele, so irgendwie potenziell unendlich viele.
Das funktioniert irgendwie nicht so gut. Bitte? Nö,
sind ja unendlich viele. Also ja, wir kennen sie,
wir können sie theoretisch irgendwie konstruieren, aber Ja,
sehr gute Frage. Wie kann man das denn überhaupt machen,
wenn man die gar nicht alle kennt?
Theoretisch kennen wir sie ja alle. Wir sagen halt,
eine Sprache ist ja dann ein NP,
wenn es eine Turing-Maschine gibt, die die Sprache entscheidet.
Also nicht die Terministraturing-Maschine gibt, die die Sprache im Polymalzeit löst.
Das reicht. Damit kann man arbeiten. Oder eben,
wenn man sagt, irgendwie, es gibt so einen Verifikationsalgorithmus.
Damit habe ich sie ja alle. Ich habe sie halt
nicht vorliegen, aber ich habe sie halt alle.
Sehen wir auch gleich. Da nochmal die Anmerkung,
dass ich höchstens mindestens auf diesem polymieren Mehraufwand bezieht.
Und da kommt diese Definition von NP
Also wir bezeichnen Sprache L als NP vollständig,
wenn sie erstens in NP ist. Und zweitens,
wenn sich alle Probleme aus NP in Polynialzeit auf diese neue Sprache L reduzieren lassen.
Ja, und den gibt es noch so ein bisschen,
die kurzen Anmerkungen, wenn man nur die zweite zeigen kann,
dann nennt man die Sprache im NP schwierig, okay.
Und all die NP vollständigen Probleme bilden eben die Komplexitätsklasse NPC,
C für Complete, also NP vollständig.
Wichtig ist da oben eine 1 und
Und warum ist das schön, so eine Definition zu haben?
Jetzt kann man nämlich den folgenden Satz zeigen,
wenn ich eine Sprache habe, die NP vollständig ist.
Und ich könnte jetzt zeigen, dass sie ein P ist.
Dann wüsste ich sofort NPSP, was halt keiner so richtig glaubt.
Deswegen ist es für eine NP vollständige Sprache sehr unwahrscheinlich,
dass man zeigen kann, dass sie ein P ist.
Warum funktioniert das? Naja, wenn ihr eine Sprache habt,
die sowohl NP vollständig ist, als auch ein P ist.
Jetzt könnt ihr mir überlegen, NP vollständig bedeutet,
ich kann jede Sprache aus NP darauf im Polonialzeiten reduzieren.
NP sein bedeutet, ich kann sie im Polonialzeit lösen.
Beides zusammengenommen bedeutet, ich kann die NP-Sprache reduzieren im Polonialzeit
und dann plötzlich im Polonialzeit lösen.
Ergo habe ich P
gleich NP
Also wegen L, NPV-ständig kann ich L-Strich, ja,
ein völlig beliebiges L-Strich aus NP,
kann ich jetzt in Polymarzeit auf L reduzieren.
Das ist einfach die Definition, da von NPV vollständig zu sein für L.
Und wenn ich jetzt noch weiß, Alice & P,
dann folgt aus diesem Satz, den wir eben gezeigt haben,
dass dann auch L-Strich in P ist.
Damit habt ihr für jedes L-Strich aus NP gezeigt, dass das in P ist.
Und damit ist P gleich NP. Also die Rückrichtung ist eh klar,
dass P eine Teilmenge von NP ist,
weil irgendwie jeder deterministische Algorithmus auch nicht dieterministische Algorithmus ist,
bei dem eben den Nicht-Dterminismus gar nicht ausnutzt.
Also das P-Timing von NP,
das zeigt NPs eine Timing von P,
also sind die beiden Klassen gleich
Und das ist der Grund, warum man eben,
weil man eben jetzt nicht glaubt, dass P gleich NP ist.
Das ist der Grund, warum man eben sagen kann,
wenn ich für eine Sprache zeigen kann, dass die NP vollständig ist,
dann ist das sehr, sehr unwahrscheinlich, dass die NP ist.
Äquivalente Formulierung, wenn es ein L aus NPO eine P ist,
dann ist der Schnitt von den beiden leer.
Das ist quasi das umgedrehte. Genau, dass das umgedreht hat. Hier wird ja gesagt,
NPSP, wenn ich jetzt hier sage,
es gibt ein L, das NNP ist,
aber nicht NP, sprich die beiden hier sind ungleich,
dann kann eben nicht gelten,
dass es irgendwie so ein L gibt,
was in den beiden ist,
sprich der Schnitt muss leer sein
Joa, und das andere wichtige Theorien, was wir noch brauchen gleich.
Philipp, warum? Ja. Nochmal zum Lesen. Ich habe manchmal
so Folien zur Nachbereitung eingebaut, weil ich irgendwie dann wollte,
dass ihr das bei der Nachbereitung nochmal seht,
was ich wahrscheinlich hoffentlich erzählt habe.
Und manchmal so im Fluss irritieren mich die Folien dann,
weil das sind ja Folien, die ich eigentlich nicht erzählen wollte.
Ja. Bitte? Was machen?
Was zeigen
Was möchtest du zeigen? Doch, der zweite ist das Gleiche wie oben.
Also hier sage ich, wenn es eine Sprache gibt,
die ein NPC ist und die NP ist, dann ist NP gleich P.
Die Umkehrung ist, wenn es eine Sprache gibt,
die ein NP ohne P ist, sprich,
wenn das hier nicht gilt, wenn NP ungleich P ist,
dann kann das hier vorne auch nicht gelten.
Sprich, dann muss NPC geschnitten P leer sein.
Das ist die gleiche Formulierung
Doch, doch, doch, doch, doch.
Also wir wissen, P ist eine Timing von NP.
So, was wir nicht wissen, ist, ob da
auch Gleichheit existiert. Wir sind uns aber relativ sicher,
dass da keine Gleichheit existiert,
sondern dass P ungleich
NP ist
Nein. Hör mir doch zu Ende zu.
Mütte. Also wir sind uns relativ sicher, dass P
nicht gleich NPS. Das heißt, jede Aussage X,
die das implizieren würde, also wenn ich irgendwie sage,
wenn X gilt, dann ist P gleich NP.
Dann wird dir jeder Theoretiker sagen, irgendwie, okay,
dann ist X sehr, sehr, sehr unwahrscheinlich.
Und hier ist X die Aussage, dass es eine Sprache gibt,
die NP vollständig ist und DNP ist.
Das heißt, diese Aussage ist sehr, sehr unwahrscheinlich.
Da glaubt keiner so richtig dran. Das heißt,
wenn du jetzt für eine, also es ist sehr unwahrscheinlich,
dass eine Sprache sowohl ein P ist, als auch NPV-ständig zu sein.
Das heißt, wir haben für eine Sprache zeigen können,
dass die NPV vollständig ist, Ja,
dann wird das andere sehr wahrscheinlich eben nicht gelten,
dass sie auch ein P ist.
Weil daraus würde dann dieses sehr unwahrscheinliche Resultat folgen, P
gleich NP. Jetzt kann man sich noch darüber Gedanken machen,
warum ist denn das so unwahrscheinlich, ja?
Aber das liegt halt einfach daran, dass man sagt,
naja, da arbeiten schon so viele clevere Leute,
so viele Jahrzehnte dran, an all diesem Problem in Endpene.
Es ist ja jetzt nicht so, dass man sagen würde,
die arbeiten alle an einem Problem. Ja,
wenn die jetzt alle, was weiß ich,
an der Aussagenerfüllbarkeit der Aussagenlogik arbeiten würden,
würde ich auch sagen, naja gut,
vielleicht gucken alle Generationen von Leuten da immer wieder falsch drauf,
aber die kommen aus total unterschiedlichem Kontext, Zahlentheorie,
Grafentheorie, Logik, alles querbeet, ne?
Oder auch einfach Algorithmiker, die versuchen,
ein Problem zu lösen und irgendwie das nicht hinkriegen,
aus einem P zu machen oder so,
auf solche Probleme so,
Und deswegen ist es halt sehr unwahrscheinlich, dass das dann plötzlich doch gilt.
Quasi Crowdintelligenz oder so jähnlich. Also alle arbeiten da dran und keiner kann es lösen. Jetzt kann man entweder sagen,
oh, aber ich bin jetzt der Überflieger,
der es macht und man ballert da noch mehr Zeit rein oder man sagt,
naja gut,
ganz so viel Erfahrung habe ich jetzt nicht in dem Metier,
dann reicht dir vielleicht ein NPV-Ständigkeitsbeweis, wo du sagst,
alles klar,
dann ist das Problem wahrscheinlich nicht NP oder selbst
wenn bin ich vielleicht nicht der,
der es lösen wird
Nee, wenn du, also die Frage war gerade,
ob man, wenn man jetzt nachweisen kann,
dass ein Problem nicht NP vollständig ist,
ob das bedeuten würde, dass es NP sein muss.
Wenn es nicht NP vollständig ist,
das geht ja draußen noch weiter. Also wir haben P,
NP, dann haben wir so P-Space, also Probleme,
die sich irgendwie im Pulli mehr viel Platz lösen lassen.
Und wenn es nicht NP vollständig ist,
dann kannst du ja irgendwie noch weiter außerhalb liegen.
Oder es könnte sogar irgendwie in NPI sein, NP Intermediate,
weil man, das könnte ein Problem sein,
das weder in P ist noch NP vollständig.
Also je nachdem, wie die Komplexitätsklassen alle zusammenhängen,
können es auch irgendwie dazwischen liegen
Sonst noch Fragen. Na, da wollte ich hin.
Jetzt brauchen wir nämlich noch irgendwie eine Möglichkeit. Das ist
ja schön, NPV-ständig zu, es ist ja schön,
NPV-Vollständigkeit so zu definieren. Das Problem ist noch,
dieses für alle oder für jedes L-Strich hier,
das nervt großartig, weil ich will mir jetzt nicht ständig
alle NP-Probleme angucken und die auf ein neues Problem reduzieren.
Das ist irgendwie doof. Deswegen helfen uns die folgenden zwei Sätze.
Das wird dann gleich klar, wenn wir die beide bewiesen haben,
warum die helfen. Das hier ist ein Satz,
der sagt was aus über Transitivität, der sagt,
wenn ich L1 auf L2 reduzieren kann und L2 auf L3,
dann kann ich auch L1 auf L3 reduzieren.
Von der Intuition her ist das relativ klar. Ich führe einfach
die Reduktion zweimal hintereinander aus, dann habe ich das.
Dann habe ich irgendwie X ist in L1 genau dann,
wenn F von X in L2 ist und F von X ist in L2 genau dann,
wenn G von F von X in L3 ist.
Zweimal genau dann, wenn hintereinander so, da passiert nichts.
Dann muss man sich noch einmal überlegen,
ist das wieder ein Polymialzeit,
aber das ist die gleiche Argumentation wie vorher auch,
zwei Polynomen hintereinander ausgeführt, kann nicht so viel Schlimmes passieren.
Und dann hat man
den Beweis
Ausführlich. Argument ist ähnlich. Sein F und G,
diese Reduktionsfunktion für irgendwie L1 auf L2 und L2 auf L3.
Bei Eingabe X berechnen wir jetzt zunächst F und X in
dieser Polinialzeit P von N. Also N ist die Länge von nix.
Dann haben wir irgendwie X auf F und X reduzierte,
also L1 für 2, dann berechnen wir G von F und X.
Jetzt muss man sich halt einmal überlegen,
wie lange das Polynom braucht,
wenn ich da zum Polynom Kuh habe,
dann kriegt das als Eingabe ja diesen String F von X.
Und F von X kann ja prinzipiell die Länge P von N haben,
um F von X zu berechnen,
habe ich ja P von N
viele Schritte Zeit
Also wenn ich irgendwie einen Kuh von Länge von Efflix,
also irgendwie Kuh von P von N,
und dann ist der Aufwand halt insgesamt einmal dieses Publinum P
von N auszuführen und dann das Publinum Kuh von P von N.
Also insgesamt ist der Aufwand hier durch P von dem Plus Kuh von P von N
nach oben beschränkt, was wieder ein Polynom ist.
Und dass das Ding korrekt ist, X in L1 genau dann,
wenn F von G von X in L3, andersrum,
geh von F von X. X in L1, genau,
dann werden G von F von X in L3 ist.
Ich führe ja erst F von X aus und dann geh von X,
also F von X und dann geh von Efflix
Und das folgt direkt aus den beiden gegebenen Reduktionen.
Wie gesagt, X ist in der 1, genau,
oder wenn Ephonix in der 2 ist, Ephonix ist in der 2 genau dann,
wenn G von Ephonix in der 3 ist.
Das heißt, wir gehen von Fhonix in L3 drin ist,
könnt ihr sagen, X ist in L1,
man gehe von Ephonix nicht in L3 drin,
das könnt ihr sagen, X ist nicht in L1.
Und da und da muss G-Kringel-F stehen, nicht F-Kringel-G. So,
wir haben jetzt diese Transitivitätsgeschichte hat, dann kann man jetzt Folgendes machen,
dann kann man sagen, wenn ich eine Sprache L habe,
das ist jetzt meine neue Sprache,
und ich habe eine Sprache Strich,
von der ich schon weiß,
dass die NP vollständig ist
Dann kann ich, wenn ich die jetzt auf L reduzieren kann,
dann kann ich Schluss folgen, das LNP schwierig ist.
Und wenn L zusätzlich noch ein NP ist, ist es sogar NPV-ständig.
Warum? Da brauchen wir jetzt nämlich diese Reduktionsfunktion.
Ihr habt diese Sprache L-Strich, die ist NPV-ständig.
Das heißt, ihr könnt alle Sprachen aus NP darauf reduzieren.
Naja, jetzt reduzieren, nehmt ihr eine beliebige Sprache aus NP,
könnt ihr darauf reduzieren. Und dann könnt ihr,
das steht da ja in den Voraussetzungen von L-Strich nach L kommen.
Also habt ihr alle Sprachen aus NP auf L reduziert.
Deswegen dieses Transitivitätsargument, weil man jetzt sagen kann, okay,
jetzt gehe ich einmal auf L-Strich und dann gehe ich auf L. Sprich,
wenn ihr gleich ein Problem haben, dass NP vollständig ist.
Also für eins müssen wir es einmal machen, diesen Akt,
dass wir alle Probleme aus NP darauf reduzieren.
Aber wenn wir das einmal gemacht haben,
dann können wir mit diesem uns jetzt schon bekannten NP vollständige Problem arbeiten und immer sagen,
okay, das reduziere ich jetzt auf ein neues Problem.
Jetzt habe ich zwei NP vollständige Probleme. Jetzt nehme ich
mir irgendwie eins davon, reduziere das wieder auf ein neues Problem.
Da habe ich drei und so weiter. Also ich habe dann nicht mehr diesen Akt,
dass ich alle darauf reduzieren muss,
was halt nur über so allgemeine Argumente geht,
sondern ich kann dann ganz konkret sagen, ich habe dieses Problem zum Beispiel Erfüllbarkeit der Aussagenlogik.
Ich habe dieses neue Problem, also wandle ich irgendwie Formeln,
um meine neue Probleminstanz und zwar auf die Art und Weise Formeln ist erfüllbar,
genau, wenn dann,
wenn neue Probleminstanz nicht an Instanz ist
Genau, den müssen wir noch beweisen,
aber der geht auch relativ schnell, wenn L-Strich NPV ständig ist,
dann kann ich jetzt ein beliebiges L-Strich aus NP darauf reduzieren in Podinialzeit.
Einfach wegen der Definition von NP Vollständigkeit. Und das
hier weiß ich ja schon, das ist ja gegeben,
dass sich L-Strich im Polymialzeit auf L reduzieren kann.
Naja, dann kann ich L-Strichstrich im Polymialzeit auf L-Strich reduzieren,
L-Strich im Polymialzeit auf L und dann wegen diesem vorherigen Satz mit der Transitivität,
heißt das,
ich kann L-Strich auf L reduzieren
Daraus folgt, dass L endlich schwierig ist. Ich habe
jetzt jedes L-Strich aus NP auf L reduziert in Polygnalzeit.
Damit ist das NP schwierig und wenn es dann eben noch
ein NP ist, dann ist es nach Definition NP vollständig.
Wallah. Ergo, was muss man machen,
wenn man jetzt irgendwie ein Problem als NP vollständig nachweisen möchte?
Man zeigt, dass es in NP ist.
Das war ja meistens relativ einfach, dass man irgendwie sagt,
okay, so und so sieht das Zertifikat aus.
Dann wählt man sich eine Sprache,
von der man schon weiß,
dass die NP vollständig ist
Und jetzt kommen die schwierigen drei Schritte. Jetzt muss man
irgendwie einen Algorithmus angeben, der diese Reduktionsfunktion berechnet,
dieses F, also ein Reduktionsalgorithmus, muss man angeben.
Und dann muss man diese zwei Eigenschaften zeigen, nämlich einmal,
dass der korrekt ist im Sinne der Reduktion,
also das X-N-L-Strich gilt genau dann, wenn FONX&L ist.
Und dann muss ich noch zeigen, dass da auch ein Problem mehr als Zeit geht.
Und das Problem ist gerade immer noch,
wir haben noch kein NP-vollständiges Problem, also dieser zweite Punkt,
da wähle ein L-Strich, das NP-vollständig ist,
das geht erst,
wenn wir überhaupt irgendein NP-vollständiges Problem haben
Fragen bis dahin. Ne, praktische Fragen. Nicht mehr vollständig.
Wenn wir das wüssten, was wüssten wir dann auch?
Die Frage war gerade, ob wir ein NP vollständiges Problem wissen,
äh Quatsch, ob wir ein Problem mit NP wissen,
das nicht NPV-ständig ist, wird richtig wiedergegeben?
Ja. Ob wir ein Problem wissen,
das in NP liegt, aber nicht NPV-ständig ist,
was wissen wir dann
Also da geht ja auch keine Menge von hinten, wie ihr wisst.
Ja, ich zeigen könnte mir auch Elemente mit sich.
Und das heisst, dass es vollständig sind,
und dann ist es ja wieder ein Begleich.
Jein, das wäre richtig für den Fall,
dass man für dieses von ihm angesprochene Problem zeigen könnte,
dass es ein P wäre.
Genau, das war nicht ganz seine Frage. Er hat gesagt,
können wir quasi allgemeiner als das, können wir ein Problem,
oder kennen wir ein Problem, das in NP liegt,
aber nicht NP vollständig ist?
Damit muss es ja nicht zwingend in P liegen.
Du hast jetzt gesagt, ja,
wenn es dann in P liegt,
dann hätten wir das und das oder so,
Weil, was wüsste man dann? Also wenn man jetzt den allgemeineren Fall hat,
wenn man jetzt wüsste, ich habe ein Problem,
das ist ein NP, das ist nicht NPV-ständig,
das liegt nicht in P, was wissen wir dann?
PSTH ist eine echte Timing von NP,
dann würden wir nicht mehr rumeiern müssen mit,
wenn das gilt, dann ist P gleich NP oder so,
weil dann wüssten wir schon PS-ungleich NP,
dann wüssten wir sofort alle NPV-ständige Probleme sind nicht NP.
Ergo, auch das können wir nicht, also für ein Problem zeigen,
dass es nicht also für ein Problem quasi zeigen,
dass es echt in NPI liegt, in dieser NPNT-Mediat-Klasse,
also größer als P ist, aber nicht NPI vollständig.
Können wir also auch nicht. Noch eine Frage. Gut
. Dann müssen wir uns irgendwie an die Arbeit machen,
so ein erstes NPV-ständiges Problem zu zeigen.
Und der, das Urproblem, ist dieses Sattproblem,
dieses Erfüllbarkeitsproblem aus der Aussagenlogik. Ich wiederhole das einmal ganz schnell,
also das hattet ihr schon in FGI 1 so mit Aussagenlogik und sowas,
aber für die, die das jetzt nicht hatten,
einmal ganz kurz die Basics so, man hat irgendwie Bullshit-Variablen,
X1X2 und so weiter,
die können über den Wert 0 oder 1 einnehmen,
also Falls oder True
Da gibt es drei Verknüpfungen, also wir schränken uns hier auf drei ein.
Einmal die Negation, dass man irgendwie sagt,
not false ist halt true und not true is false.
Disjunktion, wenn ich zwei Variablen mit oder verknüpfe,
dann kommt da eben der Wert eins raus, gelaudern,
wenn mindestens eine der beiden Variablen eins ist und Konjunktion,
wenn ich die mit unverknüpfe, da kommt eins raus,
genau dann, wenn beide Variablen eins sind.
Anders als in FG1, wo wir da sehr darauf geachtet haben,
Syntax und Semantik zu trennen, machen wir das hier jetzt mal einfach so mit Gleichheit und sowas.
Also das ist ja eigentlich aus FG1, aus der Logik,
wenn man jetzt sich wirklich in der Logik aufhält,
dann ist das so ein No-Go, da einfach so Gleichheitszeichen hinzuschreiben,
weil das Syntax und Semantik fies vermischt, aber jetzt fürs Arbeiten,
damit kann man das mal so machen,
dass man dann irgendwie quasi Algebrage damit rechnet
Dass die Negation, Dissunktion, Konjunktion kennt man, glaube ich,
auch aus allen Programmiersprachen so. Und dann kann man eben sagen,
wenn ich jetzt eine Formel kriege,
die irgendwie hier mit Negation oder das und uns verknüpft ist,
also ich kann das jetzt ja weitermachen, ich kann jetzt sagen,
X1 und X2 oder X3 und das Ganze noch negieren und so weiter,
dann kommt da irgendwie eine größere Formel raus und eine Belegung ist jetzt eine Funktion,
die jeder Variablen einen Wert aus 0 und 1 zuweist.
Und wenn man dann eben irgendwie eine Belegung finden kann,
bei der die Formel insgesamt zu 1 ausgewertet wird,
dann sage ich,
die Formel ist erfüllbar
Das sind so die Basics da vorne, nochmal hier dieses Beispiel,
was ich gerade schon mal in FD1 irgendwie hatte,
X1 oder X2 und Nicht X1 und Nicht X2 oder X,
Nicht X1. Und wenn ich jetzt eben als Belegung wähle,
X1 zu 0 auszuwerten und X2 zu 1,
dann setze ich das da überall ein und dann rechne ich halt schrittweise aus,
bei den Negationen, da flippt der Wert,
auf 0 wird 1, aus 1 wird 0,
dann sieht das irgendwie so aus.
Dann kann ich mir überlegen, 0 oder 1 ist 1,
hier ist auch 0 oder 1, das ist auch eins,
dann sieht das schon so aus.
Eins und eins hier in der Klammer ist auch eins und
nochmal eins und 1 ist eins,
also das hier X1 zu 0 auszuwerten und X2 zu 1 auszuwerten,
das wäre für die Formel eine erfüllende Belegung.
Sprich, es gibt eine erfüllende Belegung für die Formel
Genau, da nochmal der Hinweis zu diesem Sintax und Semantik und so,
aber für das, was wir jetzt machen wollen,
reicht eigentlich dieses intuitive Verständnis.
Ist das für die, die das nicht hatten,
klar, ich glaube Aussagenlogik irgendwo hatten,
müssten das eigentlich die meisten dann gehabt haben, unsere Mathekurs oder irgendwo.
Und damit kann man dann dieses ganz klassische Urproblem definieren,
dass man sagt, in satt sollen all die Kodierungen von Aussagen
logischen Formeln enthalten sein, die eben erfüllbar sind.
Historisch das erste NPV-ständige Problem. Da kann man
sich überlegen, warum ist das in NP
Mit nicht deterministischer Sichtweise. Ich rate mir eine Belegung,
die das und prüft dann, ob sie die Formeln erfüllt oder mit Zertifikat.
Das Zertifikat ist eben eine Belegung und dann überprüfe ich einmal schnell,
erfüllt die Belegung die Formel, ja oder nein?
Und das kriege ich halt im Polimialzeit hin, so mit diesen Umformungsschritten von eben.
Ich setz die alle ein und dann rechne ich das halt irgendwie aus.
Das Problem ist jetzt noch, alles aus NP darauf zu reduzieren.
Also um satt auf NP zu reduzieren,
wir raten für eine gegebene Formel die Belegung,
gibt zwei hoch NP,
wenn ich in verschiedene Variablen habe,
ich kann die alle auf null oder einsetzen und dann verifiziere
ich,
dass es ein Polimialzeit möglich ist
Genau, und jetzt müsste man alle Probleme aus NP darauf reduzieren.
Das ist ein bisschen länglich. Ja. Wen das interessiert,
kann das hier in Hauptkrift Ulmen nachlesen. Die Kernidee ist eben,
dass man sagt, ich habe ein,
wenn ich weiß, dass ein Problem ein NP ist,
so alles, was ich jetzt benutzen kann, ist,
mehr will ich nämlich nicht benutzen.
Alles, was ich jetzt benutzen kann, ist,
dass ich sage, dann gibt es eine Touring-Maschine,
M, die arbeitet nicht deterministisch und nach punymiell vier Schritten hält
die bei jeder Eingabe an und sagt,
ja oder nein,
mehr weiß ich nicht
Und jetzt kann ich aber sagen, okay, es gibt also diese Touring-Maschine,
also gibt es irgendwie dieses Toupel bestehend aus Zuständen, Übergangsfunktionen und so weiter.
Und das friemel ich mir in eine Formel rein.
Da bastle ich mir eine ziemlich lange Formel, aber eine,
die eben nur polinumiell lang ist, in der Länge der Touring-Maschine, sonst hätte ich ein Problem.
Und in dieser Formel wird quasi reinkodiert, welche Schritte okay sind,
also die ganze Übergangsfunktion wird da irgendwie reinkodiert,
so nach dem Motto, wenn der Kopf an,
wenn der Lese schreibt, Kopf der Touring-Maschine gerade über einem Z ist,
dann machst du als nächstes das und das und sowas,
dann wird noch die Startkonfiguration quasi kodiert und die Endkonfiguration,
da habe ich alles reinkodiert und wenn es dann eine erfüllende Belegung gibt,
dann weiß ich,
von der Startkodierung komme ich durch eine bestimmte Auswahl in
der Übergangsfunktion irgendwie zu einer Inkonfiguration
Und dann kann man eben zeigen, okay, wenn die Formel erfüllbar ist,
dann gibt es eine Überlegung, die sie wahrmacht.
Ja, Quatsch. Weiß ich nicht. Wenn die Tour immer steht,
die Eingabe akzeptiert, dann gibt es eine Rechnung,
auf der sie die Eingabe akzeptiert.
Und dann kann ich nämlich genau die Sachen auswendig auswählen,
um zu sagen, okay, dann ist die Formel dafür über.
Und ich weiß, wenn die Formel erfüllbar ist,
dann sagt mir quasi die Art und Weise,
wie ich die Aussagensymbole mit True und Volks belege, sagt mir,
wie ich bei der nicht-deterministischen Touring-Maschine die Übergänge wählen muss,
um zu akzeptieren,
in Belegung
zu kommen
Genau, das ist da die Idee. Das ist deswegen ein bisschen kompliziert,
weil man ja quasi diese nicht die terministische Schulmaschine,
über die man ja nichts richtig weiß,
sondern dass halt irgendwie alles mit Indizes und so ausdrücken muss,
die ganze kodiert man irgendwie in eine Formel.
Das ist mehr so Kodierungstheorie,
als dass das jetzt was mit Algorithmenentwurf oder so zu tun hat,
dass man das da irgendwie reinfriemelt.
Das ist ein schöner Beweis, das ist irgendwie sechs,
sieben Seiten oder so. Und ja, wer Interesse hat,
kann das mal durchlesen, bietet sich jetzt nicht so richtig an,
das in der Vorlesung zu machen irgendwie.
Also weil das verschleißt so ein bisschen die eigentliche Idee da
so, das kommt da nicht so gut rüber
Was wir machen können, ist, wir können uns gleich für andere Probleme angucken,
wie wir zeigen, dass die NPV-ständig ist.
Jetzt haben wir ja ein NPV-vollständiges Problem. Jetzt müssen wir nach und nach immer nur zeigen,
naja, wenn das Problem NPV-vollständig ist,
dann kann ich das auf mein neues reduzieren und dann weiß ich auch,
das ist NPV-ständig.
Und so nach und nach fühlt sich dann unser Vorrat an
NPV-vollständigen Problemen und das macht es quasi immer einfacherer für ein neues Problem zu zeigen,
dass es irgendwie vollständig ist,
weil quasi der Vorrat an NPV-ständigen Problemen immer größer wird.
Und was halt, jetzt kann man noch unterscheiden zwischen,
solange ich in einem Setting bleibe, ist es meistens ein bisschen einfacher.
Also wenn ich jetzt quasi eine Aussage Louis Bleibe,
ist eine Reduktion einzugeben, meistens ein bisschen einfacher,
als wenn ich quasi das Setting verlasse.
Deswegen ist der erste Sprung,
ein neues Setting immer ein bisschen friemelig,
wenn ich jetzt gleich in die Grafentheorie rein will,
dann muss ich
es irgendwie hinkriegen
Formeln, Grafen theoretisch auszudrücken. Das wird immer ein bisschen schwierig
. Wenn ich dann erstmal ein Grafen theoretisches Problem habe,
kann ich damit meistens ganz gut arbeiten,
so um weitere Grafen theoretisch Probleme als MPvollständig nachzuweisen.
Wenn ich dann irgendwie in die Zahlentheorie rein will,
stehe ich wieder vor diesem Problem. Ich habe noch nichts Zahlentheoretisches,
also muss ich irgendwie mein Zahlentheoretisches Problem mit Formeln
irgendwie ausdrücken oder mit Grafen oder irgendwie sowas,
das ist dann immer ein bisschen schwierig.
Frage noch?
Echtes Problem ist was
Mhm. Die Frage war gerade quasi,
welches Problem wir aufrufen, um das andere zu lösen.
Bei dem, was wir gleich machen, mit den Reduktionen ja eigentlich keins.
Wir wandeln die ja nur um. Ich wandel eine Eingabesinstanz in
eine andere um. Ich löse da ja eigentlich gar nichts.
Die Aufgabe des Reduktionsalgorithmus ist es, eine Eingabeinstanz in eine andere umzuwandeln.
Auf Metaebene quasi weiß ich jetzt, wenn ich jetzt mein Problem,
von dem ich reduziert habe, lösen will,
also wenn ich L1 auf L2 reduziere und ich will jetzt L1 lösen,
dann kann ich einfach zwei Unterroutinen aufrufen,
nämlich einmal die Unterroutine,
die die Reduktion macht und dann die Unterroutine,
die L2 löst
Aber das passiert ja quasi auf Meta-Ebene. Das machen wir
ja gleich bei den Reduktionen nicht. Also wenn ich gleich einen Reduktionsalgorithmus angebe,
da rufe ich ja nicht, wenn ich jetzt L1 auf L2 reduzieren will,
rufe ich ja weder L1 auf noch L1,
also weder den Algorithmus für L1, noch den Algorithmus für L2.
Was ich mache, ist, ich wandle eine Eingabe
instanz für L1 in der Eingabe instanz für L2 um.
Ja, aber das ist ja eine andere Ebene
Damit löst du dann L1 oder damit könntest du L1 lösen.
Aber das ist ja nicht das, was wir machen wollen.
Wir wollen ja jetzt irgendwie gleich nur Reduktionen angeben.
Ich kann die Reduktion nutzen, um dann L1 zu lösen oder so.
Aber das ist ja das, wo ich mit der NP-Vollständigkeit
gar nicht mehr hin will. Ich will ja nachher sagen,
ich habe jetzt alle Probleme aus NP auf mein neues Problem reduziert.
So. Und jetzt sage ich, Ergo ist mein neues Problem, NP vollständig.
Es wird also sehr wahrscheinlich kein P-Algorithmus dafür geben,
sondern nur ein NP-Algorithmus. NP-Algorithmen habe ich für die Probleme,
von denen ich reduziert habe, aber sowieso auch schon.
Die Aussage ist dann nur,
wenn ich jetzt mein neues Problem da gerade schnell lösen könnte,
dann kann ich plötzlich auch all die anderen schnell lösen
Ich weiß also quasi auf Metaebene, dass ich das
als Unterroutine nutzen könnte, um die anderen zu lösen.
Aber daraus folgt dann quasi, dass ich das nicht machen will.
So, was haben wir noch? Noch zwei weitere Probleme,
weil man meistens nicht von satt direkt reduziert, sondern irgendwie von was anderem.
Die sind auch beide in der Logik. KNF&D-NF-Probleme,
hier um das irgendwie eleganter zu definieren, sagt man,
literal ist entweder so eine positive, variable,
bulsche Variable oder eben eine negative Bulsche Variable,
also sowas wie X1 oder eben nicht X2,
aber halt noch nichts mit irgendwelchen anderen Jungtoren
Und eine Klausel, das ist dann so eine Oder-Verknüpfung von Literalen.
Dann habe ich so X3 oder nicht X2 oder X4.
Und wenn ich dann mehrere Klauseln mit unverknüpfe,
dann habe ich eine konjunktive Normalform, diese KNF.
Das ist dann hier irgendwie mehrere Odas habe und dann wird
das Außen mit unverknüpft und dann kommt wieder eine Klausel mit
ganz vielen Odas und dann wird das wieder mit Unverknüpfung,
wieder eine Klausel mit ganz viel Odas.
Genau. Das ist eine KNF und dann kann man sich eben definieren,
diese CNF, wo jetzt eben Vieh nicht einfach nur eine erfüllbare Aussage logische Form ist,
sondern wo die auch ein KNF gegeben ist und drei CNF,
wo die Formel zusätzlich noch so ist,
dass jede Klausel genau drei verschiedene Literale enthält.
Das ist nachher, wenn man jetzt Reduktion machen will,
angenehmer damit zu arbeiten, weil man dann
schon von einer gewissen Struktur in der Formel ausgehen kann.
Dann kann ich besser konstruieren, als wenn ich nur weiß,
die Aussage logische Formel kann irgendwie völlig beliebig aussehen.
Und bei beiden, beide sind NP vollständig,
der NP-Beweis ist wieder klar, weil man einfach nur einmal prüft,
ist die Formel von der gewünschten sind taktischen Eigenschaften,
oder lese ich einmal drüber und weiß das.
Und dann, so wie beim Sacktest auch,
dass ich dann sage, okay, dann gucke ich jetzt noch einmal,
ist die Formel erfüllbar oder nicht.
Also rate mir eine Belegung und gucke dann.
Und dann kann man eben satt im Polymialzeit auf CNF
reduzieren und CNF wieder in Polynialzeit auf 3 CNF.
Und das, worauf man halt achten muss hier bei der Reduktion,
Ich kann das halt nicht einfach für die FG1 hatten.
Ich kann das nicht einfach mit Äquivalenzumformungen machen,
weil ich dann die Formel exponentiell aufblähe.
Das heißt, ich muss das irgendwie anders machen.
Und es gibt halt eine Möglichkeit, das mit linear viel Aufwand zu machen.
Das, was man dann aber macht, ist,
dass die Formeln nicht mehr äquivalent sind, sondern eben nur noch erfüllbarkeitsäquivalent.
Aber das reicht hier ja. Ich will ja nur Janstanzen
auf Janstanzen abbilden und nein, Stunts of Nine-Instanzen.
Aber genau, das reicht dann. Und dann habe ich
halt eine Formel 4 auf eine andere Formel 4-Strich reduziert,
die dann eben in KNF ist.
Und die sind nicht äquivalent, aber die Formel 4-Strich ist eben
genau dann erfüllbar, wenn die Formel 4 erfüllbar ist.
Deswegen funktioniert das. Mit eben nur pullimiert viel Aufwand bei
der Reduktion
Ja. So, den wollen wir jetzt noch machen, hier klicke.
Wer FD1 hatte, kennt das schon, aber ich glaube,
das ist ganz gut, denn wir holen das nochmal hier.
Klicke, ich habe jetzt diesen Grafen G und ich habe
einen Teilgrafen oder ich suche einen Teilgrafen.
Ich kriege als Eingabeninstanz den Grafen G und eine Zahl K
und ich möchte wissen, gibt es in G K viele Knoten,
die alle paarweise miteinander verbunden sind.
Wird er behauptet, Klick ist ein MPV-ständig,
dass das in NP liegt, sieht man wieder relativ schnell.
Ich gebe euch irgendwie K-Knoten und behaupte,
das ist eine Clique, das könnt ihr in Polemialzeit überprüfen.
Ihr guckt euch einfach die K-Knoten an und guckt,
ob die alle paarweise miteinander verbunden sind.
Da braucht ihr irgendwie K-Quadrat viele Schritte für und fertig
Das ist nicht so das Problem. Oder eben,
wenn man an Nicht-Determinismus denkt, ich rate mir keine Knoten und überprüfe dann,
ob die eine Clique bin oder nicht, ja.
A. Welcher aus was bitte? Welcher aus FGI?
Wie welches Problem? Ja, ja,
aber das kommt auch dann
Ja. Genau, Zertifikat einfach, wir kriegen eine Menge von Knoten,
die eine Clique bilden und der prüft man poleminell,
bilden die wirklich eine Clique oder nicht.
Das ist irgendwie relativ einfach. Und jetzt haben wir halt das Problem mit der Reduktion.
Ich könnte jetzt entweder alle Probleme aus NP darauf reduzieren,
das ist aber umständlich, das wollen wir nicht mehr machen,
sondern jetzt nehmen wir uns ein Problem,
von dem wir schon wissen,
dass es NPV-ständig ist und reduzieren das auf Clique.
Und da ist jetzt gerade dieses Problem, dass man sagt,
okay, jetzt muss ich irgendwie aus meinem bisherigen Bereich rausspringen.
Ich war jetzt bisher, hatte ich nur Probleme aus dem Logikbereich,
das ist jetzt mein erstes Problem aus dem Grafentheoriebereich,
also muss ich irgendwie versuchen,
eine Reduktion anzugeben von diesem Erfüllbarkeitsproblem aufklicke
Genau. Und wer sich jetzt fragt so irgendwie,
naja, hat das jetzt was mit Algorithmik zu tun?
Das heißt ja nicht umsonst Reduktionsalgorithmus. Da passiert eigentlich
nichts anderes als eine Eingabe, eine andere umzuwandeln.
Dann soll das halt eine bestimmte Eigenschaft haben. Aber das ist genauso,
wie wir sonst, wenn wir irgendwie die Korrektheit vom Algorithmus beweisen.
Wenn wir irgendwie zeigen, ja, Merch-Sot sortiert das Eric korrekt.
Hier ist uns halt der Korrektheitsbegriff hier, sagt eben,
dass ich vor meinem Reduktionsalgorithmus erwarte, dass der Janstanz in Janstanz,
so nein, Instanz in Nein-Instanzen umwandelt.
Und genau das muss ich dann eben beweisen, dass er das tut.
Und das andere ist eben tatsächlich einfach ein Algorithmus.
Das ist eine algorithmische Vorschrift gleich,
wie ich Formeln aus der Aussagenlogik
umwandle in Grafen
Und damit das Ding dann tatsächlich korrekt ist,
soll er das oben wandeln, dass die Form mit erfüllbar ist,
genau dann, wenn der Graf eine K-Klicke enthält.
Und das, was ich halt machen kann, ist,
ich kriege jetzt irgendwie eine Formel und ich kann mir irgendwie
einen Grafen basteln und diese Zahl K, die kann ich auch noch wählen.
Und dann soll bitte rauskommen, dass der Graf genau da
eine K-Klicke hat, wenn die Formel erfüllbar ist.
So. Kann man wie folgt machen. Drei CNF nehmen wir.
Warum? Weil 13F, wie gesagt, irgendwie schönere Struktur hat.
Also jetzt kann man sich sowas überlegen,
wie gegeben so eine Formel aus drei CNF,
die hat irgendwie so und so viele Klauseln und in jeder Klausel sind genau drei Literale.
Dann kann man sich vielleicht sowas überlegen,
das nennt man dann nachher so Gadget-Konstruktionen,
dass man halt sagt, naja,
zu jeder Klausel konstruiere ich mir jetzt so ein bestimmtes Subgrafending und die verbinde ich dann auf eine bestimmte Art und Weise.
Deswegen so Gadget-Konstruktion, dass man quasi sagt,
für jedes spezielle Ding aus meiner eigenen Instanz baue ich mir was Spezielles,
was ich jetzt haben möchte und das lässt sich eben mit satt selbst nicht so gut machen,
weil satt selbst, da haben die Formen überhaupt keine Struktur,
da weiß ich nur irgendwie, dass es irgendwie eine Aussage,
eine logische Formel und damit lässt sich das nicht so gut machen.
Deswegen versucht man immer Probleme zu haben,
die auch eine gewisse Struktur haben, so.
Also einfach eine gewisse syntaktische Struktur. Jetzt kann man nämlich hier sagen,
wenn ich, wenn die Formel Fiene,
das ist jetzt eine 3CNF-Instanz und ich weiß nicht,
ob die erfüllbar ist oder nicht.
Das ist auch das Schwierige dabei. Ich weiß nicht,
ob die erfüllbar ist oder nicht und ich muss so einen Rafen konstruieren,
dass der genau dann eine Klicke hat, wenn die Formel dafür über ist.
So, jetzt hat die irgendwie hier Carfiele Klauseln,
C1 bis CK. Und jede Klausel soll die Literale L1L2L3
haben und oben steht halt der Indize der Klausel.
Also die Klausel C1 ist eben L11 oder L12 oder L13.
Und die Klausel C2 ist eben L21 oder L22 oder
Und die Dinger hier, diese L-R-I-L-R-1, L-R-3,
das sind ja die Literale,
sprich dahinter versteckt sich entweder ein positives oder negative, atomare Formel,
also sowas wie X-1 oder irgendwie nicht X-2 oder so.
Das sind die. So, was wir jetzt machen wollen,
ist, jetzt wollen wir so eine Instanz GK von Clickle konstruieren.
Ja, das ist K schlecht gewählt. Hier tritt das
K ja schon auf, das soll nicht das gleiche K sein.
Sehen wir auch gleich. Das ist das zweite, was
ich fixen muss. Also nehmen wir das mal hier irgendwie M,
also was wir machen, wobei, ich glaube,
da kommt sogar das gleiche raus,
aber erstmal weiß man das ja nicht,
erstmal würde man jetzt irgendwie M nehmen oder so
Und jetzt machen wir folgendes zu jeder Klausel,
also zu jedem L1R oder L2R oder L3R. Nehmen wir drei Knoten,
V1R, V2R, V3R, so drei Knoten.
Das ist erstmal quasi die Gadget-Konstruktion. Ich sage, naja,
für jede Klausel mache ich mir drei Knoten irgendwo hin.
Und jeder Knoten hier, V1R,
der korrespondiert halt genau zu diesem Literal L1R und V2R korrespondiert,
genau zu diesem L2R. Was ich jetzt noch brauche,
ist, jetzt sind quasi alle Knoten da.
Und jetzt muss ich noch sagen, wie ich die verbinden will.
Und die verbinde ich jetzt wie folgt, dass ich sage,
zwei Knoten, die verbinde ich genau dann,
wenn erstens,
essungleich Tee ist
Das heißt, Knoten, die zu Literalen gehören,
die in einer Klausel sind, die verbinden dich alle nicht miteinander.
Also hier diese V1RV2RV3Ren oder drei Knoten, die verbinde ich alle nicht miteinander.
Nur wenn ich jetzt auf der anderen Seite noch mal
drei Knoten habe, die zu einer anderen Klausel gehören,
da fange ich an zu verbinden.
Vorher nicht. Und dann verbinde ich genau dann,
wenn die zugehörigen Literale nicht zueinander komplementär sind. Sprich,
wenn ich hier habe X1 und hier habe ich X2,
die verbinde ich. Oder wenn ich hier habe X1 und
hier drüben habe ich auch X1, die verbinde ich auch.
Was ich nicht verbinde, ist X1 und nicht X1.
Da mache ich keine Kante. Sprich, ich mache eigentlich überall Kanten,
außer wenn die drei Knoten oder die zwei Knoten,
die verbinden will, zu einer Klausel gehören oder wenn die zueinander komplementäre Literale sind.
Also X1 und nicht X1,
dann verbinde ich die nicht
Genau. Und dann ist der Wert K hier tatsächlich,
also der hier, eigentlich solche seine WM,
das ist tatsächlich der gleiche wie die Anzahl der Klicken hier.
Da mein Beispiel, wenn ich die 3K&F-Instanz kriege,
also nicht XYZ und so weiter hier,
dann sieht das im Graphen so aus.
Wir ignorieren mal kurz das Grün und Rot markierte da, zu diesem Nicht-XYZ,
das sind die drei Knoten hier auf der linken Seite, nicht XYZ.
Dann dieses X-Nicht-Y-Nicht-Z, das sind die drei hier oben.
Und das hier XYZ, das sind die drei hier.
Und jetzt ist das so, wenn man da jetzt drauf guckt,
Die Knoten hießen ja irgendwie V1, R, V2,
R und so weiter. Das mit den Xen da und so,
das soll nur illustrieren, zu welchem Literal der Knoten gehört.
Ich kann ja nicht einen Knoten haben, die beide X heißen oder so.
Dann ist das ein Knoten, das würde keinen Sinn machen.
Also der Knoten hier, das ist nicht der Knoten X,
sondern das ist der Knoten V2-1,
weil das der Knoten V ist,
der zur zweiten Klausel gehört und da das erste Literal bezeichnet.
V2-1 und der hier ist V3-
1. Also das sind unterschiedliche Knoten,
aber die Idee ist halt,
dass zu beiden
quasi das X gehört
Na, dann kann man nämlich auch gut sehen,
wann die verbunden werden. Drei Knoten, also Knoten,
die irgendwie zu der gleichen Klausel gehören, die werden nicht miteinander verbunden.
Also hier wird irgendwie nichts verbunden auf der linken Seite.
Und dann, wenn die zueinander komplementär sind,
also das Nicht-X wird nicht mit dem X hier verbunden,
weil die zueinander komplementär sind.
Aber die beiden X werden zum Beispiel verbunden,
da gibt es eine Kante zwischen.
Warum? Weil die eben zueinander nicht komplementär sind.
Naja, und jetzt kann man sich überlegen,
in dem Beispiel kann man das auch gut sehen.
Wenn es eine K-Klicke gibt in dem Grafen,
dann muss ich aus jeder,
aus jedem dieser Dreiertriebel von Knoten genau
einen Knoten genommen haben
Weil die Knoten, die zu einem Dreiertriebel gehören,
die sind ja alle nicht miteinander verbunden.
Bei einer K-Klicke muss ich aber K-Knoten haben, die alle miteinander verbunden sind.
Das geht nur, wenn ich wirklich aus jeder,
aus jedem dieser Dreiertriebel genau einen Knoten rausnehme.
So. Und dann kommt noch dazu,
dass keine zwei Knoten in dieser K-Klicke komplementär zueinander sind.
Warum nicht? Weil sie dann ja keine Kante haben.
Also alle Knoten, die da miteinander verbunden sind,
können nicht komplementär zueinander sein. Ergo kann ich da eine
Belegung rauslesen, so wie das da jetzt illustriert ist.
Die Belegung hier ist, Z auf 1 setzen und Y
auf Null setzen
Und die Behauptung ist dann, jetzt habe ich nämlich aus,
jetzt habe ich eine Belegung und die Behauptung ist jetzt,
die ist erfüllbar.
Oder dass das eine Belegung ist, die die Formel erfüllt.
Warum muss das so sein? Naja,
ich habe jetzt ja aus jeder dieser Klauseln quasi ein literal
rausgenommen und damit wird die Klausel ja wahr.
Die Klausel, das sind ja oder verknüpfte literale.
Also wenn ich hier sage, bei der ersten nehme ich
das Z, naja, dann wird die Klausel damit wahr.
Bei der zweiten nehme ich nicht Y, damit wird die wahr.
Und bei der dritten, da nehme ich auch wieder
das Z, da wird die wahr.
Das ist okay. Und dann kann ich noch sagen,
wie ich x-belege, ist egal.
Ist ja schon
eine erfüllende Belegung
Und bin fertig. Und andersrum eben auch, wenn die Formel erfüllbar ist,
dann muss es ja irgendwie eine Belegung geben, die sie erfüllt.
Das heißt, ich habe eine Belegung,
die in jeder Klausel mindestens ein Literal wahrmacht.
Und die ist auch nicht widersprüchlich. Die macht nicht in
der Einklausel X war und in der anderen Klausel nicht X war.
Sondern das würde nicht funktionieren. Ich muss ja X entweder
wahrmachen oder nicht wahrmachen. Naja, dann habe ich eine Belegung,
dann habe ich in jeder Klausel ein Literal wahrgemacht.
Und das führt wieder dazu,
wenn ich mir dann genau dieses Literal in den Dingern hier markiere,
dann habe ich wieder eine K-Klicke.
Formal ausgeführt. Achso, und ist in Podinialted möglich.
Ich dachte, das kommt ein zweites
Also die Konstruktion ist in Polinialzeit möglich. Man liest einmal
über die Formel rüber, hat alle Auftritte in Variablen und Klauseln
, dann weiß ich das schon mal.
Und dann kann ich all die Knoten erzeugen. Und dann,
die Kanten kann ich auch, im schlimmsten Fall irgendwie mit so V-Kodrat viel Aufwand machen.
Also das wird ja nur dann irgendwie in, ich meine,
die einzigen Möglichkeiten, da aus Polymialzeit rauszurutschen,
ist eigentlich, wenn man so Sachen macht wie,
ich bastel mir jetzt alle Teilmengen der Knotenmenge und will damit irgendwie arbeiten.
Dann habe ich irgendwie zwei hochn viele Timemengen,
dann rutsche ich da irgendwie raus.
Aber ansonsten soll man da irgendwie basteln, kann eigentlich nicht
so wirklich viel passieren. Aber man muss sich halt einmal
überlegen, dass das tatsächlich in Polymialzeit geht
Gut, aber da sieht man es ganz gut. Ich meine,
ich habe genauso viele Knoten, wie die Formel lang ist,
also kann man sich schon überlegen, ja,
ich lese einmal die Formel rüber,
erzeugt mir damit die Knoten und dann gehe ich einfach einmal
über die Knotenmenge rüber da und baue die Kanten auf.
Das ist auch nicht so das Problem. Gut, was
muss man noch zeigen? Man muss zeigen, dass das
wirklich eine Reduktion ist, also dass die Reduktion korrekt ist.
Also, das müssen wir zeigen, wenn der gegebene Graf eine Clique enthält,
dann ist die Formel erfüllbar und wenn die Formel erfüllbar ist,
dann enthält der gegebene Graf eine Clique.
Erste Richtung, wenn die Form erfüllbar ist,
dann gibt es ja eine Belegung,
die in jeder Klausel mindestens ein Literal wahrmacht
Jetzt nehme ich mir ihn aus jeder Klausel eben eins der wahrgemachten Literale raus.
Also wenn er zwei oder drei Literale wahrgemacht werden,
dann ist mir das egal. Ich nehme nur eins raus
. Das reicht. Und wenn man jetzt... Genau,
wenn man jetzt die zugehörigen Knoten nimmt, also die zu diesen literalen gehören,
dann ist jetzt die Behauptung, das ist eine Karklicke.
Ja. Warum? Erstmal sind es genau Karknoten, das ist schon mal gut.
Sie hat ja Karklausel, da sind es auch Karknoten.
Und wenn ich mir jetzt zwei Knoten nehme,
beliebe ich hier, VER, VSJ,
dann will ich jetzt zeigen, dass seine Kante dazwischen ist,
damit das dann eine kacklige ist.
Erstmal gilt auf jeden Fall eher ungleich S,
da die einzelne Literale aus unterschiedlichen Klauseln waren und deswegen war
jeder Knoten ja auch aus so einem anderen drei Triebeln
Und dann können die aber auch nicht,
müssen die mit einer Kante verbunden sein,
weil die ja nicht so ineinander komplementär sein können.
Wenn die komplementär zueinander wären, hätte ich damit gerade behauptet,
dass die Belegung einmal in einer Klausel X wahrmacht und in
einer anderen Klausel nicht X wahrmacht.
Und das funktioniert nicht. Die kann das nicht gleichzeitig auf Null und
auf Eins setzen. Also sind die nicht zu komplementär.
Und damit sind die Knoten durch eine Kante verbunden.
Dann habe ich gezeigt, dass alle diese Kackknoten durch Kanten
verbunden sind und weiß, da gibt es eine Kackklicke drin.
Und andersrum, wenn ich weiß, es gibt eine Kackklicke,
dann muss jeder Knoten aus einem anderen Triebel sein,
weil ja die Knoten innerhalb eines Triebels nicht miteinander verbunden sind.
So, in der Karklicke sind aber alle paarweise miteinander verbunden.
Das heißt, jeder von den Karknoten muss aus einem
anderen Triebel sein
Und dann kann man nämlich für jeden diesen Knoten lieber dienen,
dass man da jetzt gewählt hat in der Carklick,
gesetzt man das zugehörige Literal auf den Wert 1. Dadurch,
weil die ja sonst nicht verbunden werden mit einer Kante,
hat man nicht zwei Komplementierliteralien,
wird einzugewiesen.
Wieder sowas tritt nicht auf mit X und Nicht X,
nach Konstruktion. Genau, und dann ist jede Klausel erfüllt,
weil man ja aus jedem Triebel einen Knoten gewählt hat.
Diese Knoten gehören zu einer Klausel,
also hat man jede Klausel wahrgemacht.
Fertig. Fragen
Das war jetzt das erste Problem aus der Grafentheorie,
dass man dann als NP vollständig nachgewiesen hat.
Fragen. Zum ersten, zweiten, dritten, gut.
Jetzt kann man das auch für andere Probleme machen. Teilsummenprobleme,
da würde man jetzt irgendwie, da haben wir weder Aussagen,
ruhige Sachen, noch Grafen,
sondern das ist man irgendwie so ein bisschen in der Zahlentheorie gegeben,
soll eine Menge von natürlichen Zahlen, endliche Menge von natürlichen Zahlen.
Und so ein Ziel wäre Tee. Jetzt ist die Frage,
kann ich irgendwie so und so viele Zahlen aus S rauswählen,
sodass die Summe dann Tee wird
Auch wieder nachweisen, dass das MPV-ständig ist, das Subsite-Sam-Problem.
Machen wir auch gleich nochmal. Ja, und dann kann man eine Mengen-Partitionsprobleme,
das hatten wir auch schon mal, das ist auch MPV-ständig.
Knotenüberdeckung, auch MPV-ständig. Bei Mengen-Partition ist man wieder
irgendwie in diesem Zahlentheorie-Bereich. Da kann man sich überlegen,
wenn man jetzt eins davon,
also entweder dieses Subsets haben von eben oder dieses Mengen-Partitionsproblem,
wenn man eins davon als MPV-vollständig nachgewiesen hat,
dann ist es danach wahrscheinlich einfacher von dem auf das andere Zahlentheorie-Problem zu reduzieren,
als wieder zu versuchen,
so einen Bereichswechsel zu machen
Knotenüberdeckung irgendwie aus der Grafentheorie. Ich habe einen Grafen G
und eine Zahl K. Und jetzt ist die Frage,
gibt es K viele Knoten,
die den Grafen insofern überdecken, als dass alle kannten,
entweder zwischen zwei von diesen Karknoten verlaufen oder mindestens ein Ende eben zu diesen K-Knoten dann gehört.
Also ich überdecke alle Kanten mit den Knoten. Unabhängige Menge
, so ähnlich wie Clique. Hier habe ich jetzt,
ist die Frage nicht, ob es Karknoten gibt,
die paarweise alle miteinander verbunden sind,
sondern da gibt es K-Knoten,
die alle paarweise nicht miteinander verbunden sind.
Also quasi k-isolierte Knoten
Färbungsproblem gegeben, so ein ungerichteter Graf,
kann ich jedem Knoten eine Farbe geben von 1 bis K,
sodass zwei benachbarte Knoten nicht die gleiche Farbe haben.
Und hamilt ein Kreisproblem nochmal, gibt es so einen Hamilton-Kreis in dem Grafen.
Alle NP-vollständig. Für ein paar machen wir das gleich nochmal.
Genau. Für ein paar machen wir das gleich nochmal.
Mittlerweile gibt es so mal so mehrere 10.000 NP-vollständige Probleme,
würde ich mal sagen.
Aus ganz unterschiedlichen Bereichen
Und so Techniken, um das dann zu beweisen,
so üblicherweise irgendwie Gadget-Konstruktionen, die überen beiden Restriktionen und Local Replacement,
das klappt meistens nur, wenn man Probleme hat,
die schon sehr, sehr ähnlich aussehen.
Wollen wir jetzt noch nicht großartig vertiefen. Wer sich dafür interessiert,
dieses Buch von Gary und Johnson,
ganz unten in der letzten Zeile, Computers and Intractability,
das ist aus 1977 und liest sich immer noch ziemlich gut.
Also manchmal verjährt sowas ja irgendwie, aber die hat einen
sehr schönen Stil, das liest sich immer noch so schön.
Also wer sich dafür interessiert,
wie man denn so endlich Vollständigkeitsbeweise machen kann,
das ist eine sehr coole Literatur da.
Ja, Take-on-Message
Wenn ihr ein Problem habt, für das ihr versucht,
einen schnellen Algorithmus zu entwickeln und es klappt nicht und klappt nicht
und klappt nicht und euch fällt dann im Endeffekt nur so Sachen ein,
wie irgendwie den kompletten Suchraum durchzugehen.
Also so wie beim Clique-Problem, wo man irgendwie sagt, naja,
dann wähle ich doch mal Kark-Knoten oder ich probiere alle Mengen von Kark-Knoten durch,
ob das eine Clique ist, wenn euch nur sowas einfällt,
dann ist das sehr wahrscheinlich NPV-ständig so.
Also je nachdem, wie viel Erfahrung ihr habt und so,
aber wenn einem so partout nichts einfällt,
wenn man so gar nicht vorankommt,
dann kann man das mal vermuten und dann kann man das entweder mal googeln und nachschlagen,
ob jemand das Problem oder was Ähnliches schon mal hatte oder eben selbst versuchen,
so eine NPV-Vollständigkeitsbeweis zu führen.
Solange man innerhalb eines Settings bleibt,
ist das meistens auch noch relativ einfach, zumindest schwieriger,
wenn man die Grenzen überschreitet. Genau. Ja,
Ausblick, wenn man jetzt so ein NPV-ständiges Problem hat,
dann hört man ja üblicherweise nicht auf,
sondern man versucht trotzdem irgendwie effiziente Algorithmen zu entwickeln.
Und was man dann eben macht, ist,
man guckt sich so Sachen an wie irgendwie,
kann ich die Eingabe einschränken?
Brauche ich mein Problem vielleicht gar nicht? Also will ich
vielleicht gar nicht eine Klicke auf allen möglichen Grafen machen,
sondern weiß ich vielleicht, was darüber?
Weiß ich, dass der Grad aller Knoten durch vier beschränkt ist?
Weiß ich, dass das immer Sterne drin auftreten?
Weiß ich irgendwas über meinen Grafen? Wo ich dann sagen kann,
okay, ich brauche das Problem gar nicht in seiner Allgemeinheit
zu lösen,
sondern nur für eine spezielle Eingabeklasse
Sowas kann man machen. Oder man kann den Begriff Algorithmus
quasi versuchen aufzuweichen. Dass man sagt, okay,
ich interessiere mich gar nicht zwingend für das Optimum,
sondern eine Näherungslösung reicht mir schon. Was ich sage,
naja gut, das ist nicht die kürzeste Route,
die ich hier bestimme, aber immerhin nur so 98 Prozent ist okay.
Approximationsalgorithmen sind auch deswegen interessant, weil man,
man tut ja in der Algorithmik immer so,
als wäre die Eingabe total klar.
Dass die Eingabe immer super ist.
Aber meistens bei ganz vielen Problemen ist die Eingabe auch eigentlich
nur so eine Näherung oder ein Schätzwert oder so.
Also wenn man irgendwie Was weiß ich,
wenn ihr einen Algorithmus entwickelt und ihr habt als Eingabewerte
das Interesse von einer Personengruppe, einen bestimmten Artikel zu kaufen.
Ist das auch eher so ein Schätzwert? Dann sagt er so,
naja, der Typ, der hat bisher alle Playstation-Spiele gekauft,
die es auf dem Markt gibt.
Sehr wahrscheinlich wird auch das Neue kaufen.
Und ein anderer hat vielleicht die Hälfte aller Playstation-Spiele gekauft,
die es auf dem Markt gibt,
dann wird er vielleicht das mit 50 Prozent Wahrscheinlichkeit kaufen,
das Neue oder irgendwie sowas.
Da wird ja irgendwie so Nährungswerte. Trotzdem wisst ihr ja nicht,
Wenn der Typ noch andere Interessen hat,
dann steigert sich vielleicht gerade sein Interesse, genau dieses Spiel irgendwie zu kaufen.
Also das ist auch nur so ein Wert, wo er
so ungefähr schätzt. Und dann sind Approximationsalgorithmen natürlich viel attraktiver,
als wenn die denn schneller sind, als so ein super toller deterministischer Algorithmus.
Weil was hilft es euch, wenn ihr quasi sagen könnt,
ja, meine Eingabe ist zwar nur Ernährungswert,
aber mein Ergebnis ist optimal so bezüglich der nur Ernährungsweise bestimmten Eingabewerte.
Das macht gar nicht so viel Sinn.
Deswegen reicht es dann vielleicht wirklich, wenn man sagt,
naja, mit 90 Prozent bin ich gerade am Optimum dran
Vor allem, wenn ihr dann eben nicht nur einen Tag rechnen müsst,
sondern vielleicht irgendwie nach drei Sekunden fertig seid, so. Andere Möglichkeit,
randomisierte Algorithmen, geht in eine ähnliche Richtung,
da versucht man nicht ein Optimum,
also den Begriff des Optimums aufzuweichen, sondern dass man sagt,
naja, ich rechne halt mit Münzwürfen quasi,
ich nehme mal hier eine Abzwei, mal da eine Abzweigung,
haben halt das Problem, dass sie manchmal kein Ergebnis liefern,
also dass sie dann manchmal sagen, ey,
wie weiß ich nicht.
Dafür sind die oft sehr, sehr, sehr schnell,
sodass es gar nicht so schlimm ist, dass sie manchmal kein Ergebnis liefern.
Also wenn ihr einen Algorithmus habt,
der ein Problem für das euer deterministische Algorithmus nahig langsam ist.
So, und der löst das jetzt korrekt,
ist viel, viel, viel schneller,
der macht das irgendwie ein paar Millisekunden,
aber nur mit 50-prozentiger Wahrscheinlichkeit liefert er
das korrekte Ergebnis
Wenn jetzt mit 50-prozentiger Wahrscheinlichkeit ein falsches Ergebnis liefert, dann ist doof.
Aber wenn er mit 50 Prozent mit den anderen 50 Prozent sagt,
weiß ich nicht, dann ist alles super,
dann führt er den halt einfach zehnmal hintereinander aus,
20-mal, 30-mal, 40 mal,
das haut die Wahrscheinlichkeit so doll in die Höhe,
dass er irgendwann mal das richtige Ergebnis sagt,
dass das quasi auch mit deterministischer Algorithmus ist,
nur halt viel, viel, viel schneller.
Also da greifen dann eher so Effekte,
also das kann man so weit treiben, das Spiel,
das ist quasi unwahrscheinlicher ist, dass er kein Ergebnis liefert,
als das, was weiß ich, euer Laptop zwischendurch abstürzt oder irgendwie sowas.
Dass irgendwelche Hardware-Effekte dann bedeutender sind. Und das letzte Heuristiken,
dass man eben irgendwie versucht zu raten,
so mit Nährung zu arbeiten, Heuristiken ist ein sehr spannendes Gebiet,
weil man zum Beispiel für dieses Erfüllbarkeitsproblem gibt es mittlerweile unglaublich schnelle Heuristiken,
also Heuristiken, wenn Algorithmen die benutzen,
sind die sehr, sehr, sehr schnell.
Und das Problem dabei ist, man ist sehr,
sehr schwer abzuschätzen, warum die jetzt eigentlich gut sind.
Das hängt meistens mit irgendwie sowas zusammen,
dass wenn ein Problem in der Praxis auftritt,
ihr eben doch nicht irgendwie eine völlig beliebige Aussage logische Formel kriegt,
sondern der Typ,
der die designt hat,
sich da irgendwie was bei gedacht hat und deswegen
die Formel eine sehr gewisse oder eine gewisse Struktur haben und
das kann man dann bei den Heuristiken
wieder ausnutzen
Jo, das dazu mal so als Ausblick,
was man noch alles machen kann in der Algorithmik so, wo auch viel gearbeitet wird.
Anderes Thema ist zum Beispiel noch so exakte Algorithmen, dass man versucht,
irgendwie die Basis bei dem Exponentialzeitalgorithmus immer weiter zu reduzieren,
dass das nicht in zwei hochendest, sondern in 1,8 hochenden,
1,4 hochenden und so weiter.
So, abschließend hier, Zusammenfassung nochmal, so,
was wir die letzten zwei, drei Male gemacht haben.
Wir haben uns am Anfang überlegt, was ist überhaupt ein Problem,
wie kodieren wir das, was ist die Laufzeit von so einem Problem?
Und dann haben wir gesagt, P,
das sollen die effizient lösbaren sein, wo man irgendwie versucht hat zu illustrieren,
naja, das ist tatsächlich effizient lösbar,
weil wenn ich irgendwie einen Quadratalgorithmus habe die Eingabe,
die Länge 1000, dann kommt da nur eine Million Schritte raus,
das ist irgendwie okay.
Beim Exponentialzeitalgorithmus mit zwei Hochendenden, wenn ich da 1000 reinstecke,
ist das nicht mehr okay, zwei Hochtausend ist irgendwie eine Katastrophe.
Da hat man aber festgestellt, bei diesen Exponentialzeitalgorithmen gibt es ganz viele Sachen,
die man zwar nicht schnell lösen kann, sprich kein P-Algorithmus,
aber wo man schnell ein Ergebnis verifizieren kann,
wenn man denn eins hat, Auftritt NP.
Und dann wollte man eben irgendwie eine Möglichkeit haben,
um zu sagen, okay, für dieses Problem,
wo ich jetzt weiß, dass es ein NP ist,
gibt es wirklich, wirklich, wirklich keinen coolen P-Algorithmus.
Und das hat man dann eben versucht mit dieser NP
Vollständigkeit irgendwie auszudrücken. Haben wir da gemacht, das ist die Folie zu Podierungen und ganz unten P. Dass man eben gesagt hat,
naja, wir wollen die Eingabe irgendwie binär kodieren,
die Folie ist nicht ganz so wichtig,
nur dass er das mal irgendwie nochmal euch Revue passieren lasst,
dass ihr sagt, okay, Eingaben müssen irgendwie binär kodiert sein,
damit das irgendwie Sinn macht und ich arbeite nicht wirklich mit dem Graphen,
sondern eigentlich mit der Kodierung von dem Graphen, auch wenn das jetzt bei den ganzen Reduktionen und so nicht so in den Vordergrund tritt.
Dann haben wir uns auf formale Sprachen eingeschränkt,
weil das eben die Theorie einfacher macht und da auf Entscheidungsprobleme,
dass man eben nicht mehr sagt,
ich versuche irgendwie einen kürzen Pfad zu bestimmen,
sondern ich versuche die Antwort zu lösen,
gibt es einen Pfad von der Länge kleiner gleich K,
dann kann ich mich mit Ja oder Nein antworten,
macht die Theorie auch einfacher und da hatten wir uns ja nochmal überlegt,
dass das kein großes Hindernis ist,
weil man dann quasi so ähnlich wie bei einer binären Suche
auch wieder das Optimierungsproblem gut lösen kann,
wenn man
das Entscheidungsproblem lösen kann
Ja, und dann eben, wir akzeptieren entscheiden,
okay, kurzer Exkurs und dann eben ganz wichtig hier,
wenn es zu einem Problem L,
ein Algorithmus gibt ja das Problem im Polinialzeit, entscheidet,
dann sage ich, dass die Sprache in P ist.
Und da sagen wir eben üblicherweise, dass wir dann sagen,
okay, dann ist das Problem effizient lösbar.
Dann haben wir NP so eingeführt, dass wir gesagt haben,
genau dann, wenn es so ein Algorithmus A gibt,
ein Verifikationsalgorithmus A,
der mit zwei Eingaben arbeitet und Polimir Laufzeit hat und der
dann eben für so eine Eingabe X mit dem Zertifikat Y entscheidet,
ob X eine Jahrenstanz ist oder nicht.
Und als Einschränkung für NP, noch haben wir gesagt,
das Y darf nur polymiell lang sein in der eigentlichen Eingabe
Ja, und dann haben wir noch gesagt, nicht die Feminismus- und Verifikationsalgorithmen sind äquivalent,
haben wir uns auch schon mehrmals so überlegt, genau.
Auftritt der Reduktion von heute, dass man gesagt hat,
ein Problem L1 in ein anderes Umwandeln L2. Und genau,
das ist ja eine Reduktion, das ist wieder ein Algorithmus,
weil ich eben etwas angebe, was mir Instanzen des Einproblems,
Instanzen des anderen Problems umwandeln kann,
und zwar Jahrenssatz in Jahrensstanz, Nein-Instanz in Nein-Instanzen.
Und damit konnte man da diese NPV-Vollständigkeit definieren,
dass man dann gesagt hat, okay,
wenn ein Problem zu sich noch ein NP ist und vor allem aber,
wenn ich alle Probleme aus NP, all diese L-Strichs auf L reduzieren kann,
dann sage ich, das Problem ist NP vollständig.
Und dann haben wir gesagt, okay,
um überhaupt diese Idee von NP vollständig zu,
oder zunächst um diese Idee mit der Reduktion zu untermauern, warum man überhaupt braucht.
Gibt es diesen ersten Satz, dass man sagt, naja,
ist ja schön, wenn ich so eine Reduktion habe,
weil wenn ich jetzt L2 schnell lösen kann,
kann ich auch L1 schnell lösen.
Dann habe ich das Problem, L1 zu lösen,
darauf zurückgeführt, dass ich sagen kann,
ich brauche eine Reduktion und ich muss L2 schnell lösen können.
Das ist schön. Dann haben wir uns Dann haben wir die NPV-Ständigkeit eingeführt.
Und auch da illustriert, warum ist die praktisch?
Das war hier das dritte Item, weil man sagen konnte,
naja, wenn ein Problem NPV vollständig ist und es NP ist, dann muss P gleich NP gelten. Und da wusste man schon,
oh, jetzt ist dieser Begriff NPV-Ständigkeit praktisch,
weil wenn ich dann zeigen kann, dass ein Problem MPV vollständig ist,
dann ist es sehr wahrscheinlich nicht in P. Und um uns das jetzt einfacher zu machen,
zu zeigen, dass ein Problem NPV vollständig ist,
brauchte man hier den zweiten, dass man gesagt hat,
so sieht, es gibt so eine Transitivität bezüglich der Reduktionsfunktion und dass man dann sagen konnte,
hier, wenn eine neue Sprache ist und L-Strich ist NPV vollständig, dann reicht es jetzt eine Reduktion anzugeben.
Ich brauche nicht mehr tausende von der Reduktion angeben
Genau, das war dann das Verfahren, wenn man jetzt
für ein neues Problem zeigen will, dass das NP vollständig ist.
Jetzt können wir ja auch den zweiten Schritt hier gut machen,
weil wir jetzt mehrere Probleme kennen, die NP vollständig sind.
Gleich lernen wir noch zwei, drei weitere kennen.
Genau, und jetzt kann man damit irgendwie arbeiten, ne?
Und das waren so primär die Probleme, die wir bisher hatten,
so die ersten drei haben wir jetzt nicht explizit gezeigt,
das vierte haben wir gezeigt.
Und gleich zeigen wir noch für drei weitere,
dass die auch NP vollständig sind,
um ein bisschen Übung zu kriegen.
Fragen. Zum ersten, zweiten
Gut, dann sind schnell heute. Dann machen wir immer
Pause bis Viertel vor, das sind ja nur zehn Minuten.
Ah, das ist gut. Ihr wollt alle, dass wir dann
danach länger machen können. Das finde ich gut. Ja,
dann machen wir bis Viertel vor Pause und machen,
da haben wir danach noch eine ganze Stunde.
So, yeah, voll gut, super Plan.
Und alleine so, hä, idiotisch. Nee,
okay, machen wir bis Philipp vorher Pause,
zehn Minuten und danach machen wir noch eine dreiviertel Stunde und
dann sind wir um halb zwölf durch,
ne?
Ja, alles klar.