Sia un alfabeto, cioè un insieme finito non vuoto. Una stringa è una sequenza finita di elementi (caratteri) da Σ . Ad esempio, { 0 , 1 } è l'alfabeto binario e 0110 è una stringa per questo alfabeto.
Di solito, fintanto che contiene più di 1 elemento, il numero esatto di elementi in Σ non importa: nella migliore delle ipotesi finiamo con una costante diversa da qualche parte. In altre parole, non importa se usiamo l'alfabeto binario, i numeri, l'alfabeto latino o Unicode.
Ci sono esempi di situazioni in cui è importante quanto sia grande l'alfabeto?
La ragione per cui sono interessato a questo è perché mi è capitato di imbattermi in uno di questi esempi:
Per ogni alfabeto definiamo l'oracolo casuale O Σ un oracolo che restituisce elementi casuali da Σ , in modo tale che ogni elemento abbia le stesse probabilità di essere restituito (quindi la possibilità per ogni elemento è 1).
Per alcuni alfabeti e Σ 2 - possibilmente di dimensioni diverse - prendere in considerazione la classe delle macchine per oracoli con accesso a O Σ 1 . Siamo interessati alle macchine degli oracoli di questa classe che si comportano allo stesso modo di O Σ 2 . In altre parole, vogliamo convertire un oracolo O Σ 1 in un oracolo O Σ 2 usando una macchina di Turing. Chiameremo una tale macchina di Turing un programma di conversione.
Sia e Σ = { 0 , 1 , 2 , 3 } . Convertire O Σ 1 in un oracolo O Σ 2 è facile: interrogiamo O Σ 1 due volte, convertendo i risultati come segue: 00 → 0 , 01 → 1 , 10 → 2 , 11 → 3 . Chiaramente, questo programma funziona in O ( tempo.
Ora lascia e Σ = { 0 , 1 , 2 } . Per queste due lingue, tutti i programmi di conversione vengono eseguiti in tempo O ( ∞ ) , ovvero non esistono programmi di conversione da O Σ 1 a O Σ 2 che vengono eseguiti in tempo O ( 1 ) .
Ciò può essere dimostrato dalla contraddizione: supponiamo che esista un programma di conversione da O Σ 1 a O Σ 2 in esecuzione nel tempo O ( 1 ) . Ciò significa che esiste una d ∈ N tale che C fa al massimo d query a Σ 1 .
può eseguire meno di d query in determinati percorsi di esecuzione. Possiamo facilmente costruire un programma di conversione C ' che esegue C , tenendo traccia di quante volte è stata fatta una query oracle. Sia k il numero di query oracle. C ′ quindi esegue d - k ulteriori interrogazioni sull'oracolo, scartando i risultati e restituendo ciò che C avrebbe restituito.
In questo modo, ci sono esattamente percorsi di esecuzione per C ′ . Esattamente 1 di questi percorsi di esecuzione comporterannoilritorno diC′0. Tuttavia,2d non è un numero intero, quindi abbiamo una contraddizione. Quindi, non esiste un programma del genere.
Più in generale, se abbiamo alfabeti e Σ 2 con | Σ 1 | = n e | Σ 2 | = k , allora esiste un programma di conversione da O Σ 1 a O Σ 2 se e solo se tutti i numeri primi che compaiono nella scomposizione in fattori primi di n compaiono anche nella scomposizione in fattori primi di k (quindi gli esponenti dei numeri primi nella fattorizzazione non non importa).
Ho pensato al problema sopra quando mi trovavo al supermercato, riflettendo su cosa mangiare per cena. Mi chiedevo se avrei potuto usare i lanci di monete per decidere tra la scelta A, B e C. A quanto pare, ciò è impossibile.