Программирование игр и головоломок
Шрифт:
n = а*p + b2;
а — степень двойки,
p четно,
b нечетно, b < а.
Кроме того, мы знаем, что при выходе из цикла p < а.
Если p равно нулю, то n = b2. Тогда мы видим, что n — квадрат числа b, которое выводится, и все закончено.
Но n может оказаться полным квадратом
r2 = ар + b дает
r2– 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 < а последовательно выводим
s2t < 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.