Программирование игр и головоломок
Шрифт:
22q+1 < n < 22q+2,
то единственное значение a, удовлетворяющее условию a2 > n/2, есть a = 2q+1, и для этого значения имеем a2 > n, что гарантирует остановку. Поскольку r = a– b, то а = r + b > r
Во втором случае
r = 2a– b и b < а, откуда а < 2a– b = r.
Таким образом, все три распознаваемые программой случая являются единственными возможными исходами программы, и каждый из них может произойти.
Таким образом, перед нами — очень забавный алгоритм, который дает значение квадратного корня, и который определяет случай, когда n не является корнем, но в этом случае не дает никакой дополнительной информации.
Программа заведомо останавливается при а = 2q+1, так что число шагов цикла не больше q– 1 (начиная с 4), причем q — логарифм квадратного корня из n по основанию 2. Таким образом, получилась программа порядка In n, что дает ту же сложность, что и обычный алгоритм, действующий кусками по две цифры. Но для этого последнего алгоритма нужен еще первый цикл, чтобы найти порядок величины n.
Головоломка 19.
Соотношение f(a, b) = f(b, a) следует из самой инициализации p и q:
p := max (a, b); q := min (a, b).
Эти две функции симметричны по a и b, и поэтому точно так же симметрична f. При анализе программы мы ограничены действиями, происходящими внутри цикла. Величины r и s являются вспомогательными переменными, которые не оставляют никакой проблемы. Трудность вызывают преобразования, проделываемые над p и q. Чтобы ясно увидеть эту трудность, осуществим введение новых переменных без разрушения старых. Перепишем наш цикл:
ПОКА q >= eps ВЫПОЛНЯТЬ
r := (q/p)2; s := r/(r + 4)
p' := (2 * s + 1) * p; q' := s * q
p := p'; q := q'
ВЕРНУТЬСЯ
Рассмотрим действия этой программы, производимые над данными a, b с одной стороны и над ac, bc с другой.
Когда мы входим в цикл, то и p, и q умножаются на с при переходе от первого вычисления ко второму.
Это не меняет величины r и, следовательно, не меняет величины s. Таким образом, p и q
Выполнение программы для вычисления g(x) = f(x, 1) с x = 1 и eps = 10– 5 дает мне результат, равный 1.4142.
Дальше считать бесполезно, это 2.
Я немедленно изменяю программу, чтобы она выполняла вывод не только величины g, но также и g2. Я получаю:
x g2(x)
1 2
2 5
3 10
4 17
Нет возможности сомневаться: g(х) = х2 + 1.
Перенося эту формулу в соотношение между f и g, мы видим, проделав все вычисления, что
f (a, b) = a2 + b2.
«Осталось только» доказать это. Мы не можем доверять заверениям программистов, утверждающих, что их программа делает то-то и то-то. При входе в цикл p и q имеют значения а и b в каком-то порядке, поэтому
p2 + q2 = a2 + b2.
Что происходит с величиной p2 + q2 после изменений, которым p и q подвергаются в цикле? Вычислим p'2 + q'2:
p'2 + q'2 = (2s + 1)2p2 + s2q2 = s2 (4р2 + q2) + 4sp + р2.
Вычислим s:
r := q2/p2, s = r/(r + 4) = q2(q2 + 4p2),
откуда, наконец,
s (4р2 + q2) = q2.