Sea un alfabeto, es decir, un conjunto finito no vacío. Una cadena es cualquier secuencia finita de elementos (caracteres) de . Como ejemplo, es el alfabeto binario y es una cadena para este alfabeto.Σ { 0 , 1 } 0110
Por lo general, siempre que contenga más de 1 elemento, el número exacto de elementos en no importa: en el mejor de los casos, terminamos con una constante diferente en alguna parte. En otras palabras, realmente no importa si usamos el alfabeto binario, los números, el alfabeto latino o Unicode.Σ
¿Hay ejemplos de situaciones en las que importa qué tan grande es el alfabeto?
La razón por la que estoy interesado en esto es porque me topé con uno de esos ejemplos:
Para cualquier alfabeto , definimos el oráculo aleatorio como un oráculo que devuelve elementos aleatorios de , de modo que cada elemento tiene la misma probabilidad de ser devuelto (por lo que la posibilidad de cada elemento es ).O Σ Σ 1
Para algunos alfabetos y , posiblemente de diferentes tamaños, considere la clase de máquinas con acceso a . Estamos interesados en las máquinas en esta clase que se comportan igual que . En otras palabras, queremos convertir un oráculo en un oráculo usando una máquina Turing. Llamaremos a esa máquina Turing un programa de conversión.Σ 2 O Σ 1 O Σ 2 O Σ 1 O Σ 2
Deje y . Convertir en un oráculo es fácil: consultamos dos veces, convirtiendo los resultados de la siguiente manera: , , , . Claramente, este programa se ejecuta en tiempo .Σ = { 0 , 1 , 2 , 3 } O Σ 1 O Σ 2 O Σ 1 00 → 0 01 → 1 10 → 2 11 → 3 O ( 1 )
Ahora dejemos y . Para estos dos idiomas, todos los programas de conversión se ejecutan en tiempo , es decir, no hay programas de conversión de a que se ejecutan en tiempo .Σ = { 0 , 1 , 2 } O ( ∞ ) O Σ 1 O Σ 2 O ( 1 )
Esto se puede demostrar por contradicción: suponga que existe un programa de conversión de a ejecutándose en tiempo . Esto significa que hay un tal que realiza como máximo consultas a .O Σ 1 O Σ 2 O ( 1 ) d ∈ N C d Σ 1
d C ′ C k C ′ d - k C puede hacer menos de consultas en ciertas rutas de ejecución. Podemos construir fácilmente un programa de conversión que ejecute , haciendo un seguimiento de cuántas veces se realizó una consulta Oracle. Sea el número de consultas de oráculo. luego hace consultas adicionales de oráculo, descartando los resultados, devolviendo lo que habría devuelto.
De esta manera, hay exactamente rutas de ejecución para . Exactamente de estas rutas de ejecución dará como resultado que devuelva . Sin embargo, no es un número entero, por lo que tenemos una contradicción. Por lo tanto, no existe tal programa.C ′ 1 C′02d
De manera más general, si tenemos alfabetos y con y , entonces existe un programa de conversión de a si y sólo si todos los primos que aparecen en la factorización prima de también aparecen en la factorización prima de (por lo que los exponentes de los primos en la factorización no importan).Σ 2 | Σ 1 | = n | Σ 2 | = k O Σ 1 O Σ 2 n k
Una consecuencia de esto es que si tenemos un generador de números aleatorios que genera una cadena binaria de longitud , no podemos usar ese generador de números aleatorios para generar un número en con exactamente la misma probabilidad.{ 0 , 1 , 2 }
Pensé en el problema anterior cuando estaba parado en el supermercado, reflexionando sobre qué cenar. Me preguntaba si podría usar los lanzamientos de monedas para decidir entre las opciones A, B y C. Resulta que eso es imposible.