Вот решение с использованием формулы Евклида ( ссылка ).
Давайте сделаем немного математики:
В общем, каждое решение будет иметь вид
a=k(x²-y²)
b=2kxy
c=k(x²+y²)
где k, x и y - положительные целые числа, y
Теперь a + b + c = kx²-ky² + 2kxy + kx² + ky² = 2kx² + 2kxy = 2kx (x + y) = 1000
Разделите на 2: kx (x + y) = 500
Теперь мы установили s = x + y: kxs = 500
Теперь мы ищем решения с kxs = 500, где k, x и s - целые числа, а x < s < 2x
.
Поскольку все они делят 500, они могут принимать только значения 1, 2, 4, 5, 10, 20, 25, 50, 100, 125, 250, 500. Некоторые псевдокоды делают это для произвольного n (это и может быть легко сделать вручную для n = 1000)
If n is odd
return "no solution"
else
L = List of divisors of n/2
for x in L
for s in L
if x< s <2*x and n/2 is divisible by x*s
y=s-x
k=((n/2)/x)/s
add (k*(x*x-y*y),2*k*x*y,k*(x*x+y*y)) to list of solutions
sort the triples in the list of solutions
delete solutions appearing twice
return list of solutions
Вы все еще можете улучшить это:
- x никогда не будет больше корня n / 2
- цикл для s может начинаться с x и останавливаться после прохождения 2x (если список упорядочен)
Для n = 1000 программа должна проверить шесть значений для x и, в зависимости от деталей реализации, до одного значения для y. Это прекратится до того, как вы отпустите кнопку.