Équivalence des définitions de Kolmogorov-Complexity

20

Il existe de nombreuses façons de définir la complexité de Kolmogorov et, généralement, toutes ces définitions sont équivalentes jusqu'à une constante additive. C'est-à-dire que si et sont des fonctions de complexité de kolmogorov (définies via différents langages ou modèles), alors il existe une constante telle que pour chaque chaîne , . Je crois que c'est parce que pour chaque fonction de complexité de Kolmogorov et pour chaque il tient que , pour une constante .K 2 c xK1K2cxK x K ( x ) | x | + c c|K1(x)K2(x)|<cKxK(x)|x|+cc

Je suis intéressé par les définitions suivantes de , basées sur les machines de TuringK

  1. nombre d'états : Définissez comme le nombre minimal tel qu'une MT avec états génère sur la chaîne vide.q q xK1(x)qqx
  2. Durée du programme : Définissez comme le "programme" le plus court qui génère . À savoir, fixer un moyen de coder les MT en chaînes binaires; pour une machine désigne son encodage (binaire) comme . où le minimum est supérieur à tous les M qui produisent x sur une entrée vide.K2(x)xMMM xK2(x)=min|M|Mx

Est-ce que K1 et K2 équivalents? Quelle est la relation entre eux, et laquelle saisit mieux le concept de complexité de Kolmogorov, s'ils ne sont pas équivalents.

Ce qui me dérange surtout, c'est l' augmentation du taux K2 avec x , qui ne semble pas être super-linéaire (ou au moins linéaire avec une constante C>1 telle que K2<C|x| , plutôt que |x|+c ). Considérez la MT la plus simple qui génère x - celle qui code simplement x dans le cadre de sa fonction d'états et de transitions. il est immédiat de voir que K1(x)|x|+1 . Cependant l'encodage de la même machine est beaucoup plus grand, et la borne triviale que j'obtiens est K2(x)|x|log|x|.

A sonné.
la source
Il existe plus de 2n2 machines avec n états, et leur taille moyenne est d'au moins n2 , il est donc peu probable que celles-ci ne diffèrent que par une constante additive.
Kaveh
1
Il existe une borne bien connue quepour certains fixes ne dépendant pas de . En effet, nous pouvons coder dans un langage sans préfixe en doublant simplement chaque bit de et en terminant par . Cela prend bits pour représenter . Ainsi, parce que est défini en termes de machine universelle sans préfixe, pour certains fixes . Cela peut être amélioré en utilisant une manière plus intelligente d'encoder dans un langage sans préfixe. c x x x 01 2 | x | + 2 x K 2 K 2 ( x ) 2 | x | + 2 + c c xK2(x)c+2|x|cxxx012|x|+2xK2K2(x)2|x|+2+ccx
Carl Mummert
Je ne vois pas comment. Il semble que soit soit donné dans le cadre de l'encodage (sous forme de données brutes), soit vous devez construire par votre machine à états. La première option semble tricher et je ne vois pas comment elle peut être comparable à la deuxième option (ce qui implique )x K 1xxK1
Ran G.
@Ran G .: Le point clé est le théorème d'invariance décrit sur en.wikipedia.org/wiki/Invariance_theorem . Si je peux décrire un système efficace qui a un taux de croissance dealors une machine de Turing universelle (comme vous le décrivez pour ) rencontrera cela dans une constante additive. La machine universelle est celle qui prend entrée et renvoie la sortie de si s'arrête. K 2M M M2|x|K2MMM
Carl Mummert

Réponses:

6

Je m'excuse à l'avance d'avoir donné trop de détails, mais je suis sur le point de contredire les gens.

À propos deK(x)K(x)+c

Le fait que provient généralement d'un interprète du langage de description # 2 dans le langage de description # 1 et non d'une traduction de programmes de # 2 en programmes de # 1.K1(x)K2(x)+c

Par exemple et vous obtenez cette inégalité aussi simplement que ceci: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)");
}

