Para que la complejidad de Kolmogorov tenga sentido se necesita un lenguaje Turing-completo. Javascript es bonito y compacto, pero es un inconveniente porque no tiene precisión arbitraria, así que vamos a utilizar Python en su lugar. Definamos una secuencia como una función sobre los números naturales a partir de $0$ . Decimos que una secuencia $f$ se representa en Python3 mediante un programa $P$ si $P$ se detiene y el valor final de la variable f
es un procedimiento que representa $f$ .
Aquí hay algunas expresiones de Python3 en orden de longitud creciente (contando la nueva línea como 1 símbolo):
Programa A0 (longitud 12; representa $(1,\cdots$ )
f=lambda n:1
Programa A1 (longitud 14; representa $(1,2,\cdots$ )
f=lambda n:n+1
Programa A2 (longitud 15; representa $(1,2,4,\cdots$ )
f=lambda n:1<<n
Programa A3 (longitud 22; representa $(1,2,4,\cdots$ )
def f(n):
return 1<<n
Se puede ver que, para la secuencia de potencias de $2$ con sólo la primera $1$ o $2$ elementos La complejidad de Python3 favorecería la secuencia incorrecta (Programas A0,A1). Pero con sólo $3$ elementos favorecerá la secuencia correcta (Programa A2). Esto se debe a que Python3 fue diseñado para ser conveniente para los programadores, así que por supuesto se espera que favorezca las potencias de $2$ ...
Para un ejemplo más interesante, considere las siguientes expresiones de Python3 para segmentos iniciales de números primos:
Programa B0 (longitud 12; representa $(2,\cdots$ )
f=lambda n:2
Programa B1 (longitud 14; representa $(2,3,\cdots$ )
f=lambda n:n+2
Programa B2 (longitud 19; representa $(2,3,5,\cdots$ )
f=lambda n:n+2+n//2
Programa B3 (longitud 22; representa $(2,3,5,7,\cdots$ )
f=lambda n:(n<1)+1+2*n
Programa B3 (longitud 28; representa $(2,3,5,7,11,\cdots$ )
f=lambda n:[2,3,5,7,11][n%5]
Programa B4 (longitud 29; representa $(2,3,5,7,11,13,\cdots$ )
f=lambda n:(n<1)+1+2*(n+n//4)
Programa B5 (longitud 34; representa $(2,3,5,7,11,13,17,19,23,\cdots$ )
f=lambda n:(n<1)+1+2*(n+n//4+n//6)
Programa B6 (longitud 41; representa $(2,3,5,7,11,13,17,19,23,29,31,\cdots$ )
f=lambda n:(n<1)+1+2*(n+n//4+n//6+n//9*2)
Programa B7 (longitud 49; representa $(2,3,5,7,11,13,17,19,23,29,31,37,\cdots$ )
f=lambda n:(n<1)+1+2*(n+n//4+n//6+n//9*2+n//11*2)
Programa B8 (longitud 55; representa $(2,3,5,7,11,13,17,19,23,29,31,37,41,43,\cdots$ )
f=lambda n:(n<1)+1+2*(n+n//4+n//6+n//9*2+n//11*2-n//12)
Programa B9 (longitud 59; representa primos hasta $47$ )
f=lambda n:[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47][n%15]
(Creo que esta repetición es óptima para todos los segmentos iniciales intermedios).
Programa B10 (longitud 101; representa primos hasta $107$ )
f=lambda n:[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107][n%28]
Programa B11 (longitud 104; representa los primos)
def f(n):
p=2
while n>0:
n,d=n-1,2
while d>1:
p,d=p+1,p-1
while d>1 and p%d>0:d-=1
return p
Si alguien puede acortar alguna de ellas, que me lo diga en los comentarios. Pero si lo que tengo arriba es óptimo, entonces se necesita la primera $29$ ¡elementos de la secuencia de primos para que la complejidad de Python3 favorezca la secuencia correcta! Incluso si lo que tengo no es óptimo, estoy seguro de que se necesita al menos el primer $15$ elementos. Es mucho más largo de lo que cabría esperar.
0 votos
Iba a escribir que la complejidad de Kolmogorov es probablemente interesante pero ya lo tenías en las etiquetas así que supongo que lo conoces. Tal vez no sólo la longitud más corta de un programa de ordenador como una cadena de texto en un lenguaje informático, sino también el menor número de operaciones elementales por el ordenador podría ser interesante. No recuerdo cuál de ellas es la que se define como complejidad de Kolmogorov
0 votos
Si el ordenador tiene una instrucción de máquina para calcular algo que es más rápido que multiplicar por dos, tal vez se pueda argumentar que es "más simple". Por ejemplo, una máquina que trabaje con representaciones distintas de la binaria, en la que la multiplicación por dos no es tan fácil de hacer rápida en comparación con otras operaciones.
0 votos
Tu "definición" deja fuera el problema de la detención, es indecidible. "El programa más corto que se detiene tal que... " no es siempre una frase con sentido. E incluso si te restringes a alguna gramática de detención, el ordenamiento de los programas por tamaño no es probable que coincida con el ordenamiento humano de los programas debido a las diferencias de las primitivas.
0 votos
@DanielV Me temo que no te sigo. ¿Qué es una gramática vacilante?
0 votos
@FFF En algunos modelos de computación, todo se detiene. El cálculo lambda tipado y las ecuaciones recursivas primitivas son dos ejemplos. En algunos modelos de computación, hay programas que no se detienen. El cálculo lambda general y las máquinas de Turing son dos ejemplos. Hay un argumento de diagonalización general para mostrar que no se pueden enumerar todos los programas que se detienen.
0 votos
@DanielV Sí, conozco estos hechos, pero ¿qué relación tienen con la pregunta? Mi definición es una extensión (¿aparentemente?) natural de la complejidad de Kolmogorov, que a su vez es no computable, por lo que la pregunta es sobre una propiedad no computable de todos modos.
0 votos
No pretendía echar por tierra toda tu pregunta, sólo que, ya que te has esforzado en intentar hacer una definición formal, no quería dejar a un posible participante con la idea de que "el TM más corto que implementa P" es un concepto totalmente definido de la misma manera que a veces lo es "el número entero más pequeño con la propiedad P".