Niech będzie alfabetem, czyli niepustym zbiorem skończonym. Łańcuch to dowolna skończona sekwencja elementów (znaków) z . Na przykład to alfabet binarny, a to ciąg znaków dla tego alfabetu.
Zazwyczaj, dopóki zawiera więcej niż 1 element, dokładna liczba elementów w nie ma znaczenia: w najlepszym razie otrzymujemy gdzieś inną stałą. Innymi słowy, tak naprawdę nie ma znaczenia, czy użyjemy binarnego alfabetu, liczb, alfabetu łacińskiego czy Unicode.
Czy istnieją przykłady sytuacji, w których ma znaczenie wielkość alfabetu?
Interesuje mnie to, ponieważ natknąłem się na jeden taki przykład:
Dla każdego alfabetu definiujemy losową wyrocznię jako wyrocznię, która zwraca losowe elementy z , tak że każdy element ma równą szansę na zwrot (więc szansa na każdy element to ).
W przypadku niektórych alfabetów i - być może różnych rozmiarów - rozważ klasę maszyn Oracle z dostępem do . Interesują nas maszyny Oracle w tej klasie, które zachowują się tak samo jak . Innymi słowy, chcemy przekształcić wyrocznię w wyrocznię za pomocą maszyny Turinga. Taką maszynę Turinga nazwiemy programem konwersji.
Niech i . Przekształcanie w wyrocznię jest łatwe: dwukrotnie , konwertując wyniki w następujący sposób: , , , . Oczywiście ten program działa w czasie .
Teraz pozwól i . Dla tych dwóch języków wszystkie programy konwersji działają w czasie , tzn. Nie ma programów konwersji od do które działają w czasie .
Można to udowodnić przez sprzeczność: załóżmy, że istnieje program do konwersji z na działający w czasie . Oznacza to, że istnieje takie że wykonuje co najwyżej zapytania do .
może wykonać mniej niż zapytań w niektórych ścieżkach wykonania. Możemy łatwo zbudować program konwersji który wykonuje , śledząc ile razy zostało wykonane zapytanie Oracle. Niech będzie liczbą zapytań wyroczni. następnie wykonuje dodatkowe zapytania wyroczni, odrzucając wyniki, zwracając to, co by zwrócił.
W ten sposób istnieją dokładnie ścieżki wykonawcze dla . Dokładnie z tych dróg realizacji spowoduje powrotem . Jednak nie jest liczbą całkowitą, więc mamy sprzeczność. Dlatego nie istnieje żaden taki program.
Mówiąc bardziej ogólnie, jeśli mamy alfabety i z i , wówczas istnieje program do konwersji z na wtedy i tylko wtedy, gdy wszystkie liczby pierwsze występujące w rozkładzie na czynniki pierwsze pojawiają się również w rozkładzie na czynniki pierwsze (więc wykładniki liczb pierwszych w rozkładzie na czynniki pierwsze nie mają znaczenia).
Konsekwencją tego jest to, że jeśli mamy generator liczb losowych generujący ciąg binarny o długości , nie możemy użyć tego generatora liczb losowych do wygenerowania liczby w z dokładnie takim samym prawdopodobieństwem.
Wymyśliłem powyższy problem, stojąc w supermarkecie i zastanawiając się, co zjeść na obiad. Zastanawiałem się, czy mógłbym użyć rzutów monetą, aby zdecydować między wyborem A, B i C. Jak się okazuje, jest to niemożliwe.