Biarkan menjadi alfabet, yaitu himpunan terbatas yang tidak kosong. String adalah setiap urutan elemen (karakter) hingga dari Σ . Sebagai contoh, { 0 , 1 } adalah alfabet biner dan 0110 adalah string untuk alfabet ini.
Biasanya, selama mengandung lebih dari 1 elemen, jumlah pasti elemen dalam Σ tidak masalah: paling baik kita berakhir dengan konstanta berbeda di suatu tempat. Dengan kata lain, tidak masalah jika kita menggunakan alfabet biner, angka, alfabet Latin atau Unicode.
Apakah ada contoh situasi yang penting seberapa besar alfabetnya?
Alasan saya tertarik pada ini adalah karena saya kebetulan menemukan satu contoh seperti:
Untuk setiap alfabet kita mendefinisikan oracle acak O Σ menjadi oracle yang mengembalikan elemen acak dari Σ , sehingga setiap elemen memiliki peluang yang sama untuk dikembalikan (sehingga peluang untuk setiap elemen adalah 1).
Untuk beberapa huruf dan Σ 2 - kemungkinan ukuran berbeda - pertimbangkan kelas mesin oracle dengan akses ke O Σ 1 . Kami tertarik pada mesin oracle di kelas ini yang berperilaku sama dengan O Σ 2 . Dengan kata lain, kami ingin mengubah oracle O Σ 1 menjadi oracle O Σ 2 menggunakan mesin Turing. Kami akan menyebut mesin Turing seperti itu sebagai program konversi.
Biarkan dan Σ = { 0 , 1 , 2 , 3 } . Mengubah O Σ 1 menjadi oracle O Σ 2 itu mudah: kita query O Σ 1 dua kali, mengonversi hasilnya sebagai berikut: 00 → 0 , 01 → 1 , 10 → 2 , 11 → 3 . Jelas, program ini berjalan di O ( waktu.
Sekarang dan Σ = { 0 , 1 , 2 } . Untuk dua bahasa ini, semua program konversi berjalan dalam waktu O ( ∞ ) , yaitu tidak ada program konversi dari O Σ 1 ke O Σ 2 yang berjalan dalam waktu O ( 1 ) .
Ini dapat dibuktikan dengan kontradiksi: misalkan ada program konversi dari O Σ 1 ke O Σ 2 yang berjalan dalam waktu O ( 1 ) . Ini berarti ada d ∈ N sehingga C membuat paling banyak d query ke Σ 1 .
dapat membuat kurang dari d kueri di jalur eksekusi tertentu. Kami dapat dengan mudah membuat program konversi C ′ yang mengeksekusi C , melacak berapa kali permintaan oracle dibuat. Biarkan k menjadi jumlah permintaan oracle. C ′ kemudian membuat d - k permintaan oracle tambahan, membuang hasilnya, mengembalikan apa yangakan dikembalikan C.
Dengan cara ini, ada persisnya jalur eksekusi untuk C ′ . Tepat 1 dari jalur eksekusi ini akan menghasilkanC′mengembalikan0. Namun,2d bukan angka integer, jadi kami memiliki kontradiksi. Karenanya, tidak ada program semacam itu.
Lebih umum, jika kita memiliki huruf dan Σ 2 dengan | Σ 1 | = n dan | Σ 2 | = k , maka ada program konversi dari O Σ 1 ke O Σ 2 jika dan hanya jika semua bilangan prima yang muncul dalam faktorisasi utama n juga muncul dalam faktorisasi utama k (sehingga eksponen bilangan prima dalam faktorisasi tidak itu penting).
Saya memikirkan masalah di atas ketika berdiri di supermarket, merenungkan apa yang harus saya makan malam. Saya bertanya-tanya apakah saya bisa menggunakan lemparan koin untuk memutuskan antara pilihan A, B dan C. Ternyata, itu tidak mungkin.