Ini adalah komentar (panjang!) Pada karya bagus yang telah diposting @vqv di utas ini. Ini bertujuan untuk mendapatkan jawaban yang pasti. Dia telah melakukan kerja keras menyederhanakan kamus. Yang tersisa hanyalah mengeksploitasinya secara maksimal. Hasilnya menunjukkan bahwa solusi brute-force layak dilakukan . Lagipula, termasuk wildcard, paling banyak ada kata yang dapat dibuat dengan 7 karakter, dan sepertinya kurang dari 1/10000 di antaranya - katakanlah, sekitar satu juta - akan gagal memasukkan beberapa kata yang valid. 277=10,460,353,203
Langkah pertama adalah menambah kamus minimal dengan karakter wildcard, "?". 22 huruf muncul dalam kata-kata dua huruf (semua kecuali c, q, v, z). Sesuaikan wildcard ke 22 huruf tersebut dan tambahkan ke kamus: {a ?, b?, D ?, ..., y?} Sekarang sudah masuk. Demikian pula kita dapat memeriksa kata-kata tiga huruf minimal, menyebabkan beberapa kata tambahan muncul di kamus. Akhirnya, kami menambahkan "??" ke kamus. Setelah menghapus pengulangan yang menghasilkan, itu berisi 342 kata-kata minimal.
Cara yang elegan untuk melanjutkan - yang menggunakan jumlah pengkodean yang sangat kecil - adalah untuk melihat masalah ini sebagai aljabar . Sebuah kata, yang dianggap sebagai seperangkat huruf yang tidak teratur, hanyalah sebuah monomial. Misalnya, "pertengkaran" adalah monomial . Kamus karena itu adalah kumpulan monomial. Sepertinyaaps2t
{a2,ab,ad,...,ozψ,wxψ,ψ2}
(di mana, untuk menghindari kebingungan, saya telah menulis untuk karakter wildcard).ψ
Rak berisi kata yang valid jika dan hanya jika kata itu membagi rak.
Cara yang lebih abstrak, tetapi sangat kuat, untuk mengatakan ini adalah bahwa kamus menghasilkan ideal dalam cincin polinomial R = Z [ a , b , … , z , ψ ] dan bahwa rak dengan kata-kata yang valid menjadi nol dalam hasil bagi dering R / I , sedangkan rak tanpa kata-kata yang valid tetap tidak nol dalam hasil bagi. Jika kita membentuk jumlah semua rak dalam R dan menghitungnya dalam cincin hasil bagi ini, maka jumlah rak tanpa kata sama dengan jumlah monomial yang berbeda dalam hasil bagi.IR=Z[a,b,…,z,ψ]R/IR
Selain itu, jumlah semua rak di mudah untuk diekspresikan. Biarkan α = a + b + ⋯ + z + ψ menjadi jumlah dari semua huruf dalam alfabet. α 7 berisi satu monomial untuk setiap rak. (Sebagai bonus tambahan, koefisiennya menghitung jumlah cara setiap rak dapat dibentuk, memungkinkan kita menghitung probabilitasnya jika kita mau.)Rα=a+b+⋯+z+ψα7
Sebagai contoh sederhana (untuk melihat bagaimana ini bekerja), misalkan (a) kita tidak menggunakan wildcard dan (b) semua huruf dari "a" hingga "x" dianggap sebagai kata. Maka satu-satunya rak yang memungkinkan dari mana kata-kata tidak dapat dibentuk harus seluruhnya terdiri dari y dan z. Kami menghitung modulo yang ideal dihasilkan oleh { a , b , c , … , x } satu langkah pada satu waktu, dengan demikian:α=(a+b+c+⋯+x+y+z)7{a,b,c,…,x}
α0α1α2⋯α7=1=a+b+c+⋯+x+y+z≡y+zmodI≡(y+z)(a+b+⋯+y+z)≡(y+z)2modI≡(y+z)6(a+b+⋯+y+z)≡(y+z)7modI.
Kita dapat membaca peluang mendapatkan rak non-kata dari jawaban akhir, : masing-masing koefisien menghitung cara rak yang sesuai dapat ditarik. Misalnya, ada 21 (dari 26 ^ 7 kemungkinan) cara untuk menggambar 2 y dan 5 z karena koefisien yy7+7y6z+21y5z2+35y4z3+35y3z4+21y2z5+7yz6+z7 sama dengan 21.y2z5
Dari perhitungan dasar, jelas ini adalah jawaban yang benar. Intinya adalah bahwa prosedur ini berfungsi terlepas dari isi kamus.
Perhatikan bagaimana mengurangi daya modulo ideal pada setiap tahap mengurangi perhitungan: itulah cara pintas yang diungkapkan oleh pendekatan ini. (Akhir contoh.)
Sistem aljabar polinomial menerapkan perhitungan ini . Misalnya, ini adalah kode Mathematica :
alphabet = a + b + c + d + e + f + g + h + i + j + k + l + m + n + o +
p + q + r + s + t + u + v + w + x + y + z + \[Psi];
dictionary = {a^2, a b, a d, a e, ..., w z \[Psi], \[Psi]^2};
next[pp_] := PolynomialMod[pp alphabet, dictionary];
nonwords = Nest[next, 1, 7];
Length[nonwords]
(Kamus dapat dibangun secara langsung dari min.dict @ vqv; Saya meletakkan garis di sini yang menunjukkan bahwa itu cukup pendek untuk ditentukan secara langsung jika Anda suka.)
Output - yang memerlukan sepuluh menit perhitungan - adalah 577958. ( NB Dalam versi sebelumnya dari pesan ini saya telah membuat kesalahan kecil dalam mempersiapkan kamus dan memperoleh 577940. Saya telah mengedit teks untuk mencerminkan apa yang saya harap sekarang adalah hasil yang benar!) Sedikit kurang dari satu juta atau lebih yang saya harapkan, tetapi dengan urutan yang sama besarnya.
Untuk menghitung kemungkinan mendapatkan rak seperti itu, kita perlu memperhitungkan sejumlah cara di mana rak dapat ditarik. Seperti yang kita lihat dalam contoh, ini sama dengan koefisiennya di . Peluang menggambar beberapa rak tersebut adalah jumlah dari semua koefisien ini, mudah ditemukan dengan menyetel semua huruf sama dengan 1:α7
nonwords /. (# -> 1) & /@ (List @@ alphabet)
Jawabannya sama dengan 1066056120, memberikan peluang 10,1914% menggambar rak dari mana tidak ada kata yang valid dapat dibentuk (jika semua huruf sama-sama kemungkinan).
Ketika probabilitas surat berbeda-beda, ganti saja setiap huruf dengan kemungkinan ditarik:
tiles = {9, 2, 2, 4, 12, 2, 3, 2, 9, 1, 1, 4, 2, 6, 8, 2, 1, 6, 4, 6,
4, 2, 2, 1, 2, 1, 2};
chances = tiles / (Plus @@ tiles);
nonwords /. (Transpose[{List @@ alphabet, chances}] /. {a_, b_} -> a -> b)
Outputnya adalah 1,079877553303%, jawaban yang tepat (meskipun menggunakan model perkiraan, menggambar dengan penggantian). Melihat kembali, butuh empat baris untuk memasukkan data (alfabet, kamus, dan alfabet frekuensi) dan hanya tiga baris untuk melakukan pekerjaan: menjelaskan bagaimana untuk mengambil kekuatan berikutnya modulo saya , mengambil kekuasaan 7 rekursif, dan mengganti probabilitas untuk surat-surat itu.αI