Ceci est un (long!) Commentaire sur le beau travail que @vqv a publié dans ce fil. Il vise à obtenir une réponse définitive. Il a fait le travail acharné de simplification du dictionnaire. Il ne reste plus qu'à l'exploiter au maximum. Ses résultats suggèrent qu'une solution de force brute est faisable . Après tout, y compris un caractère générique, il y a au plus mots que l'on peut faire avec 7 caractères, et il semble que moins de 1/10000 d'entre eux - disons, environ un million - ne pas inclure un mot valide. 277= 10 , 460 , 353 , 203
La première étape consiste à augmenter le dictionnaire minimal avec un caractère générique, "?". 22 des lettres apparaissent en deux lettres (toutes sauf c, q, v, z). Joignez un caractère générique à ces 22 lettres et ajoutez-les au dictionnaire: {a ?, b ?, d ?, ..., y?} Sont maintenant entrés. De même, nous pouvons inspecter les mots minimaux à trois lettres, provoquant quelques mots supplémentaires à apparaître dans le dictionnaire. Enfin, nous ajoutons "??" au dictionnaire. Après avoir supprimé les répétitions qui en résultent, il contient 342 mots minimum.
Une manière élégante de procéder - qui utilise en effet une très petite quantité d'encodage - est de considérer ce problème comme un problème algébrique . Un mot, considéré comme un ensemble de lettres non ordonné, n'est qu'un monôme. Par exemple, "spats" est le monôme . Le dictionnaire est donc une collection de monômes. Ça ressemble àa p s2t
{ a2, a b , a d, . . . , o zψ , w x ψ , ψ2}
(où, pour éviter toute confusion, j'ai écrit pour le caractère générique).ψ
Un rack contient un mot valide si et seulement si ce mot divise le rack.
Une façon plus abstraite, mais extrêmement puissante, de dire ceci est que le dictionnaire génère un idéal dans l'anneau polynomial R = Z [ a , b , … , z , ψ ] et que les racks avec des mots valides deviennent nuls dans le quotient anneau R / I , tandis que les racks sans mots valides restent différents de zéro dans le quotient. Si nous formons la somme de tous les racks dans R et que nous la calculons dans cet anneau de quotient, alors le nombre de racks sans mots est égal au nombre de monômes distincts dans le quotient.jeR = Z [ a , b , … , z, ψ ]R/IR
De plus, la somme de tous les racks en est simple à exprimer. Soit α = a + b + ⋯ + z + ψ la somme de toutes les lettres de l'alphabet. α 7 contient un monôme pour chaque rack. (En prime, ses coefficients comptent le nombre de façons dont chaque rack peut être formé, ce qui nous permet de calculer sa probabilité si nous le voulons.)Rα=a+b+⋯+z+ψα7
À titre d'exemple simple (pour voir comment cela fonctionne), supposons (a) que nous n'utilisons pas de caractères génériques et (b) toutes les lettres de "a" à "x" sont considérées comme des mots. Ensuite, les seuls racks possibles à partir desquels les mots ne peuvent pas être formés doivent être entièrement composés de y et de z. On calcule modulo l'idéal généré par { a , b , c , … , x } une étape à la fois, donc:α=(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.
Nous pouvons lire la possibilité d'obtenir un rack non mot à partir de la réponse finale, : chaque coefficient compte les façons dont le rack correspondant peut être dessiné. Par exemple, il existe 21 façons (sur 26 ^ 7 possibles) de dessiner 2 y et 5 z car le coefficient de yy7+ 7 y6z+ De 21 ans5z2+ 35 y4z3+ 35 y3z4+ De 21 ans2z5+ 7 yz6+ z7 est égal à 21.y2z5
D'après les calculs élémentaires, il est évident que c'est la bonne réponse. Le fait est que cette procédure fonctionne quel que soit le contenu du dictionnaire.
Remarquez comment la réduction du module de puissance idéal à chaque étape réduit le calcul: c'est le raccourci révélé par cette approche. (Fin de l'exemple.)
Les systèmes d'algèbre polynomiale implémentent ces calculs . Par exemple, voici le code 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]
(Le dictionnaire peut être construit de manière simple à partir du min.dict de @ vqv; je mets ici une ligne montrant qu'il est suffisamment court pour être spécifié directement si vous le souhaitez.)
La sortie - qui prend dix minutes de calcul - est 577958. ( NB Dans une version antérieure de ce message, j'avais fait une petite erreur dans la préparation du dictionnaire et obtenu 577940. J'ai édité le texte pour refléter ce que j'espère être maintenant les résultats corrects!) Un peu moins que le million environ que j'attendais, mais du même ordre de grandeur.
Pour calculer les chances d'obtenir un tel rack, nous devons tenir compte du nombre de façons dont le rack peut être dessiné. Comme nous l'avons vu dans l'exemple, cela équivaut à son coefficient en . La chance de dessiner un tel rack est la somme de tous ces coefficients, facilement trouvée en mettant toutes les lettres égales à 1:α7
nonwords /. (# -> 1) & /@ (List @@ alphabet)
La réponse est égale à 1066056120, ce qui donne une chance de 10,1914% de dessiner un rack à partir duquel aucun mot valide ne peut être formé (si toutes les lettres sont également probables).
Lorsque les probabilités des lettres varient, il suffit de remplacer chaque lettre par sa chance d'être tirée:
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)
La sortie est 1,079877553303%, la réponse exacte (bien qu'en utilisant un modèle approximatif, dessin avec remplacement). Avec le recul, il a fallu quatre lignes pour saisir les données (alphabet, dictionnaire et fréquences de l'alphabet) et seulement trois lignes pour faire le travail: décrire comment prendre la prochaine puissance de modulo I , prendre la 7e puissance récursivement et remplacer la probabilités pour les lettres.αI