Equivalenza delle definizioni di Kolmogorov-complessità


20

Esistono molti modi per definire la complessità di Kolmogorov e , di solito, tutte queste definizioni sono equivalenti a una costante additiva. Cioè se e sono funzioni di complessità di kolmogorov (definite tramite linguaggi o modelli diversi), allora esiste una costante tale che per ogni stringa , . Credo che ciò sia dovuto al fatto che per ogni funzione di complessità di Kolmogorov e per ogni sostiene che K (x) \ le | x | + c , per qualche costante c .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

Sono interessato alle seguenti definizioni per K , basate su macchine di Turing

  1. numero di stati : definire K1(x) come numero minimo q tale che una TM con stati q emetta x sulla stringa vuota.
  2. Lunghezza del programma : definire K2(x) come il "programma" più breve che genera x . Vale a dire, fissa un modo per codificare le TM in stringhe binarie; per una macchina M denota la sua codifica (binaria) come M . K2(x)=min|M|dove il minimo è su tutte le M che producono x su input vuoto.

Sono K1 e K2 equivalente? Qual è la relazione tra loro e quale afferriamo meglio il concetto di complessità di Kolmogorov, se non equivalenti.

Ciò che in particolare mi dà fastidio è l' K2aumento del tasso K_2 con x , che non sembra essere super-lineare (o almeno lineare con C> 1 costante C>1tale che K2<C|x| , piuttosto che |x|+c ). Considera la TM più semplice che genera x - quella che codifica solo x come parte dei suoi stati e delle sue funzioni di transizione. è immediato vedere che K1(x)|x|+1 . Tuttavia, la codifica della stessa macchina è molto più grande e il limite banale che ottengo è K2(x)|x|log|x|.


Esistono più di macchine con stati e la loro dimensione media è almeno , quindi è improbabile che differiscano solo per una costante additiva. n n 22n2nn2
Kaveh,

1
C'è un limite ben noto cheper alcuni fissi non dipendenti da . Questo perché possiamo codificare in un linguaggio privo di prefissi semplicemente raddoppiando ogni bit di e terminando con . Questo richiede bit per rappresentare . Pertanto, poiché è definito in termini di macchina universale priva di , per alcuni fissi . Questo può essere migliorato in parte usando un modo più intelligente per codificare in un linguaggio libero prefisso. 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

Non vedo come. Sembra che sia dato come parte della codifica (come dati non elaborati) o che tu debba costruire dalla tua macchina a stati. La prima opzione sembra barare e non vedo come possa essere paragonabile alla seconda opzione (che implica )x K 1xxK1
Ran G.

@Ran G .: Il punto chiave è il teorema di invarianza descritto in en.wikipedia.org/wiki/Invariance_theorem . Se riesco a descrivere qualsiasi sistema efficace che ha un tasso di crescita diallora una macchina di Turing universale (come descrivi per ) incontrerà questo all'interno di una costante additiva. La macchina universale è quella che accetta sono input e restituisce l'output di se ferma. K 2M M M2|x|K2MMM
Carl Mummert,

Risposte:


6

Mi scuso in anticipo per aver dato troppi dettagli, ma sto per contraddire le persone.

CircaK(x)K(x)+c

Il fatto che solito provenga da un interprete della lingua di descrizione n. 2 nella lingua di descrizione n. 1 e non da una traduzione da programmi di n. 2 a programmi di n. 1.K1(x)K2(x)+c

Ad esempio e ottieni questa disuguaglianza semplicemente come questa: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)");
}

Quindi la tua costante sarà qualcosa come dove è il numero di bit per questo codice e bit è la dimensione dell'interprete ufficiale di Python scritta in C. Naturalmente devi solo interpretare ciò che è possibile nel linguaggio di descrizione per Python in modo da poter fare meglio di 69 MB :-) 528 + 490240688 528 490240688cpy2c528+490240688528490240688

Ciò che è importante è che puoi scrivere il tuo programma Python in modo lineare nel tuo codice C. Ad esempio, una lingua in cui è necessario inserire "BANANA" tra ogni personaggio non è un ottimo programma di descrizione e la proprietà è quindi falsa. (Ma se il linguaggio descrittivo ti autorizza a scrivere i dati in un file separato o in un blocco, questo problema scompare)

Perché il tuo è difettosoK1(x)=q

Il problema con la tua definizione di è che potresti aver bisogno di più di bit per descrivere una macchina di Turing con stati perché devi codificare le transizioni. q qK1qq

Quindi nessun e probabilmente non sono equivalenti, ma è principalmente colpa di . Penso che possiamo dimostrare che per tutti esiste un tale che . Ovviamente qualsiasi è sufficiente per confutare il fatto che non è una funzione valida, poiché ciò significherebbe che possiamo codificare più tutte le possibili stringhe di lunghezza in bit .K1K2K1a>0caK1(x)a|x|+caa<1K12nnan+ca

Ma le dimensioni sono un limite incredibilmente stretto quando si costruiscono macchine Turing. L'idea è che in un blocco di stati ci sono modi per trovare le transizioni per ogni stato ed è meglio dei soliti 2 b modi in cui puoi riempire b bit. Quindi è possibile memorizzare in ciascun blocco di registro 2 b bit di informazione. (non 2 log 2 b perché devi entrare e uscire dal blocco in un modo o nell'altro)bb2b2bblog2b2log2b

Quindi sì ... Con blocchi di dimensioni probabilmente potresti provare K 1 ( x ) a | x | + c a . Ma ho già scritto troppo sul perché il numero di stati non è una valida funzione di complessità di Kolmogorov. Se vuoi che ti elabori, lo farò.21/aK1(x)a|x|+ca

Ora su K2

La lingua descrittiva ingenua corrisponde approssimativamente a (cioè log 2 q per ogni stato successivo e dettagli su scrittura e terminazione).K2(x)=q2(log2q+2)log2q

Come sembri, sono convinto che un modo migliore / imbroglione sarebbe quello di autorizzare la codifica di "dati" nella macchina di Turing, magari aggiungendo un tag binario nel linguaggio descrittivo che indica se uno stato è uno stato di dati ( che scrive solo un po 'e passa allo stato successivo) o se fa qualcos'altro. In questo modo potresti memorizzare un bit della tua in un bit del tuo linguaggio descrittivo.x

Tuttavia se mantieni lo stesso potresti usare la stessa tecnica che ho usato nella parte precedente per salvare alcuni bit, ma mi sembra di essere bloccato a K 2 ( x ) a | x | log | x | + c (per qualsiasi a > 0 ) .. forse inferiore a log | x | , anche, ma ottenere O ( | x | ) sembra difficile. (E mi aspetto che dovrebbe essere | x | , nemmeno O ( |K2K2(x)a|x|log|x|+ca>0log|x|O(|x|)|x| .)O(|x|)


affermi che non è una funzione di complessità kolmogorov? Questo è molto sorprendente per me, dal momento che K 1 è in realtà la definizione usata in alcuni corsi di introduzione alla calcolabilità che ho seguito una volta (non che dice nulla sulla sua correttezza). K1K1
Ran G.

Bene il fatto che è abbastanza inquietante. Considera questo: ci sono2nparole possibili dinbit e potresti codificarle usando un1K1(x)12|x|+c2nnbit? Ciò implicherebbe2n=O(2 112n+c(la codifica deve essere iniettiva)2n=O(212n)
jmad

Cosa succede se il programma Python ha caratteri riservati da C?
PyRulez,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.