Gleichwertigkeit von Kolmogorov-Komplexitätsdefinitionen


20

Es gibt viele Möglichkeiten, die Kolmogorov-Komplexität zu definieren , und normalerweise sind alle diese Definitionen bis zu einer additiven Konstante äquivalent. Das heißt , wenn und Kolmogorov Komplexität Funktionen (definiert über verschiedene Sprachen oder Modelle) sind, dann gibt es eine Konstante , so dass für jeden String , . Ich glaube , das liegt daran , dass für jede Kolmogorov Komplexität Funktion und für jedes gilt , daß , für eine Konstante .K 2 c x | K 1 ( x ) - K 2 ( x ) | < c K x K ( x ) | x | + c cK1K2cx|K1(x)K2(x)|<cKxK(x)|x|+cc

Ich interessiere mich für die folgenden Definitionen für , basierend auf Turing-MaschinenK

  1. Anzahl der Zustände : Definieren Sie als die minimale Zahl , sodass ein TM mit Zuständen für die leere Zeichenfolge ausgibt .q q xK1(x)qqx
  2. Länge des Programms : Definieren Sie als das kürzeste "Programm", das ausgibt . Beheben Sie nämlich eine Möglichkeit, TMs in binäre Zeichenfolgen zu codieren. für eine Maschine bezeichnet ihre (binäre) Kodierung als . wobei das Minimum über allen , die bei leerer Eingabe ausgeben .x M M K 2 ( x ) = min | M |K2(x)xMMK2(x)=min|M|Mx

Sind und gleichwertig? Was ist die Beziehung zwischen ihnen und welche man besser versteht das Konzept der Kolmogorov Komplexität, wenn sie nicht gleichwertig sind.K1K2

Was mich besonders stört, ist der Anstieg der Rate mit , der nicht zu sein scheint (oder zumindest linear mit der Konstanten so dass statt ). Betrachten Sie das einfachste TM, das ausgibt - dasjenige, das als Teil seiner Zustands- und Übergangsfunktion codiert . es ist sofort zu sehen, dass . Die Kodierung derselben Maschine ist jedoch viel größer und die triviale Grenze, die ich erhalte, ist K_2 (x) \ le | x | \ log | x | .K2xC>1K2<C|x||x|+cxxK1(x)|x|+1K2(x)|x|log|x|


Es gibt mehr als 2n2 Maschinen mit n Zuständen, und ihre durchschnittliche Größe beträgt mindestens n2 , weshalb es unwahrscheinlich ist, dass sich diese nur durch eine additive Konstante unterscheiden.
Kaveh

1
Es gibt eine bekannte Schranke, dassfür einige feste nicht abhängig von . Dies liegt daran, dass wir in eine präfixfreie Sprache kodieren können, indem wir einfach jedes Bit von verdoppeln und dann mit enden . Dies dauert Bits zur Darstellung von . Da also als universelle präfixfreie Maschine definiert ist, gilt für einige feste . Dies kann durch intelligentere Codierung von in eine präfixfreie Sprache verbessert werden . K2(x)c+2|x|cxxx012|x|+2xK2K2(x)2|x|+2+ccx
Carl Mummert

Ich kann nicht sehen wie. Es scheint, dass entweder als Teil der Codierung (als Rohdaten) angegeben wird, oder dass Sie durch Ihre Zustandsmaschine konstruieren müssen . Die erste Option scheint zu schummeln und ich verstehe nicht, wie sie mit der zweiten Option vergleichbar sein kann (was impliziert )xxK1
Ran G.

@Ran G .: Der Schlüsselpunkt ist der Invarianzsatz, der unter en.wikipedia.org/wiki/Invariance_theorem beschrieben ist . Wenn ich ein effektives System mit einer Wachstumsrate vondann wird eine universelle Turingmaschine (wie Sie für beschreiben ) dies innerhalb einer additiven Konstante erfüllen. Die Universalmaschine ist diejenige, die die Eingabe von annimmt und die Ausgabe von zurückgibt, wenn anhält. 2|x|K2MMM
Carl Mummert

Antworten:


6

Ich entschuldige mich im Voraus dafür, dass ich zu viele Details weggebe, aber ich bin dabei, Leuten zu widersprechen.

ÜberK(x)K(x)+c

Die Tatsache, dass kommt normalerweise von einem Interpreter der Beschreibungssprache # 2 in die Beschreibungssprache # 1 und nicht von einer Übersetzung von Programmen von # 2 in Programme von # 1.K1(x)K2(x)+c

Zum Beispiel und Sie erhalten diese Ungleichung so einfach wie :KC(x)KPython(x)+cpy2c

