Це (довгий!) Коментар до приємної роботи @vqv, розміщеної в цій темі. Він спрямований на отримання остаточної відповіді. Він провів важку роботу зі спрощення словника. Залишилося лише експлуатувати це повною мірою. Його результати говорять про те, що жорстоке рішення є можливим . Зрештою, включаючи підстановку, є щонайбільше слова, які можна скласти із 7 символів, і схоже, що менше 1/10000 з них - скажімо, близько мільйона - не включатимуть дійсних слово. 277= 10 , 460 , 353 , 203
Перший крок - збільшити мінімальний словник з символом підстановки "?". 22 букви з’являються двобуквенними словами (усі, крім c, q, v, z). Приєднайте підстановку до цих 22 букв і додайте їх до словника: {a ?, b ?, d ?, ..., y?} Зараз. Так само ми можемо перевірити мінімальні трибуквні слова, викликаючи додаткові слова з’являтися в словнику. Нарешті додаємо "??" до словника. Після видалення результатів повторень він містить 342 мінімальних слова.
Елегантний спосіб продовження - той, що дійсно використовує дуже малу кількість кодування - це розглянути цю проблему як алгебраїчну . Слово, яке розглядається як не упорядкований набір букв, є лише мономієм. Наприклад, "шпліци" - одночлен . Словник тому є сукупністю мономіїв. Це виглядає якa p s2т
{ a2, Б , д, . . . , o zψ , w x ψ , ψ2}
(де, щоб уникнути плутанини, я написав для символу підстановки).ψ
Стійка містить дійсне слово тоді і тільки тоді, коли це слово розділяє стійка.
Більш абстрактний, але надзвичайно потужний спосіб сказати це, що словник генерує ідеальне в поліноміальному кільці і що стійки з дійсними слова стають нульовими в кінцевому кільці , тоді як стійки без дійсних слів залишаються нульовими в частці. Якщо ми сформуємо суму всіх стелажів у і обчислимо її в цьому коефіцієнті, то кількість стійок без слів дорівнює кількості виразних одночленів у коефіцієнті.R = Z [ a , b , … , z , ψ ] R / I RЯR = Z [ a , b , … , z, ψ ]Р / яR
Крім того, суму всіх стійок у просто виразити. Нехай - сума всіх літер в алфавіті. містить один монолог для кожної стійки. (В якості додаткового бонусу його коефіцієнти підраховують кількість способів формування кожної стійки, що дозволяє нам обчислити її ймовірність, якщо нам це подобається.)α = a + b + ⋯ + z + ψ α 7Rα = a + b + ⋯ + z+ ψα7
Як простий приклад (щоб побачити, як це працює), припустимо, (а) ми не використовуємо підстановку та (b) всі літери від "а" до "х" вважаються словами. Тоді єдині можливі стійки, з яких не можна сформувати слова, повинні повністю складатися з 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≡ у+zмодЯ≡ ( у+ z) ( a + b + ⋯ + y+ z) ≡ ( у+z)2модЯ≡ (у+ z)6( a + b + ⋯ + y+z) ≡ (у+ z)7модЯ.
З остаточної відповіді ми можемо прочитати шанс отримання несловної стійки, : кожен коефіцієнт підраховує способи, за якими можна намалювати відповідну стійку. Наприклад, існує 21 (з 26 ^ 7 можливих) способів намалювати 2 y та 5 z's, оскільки коефіцієнт дорівнює 21.y 2 z 5у7+ 7 у6z+ 21 рік5z2+ 35 г4z3+ 35 г3z4+ 21 рік2z5+7 уz6+z7у2z5
З елементарних розрахунків очевидно, що це правильна відповідь. Вся справа в тому, що ця процедура працює незалежно від змісту словника.
Зверніть увагу, як зменшення модуля потужності ідеалом на кожному етапі скорочує обчислення: ось ярлик, виявлений таким підходом. (Кінець прикладу.)
Системи поліноміальної алгебри реалізують ці розрахунки . Наприклад, ось код 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]
(Словник може бути побудований прямо з @ vqv's min.dict; я ставлю сюди рядок, який показує, що він досить короткий, щоб бути визначеним безпосередньо, якщо вам подобається.)
Вихід - який займає десять хвилин на обчислення - становить 577958. ( Примітка. У попередній версії цього повідомлення я допустив невелику помилку при підготовці словника і отримав 577940. Я відредагував текст, щоб відобразити те, на що я сподіваюся, що зараз. правильні результати!) Трохи менше, ніж я очікував мільйон, але такого ж порядку.
Щоб обчислити шанс отримання такої стійки, нам потрібно врахувати кількість способів, яким можна намалювати стійки. Як ми бачили в прикладі, це дорівнює його коефіцієнту в . Шанс намалювати якусь таку стійку - це сума всіх цих коефіцієнтів, яку легко знайти, встановивши всі літери, що дорівнюють 1:α7
nonwords /. (# -> 1) & /@ (List @@ alphabet)
Відповідь дорівнює 1066056120, що дає шанс 10,1914% намалювати стійка, з якої не може бути сформовано жодного дійсного слова (якщо всі букви однакові).
Коли ймовірність букв змінюється, просто замініть кожну букву на її шанс намалювати:
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%, точна відповідь (хоча і з використанням приблизної моделі, креслення із заміною). Озираючись назад, для введення даних (алфавіту, словника та частоти алфавіту) знадобилось чотири рядки і лише три рядки для виконання роботи: опишіть, як приймати наступну потужність модуля , приймати 7-ту потужність рекурсивно та замінювати ймовірності для букв.IαЯ