エラトステネスのふるい(6n+k)

 投稿者:しばっち  投稿日:2021年11月 3日(水)18時07分6秒
  エラトステネスのふるい(6n+k)

LET N=5
FOR I=1 TO 10
   LET E=I*10^N
   LET PE=PRIMECOUNT(E)
   PRINT S+1;"~";E;":";PE-PS;PE
   LET S=E
   LET PS=PE
NEXT I
END

EXTERNAL  FUNCTION PRIMECOUNT(N)
DIM A(2),P(N)
MAT READ A
! 2・3を特別扱い
DATA 1,5
FOR I=0 TO INT(SQR(N)/6) ! ループ SQR(N)*2/6=SQR(N)/3
   FOR J=1 TO 2
      IF I=0 AND J=1 THEN LET J=2
      LET K=6*I+A(J)
      IF N<K THEN EXIT FOR
      IF P(K)=0 THEN
         FOR L=K*K TO N STEP K*2
            LET P(L)=1
         NEXT L
      END IF
   NEXT J
NEXT I
LET COUNT=2 ! 2 3
FOR I=0 TO INT(N/6)
   FOR J=1 TO 2
      IF I=0 AND J=1 THEN LET J=2
      LET K=6*I+A(J)
      IF N<K THEN EXIT FOR
      IF P(K)=0 THEN LET COUNT=COUNT+1
   NEXT J
NEXT I
LET PRIMECOUNT=COUNT
END FUNCTION


https://en.wikipedia.org/wiki/Wheel_factorization


2n+k         1/2    2を特別扱い
6n+k         2/6=1/3    2,3を特別扱い
30n+k        8/30=1/3.75    2,3,5を特別扱い
210n+k       48/210=1/4.375    2,3,5,7を特別扱い
2310n+k      480/2310=1/4.8125    2,3,5,7,11を特別扱い
30030n+k     5760/30030=1/5.21354166666667    2,3,5,7,11,13を特別扱い
510510n+k    92160/510510=1/5.53938802083333    2,3,5,7,11,13,17を特別扱い
9699690n+k   1658880/9699690=1/5.84713179976852    2,3,5,7,11,13,17,19を特別扱い
223092870n+k 36495336/223092870=1/6.112914537901501    2,3,5,7,11,13,17,19,23を特別扱い


素数階乗(素数積)以外では
60n+k(1,7,11,13,17,19,23,29,31,37,41,43,47,49,53,59) の16個となり16/60=1/3.75
つまり30n+kと計算量は同じになります

10n+k(1,3,7,9) 4/10=1/2.5
100n+k(1,3,7,9,11,13,17,19,21,23,27,29,31,33,37,39,41,43,47,49,51,53,57,59,61,63,67,69,71,73,77,79,81,83,87,89,91,93,97,99) の40個係数が必要で
40/100=1/2.5となり 6n+k(1,5) 2/6=1/3 6n+kよりも計算量が多くなります。

6n+k(1,5),6n+k(5,7),6n+k(-1,1),6n+k(-5,-1)でも計算可能です(nの範囲が異なります)


   係数の求め方

30n+kでn=0,1,2,...とした時、30n+kが素数になるkを求めます。

30n+1 : 31,61,151...素数
30n+2 : 2で割れる
30n+3 : 3で割れる
30n+5 : 5で割れる
30n+7 : 7,37,67...素数
30n+9 : 3で割れる
30n+11: 11,41,71...素数
30n+13: 13,43,73...素数
30n+15: 15で割れる
30n+17: 17,47,107...素数
30n+19: 19,79,109...素数
30n+21: 3で割れる
30n+23: 23,53,73...素数
30n+25: 5で割れる
30n+27: 3で割れる
30n+29: 29,59,89...素数

よって
30n+k(1,7,11,13,17,19,23,29)となります
30n+k(7,11,13,17,19,23,29,31)でも計算できます
 

戻る