|
> No.4262[元記事へ]
たろささんへのお返事です。
DECLARE EXTERNAL FUNCTION cprime
OPTION ARITHMETIC NATIVE !2進モード
LET t0=TIME
LET k6=1E8
DATA 14143,17321,20011,22367,24499,26459,28289,30011,31627,33179
DATA 34649,36061,37423,38729,40009,41231,42433,43591,44729,45827
DATA 46919,47963,48989,50021,50993,51971,52919,53857,54773,55681
DATA 56569,57457,58309,59167,60013,60859,61651,62459,63247,64033
DATA 64811,65579,66337,67103,67829,68567,69313,70001,70717,71419
DATA 72139,72817,73517,74161,74843,75503,76157,76819,77471,78121
DATA 78779,79379,80021,80627,81281,81853,82463,83071,83689,84263
DATA 84857,85447,86027,86627,87179,87751,88321,88883,89443,90001
DATA 90583,91121,91673,92203,92737,93281,93809,94343,94873,95393
DATA 95917,96443,96953,97499,97987,98491,98999,99523,100003,100501
DIM Ba(100)
MAT READ Ba
DATA 1664,1991,2263,2503,2718,2907,3081,3246,3402,3555
DATA 3700,3830,3962,4082,4204,4317,4436,4541,4649,4747
DATA 4847,4943,5034,5134,5222,5316,5400,5486,5572,5651
DATA 5737,5824,5903,5983,6058,6132,6203,6270,6338,6417
DATA 6478,6549,6614,6685,6757,6818,6881,6936,7005,7074
DATA 7141,7199,7258,7316,7380,7436,7497,7552,7609,7671
DATA 7725,7779,7838,7889,7953,8004,8059,8113,8167,8215
DATA 8266,8317,8365,8422,8465,8523,8564,8611,8661,8714
DATA 8768,8810,8860,8904,8959,9010,9051,9099,9148,9195
DATA 9244,9287,9331,9375,9418,9459,9505,9548,9593,9633
DIM Bb(100)
MAT READ Bb
DATA 1177,1922,2497,2979,3400,3778,4122,4441,4741,5022
DATA 5289,5544,5788,6023,6247,6466,6676,6880,7078,7272
DATA 7458,7643,7823,7995,8169,8336,8502,8663,8823,8978
DATA 9132,9281,9431,9576,9718,9857,10001,10138,10276,10410
DATA 10542,10672,10802,10927,11056,11180,11300,11427,11547,11667
DATA 11781,11900,12014,12134,12246,12360,12473,12582,12691,12799
DATA 12914,13021,13124,13232,13337,13438,13552,13642,13741,13848
DATA 13944,14043,14142,14237,14338,14434,14530,14625,14720,14814
DATA 14903,14998,15089,15183,15276,15365,15456,15545,15634,15724
DATA 15812,15916,15986,16068,16158,16244,16329,16411,16411,16499
DIM Bc(100)
MAT READ Bc
LET c1=5761455
PRINT " 1";":";c1
FOR n=1 TO 100
LET k=Ba(n) !SQR(1E8)
LET k2=Bb(n) !π(x)
LET S=Bc(n)
LET k6=k6+1E8
LET C=cprime(k,k2,k6,S)
LET c1=c1+c
PRINT n+1;":";c1;":";c
NEXT n
LET TM=TIME-t0
PRINT USING"####." & REPEAT$("#",2):TM;
PRINT "秒"
END
EXTERNAL FUNCTION cprime (k,k2,k6,S)
OPTION ARITHMETIC NATIVE
LET k4=k6-1E8
LET U=IP(k6/6)+1
LET W=IP(k4/6)-1
DIM x(w TO u)
DIM y(w TO u)
!エラトステネスの篩
DIM P(k)
DIM A(k2) !素数
LET h1=1
LET A(h1)=2
LET h1=2
FOR n1=3 TO k STEP 2
IF P(n1)=0 THEN
LET A(h1)=n1
LET h1=h1+1
IF h1>k+1 THEN GOTO 20
END IF
FOR k1=n1 TO k STEP 2
LET m1=n1*k1
IF m1>k THEN GOTO 10
LET P(m1)=1
NEXT k1
10 NEXT n1
20
FOR n=3 TO k2
LET P6=A(n)
IF MOD(P6+1,6)=0 THEN !(6*n-1)
LET r=(P6+1)/6
FOR i=S TO u
IF P6*i+r>u THEN EXIT FOR
IF P6*i+r<w THEN GOTO 30
LET x(P6*i+r)=1
30 NEXT i
END IF
IF MOD(P6-1,6)=0 THEN
LET r=(P6-1)/6
FOR i=S TO u
IF P6*i-r>u THEN EXIT FOR
IF P6*i-r<w THEN GOTO 40
LET x(P6*i-r)=1
40 NEXT i
END IF
IF MOD(P6+1,6)=0 THEN !(6*n+1)
LET r=(P6+1)/6
FOR i=S TO u
IF P6*i-r>u THEN EXIT FOR
IF P6*i-r<w THEN GOTO 50
LET y(P6*i-r)=1
50 NEXT i
END IF
IF MOD(P6-1,6)=0 THEN
LET r=(P6-1)/6
FOR i=S TO u
IF P6*i+r>u THEN EXIT FOR
IF P6*i+r<w THEN GOTO 60
LET y(P6*i+r)=1
60 NEXT i
END IF
NEXT n
FOR n=w TO u
IF x(n)=1 THEN
GOTO 100
ELSE
IF k6-1E8>n*6-1 OR k6<n*6-1 THEN GOTO 100
LET cc=cc+1
END IF
100 IF y(n)=1 THEN
GOTO 200
ELSE
IF k6-1E8>n*6+1 OR k6<n*6+1 THEN GOTO 200
LET cc=cc+1
END IF
200 NEXT n
LET cprime=cc
END FUNCTION
-----------------------------------------
10億までは高速です。
-----------------------------------------
6n±1篩を途中から計算するプログラムです。
10億までは、しばっち様の
Re: エラトステネスの篩
#4101
プログラムとBASIC Accの計算結果ならいい勝負です。
素数リスト作成プログラムは、下記の方が速い。
1000億までの素数リスト作成
Re: Sieve of Sundaram サンダラムの篩(ふるい)
6n±1篩を途中から計算する方法
教えてください。
http://blogs.yahoo.co.jp/donald_stinger
|
|