ある数が合同数か否かを判定する方法が、いくつか『数論における未解決問題集』で紹介されている。
以下の場合は合同数となる。
以下の場合は合同数とならない。
J. B. Tunnell は、任意の数に対する判定条件を与えた。
出典
J. B. Tunnell, "A Classical Diophantine Problem and Modular Forms of Weight 3/2", Inventiones mathematicae, 72(1983)323-334
志賀弘典、『楕円曲線の水系』、数理科学、No.390, Dec. 1995
奇数自然数nが合同数であるためには、次の条件が満たされることが必要十分:
「x2+2y2+8z2=n の整数解の個数」
=「x2+2y2+32z2=n の整数解の個数」×2
偶数については、
「x2+4y2+8z2=n/2 の整数解の個数」
=「x2+4y2+32z2=n/2 の整数解の個数」×2
(注:『整数解』なので、負の場合も解となる。)
10 ' set cong : s_cong.ub 20 word 4:N%=10000:dim T(N%),S(N%):T(1)="□":S(1)=T(1):D%=0 30 for I%=2 to N% 40 if moeb(I%)=0 then T(I%)="□" else T(I%)="" 50 S(I%)=T(I%) 60 next I% 70 ' N3, C5, C7 80 for I%=2 to N% 90 if and{prmdiv(I%)=I%,I%@8=3} then T(I%)="N3" 100 if and{prmdiv(I%)=I%,I%@8=5} then T(I%)="C5" 110 if and{prmdiv(I%)=I%,I%@8=7} then T(I%)="C7" 120 next I% 130 ' C6 140 for I%=6 to N% step 8:J%=I%\2:if prmdiv(J%)<J% then 160 150 if T(I%)="" then T(I%)="C6" 160 next I% 170 ' NX 180 for I%=5 to N%\2 step 8:if prmdiv(I%)<I% then 200 190 if T(I%*2)="" then T(I%*2)="NX" 200 next I% 210 ' N9 220 for I%=3 to N% step 8:if prmdiv(I%)<I% then 270 230 for J%=I% to N% step 8:if prmdiv(J%)<J% then 260 240 if I%*J%>N% then cancel for:goto 270 250 if T(I%*J%)="" then T(I%*J%)="N9" 260 next J% 270 next I% 280 ' NL 290 for I%=5 to N% step 8:if prmdiv(I%)<I% then 340 300 for J%=I% to N% step 8:if prmdiv(J%)<J% then 330 310 if 2*I%*J%>N% then cancel for:goto 340 320 if T(2*I%*J%)="" then T(2*I%*J%)="NL" 330 next J% 340 next I% 350 ' N2 360 for I%=9 to N%\2 step 16:if prmdiv(I%)<I% then 390 370 if 2*I%>N% then cancel for:goto 410 380 if T(I%*2)="" then T(I%*2)="N2" 390 next I% 400 ' general criteria 410 for I%=2 to N%:if moeb(I%)=0 then 510 420 if T(I%)="" then T(I%)=" " 430 if even(I%) then 490 440 ' odd case 450 A%=fnSub(I%,2,8):B%=fnSub(I%,2,32) 460 if A%=(B%*2) then S(I%)="C" else S(I%)="N" 470 goto 510 480 ' even case 490 A%=fnSub(I%\2,4,8):B%=fnSub(I%\2,4,32) 500 if A%=(B%*2) then S(I%)="C" else S(I%)="N" 510 next I% 520 ' 530 for I%=2 to N%-2:print I%;": ";T(I%);":";S(I%) 540 next I%:print "count=";D% 550 end 560 ' 570 fnSub(N%,P%,Q%) 580 local X%,Y%,Z%,A%,B%,C%,D% 590 D%=0:C%=isqrt(N%/Q%) 600 for Z%=C% to -C% step -1 610 B%=isqrt((N%-Q%*Z%^2)/P%) 620 for Y%=B% to -B% step -1 630 A%=N%-Q%*Z%^2-P%*Y%^2:if A%<0 then 660 640 X%=isqrt(A%):if res>0 then 660 650 inc D%:if X%>0 then inc D%:' print N%;":";X;Y%;Z% 660 next Y% 670 next Z% 680 return(D%)
このプログラムを実行させると、1000以下の合同数は確かに361個となる。
また 10000以下の合同数は 3503個 であることがわかる。
前 | この章の目次 | 次 |
---|