Написал программу на GO, в которой реализовал этот алгоритм:
В случае
![$n \equiv 2 \pmod{8}$ $n \equiv 2 \pmod{8}$](https://dxdy-04.korotkov.co.uk/f/7/2/b/72befc835f3853c7ded9b47ddafe57b982.png)
мне удалось найти решения для всех
![$n < 50$ $n < 50$](https://dxdy-02.korotkov.co.uk/f/5/e/8/5e8b62ded2971d387c108d5d7fb78d5082.png)
. Для
![$n = 50$ $n = 50$](https://dxdy-03.korotkov.co.uk/f/2/1/4/2145b14df7ead085734846dfed1e9ead82.png)
получается уравнение
![$$ x^2 - (2500s^2-1)y^2 = - 2s^3$$ $$ x^2 - (2500s^2-1)y^2 = - 2s^3$$](https://dxdy-04.korotkov.co.uk/f/3/c/d/3cd68f949f552d5557dd2dbdf0166dd382.png)
При этом,
![$s \equiv 1 \pmod{4}$ $s \equiv 1 \pmod{4}$](https://dxdy-03.korotkov.co.uk/f/a/1/7/a17bf12ce6be4d3e122ebe7e95f83f3e82.png)
,
![$s \equiv 0 \pmod{3}$ $s \equiv 0 \pmod{3}$](https://dxdy-02.korotkov.co.uk/f/d/5/c/d5c22df5e43c6f92469d8d47e2d3e3d082.png)
или
![$s \equiv 1 \pmod{3}$ $s \equiv 1 \pmod{3}$](https://dxdy-02.korotkov.co.uk/f/d/2/3/d233b2fc71b9339aef4fba436e425c0c82.png)
,
![$y \equiv 1 \pmod{2}$ $y \equiv 1 \pmod{2}$](https://dxdy-03.korotkov.co.uk/f/e/e/9/ee972092d0f326769265fd8ece95380982.png)
,
![$y < \frac{s}{7}$ $y < \frac{s}{7}$](https://dxdy-03.korotkov.co.uk/f/e/f/9/ef934bdf8649a0e6565f4b71f910dfd982.png)
. Для
![$s \le 50000$ $s \le 50000$](https://dxdy-03.korotkov.co.uk/f/e/6/4/e64c5cffc787bddbc243ffc845b1e4f682.png)
решений нет.
Код:
Код:
package main
import (
"fmt"
"math/big"
)
func main() {
var s int64
var y int64
var mul int64
var limit int64 = 100000
var n int64
is_find := 0
fmt.Scanln(&n)
for s = 1; s < limit; s += 4 {
if is_find == 1 {
break
}
if s%5000 == 1 {
fmt.Println(s)
}
if (s%9 == 3) || (s%9 == 6) {
continue
}
if (s%7 == 0) && (s%49 != 0) {
continue
}
if s%3 == 0 {
mul = 27
} else {
mul = 1
}
for y = 1; y < s/6; y += 2 * mul {
sBig := big.NewInt(s)
yBig := big.NewInt(y)
v1 := big.NewInt(s)
v1.Mul(v1, sBig)
v1.Mul(v1, big.NewInt(n*n))
v1.Sub(v1, big.NewInt(1))
v1.Mul(v1, yBig)
v1.Mul(v1, yBig)
v2 := big.NewInt(s)
v2.Mul(v2, sBig)
v2.Mul(v2, sBig)
v2.Mul(v2, big.NewInt(2))
v1.Sub(v1, v2)
if v1.Cmp(big.NewInt(0)) == -1 {
continue
}
v2.Sqrt(v1)
v2.Mul(v2, v2)
if v1.Cmp(v2) == 0 {
fmt.Println(s, y)
is_find = 1
break
}
}
}
}
Программа работает нестабильно. Например, при вводе 42 она иногда печатает строку с решением "1765 27", а иногда почему-то не печатает. Как сделать так, чтобы строка с решением всегда печаталась?