Ensuite, votre constante sera quelque chose comme 528 + 490240688528 est le nombre de bits pour ce code et 490240688 bits est la taille de l'interpréteur Python officiel écrit en C.Bien sûr, vous n'avez besoin que d'interpréter ce qui est possible dans votre langage de description pour Python afin que vous puissiez faire mieux que 69 Mo :-)cpy2c528+490240688528490240688

Ce qui est important, c'est que vous pouvez écrire votre programme Python de façon linéaire dans votre code C. Par exemple, une langue où vous devez mettre "BANANA" entre chaque caractère n'est pas un très bon programme de description et la propriété est alors fausse. (Mais si le langage de description vous autorise à écrire des données dans un fichier séparé ou dans un bloc, ce problème disparaît)

Pourquoi votre est défectueuxK1(x)=q

Le problème avec votre définition de est que vous pouvez avoir besoin de plus de bits pour décrire une machine de Turing avec états car vous devez coder des transitions.K1qqq

Donc aucun et K 2 ne sont probablement pas équivalents, mais c'est principalement la faute de K 1 . Je pense que nous pouvons prouver que pour tout un > 0 il y a une c une telle que K 1 ( x ) a | x | + c a . Bien sûr, tout a < 1 suffit pour réfuter le fait que K 1 n'est pas une fonction valide, car cela signifierait que nous pouvons coder plus toutes les 2 n chaînes de longueur possiblesK1K2K1a>0caK1(x)a|x|+caa<1K12n dans un n + c a des bits.nan+ca

Mais la taille est une limite incroyablement serrée lors de la construction de machines Turing. L'idée est que dans un bloc de états, il existe b 2 b façons de trouver des transitions pour chaque état et c'est mieux que les 2 b façons habituelles de remplir b bits. Ensuite, vous pouvez stocker dans chaque journal de bloc 2 b bits d'informations. (pas 2 log 2 b car vous devez entrer et sortir du bloc d'une manière ou d'une autre)bb2b2bblog2b2log2b

Alors oui ... Avec des blocs de taille vous pourriez probablement prouver K 1 ( x ) a | x | + c a . Mais j'ai déjà trop écrit sur les raisons pour lesquelles le nombre d'états n'est pas une fonction de complexité de Kolmogorov valide. Si vous voulez que j'élabore, je le ferai.21/aK1(x)a|x|+ca

Maintenant sur K2

Le langage descriptif naïf correspond approximativement à (c'est-à-dire log 2 q pour chaque état suivant et détails sur l'écriture et la terminaison).K2(x)=q2(log2q+2)log2q

Comme vous semblez l'être, je suis convaincu qu'une meilleure façon / tricherie serait d'autoriser à encoder des "données" dans la machine Turing, peut-être en ajoutant une balise binaire dans le langage de description qui indique si un état est un état de données ( qui écrit juste un peu et passe à l'état suivant) ou s'il fait autre chose. De cette façon, vous pouvez stocker un bit de votre dans un bit de votre langage descriptif.x

Cependant, si vous gardez le même vous pouvez utiliser la même technique que j'ai utilisée dans la partie précédente pour enregistrer quelques bits, mais il me semble que je suis bloqué à K 2 ( x ) a | x | journal | x | + c (pour tout a > 0 ) .. peut-être moins que log | x | , même, mais obtenir O ( | x | ) semble difficile. (Et je m'attends à ce que ce soit | x | , pas même O ( |K2K2(x)a|x|log|x|+ca>0log|x|O(|x|)|x| .)O(|x|)

jmad
la source
prétendez-vous que n'est pas une fonction de complexité de kolmogorov? C'est très surprenant pour moi, car K 1 est en fait la définition utilisée dans certains cours d'introduction à la calculabilité que j'ai pris une fois (non pas qu'il dise quoi que ce soit sur son exactitude). K1K1
Ran G.
Eh bien le fait que est assez dérangeant. Considérez ceci: il y a2nmots possibles denbits et vous pouvez les encoder en utilisant un1K1(x)12|x|+c2nnbits? Cela impliquerait2n=O(2 112n+c(votre encodage doit être injectif)2n=O(212n)
jmad
Que faire si le programme python a des caractères réservés par C?
PyRulez