|
> No.4054[元記事へ]
しばっちさんへのお返事です。
ありがとうございます。プログラムを理解するまでは至りません(頭が篩=古い)が、自分なりに分析してみました。
テスト機AMD Athlon 64 3800+ (2.4GHz) Win8.1 32bt
BASIC Acc 計算結果
----------------------------
エラトステネスの奇数& 6n±1 篩
1026167 : 80426
249.841 秒
----------------------------
試割&6n±1 primenumber
1026167 : 80426
252.731000000007 秒
----------------------------
Sieve of Sundaram
1026167 : 80426
251.246999999996 秒
----------------------------
!エラトステネスの奇数& 6n±1 篩
OPTION ARITHMETIC NATIVE
LET t0=TIME
PRINT " 2 : 1"
LET Kmin=1 !99991(9592nd prime) 999983(78498th prime)
LET KMAX=Kmin-1+1.E6+26167 !99999989(5761455th prime)
LET C=1 !Kmin以下の素数の個数
DIM s(Kmin TO KMAX)
MAT s=ZER
FOR n=3 TO KMAX STEP 2
IF N>3 AND MOD(n,3)=0 OR N>5 AND MOD(n,10)=5 THEN GOTO 10
IF n < Kmin THEN GOTO 10
IF s(n)=0 THEN
LET C=C+1
PRINT n;":";c
END IF
10 FOR k=n^2 TO KMAX STEP n
IF K < Kmin THEN GOTO 20
LET s(k)=1
20 NEXT k
NEXT n
PRINT TIME-t0;"秒"
END
----------------------------------
!試割&6n±1 primenumber
OPTION ARITHMETIC NATIVE
LET t0=TIME
LET KMAX=169
DIM SOSU(KMAX)
LET SOSU(1)=3
LET SOSU(2)=5
LET SOSU(3)=7
LET NUM=4
LET K=3
FOR I=1 TO KMAX-1
FOR J=SOSU(I)^2+2 TO SOSU(I+1)^2-2 STEP 2
IF MOD(J,3)=0 OR MOD(J,10)=5 THEN GOTO 10
FOR P=3 TO I
IF MOD(J,SOSU(P))=0 THEN GOTO 10
NEXT p
LET NUM=NUM+1
PRINT J;":";NUM
IF K<KMAX THEN
LET K=K+1
LET SOSU(K)=J
END IF
10 NEXT j
NEXT i
PRINT TIME-t0;"秒"
END
----------------------------------
!Sieve of Sundaram
OPTION ARITHMETIC NATIVE
LET t0=TIME
LET L=513084 !計算結果は2倍の数値になります。
LET C=1
DIM P(L)
LET b=1
LET k=0.7
FOR a=3 TO INT(L*k) STEP 2
LET f=f+1
FOR N=1 TO f STEP 1
LET z=a*n+b
IF Z>L THEN GOTO 100
LET P(z)=1
NEXT n
100 LET b=b+1
NEXT a
FOR i=1 TO L-1
IF P(i)=0 THEN
LET z=I*2+1
LET c=c+1
PRINT z;":";c
END IF
NEXT i
PRINT TIME-t0;"秒"
END
-------------------------------------
!エラトステネスの奇数& 6n±1 篩 は1億以上での動作も確認しました。
!エラトステネスの奇数& 6n±1 篩
OPTION ARITHMETIC NATIVE
LET t0=TIME
!PRINT " 2 : 1"
LET Kmin=1.E9 !99991(9592nd prime) 999983(78498th prime)
LET KMAX=Kmin+1.E6 !99999989(5761455th prime) 999999937(50847534th prime)
LET C=50847534 !Kmin以下の素数の個数
DIM s(Kmin TO KMAX)
MAT s=ZER
FOR n=3 TO KMAX STEP 2
IF N>3 AND MOD(n,3)=0 OR N>5 AND MOD(n,10)=5 THEN GOTO 10
IF n < Kmin THEN GOTO 10
IF s(n)=0 THEN
LET C=C+1
PRINT n;":";c
END IF
10 FOR k=n^2 TO KMAX STEP n
IF K < Kmin THEN GOTO 20
LET s(k)=1
20 NEXT k
NEXT n
PRINT TIME-t0;"秒"
END
-------------------------------------
1000999949 : 50895689
276.904999999999 秒
素数階乗 #3996
重宝しています。重ねてお礼申し上げます。
http://blogs.yahoo.co.jp/donald_stinger
|
|