Bu, @vqv'nin bu konuya gönderdiği güzel çalışma hakkında (uzun!) Bir yorum. Kesin bir cevap elde etmeyi amaçlar. Sözlüğü basitleştirmek için sıkı bir çalışma yaptı. Geriye kalan tek şey onu sonuna kadar kullanmak. Elde ettiği sonuçlar kaba kuvvetli bir çözümün mümkün olduğunu gösteriyor . Sonuçta, bir joker karakter dahil, en fazla kelimeden biri 7 karakterden oluşabiliyor ve bunların 1 / 10000'den daha azına benziyor - bir milyon civarında - olacak geçerli bir kelime içermemekte. 277=10,460,353,203
İlk adım, minimal sözlüğü "?" Joker karakteriyle genişletmektir. Harflerin 22'si iki harften oluşur (hepsi c, q, v, z hariç). Bu 22 harfe joker karakter ekleyin ve bunları şu sözlüğe ekleyin: {a ?, b ?, d ?, ..., y?} Şimdi içeride. Benzer şekilde, en az üç harften oluşan kelimeleri inceleyebiliriz, ek kelimelere neden olabiliriz. sözlükte görünmek için Sonunda "??" ekleriz. Sözlüğe Ortaya çıkan tekrarları sildikten sonra en az 342 kelime içerir.
Gerçekten de çok küçük bir kodlama kullanan, devam etmenin zarif bir yolu, bu sorunu cebirsel olarak görmektir . Sırasız bir harf kümesi olarak kabul edilen bir kelime, sadece bir monomialdir. Örneğin, "Spats" monomial olan . Bu nedenle sözlük, bir monom koleksiyonudur. Benziyora p s2t
{ a2, bir b , bir d, . . . , o zψ , w x ψ , ψ2}
(karışıklıktan kaçınmak için, joker karakter için yazdım ).ψ
Bir raf, yalnızca bu kelime rafa bölündüğünde geçerli bir kelime içerir.
Daha soyut, ama son derece güçlü, bunu söylemenin bir yolu, sözlüğün R = Z [ a , b , … , z , om ] polinomu halkasında ideal bir üretmesi ve geçerli kelimelere sahip rafların bölüm içinde sıfıra dönmesidir. halka R / I , oysa geçerli sözcük içermeyen raflar bölüm içinde sıfır kalmaz. Eğer R'deki tüm rafların toplamını oluşturur ve bu bölüm halkasında hesaplarsak, sözsüz raf sayısı, bölümdeki farklı monomiallerin sayısına eşittir.benR=Z[a,b,…,z,ψ]R/IR
Ayrıca, tüm rafların toplamının ifade edilmesi kolaydır. Let α = bir + b + ⋯ + z + ψ alfabenin tüm harfleri toplamı olacaktır. α 7 her bir raf için, bir tek terimli içerir. (Ek bir avantaj olarak, katsayıları, her bir rafın oluşturulabileceği sayıları sayar ve eğer istersen olasılığını hesaplamamızı sağlar.)Rα=a+b+⋯+z+ψα7
Basit bir örnek olarak (bunun nasıl çalıştığını görmek için), (a) joker karakter kullanmıyoruz ve (b) "a" dan "x" e kadar olan tüm harfleri kelimeler olarak kabul ediyoruz. Öyleyse, sözcüklerin oluşamayacağı olası raflar tamamen y ve z 'den oluşmalıdır. Bu işlem tarafından oluşturulan ideal bir modulo { a , b , c , ... , x } böylece her seferinde bir adım:α=(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.
Son cevaptan kelime olmayan bir raf alma şansını okuyabiliriz, : her katsayı, ilgili rafın nasıl çekilebileceğini sayar. Örneğin, 2 (5 ve 26) mümkün) 2 y ve 5 z'yi çizmenin bir yolu vardır, çünkü y katsayısıy7+7y6z+21y5z2+35y4z3+35y3z4+21y2z5+7yz6+z7 21 eşittir.y2z5
Temel hesaplamalardan, bunun doğru cevap olduğu açıktır. Bütün mesele şu ki, bu prosedür sözlüğün içeriğinden bağımsız olarak çalışır.
Güç modülünün her aşamada ideal olarak azaltılmasının hesaplamayı nasıl azalttığına dikkat edin: bu, bu yaklaşımın ortaya çıkardığı kısayol. (Örneğin sonu.)
Polinom cebir sistemleri bu hesaplamaları uygular . Örneğin, işte Mathematica kodu:
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]
(Sözlük @ vqv'nin min.dict'sinden basit bir şekilde oluşturulabilir; İsterseniz doğrudan belirtilmesinin yeterince kısa olduğunu gösteren bir çizgi koyuyorum.)
Hesaplama on dakika süren çıktı 577958 'dir. ( NB Bu mesajın önceki sürümlerinde sözlüğü hazırlarken ufak bir hata yaptım ve 577940' ı elde ettim. doğru sonuçlar!) Beklediğim milyondan biraz daha az, ama aynı büyüklükte.
Böyle bir raf alma şansını hesaplamak için , rafın nasıl çekilebileceğini hesaplamamız gerekir. Örnekte gördüğümüz gibi, bu katsayısına eşittir . Çizim şansı bazı tür raf 1'e eşit kolaylıkla tüm harfleri ayarlayarak bulunan tüm bu katsayılar, toplamıdır:α7
nonwords /. (# -> 1) & /@ (List @@ alphabet)
Cevap, 1066056120’ye eşittir,% 10.1914 oranında geçerli bir kelime oluşturulamayan bir raf çekme şansı verir (eğer tüm harfler eşit derecede muhtemel ise).
Harflerin olasılıkları değiştiğinde, sadece her bir harfi çizilme şansıyla değiştirin:
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)
Çıktı % 1.079877553303'tür, kesin cevap (yaklaşık bir model kullanılsa da, değiştirilmesi ile çizim ). Geriye dönüp bakıldığında, verileri girmek için dört satır gerekiyordu (alfabe, sözlük ve alfabe frekansları) ve işi yapmak için sadece üç satır vardı: modulo I'in bir sonraki gücünün nasıl alınacağını, 7. gücün tekrarlı bir şekilde nasıl alınacağını ve ikame edicinin yerine geçeceğini tanımlayın . harfler için olasılıklar.αben