Наконец, a
, начиная с 4, умножается на 2 при каждом прохождении цикла; b начинается с 1, которое меньше соответствующего начального а = 4.Тогда при переходе от a
, b, p к a', b', p' либоb
' = b, а' = 2*а, так что если b < а, то и b' < а';либо
b
' = а + b, а' = 2*а, что также сохраняет справедливость отношения а' < b'.Следовательно, вот ситуация, которую цикл оставляет инвариантной:
n
= а*p + b2;а
— степень двойки,p
четно,b
нечетно, b < а.Кроме того, мы знаем, что при выходе из цикла p
< а.Если p
равно нулю, то n = b2. Тогда мы видим, что n — квадрат числа b, которое выводится, и все закончено.Но n
может оказаться полным квадратом и тогда, когда p не нуль. Попробуем рассмотреть все возможные случаи. Положим n = r2 (r нечетно). Соотношениеr
2 = ар + b даетr
2 − b2 = ар.Положим r
+ b = 2u, r − b = 2v (r и b нечетны). Отсюда получаем 4uv = ар.Поскольку r
= u + v, где r нечетно, получаем, что u и v не могут быть числами одинаковой четности, так что одно из них четно, а другое нечетно. Так как а является степенью двойки, то нечетный сомножитель относится к p. Выявим его, полагая р = s2t, где s нечетно, a t ≥ 1 (p четно).Напомним, что а
= 2k. В этих обозначениях 4uv = ар = s2k+t, uv = s2k+t−2.Возможные решения для пары u
, v имеют вид парs
'2k+t-2, s''где s
's" = s.Покажем сначала, что s
" — меньший из этих двух элементов пары. Вследствие t ≥ 1 имеем k − t ≤ k + t − 2.Вследствие p
< а последовательно выводимs
2t < 2k,s
's"2t < 2k.s
's" < 2k-t ≤ 2k+t-2 ≤ s'22k+t-2(потому что s
' нечетен и не меньше 1).Следовательно, нужно взять u
= s'2k+t-2, v = s".Покажем теперь, что нужно обязательно взять s
' =1, s" = s. По выбору u и vb
= 2k+t−2s' − s" < а = 2k.Отсюда получаем:
s
" > 2k+t−2s' − 2k,и, так как t
≥ 1:s" > 2k
−1s' − 2k,s
= s's" > 2k−1s'2 − 2ks = 2k−1s' (s' − 2).Вследствие р
= s2t < а = 2k выводим s < 2k−t ≤ 2k−1.Объединим два полученных неравенства:
2k
−1s' (s' − 2) < x < 2k−1, поэтому s' (s' − 2) < 1.Единственное нечетное число s
', удовлетворяющее этому соотношению, это s' = 1. Следовательно, у нас остается единственная возможность:u
= 2k+t-2, v = s,b
= u − v = 2k+t-2 − s < а = 2k,s > 2k
+t-2 − 2k.Так как s
< 2k−t, то t должно быть таким, чтобы2k
−t > 2k+t-2 − 2k.Поскольку t
должно быть строго положительно, то его единственными возможными значениями являются t = 1 и t = 2.При t
= 1 имеемp
= 2s, b = 2k−t − s = a/2 − p/2.Следовательно, если 2b
= а − p, то n — квадрат числа (а + p)/2 = а − b.При t
= 2 имеемp
= 4s, b = 2k − s = a − p/4.Следовательно, если p
= 4(a − b), то n — квадрат числа a + p/4 = 2а − b.Этим исчерпываются случаи, когда n
может быть полным квадратом.Можно спросить себя, могут ли эти различные случаи действительно осуществляться. Заметим, что при вступлении в цикл у нас b
= 1, a = 4. После этого b может быть изменено добавлением а, т. е. кратным числа 4. Следовательно, b остается сравнимым с 1 по модулю 4. В трех возможных случаях:p
= 0, r = b,p
= а − 2b, r = a − b,p
= 4 (a − b), r = 2a − b,первый случай — единственный, в котором квадратный корень из n
сравним с 1 по модулю 4; два других дают квадратный корень, сравнимый с 3 по модулю 4. При выходе из цикла равенствоb
= ар + b2с учетом соотношений p
< a, b < a дает n < 2a2 и, следовательно, при выходе из цикла a2 > n/2. Равенствоар
= n − b2дает p
= (n − b2)/a < n/а.Если окажется, что n
/а < a, то непременно p < а и цикл закончен. Чтобы цикл остановился, необходимо, чтобы a2 > n/2, и цикл заведомо останавливается, если a3 > n.Следовательно, все зависит от положения n
по отношению к степеням двойки. Существует такое целое n, что4q
< n < 4q+1.Возможны два случая. Во-первых, может выполняться неравенство
4q
= 22q < n < 22q+1,и тогда для k
= q число a2 = 22q > n/2 может быть значением остановки, но в этом нет уверенности. С другой стороны, если22q
+1 < n < 22q+2,то единственное значение a
, удовлетворяющее условию a2 > n/2, есть a = 2q+1, и для этого значения имеем a2 > n, что гарантирует остановку. Поскольку r = a − b, то а = r + b > r и, следовательно, a2 > n.Во втором случае
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).