Это (длинный!) Комментарий к хорошей работе, которую @vqv опубликовал в этой теме. Он направлен на получение окончательного ответа. Он проделал тяжелую работу по упрощению словаря. Все, что остается, - это использовать его в полной мере. Его результаты предполагают, что решение грубой силы возможно . В конце концов, включая подстановочный знак, существует не более слов, которые можно произнести с помощью 7 символов, и похоже, что менее 1/10000 из них, скажем, около миллиона, не в состоянии включить какое-либо действительное слово. 277=10,460,353,203
Первым шагом является добавление минимального словаря подстановочным знаком «?». 22 буквы появляются в двухбуквенных словах (все, кроме c, q, v, z). Присоедините подстановочный знак к этим 22 буквам и добавьте их в словарь: {a ?, b ?, d ?, ..., y?} Теперь в. Аналогично мы можем проверить минимальные трехбуквенные слова, вызывая некоторые дополнительные слова появляться в словаре. Наконец, мы добавляем "??" в словарь. После удаления повторений, которые в результате, он содержит 342 минимальных слова.
Элегантный способ продолжить - тот, который действительно использует очень небольшое количество кодирования - это рассматривать эту проблему как алгебраическую . Слово, рассматриваемое как неупорядоченный набор букв, является просто мономом. Например, "spats" - это моном . Таким образом, словарь представляет собой набор мономов. Это выглядит какaps2t
{a2,ab,ad,...,ozψ,wxψ,ψ2}
(где, чтобы избежать путаницы, я написал для символа подстановки).ψ
Стойка содержит правильное слово, если и только если это слово разделяет стойку.
Более абстрактный, но чрезвычайно мощный способ сказать, что словарь генерирует идеал в кольце многочленов R = Z [ a , b , … , z , ψ ] и что стойки с действительными словами становятся равными нулю в частном. ring R / I , тогда как стойки без допустимых слов остаются ненулевыми в частном. Если мы сформируем сумму всех стоек в R и вычислим ее в этом фактор-кольце, точисло стоек без слов будет равным количеству различных мономов в фактор-группе.яR = Z [ a , b , … , z, ψ ]R / Iр
Кроме того, сумма всех стоек в легко выразить. Пусть α = a + b + ⋯ + z + ψ - сумма всех букв в алфавите. α 7 содержит один моном для каждой стойки. (В качестве дополнительного бонуса его коэффициенты подсчитывают количество способов, которыми может быть сформирована каждая стойка, что позволяет нам вычислять ее вероятность, если мы захотим.)рα = a + b + ⋯ + z+ ψα7
В качестве простого примера (чтобы увидеть, как это работает), предположим, что (а) мы не используем подстановочные знаки и (б) все буквы от «а» до «х» считаются словами. Тогда единственно возможные стойки, из которых не могут быть образованы слова, должны состоять целиком из y и z. Вычисляем по модулю идеала, порожденного { 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.
Мы можем зачитать шанс получить не состоящую из слов стойку из окончательного ответа: : каждый коэффициент подсчитывает, каким образом можно нарисовать соответствующую стойку. Например, есть 21 (из 26 ^ 7 возможных) способов нарисовать 2 y и 5 z, потому что коэффициент yy7+7y6z+21y5z2+35y4z3+35y3z4+21y2z5+7yz6+z7 равняется 21.y2z5
Из элементарных расчетов очевидно, что это правильный ответ. Все дело в том, что эта процедура работает независимо от содержания словаря.
Обратите внимание, как уменьшение мощности по модулю идеала на каждом этапе сокращает вычисления: это сокращение, выявленное этим подходом. (Конец примера.)
Системы полиномиальной алгебры реализуют эти вычисления . Например, вот код 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]
(Словарь может быть построен простым способом из min.dict @vqv; я поставил здесь строку, показывающую, что он достаточно короткий, чтобы его можно было указать напрямую, если хотите.)
Вывод - который занимает десять минут вычислений - 577958. ( NB. В более ранней версии этого сообщения я допустил небольшую ошибку при подготовке словаря и получил 577940. Я отредактировал текст, чтобы отразить то, что, я надеюсь, сейчас правильные результаты!) Чуть меньше миллиона или около того я ожидал, но того же порядка.
Чтобы рассчитать вероятность получения такой стойки, нам необходимо учесть количество способов, которыми эта стойка может быть вытянута. Как мы видели в примере, это равно его коэффициенту в . Возможность рисования некоторого такой стеллажа является суммой всех этих коэффициентов, легко найти, установив все буквы равно 1:α7
nonwords /. (# -> 1) & /@ (List @@ alphabet)
Ответ равняется 1066056120, что дает 10,19% вероятности составить стойку, из которой невозможно составить правильное слово (если все буквы одинаково вероятны).
Когда вероятности букв меняются, просто замените каждую букву ее шансом быть нарисованным:
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)
Выход составляет 1.079877553303%, точный ответ (хотя и с использованием приблизительной модели, чертеж с заменой). Оглядываясь назад, потребовалось четыре строки для ввода данных (частоты алфавита, словаря и алфавита) и всего три строки для выполнения работы: опишите, как получить следующую степень по модулю I , взять 7-ю степень рекурсивно и подставить вероятности для букв.αI