Suponiendo una memoria infinita, ¿siempre es posible aumentar la complejidad de cualquier programa sin introducir redundancia?

Creo que aquí tienes conceptos confusos. Formalmente, la complejidad se define en términos de ejecutar un Algoritmo. Entonces, un algoritmo es más complejo cuando usa más recursos (tiempo y / o almacenamiento adicional) La complejidad de un Algoritmo, por lo tanto, un programa, es independiente de ser óptimo. Muchos algoritmos no óptimos tienen una complejidad muy alta. Puede imaginarse fácilmente haciendo un algoritmo de búsqueda con complejidad de tiempo cuadrático. Comprobar la complejidad del tiempo – Wikipedia

Así que creo que se pregunta si el conjunto de algoritmos óptimos es infinito. En otras palabras, si la cantidad de programas óptimos (no redundantes en su definición) es infinita.

Yo diría que , la cantidad de algoritmos óptimos es infinita porque hay un conjunto infinito de idiomas. La descripción de la máquina de Turing define un idioma, por lo que si cambia el idioma debe cambiar necesariamente la descripción de la máquina de Turing. Por lo tanto, necesariamente necesita al menos una máquina de Turing por idioma.

Aclarando un poco más, algoritmos-> idiomas es una relación de muchos a uno . Por lo tanto, un idioma puede tener muchas máquinas de Turing, pero una máquina de Turing solo tendrá un idioma. Además, un idioma puede tener muchos algoritmos óptimos en términos de complejidad formal.

Sí, eso siempre es posible.

Para demostrarlo formalmente, debe ser mucho más preciso en la definición de redundancia.

Pero informalmente, lo haría de la siguiente manera:

  • Defina una secuencia infinitamente contable de distintos lenguajes de programación. Digamos que su plataforma puede ejecutar programas en el lenguaje 1.
  • Elija cualquier índice i y escriba su programa de interés en el idioma i.
  • Agregue un intérprete para el lenguaje i, escrito en el lenguaje i-1.
  • Agregue un intérprete para el lenguaje i-1, escrito en el lenguaje i-2.
  • Agregue un intérprete para el idioma 2, escrito en el idioma 1.

Al elegir i suficientemente grande, puede hacer que el programa sea tan complejo como desee.