To jest (długi!) Komentarz do dobrej pracy opublikowanej przez @vqv w tym wątku. Ma na celu uzyskanie ostatecznej odpowiedzi. Ciężko pracował nad uproszczeniem słownika. Pozostaje tylko wykorzystać go w pełni. Jego wyniki sugerują, że możliwe jest rozwiązanie z użyciem siły brutalnej . W końcu, włączając w to symbol wieloznaczny, istnieje co najwyżej słów, które można sformułować za pomocą 7 znaków, i wygląda na to, że mniej niż 1/10000 z nich - powiedzmy, około miliona - nie będzie zawierać niektórych poprawnych słowo. 277=10,460,353,203
Pierwszym krokiem jest uzupełnienie minimalnego słownika znakiem wieloznacznym „?”. 22 litery pojawiają się w dwuliterowych słowach (wszystkie oprócz c, q, v, z). Dołącz znak wieloznaczny do tych 22 liter i dodaj je do słownika: {a ?, b ?, d ?, ..., y?} Już są. Podobnie możemy sprawdzić minimalne trzyliterowe słowa, powodując dodatkowe słowa pojawić się w słowniku. Na koniec dodajemy „??” do słownika. Po usunięciu powtórzeń zawiera 342 minimalne słowa.
Elegancki sposób postępowania - taki, który używa bardzo niewielkiej ilości kodowania - polega na postrzeganiu tego problemu jako algebraicznego . Słowo, uważane za nieuporządkowany zestaw liter, jest po prostu monomialne. Na przykład „spats” to monomialne . Słownik jest zatem zbiorem monomialów. To wygląda jakaps2t
{a2,ab,ad,...,ozψ,wxψ,ψ2}
(gdzie, aby uniknąć zamieszania, napisałem dla znaku wieloznacznego).ψ
Stojak zawiera prawidłowe słowo, tylko wtedy, gdy to słowo dzieli stojak.
Bardziej abstrakcyjnym, ale niezwykle potężnym sposobem na powiedzenie tego jest to, że słownik generuje idealne w pierścieniu wielomianowym i że stojaki z poprawnymi słowa stają się zerowe w pierścieniu ilorazowym , natomiast stojaki bez prawidłowych słów pozostają niezerowe w ilorazie. Jeśli utworzymy sumę wszystkich stojaków w i obliczymy je w tym pierścieniu ilorazowym, wówczas liczba stojaków bez słów jest równa liczbie różnych jednomianów w ilorazie.R = Z [ a , b , … , z , ψ ] R / I RIR=Z[a,b,…,z,ψ]R/IR
Ponadto suma wszystkich stojaków w jest łatwa do wyrażenia. Niech będzie sumą wszystkich liter alfabetu. zawiera jeden monomial na każdy stojak. (Jako dodatkowy bonus, jego współczynniki liczą liczbę sposobów, w jakie można utworzyć każdy stojak, co pozwala nam obliczyć jego prawdopodobieństwo, jeśli chcemy.)α = a + b + ⋯ + z + ψ α 7Rα=a+b+⋯+z+ψα7
Jako prosty przykład (aby zobaczyć, jak to działa) załóżmy, że (a) nie używamy symboli wieloznacznych i (b) wszystkie litery od „a” do „x” są uważane za słowa. Zatem jedyne możliwe stojaki, z których nie można utworzyć słów, muszą składać się wyłącznie z liter y i z. Obliczamy modulo ideału generowanego przez krok po kroku, w ten sposób: { a , b , c , … , x }α=(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.
Z ostatecznej odpowiedzi możemy odczytać szansę otrzymania stojaka bez słów, : każdy współczynnik zlicza sposoby, w jakie można narysować odpowiedni stojak. Na przykład istnieje 21 (z 26 ^ 7 możliwych) sposobów na narysowanie 2 lat i 5 z, ponieważ współczynnik wynosi 21.y7+7y6z+21y5z2+35y4z3+35y3z4+21y2z5+7yz6+z7y2z5
Z elementarnych obliczeń wynika, że jest to poprawna odpowiedź. Chodzi o to, że ta procedura działa niezależnie od zawartości słownika.
Zauważ, jak redukcja modułu mocy ideału na każdym etapie zmniejsza obliczenia: oto skrót ujawniony w tym podejściu. (Koniec przykładu.)
Systemy algebry wielomianowej realizują te obliczenia . Na przykład, oto kod 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]
(Słownik można zbudować w prosty sposób z min.dict @ vqv; wstawiłem tutaj wiersz pokazujący, że jest on wystarczająco krótki, aby można go było podać bezpośrednio, jeśli chcesz).
Wynik - który zajmuje dziesięć minut obliczeń - wynosi 577958. ( Uwaga: We wcześniejszej wersji tego komunikatu popełniłem niewielki błąd podczas przygotowywania słownika i otrzymałem 577940. Edytowałem tekst, aby odzwierciedlić to, co mam nadzieję teraz poprawne wyniki!) Nieco mniej niż milion oczekiwałem, ale tego samego rzędu wielkości.
Aby obliczyć szansę na uzyskanie takiego stojaka, musimy wziąć pod uwagę liczbę sposobów, w jakie można go wyciągnąć. Jak widzieliśmy w przykładzie, jest to równe jego współczynnikowi w . Szansa rysunek jakiś taki stojak jest sumą wszystkich tych współczynników, łatwo znaleźć poprzez ustawienie wszystkich liter równy 1:α7
nonwords /. (# -> 1) & /@ (List @@ alphabet)
Odpowiedź równa się 1066056120, co daje 10,1914% szansy na wyciągnięcie stojaka, z którego nie można utworzyć prawidłowego słowa (jeśli wszystkie litery są jednakowo prawdopodobne).
Gdy prawdopodobieństwa liter są różne, po prostu zamień każdą literę na szansę na narysowanie:
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)
Wynik wynosi 1.079877553303%, dokładna odpowiedź (choć przy użyciu modelu przybliżonego, rysunek z zamiennikiem). Patrząc wstecz, dane zajęły cztery linie (alfabet, słownik i częstotliwości alfabetu) i tylko trzy linie do wykonania pracy: opisz, jak pobrać następną potęgę modulo , rekurencyjnie weź siódmą potęgę i zamień ją prawdopodobieństwa liter.αI