十進BASICプログラム 6n-1,6n+1 素数の個数を数える
6n-1,6n+1 素数の個数を数える
!6n+k
OPTION ARITHMETIC NATIVE
DECLARE EXTERNAL SUB prime
LET k=3E8
CALL prime(k)
END
EXTERNAL SUB prime(k)
OPTION ARITHMETIC NATIVE
!エラトステネスの篩
LET Fu=17783
LET Fm=2040
DIM P(Fu)
DIM A(Fm)
MAT P=ZER
MAT A=ZER
LET A(1)=2
LET H1=1
FOR I=3 TO SQR(Fu) STEP 2
IF P(I)=0 THEN
FOR J=I*I TO Fu STEP I
LET P(J)=1
NEXT J
END IF
NEXT I
FOR I=3 TO Fu STEP 2
IF P(I)=0 THEN
LET H1=H1+1
LET A(H1)=I
END IF
NEXT I
LET Q=6
LET k5=IP(k/Q)
DIM Au(k5),Av(k5)
MAT Au = ZER !(6*n-1)
MAT Av = ZER !(6*n+1)
FOR P1=3 TO k/6
LET P2=A(P1)
LET P3=A(P1+1)
IF P2^2>k THEN EXIT FOR
LET m= (P2^2-1)/ 6
DO
LET Av(m)=1 !(6*n+1)
LET m=m+p2
IF m>k5 THEN EXIT DO
LOOP
IF MOD(P2*P3+1,6)=0 THEN
LET w= (P2*P3+1)/ 6
ELSE
LET P3=A(P1)
DO
LET P3=P3+1
IF MOD(P2*P3+1,6)=0 THEN EXIT DO
LOOP
LET w= (P2*P3+1)/ 6
! PRINT P2;P3;P2*P3+1
END IF
DO
LET Au(w)=1 !(6*n-1)
LET w=w+p2
IF w>k5 THEN EXIT DO
LOOP
NEXT p1
!PRINT 2
!PRINT 3
LET cc=2
FOR n=1 TO k5
IF Au(n)=0 THEN
LET cc=cc+1
LET L= 6*n-1
!PRINT L !(6*n-1)
END IF
IF Av(n)=0 THEN
LET cc=cc+1
LET R= 6*n+1
!PRINT R !(6*n+1)
END IF
NEXT n
print cc
END SUB
計算結果
16252325 3億までの素数の個数
数学的に
素数の Pn^2 は 6*n-1 例: 5×5=25 4×6=24 24+1=25
素数積の Pn×Pn+1 は 6*n+1 例: 5×7=35 6×6=36 36-1=35
無限ループ