Если N
(квадрат) равно p^2
, а n+N=r^2
, вы можете написать
n + p^2 = r^2
n = r^2 - p^2
n = (r - p) * (r + p)
Если мы представим n
как произведение пары делителей:
n = a * b // let a<=b
a * b = (r - p) * (r + p)
У нас есть система
r - p = a
r + p = b
и
p = (b - a) / 2
Когда p
самый маленький? В случае максимально близких факторов b
и a
. Итак, мы можем попытаться вычислить делители, начиная с квадрата root из n
. Также обратите внимание, что a
и b
должны иметь одинаковую четность (чтобы сделать p
целое число)
Псевдокод:
int N = -1;
for (int a = Math.Ceiling(Math.Sqrt(n)) - 1; a > 0; a--) {
if (n % a == 0) {
int bma = n / a - a;
if (bma % 2 == 0) {
int p = bma / 2;
int N = p * p;
break;
}
}
}
Примеры:
n = 16
first divisor below sqrt(16) a = 2, b=8
p = 3, 16 + 9 = 25
n = 13
first divisor below sqrt(13) a = 1, b=13
p = 6, 13 + 36 = 49
n = 72
first divisor below sqrt(72) is a = 8, b= 9 - but distinct parity!
so the next suitable pair is a = 6, b = 12
p = 3, 72 + 9 = 81