void py_run(char * s) {
    // code of your Python interpreter
}

int main(void) {
    py_run("Put here your Python program of size Kpython(x)");
}

Dann ist Ihr stetiger etwas sein wie , wo die Anzahl der Bits für diesen Code ist und Bits ist die Größe der offiziellen Python - Interpreter in C geschrieben Natürlich brauchen Sie nur zu interpretieren , was möglich ist , in deiner Beschreibungssprache für Python also kannst du es besser machen als 69 MB :-)cpy2c528+490240688528490240688

Wichtig ist, dass Sie Ihr Python-Programm linear in Ihren C-Code schreiben können . Beispielsweise ist eine Sprache, in der Sie "BANANA" zwischen jedes Zeichen setzen müssen, kein sehr gutes Beschreibungsprogramm, und die Eigenschaft ist dann falsch. (Wenn Sie jedoch aufgrund der Beschreibungssprache berechtigt sind, Daten in eine separate Datei oder in einen Block zu schreiben, verschwindet dieses Problem.)

Warum ist dein fehlerhaft?K1(x)=q

Das Problem bei Ihrer Definition von ist, dass Sie möglicherweise mehr als Bits benötigen , um eine Turing-Maschine mit Zuständen zu beschreiben , da Sie Übergänge codieren müssen.K1qq

Also sind und wahrscheinlich nicht gleichwertig, aber das ist hauptsächlich die Schuld von . Ich denke, wir können beweisen, dass es für alle ein so dass . Natürlich ist jedes genug, um die Tatsache zu widerlegen, dass keine gültige Funktion ist, da dies bedeuten würde, dass wir mehr alle möglichen Zeichenfolgen der Länge in Bit codieren können.K1K2K1a>0caK1(x)a|x|+caa<1K12nnan+ca

Aber die Größe ist beim Bau von Turing-Maschinen unglaublich eng. Die Idee ist, dass es in einem Block von Zuständen Möglichkeiten gibt, Übergänge für jeden Zustand zu finden, und das ist besser als die üblichen Möglichkeiten, mit denen Sie Bits füllen können. Dann können Sie in jedem Block Informationsbits speichern . (nicht weil man den Block auf die eine oder andere Weise und verlassen muss)bb2b2bblog2b2log2b

Also ja ... Mit Blöcken der Größe könnten Sie wahrscheinlich beweisen, dass . Aber ich habe bereits viel zu viel darüber geschrieben, warum die Anzahl der Zustände keine gültige Kolmogorov-Komplexitätsfunktion ist. Wenn du willst, dass ich es ausarbeite, werde ich es tun.21/aK1(x)a|x|+ca

Nun zuK2

Die naive beschreibende Sprache entspricht in etwa (dh für jeden nächsten Zustand und Einzelheiten zum Schreiben und Beenden).K2(x)=q2(log2q+2)log2q

Wie Sie zu sein scheinen, bin ich davon überzeugt, dass eine bessere / betrügerische Möglichkeit darin besteht, die Codierung von "Daten" in Turing-Maschinen zu autorisieren, indem möglicherweise ein binäres Tag in der Beschreibungssprache hinzugefügt wird, das besagt, ob ein Zustand ein Datenzustand ist ( das schreibt nur ein bisschen und geht zum nächsten Zustand) oder wenn es etwas anderes macht. Auf diese Weise können Sie ein Bit Ihres in einem Bit Ihrer beschreibenden Sprache speichern .x

Wenn Sie jedoch das gleiche , könnten Sie die gleiche Technik verwenden, die ich im vorherigen Teil verwendet habe, um ein paar Bits zu speichern, aber ich scheine bei (für any ) .. vielleicht kleiner als, gerade, aber es scheint schwierig , . (Und ich erwarte, dass es , nicht einmal .)K2K2(x)a|x|log|x|+ca>0log|x|O(|x|)|x|O(|x|)


Behauptest du, dass keine Kolmogorov-Komplexitätsfunktion ist? Dies ist für mich sehr überraschend, da tatsächlich die Definition ist, die ich in einem Einführungskurs zum Thema Berechenbarkeit verwendet habe (nicht, dass es etwas über seine Richtigkeit aussagt). K1K1
Ran G.

Nun, die Tatsache, dass ist ziemlich störend. Bedenken Sie : Es gibt mögliche Wörter mit Bits und Sie könnten sie mit Bits codieren . Das würde bedeuten, dass ( Kodierung muss injektiv sein)K1(x)12|x|+c2nn12n+c2n=O(212n)
jmad

Was ist, wenn das Python-Programm Zeichen enthält, die von C reserviert wurden?
PyRulez
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.