Книга: Программирование игр и головоломок

Зашифрованные операции

Зашифрованные операции

Общая идея состоит в том, чтобы перепробовать все возможные комбинации, согласующиеся с условием, и сохранить только те из них, которые удовлетворяют предложенной операции.

Головоломка 8.

Пусть даны значения D и E (значения различны). Из них получается Y и то, что «в уме». По этой величине «в уме» получается значение N. Так как N + R + «в уме» = E (плюс, быть может, 10) и так как E известно, то только N можно выбирать произвольно. Кроме того, нужно, чтобы оно отличалось от D, E и Y и нужно, чтобы R, полученное таким образом, отличалось от D, E, Y, N. Если пока все идет хорошо, то вы продолжаете выбор. Если уже возникла невозможность, то вернитесь назад и осуществите другой выбор N. Если никакой выбор для N не оказывается возможным, вернитесь назад и измените выбор E

Это — одно решение.

Но оно может потребовать много времени. Чтобы выиграть время, ограничьте возможные выборы. Очевидно, что значение SEND ограничено числом 9999, как и MORE, и поэтому значение MONEY не может превосходить 19998. Так как это — число из пяти цифр, то M = 1. Это освобождает вас от испытания 1 для D и E. Если цифра единиц суммы D + E равна 1, то этот набор D и E недопустим.

Поставьте 1 на свое место:


S + 1 + «то, что в уме» дает число, большее девяти. Это возможно только в случае, если мы предположим что «в уме» для S кое-что есть:

S + 2 = 10 + O

(справа буква O, а не цифра ноль).

S + 2 может превосходить 9 только в случае, если S больше 7. Единственные возможные значения — это

S = 8, что дает букве O значение 0,

S = 9, что дает букве O значение 1.

Но 1 уже присвоено букве M. Следовательно, S = 8 и O = 0.

Метод, использованный в этом упражнении, имеет очень широкую область применения. Нужно исследовать все возможности, чтобы выявить те, которые удовлетворяют условию задачи. Мы упорядочиваем их таким образом, чтобы, переходя от одной комбинации к следующей, пересмотреть их все и притом по одному разу.

1. Берем первую комбинацию.

2. Испытываем ее. Если она удовлетворяет требованиям, запоминаем ее значение.

3. Если это — последняя комбинация, то все значения записаны и все кончено.

4. Если не последняя, то переходим к следующей комбинации и повторяем, начиная с пункта 2.

В данном случае — так как мы уже знаем значения букв S, O, M, остается только три еще не определенных значения: D, E, N. Для каждой из них берем постепенно возрастающие значения, изменяя их таким образом, чтобы сначала возрастало N при постоянных D и E. Затем меняется E при постоянном D (а N пробегает все возможные значения). Когда все возможные значения для E испытаны, мы переходим к следующему значению D.

Таким образом, D может принимать 7 значений.

Для каждого из них E может принимать 6 значений.

Для каждой такой пары N может принимать 5 значений.

Отсюда следует, что нужно перепробовать 7 ? 6 ? 5 = 210 значений, что совершенно не затруднит компьютер…

Головоломка 9.

Будем действовать, как в предыдущей задаче. Но здесь есть некоторая дополнительная информация. В условии участвуют 10 букв:

H E L P T Y O U N G

Так как они имеют значения в виде 10 цифр, где каждая цифра участвует и притом только один раз, то

H + E + L + P + T + Y + O + U + N + G = 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7+ 8 + 9 = 45.

Если вы учтете очевидные значения букв Y, O, H, то вы сможете дать сначала значения каждому из чисел «в уме». Используя тогда соотношения между значениями букв, заданных в зашифрованном сложении, вы сможете получить соотношение между четырьмя буквами и вывести из него, что E нечетно. Отсюда вы быстро выведете, что оно может принимать не более двух значений: 3 и 5.

Испытайте их одно за другим…

Головоломка 10.

Здесь снова используются 10 цифр. Вы знаете их сумму. Она делится на 9. Вы знаете кое-что о сумме цифр результата.

Вы легко сможете заменить это умножение сложением. В нем вы сможете определить все величины «в уме». Вам останется сделать не так уж много попыток…

Головоломка 11.

Эта головоломка намного серьезнее. Если вы пойдете по пути систематических испытаний, то вы рискуете потерять время зря. Есть 9! = 362880 перестановок девяти первых цифр. Не все они подлежат проверке, поскольку крайняя слева цифра не может превосходить 3. Но остается еще очень много возможностей.

