Definições de equivalência de Kolmogorov-Complexity

20

Existem muitas maneiras de definir a Complexidade Kolmogorov e , geralmente, todas essas definições são equivalentes a uma constante aditiva. Isto é, se e são Kolmogorov funções de complexidade (definida através de diferentes línguas ou modelos), então existe uma constante tal que, para cada corda , . Acredito que isso ocorre porque para cada função de complexidade Kolmogorov e para cada ela sustenta que , por alguma constante .K1K2cx|K1(x)K2(x)|<cKxK(x)|x|+cc

Estou interessado nas seguintes definições de , baseadas em máquinas de TuringK

  1. número de estados : Defina como o número mínimo modo que uma TM com estados produzaK1(x)qqx na sequência vazia.
  2. K2(x)xMMK2(x)=min|M|Mx

São K1 e K2 equivalente? Qual é a relação entre eles e qual deles apreende melhor o conceito de complexidade de Kolmogorov, se não forem equivalentes.

O que mais me incomoda é a taxa aumentar com , que parece não ser super-linear (ou pelo menos linear com a constante tal que , em vez de ). Considere a TM mais simples que gera - aquela que apenas codifica como parte de sua função de estados e transições. é imediato ver que . No entanto, a codificação da mesma máquina é muito maior, e o limite trivial que recebo é K_2 (x) \ le | x | \ log | x | .K2xC>1K2<C|x||x|+cxxK1(x)|x|+1K2(x)|x|log|x|

Tocou.
fonte
Existem mais de 2n2 máquinas com n estados e seu tamanho médio é pelo menos n2 ; portanto, é improvável que elas diferam apenas por uma constante aditiva.
Kaveh
1
Existe um limite bem conhecido de quepara alguns fixos, não depende de . Isso ocorre porque podemos codificar em um idioma sem prefixo apenas dobrando cada bit de e terminando com . Isso leva bits para representar . Assim, como é definido em termos de uma máquina universal sem prefixos, para alguns fixos . Isso pode ser melhorado usando uma maneira mais inteligente de codificar em um idioma livre de prefixo. K2(x)c+2|x|cxxx012|x|+2xK2K2(x)2|x|+2+ccx
Carl Mummert
Não vejo como. Parece que é fornecido como parte da codificação (como dados brutos) ou você deve construir por sua máquina de estado. A primeira opção parece estar traindo e eu não vejo como ele pode ser comparável com a segunda opção (o que implica )xxK1
Ran G.
@Ran G .: O ponto principal é o teorema da invariância descrito em en.wikipedia.org/wiki/Invariance_theorem . Se eu puder descrever qualquer sistema eficaz que tenha uma taxa de crescimento deentão uma máquina universal de Turing (como você descreve para ) atenderá a isso dentro de uma constante aditiva. A máquina universal é aquela que leva entrada e retorna a saída de se parar. 2|x|K2MMM
Carl Mummert

Respostas:

6

Peço desculpas antecipadamente por dar muitos detalhes, mas estou prestes a contradizer as pessoas.

SobreK(x)K(x)+c

O fato de geralmente vir de um intérprete da linguagem de descrição # 2 para a linguagem de descrição # 1 e não de uma tradução dos programas de # 2 para os programas de # 1.K1(x)K2(x)+c

Por exemplo, e você obtém essa desigualdade da seguinte maneira: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)");
}

Então sua constante será algo como que é o número de bits desse código e bits é o tamanho que o interpretador Python oficial escrito em C. É claro que você só precisa interpretar o que é possível na linguagem de descrição do Python para que você possa fazer melhor que 69 MB :-)cpy2c528+490240688528490240688

O importante é que você possa escrever seu programa Python linearmente no seu código C. Por exemplo, um idioma em que você precisa colocar "BANANA" entre todos os caracteres não é um programa de descrição muito bom e a propriedade é falsa. (Mas se o idioma da descrição autorizar você a gravar dados em um arquivo separado ou em um bloco, esse problema desaparecerá)

Por que seu é defeituosoK1(x)=q

O problema com sua definição de é que você pode precisar de mais de bits para descrever uma máquina de Turing com estados , porque é necessário codificar transições.K1qq

Portanto, não e provavelmente não são equivalentes, mas isso é principalmente culpa 's. Penso que podemos provar que para todo existe um tal que . É claro que qualquer é suficiente para refutar o fato de que não é uma função válida, pois isso significa que podemos codificar mais todas as possíveis seqüências de comprimento em bits .K1K2K1a>0caK1(x)a|x|+caa<1K12nnan+ca

Mas o tamanho é incrivelmente limitado quando se constrói máquinas de Turing. A idéia é que, em um bloco de estados , existem maneiras de encontrar transições para cada estado e isso é melhor do que as formas comuns você pode preencher bits. Então você pode armazenar em cada bloco bits de informação. (não porque você precisa entrar e sair do bloco de uma forma ou de outra)bb2b2bblog2b2log2b

Então sim ... Com blocos de tamanho você provavelmente poderia provar . Mas eu já escrevi muito sobre por que o número de estados não é uma função de complexidade válida de Kolmogorov. Se você quer que eu elabore, eu irei.21/aK1(x)a|x|+ca

Agora sobreK2

A linguagem descritiva ingênua corresponde aproximadamente a (ou seja, para cada próximo estado e detalhes sobre gravação e terminação).K2(x)=q2(log2q+2)log2q

Como você parece, estou convencido de que uma maneira melhor / trapaceira seria autorizar a codificação de "dados" na máquina de Turing, talvez adicionando uma tag binária na linguagem de descrição que diz se um estado é um estado de dados ( que apenas escreve um pouco e passa para o próximo estado) ou se faz outra coisa. Dessa forma, você pode armazenar um pouco do seu em um pouco da sua linguagem descritiva.x

No entanto, se você mantiver o mesmo poderá usar a mesma técnica que usei na parte anterior para economizar alguns bits, mas pareço estar preso no (para qualquer ) .. talvez menor que, mesmo, mas obter parece difícil. (E espero que deva ser , nem mesmo .)K2K2(x)a|x|log|x|+ca>0log|x|O(|x|)|x|O(|x|)

jmad
fonte
você afirma que não é uma função de complexidade kolmogorov? Isso é muito surpreendente para mim, já que é na verdade a definição usada em algum curso de introdução à computabilidade que já tomei (não que ele diga algo sobre sua correção). K1K1
Ran G.
Bem, o fato de que é bastante perturbador. Considere o seguinte: existem palavras possíveis de bits e você pode codificá-las usando a bits? Isso implicaria (a codificação precisa ser injetável) #K1(x)12|x|+c2nn12n+c2n=O(212n)
447 jmad
E se o programa python tiver caracteres reservados por C?
PyRulez