1.brute force method による解

brute force method による探査

まずは感触をつかむために、1000以下の x, y の組について n = (x2-1)/y2, (x2+1)/y2 を計算し、
n が 100以下の自然数、かつ 2乗因子を含まないケースを探す。
任意の n について解を持つことが保証されている(参考文献)。

x2 - ny2 = -1 の解がわかれば、+1 の場合の解を構成することができる。
左辺を実数の範囲で因数分解すると、

(x - sqrt(n)y)(x + sqrt(n)y) = -1

両辺を 2乗すると、

(x - sqrt(n)y)2(x + sqrt(n)y)2 = 1

ここで、

(x - sqrt(n)y)2 = x2 + ny2 - 2xy * sqrt(n)
(x + sqrt(n)y)2 = x2 + ny2 + 2xy * sqrt(n)

なので、

X = x2 + ny2
Y = 2xy

とおくと、

1 = (x - sqrt(n)y)2(x + sqrt(n)y)2
  = {(x2 + ny2) - 2xy * sqrt(n)}{(x2 + ny2) + 2xy * sqrt(n)}
  = (X - Ysqrt(n))(X + Ysqrt(n))
  = X2 - (Ysqrt(n))2
  = X2 - nY2

となり、確かに +1 の場合の解となっている。
よって探査は、1か - 1のどちらかの解が見つかった時点で終了してよい。

プログラム

nについての解が見つかったかどうかを判定するために、配列 M%(100) をとり、
0で初期化、解が見つかったら 1をセットする。
x, y を for 〜 next で 1 から 1000 ぐらいまでまわして、

n = (x2 +1) / y2 が整数であり、かつ 100 以下の場合
n = (x2 -1) / y2 が整数であり、かつ 100 以下の場合

に、n, x, y, x2 - ny2 を print し、M%(n) = 1とする。
プログラムは以下のとおり。

 10   ' pell1
 20   dim M%(100)
 30   for I%=2 to 100
 40     if moeb(I%)=0 then M%(I%)=1 else M%(I%)=0
 50   next I%
 60   '
 70   for X%=1 to 1000:X2=X%^2
 80     for Y%=1 to 1000:Y2=Y%^2
 90       if (X2+1)@Y2=0 then W=(X2+1)\Y2 else 120
100       if or{W<1,W>=100} then 120
110       if M%(W)=0 then print W;X%;Y%;X2-W*Y2:M%(W)=1
120       if (X2-1)@Y2=0 then W=(X2-1)\Y2 else 150
130       if or{W<1,W>=100} then 150
140       if M%(W)=0 then print W;X%;Y%;X2-W*Y2:M%(W)=1
150     next Y%
160   next X%
170   '
180   for I%=2 to 100
190     if M%(I%)=0 then print I%;
200   next I%

40行の moeb(I%) は、メビウス関数といい、I% が2乗因子を持つとき0を返す。
1000×1000 回のループが終わったら、180〜200行で、解が得られなかった nの値を返す。
実行結果は以下のとおり。

実行結果

nxyx2 - ny2
211-1
3211
521-1
6521
7831
1031-1
111031
13185-1
141541
15411
1741-1
19170391
2155121
22197421
232451
2651-1
297013-1
301121
332341
343561
35611
3761-1
383761
392541
41325-1
421321
474871
515071
5318225-1
5589121
57151201
589913-1
59530691
626381
6581-1
666581
70251301
74435-1
77351401
785361
798091
8291-1
838291
8537841-1
872831
8950053-1
953941

見つからなかったのは、

31, 43, 46, 61, 67, 69, 71, 73, 86, 91, 93, 94, 97

の13個。


次に、見つからなかった n について x, y の値を大きくして探してみる。
とりあえず 10000 ぐらいまでとする。n は毎回入力するようにする。
上の解からわかるように x と y では y の方が小さいので、y でループを回した方が、回数が少なくてすむ。
x2 = ny2 ±1 のルートを取り、整数値となる場合を探す。
プログラムは以下のとおり。

10   ' pell2
20   input N:if moeb(N)=0 then 20
30   '
40   for Y=2 to 10000:Y2=Y^2
50     W=N*Y2-1:X=isqrt(W):if res=0 then print N;X;Y;W-N*Y2:end
60     W=N*Y2+1:X=isqrt(W):if res=0 then print N;X;Y;W-N*Y2:end
70   next Y

実行結果は以下のとおり。

nxyx2 - ny2
3115202731
4334825311
462433535881
61297183805-1
674884259671
6977759361
7134804131
731068125-1
861040511221
9115741651
931215112601
975604569-1


残るは n=94 の場合だけである。
上記のプログラムで、yの上限値を 10^9 ぐらいにしておく。
実行すると、割と簡単にケリがつく。

94 : 2143295 , 221064 : 1

221064回のループの後に、解が見つかった。
これで 100以下の解についてはすべて求められた。


この章の目次

E-mail : kc2h-msm@asahi-net.or.jp
三島 久典