Запишите это символическое умножение и обозначьте его величины «в уме». После умножения на 3 величина «в уме» может быть только 0, 1 или 2. Замечая, что все 9 цифр, отличных от 0, использованы, вы можете узнать сумму величин «в уме» (10). Так как 6 не может быть связано с 2 «в уме», поскольку 3 ? 6 + 2 = 20 дает 0 в качестве цифры единиц, а это исключено, то вы сможете таким образом полностью определить величины «в уме», связанные с этими двумя цифрами. Это разрешает задачу о решениях, оканчивающихся на 3.

Так как величины «в уме» являются ключом к задаче, составьте маленькую таблицу, показывающую для каждой цифры, как она может быть получена в качестве цифры единиц произведения некоторой цифры на 3 с добавлением величины «в уме». Например, 5 можно получить как 3 ? 5 + 0, 3 ? 8 + 1, 3 ? 1 + 2.

Если число кончается на 9, то результат кончается на 7, и 2 оказывается «в уме». Можно почти закончить вручную. Во всяком случае вручную легко найти какое-то решение. Программа для компьютера остается необходимой для того, чтобы найти все остальные решения.

Головоломка 12.

Легко! Чтобы доказать эту теорему, достаточно доказать, что ее утверждение справедливо для любого n, кратного трем. Давайте-ка их все переберем. Сначала для каждого n вычислим первое число n, сумму кубов цифр числа n. Если n' меньше n, то дальше идти незачем. Покажите, что n' кратно трем. Если оно меньше n, то оно уже испытано, и для него результат известен.

Можете ли вы найти такое k, что при n > k имеем n' < n?

Если можете, то достаточно проверить искомое свойство для всех n, кратных трем и меньших k. Это делается очень быстро.

Головоломка 13.

Эти варианты исследуются таким же способом. Проделайте сначала вручную пробы, чтобы увидеть, как ведут себя последовательности сумм кубов цифр для чисел п, не кратных трем, различая случаи: n на единицу больше кратного трем, и на 2 единицы больше кратного трем.

В случае суммы квадратов вы знаете, какой результат нужно доказывать. Это легко…

Головоломка 14.

Изучаемое число имеет вид 1000a + 100b + 10c + d при a ? b ? c ? d. И, так как не все цифры одинаковы, то непременно a > d.

Вы можете доказать, что результат первого вычитания кратен девяти, так что, переходя к первой разности, вы кое-что знаете о сумме a + b + c + d.

Каково бы ни было исходное число, первая из полученных разностей имеет вид 999u + 90v с v < u, 0 ? v, 0 < u ? 9. Так что-не так уж много чисел нужно испытывать…

Головоломка 15.

Эта головоломка намного труднее. Используйте все данные задачи, хотя и кажется, что их не слишком много.

Господин P не может найти искомые числа. Следовательно, число р не является произведением двух простых чисел — в противном случае их разложение на множители было бы однозначным.

Господин S это знает. Но их сумма s может быть многими способами представлена в виде суммы двух чисел. Ни одна из этих пар не является парой простых чисел. Это условие гораздо более ограничительно: нужно вычеркнуть из списка возможных значений s все такие значения, которые являются суммами двух простых чисел — таковы 12 (так как 12 = 7 + 5), 13 (11 + 2). Компьютер позволит вам составить оставшийся список.

Господин P не может найти решение, так как его произведение может быть многими разными способами разложено в произведение двух чисел. Учитывая, что именно знает S, он исключает все пары, сумма которых вычеркнута. У него остается в точности одна пара. Каковы произведения, обладающие этим свойством?

Наконец, господин S получает решение. Следовательно, среди всех пар с суммой s есть только одна пара, дающая произведение с упомянутым выше свойством.

Компьютер нужен, чтобы порождать списки и вычеркивать в них. В конце должна оставаться одна и только одна пара.

Головоломка 16.

Я предлагаю вам решить эту задачу в два приема.

1. Составьте сначала программу по методу Полларда-Брента о «маленькими» числами, иначе говоря, такими, что машина представляет их бее округления или усечения, Это зависит от машины. Я на своей машине могу получить около 8·106, что немного. Возникают еще некоторые сомнения, как только принимаются во внимание деления…

