Soit un alphabet, c'est-à-dire un ensemble fini non vide. Une chaîne est une séquence finie d'éléments (caractères) de Σ . Par exemple, { 0 , 1 } est l'alphabet binaire et 0110 est une chaîne pour cet alphabet.
Habituellement, tant que contient plus d'un élément, le nombre exact d'éléments dans Σ n'a pas d'importance: au mieux, nous nous retrouvons quelque part avec une constante différente. En d'autres termes, peu importe si nous utilisons l'alphabet binaire, les chiffres, l'alphabet latin ou Unicode.
Existe-t-il des exemples de situations dans lesquelles la taille de l'alphabet est importante?
La raison pour laquelle cela m'intéresse, c'est parce que je suis tombé sur un exemple:
Pour tout alphabet nous définissons l'oracle aléatoire O Σ comme un oracle qui renvoie des éléments aléatoires de Σ , de sorte que chaque élément a une chance égale d'être retourné (donc la chance pour chaque élément est 1).
Pour certains alphabets et Σ 2 - éventuellement de tailles différentes - considérez la classe des machines oracle ayant accès à O Σ 1 . Nous nous intéressons aux machines oracle de cette classe qui se comportent de la même manière que O Σ . En d'autres termes, nous voulons convertir un oracleO Σ 1 en un oracleO Σ 2 à l' aide d'une machine de Turing. Nous appellerons une telle machine de Turing un programme de conversion.
Soit et Σ = { 0 , 1 , 2 , 3 } . Convertir O Σ 1 en oracle O Σ 2 est simple: on interroge O Σ 1 deux fois, en convertissant les résultats comme suit: 00 → 0 , , 10 → 2 , 11 → 3 . De toute évidence, ce programme s'exécute en O ( temps.
Soit maintenant et Σ = { 0 , 1 , 2 } . Pour ces deux langues, tous les programmes de conversion s'exécutent en temps O ( ∞ ) , c'est-à-dire qu'il n'y a pas de programme de conversion depuis O Σ 1 à qui s'exécute en temps O ( 1 ) .
Cela peut être prouvé par contradiction: supposons qu'il existe un programme de conversion de O Σ 1 en O Σ 2 fonctionnant en temps O ( 1 ) . Cela signifie qu'il y a un d tel que C effectue au plus d requêtes à Σ 1 .
peut effectuer moins de d requêtes dans certains chemins d'exécution. Nous pouvons facilement construire un programme de conversion C ' qui exécute C , en gardant une trace du nombre de fois qu'une requête Oracle a été faite. Soit k le nombre de requêtes oracle. C ′ effectue ensuite d - k requêtes oracle supplémentaires, rejetant les résultats, renvoyant ce que C aurait retourné.
De cette façon, il y a exactement chemins d'exécution pour C ′ . Exactement 1 de ces chemins d'exécution se traduiront parleretourparC'de0. Cependant,2jours n'est pas un nombre entier, nous avons donc une contradiction. Par conséquent, aucun programme de ce type n'existe.
Plus généralement, si nous avons les alphabets et Σ 2 avec | Σ 1 | = n et | Σ 2 | = k , alors il existe un programme de conversion de O Σ 1 en si et seulement si tous les nombres premiers apparaissant dans la factorisation première de n apparaissent également dans la factorisation prime de k (donc les exposants des nombres premiers dans la factorisation ne font pas importe pas).
Une conséquence de ceci est que si nous avons un générateur de nombres aléatoires générant une chaîne binaire de longueur , nous ne pouvons pas utiliser ce générateur de nombres aléatoires pour générer un nombre dans { 0 , 1 , 2 } avec une probabilité exactement égale.
J'ai pensé au problème ci-dessus en me tenant au supermarché, en réfléchissant à ce que j'aurais à dîner. Je me demandais si je pouvais utiliser des lancers de pièces pour décider entre les choix A, B et C. En fait, c'est impossible.