1000以下の数で、解が見つからなかった 163個 について、 ループ回数を増やす、という直接的な方法もあるが、他の手だてを考えてみる。
もともとの式、
g=T(m)T(n)T(m+n)T(m−n)
は互いに素な4つの数の積である。
例えば、素数を小さい方から4つ持ってくると、
g=2×3×5×7=210
となり、最小の4つで既にこの状態なのだから、
大きなm、nについてgが1000以下になるためには、
T(m), T(n), T(m+n), T(m−n) 自体がかなり小さい数でないと成立しない。
そこで、これらの4つの数、m, n, m+n, m−n のうち2つが2乗数である場合を考える。
4つの数のうち2個を2乗数 i2, j2 に割り当てる方法は、以下の6とおり。
No. | m | n | m+n | m-n |
---|---|---|---|---|
1 | i2 | j2 | ||
2 | i2 | j2 | ||
3 | i2 | j2 | ||
4 | i2 | j2 | ||
5 | i2 | j2 | ||
6 | i2 | j2 |
m>nであることに注意すると、
No. | m | n | m+n | m-n |
---|---|---|---|---|
2 | i2 | j2−i2 | j2 | 2i2−j2 |
4 | j2−i2 | i2 | j2 | j2−2i2 |
より、i>jとなるようにi、jを入れ替えると、
No. | m | n | m+n | m-n |
---|---|---|---|---|
2 | j2 | i2−j2 | i2 | 2j2−i2 |
4 | i2−j2 | j2 | i2 | i2−2j2 |
この場合をそれぞれ(4)、(5)とする。
以上まとめると、以下の5とおりについて、調べればよいことがわかる。
No. | m | n | m+n | m-n |
---|---|---|---|---|
(1) | i2 | j2 | i2+j2 | i2-j2 |
(2) | i2 | i2-j2 | 2i2-j2 | j2 |
(3) | i2+j2 | i2 | 2i2+j2 | j2 |
(4) | j2 | i2−j2 | i2 | 2j2−i2 |
(5) | i2−j2 | j2 | i2 | i2−2j2 |
プログラムは以下のようになる。
10 ' congruum : cong_2.ub 20 L%=32767:M%=1000 30 ' i2=i^2, j2=j^2, k2=i2+j2, L2=i2-j2 40 for I%=2 to L%:I2=I%^2 50 for J%=1 to I%-1:if gcd(I%,J%)>1 then 210 else J2=J%^2:K2=I2+J2:L2=I2-J2 60 A=fnSub(K2):if A>M% then F%=1:goto 140 else F%=0 70 ' (3) i2+j2, i2, 2i2+j2, j2 80 G=fnSub(A*(I2+K2)):if G>M% then 100 90 R%=fnPrt(3,K2,I2) 100 ' (1) i2, j2, i2+j2, i2-j2 110 B=fnSub(L2):if B>M% then 210 120 G=fnSub(A*B):if G>M% then 140 130 R%=fnPrt(1,I2,J2) 140 ' (2) i2, i2-j2, 2i2-j2, j2 150 if F%=1 then B=fnSub(L2):if B>M% then 210 160 G=fnSub(B*(I2+L2)):if G>M% then 180 170 R%=fnPrt(2,I2,L2) 180 ' (4) j2, i2-j2, i2, 2j2-i2 (5) i2-j2, j2, i2, i2-2j2 190 C=abs(J2-L2):G=fnSub(B*C):if G>M% then 210 200 R%=fnPrt(4,J2,L2) 210 next J% 220 next I% 230 end 240 ' 250 fnSub(N) 260 local P,S=1 270 P=prmdiv(N):if or{P>M%,P=0} then return(N) 280 N=N\P:if N@P=0 then N=N\P else S=S*P 290 if or{S>M%,N=1} then return(S) else goto 270 300 ' 310 fnPrt(T,M,N) 320 local K,X,Y 330 reduce M,N:if M<N then swap M,N:T=5 340 print "(";cutspc(str(T));"):";G;",";M;",";N;",";I%;",";J%;":"; 350 K=isqrt(M*N*(M+N)*(M-N)\G):X=(M*G)//N:Y=(K*G*G)//(N*N) 360 print num(X);",";num(Y);",";isqrt(den(X)) 370 return(0)
32,767以下のi、jについて調べたところ、新たに以下の 30個 について解が求められた。
47, 61, 79, 134, 166, 183, 206, 213, 247, 262, 309, 335, 437, 447, 469, 471, 511, 526, 559, 589, 591, 655, 678, 687, 719, 821, 871, 894, 902, 942
実行結果は以下のとおり。
解が依然見つかっていないのは、以下の 133個 。
53, 101, 103, 118, 127, 142, 157, 167, 173, 181, 191, 197, 199, 223, 229, 237, 263, 269, 271, 277, 278, 287, 293, 302, 303, 311, 317, 326, 327, 334, 349, 358, 359, 365, 367, 373, 382, 383, 389, 397, 398, 407, 413, 415, 421, 431, 439, 446, 453, 454, 461, 463, 478, 479, 485, 487, 493, 501, 502, 503, 519, 533, 541, 542, 543, 557, 566, 573, 583, 597, 599, 607, 613, 614, 623, 631, 638, 647, 653, 661, 662, 677, 679, 685, 695, 701, 703, 717, 718, 727, 733, 742, 743, 757, 758, 766, 767, 773, 781, 789, 797, 807, 815, 822, 823, 829, 831, 838, 839, 853, 862, 863, 877, 878, 886, 887, 893, 911, 917, 919, 926, 933, 941, 958, 965, 967, 974, 982, 983, 989, 991, 997, 998
前 | この章の目次 | 次 |
---|