Чтобы узнать, становится ли последовательность периодической, вы можете ограничиться рассмотрением разностей ai ? aj, где i и j меняются в соответствии с вполне определенными законами, Вам следует рассматривать н. о. д. этих разностей и n. Это невыполнимо для каждой разности и потребует много времени.

Идея в том, чтобы образовать произведение на некоторое число этих разностей по модулю n, а затем брать н. о. д. этих разностей и n. Если одна из этих разностей имеет с n н. о. д., отличный от 1, то для произведения будет выполняться то же самое. Выбор числа членов для участия в произведении предоставляется вашему усмотрению. Если членов слишком мало, то вы вычисляете много н о. д. и замедляете метод. Если членов много, то вы делаете ненужные операции! вы долго ждете перед тем, как обнаружить делитель…

2. Если эта первая программа уже готова, переходите к гораздо большим числам. Нужно выполнить следующие операции:

произведение двух чисел по модулю n,

н. о. д. двух чисел, числа n и числа, меньшего n.

Настоящая трудность — это произведение по модулю n. Так как к ней часто обращаются, то она должна быть оптимальной…

Может оказаться опасным пускаться в этот метод Полларда, не зная, является ли исследуемое число составным. Используйте для этого тест Ферма.

В этом единственную трудность представляет возведение x в степень n ? 1 по модулю n.

Следовательно, пусть нужно вычислить y = xp.

Примем следующую индуктивную гипотезу: искомый результат имеет вид y = ukw.

Если k есть нуль, то uk = 1 и потому у = w, и все закончено.

Если k не нуль и если k четно, то uk = u2(k/2) = (u2)k/2.

Заменяя u на u * u и k на k/2 возвращаемся к общей ситуации.

Если k нечетно, то uk = u * u2((k?1)/2)

w * uk = (w * u) * (u2)(k?1)/2

Заменим w на w * u, u на u * u и k на целую часть от k/2.

Все это должно проделываться по модулю n. Операции над k не содержат трудностей. Если числа достаточно малы, то вы действуете обычными умножениями или делениями.

Если же числа не являются достаточно малыми, то все сводится к предыдущему случаю. Но у вас здесь есть элемент ответа. Я уже говорил вам, как можно вычислить y = xp с помощью бинарного разложения p, выполняя умножения только по модулю n. Переделайте то же рассуждение для y = p * x, заменяя возведение в степень умножением, а умножение — сложением. Предположите, что результат имеет вид

y = k * u + w.

Если k четно, то k * u (k/2) * (u + u), и т. д.

Сложения нужно делать по модулю n, что не требует, впрочем, операции деления…

Я на своем компьютере получил отличные результаты для теста Ферма. А метод Полларда-Брента еще остается очень медленным. Работайте надежно. Можно ли пользоваться программой, в правильности которой вы не уверены?

Головоломка 17.

Подсказка: эта программа сообщает, делится ли n на b.

Головоломка 18.

Снова подсказка: эта программа выводит НЕТ, если n не является точным квадратом; в противном случае она выводит квадратный корень из n. Но это из области бесполезных подсказок. Как вы сможете показать, что эта программа действительно делает то, что я анонсировал? Испытав ее? Вы можете испытать все целые?

По индукции? Почему бы и нет? Напишите мне, если получится…

Головоломка 19.

Не пренебрегайте крохами информации, которые можно извлечь из текста программы. Вполне правдоподобна гипотеза, что eps — параметр, характеризующий точность, маленький и потому вещественный. Следовательно, p и q, и — вследствие этого — a и b имеют хорошие шансы оказаться вещественными. Примите это как гипотезу, касающуюся типа данных и результата.

Вы не можете исследовать плоскость a, b, чтобы увидеть, что же именно вычисляет эта программа. Но можно сделать несколько простых замечаний. Пусть f(a, b) — значение, вычисляемое программой.

Вы без особых усилий сумеете показать, что

f(a, b) = f(b, a),

f(ac, bc) = cf(a, b)

и вследствие этого

f(a, b) = bf(a/b, 1).

Ho g(x) = f(x, 1) — функция только одного аргумента. Можно ограничиться областью x ? 1. Я написал программу, вычисляющую g (простой и очевидный вариант предыдущей программы), а затем вычислил g для

x = 1, 2, 3, …, 10,

x = 1.1, 1.2, 1.3, …, 1.9.

Природа функции g становится очевидной, если исходить из этой таблицы. Уразумев, что именно нужно доказать, мы справимся с этим без труда.

Оглавление книги


Генерация: 1.319. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз