投稿者:たろさ
投稿日:2016年12月22日(木)05時53分9秒
|
|
|
!6n±1篩
!A046954 Numbers n such that 6n+1 is nonprime. http://oeis.org/A046954
OPTION ARITHMETIC NATIVE !2進モード
LET t0=TIME
LET k=1E4
LET k2=1229
DIM P(k)
DIM A(k2) !素数
SUB prime(v) !エラトステネスの奇数列篩
LET k9=v
LET h1=1
LET A(h1)=2
LET h1=2
FOR n1=3 TO k9 STEP 2
IF P(n1)=0 THEN
LET A(h1)=n1
LET h1=h1+1
IF h1>k9+1 THEN GOTO 20
END IF
FOR k1=n1 TO k9 STEP 2
LET m1=n1*k1
IF m1>k9 THEN GOTO 10
LET P(m1)=1
NEXT k1
10 NEXT n1
20
END SUB
CALL prime(k)
LET k6=1E7 !篩の計算範囲
DIM A6(k6),A7(k6)
MAT A6 = ZER !(6*n-1)
FOR n=1 TO k2-2
LET P6=n+2
IF MOD(A(P6)+1,6)=0 THEN
LET r6=(A(P6)+1)/6
FOR i=1 TO k6
IF A(P6)*i+r6>k6/6 THEN EXIT FOR
LET A6(A(P6)*i+r6)=1
NEXT i
END IF
IF MOD(A(P6)-1,6)=0 THEN
LET r6=(A(P6)-1)/6
FOR i=1 TO k6
IF A(P6)*i-r6>k6/6 THEN EXIT FOR
LET A6(A(P6)*i-r6)=1
NEXT i
END IF
NEXT n
FOR n=1 TO k6/6
IF A6(n)=1 THEN GOTO 100
LET A7(6*n-1)=1
100 NEXT n
MAT A6 = ZER !(6*n+1)
FOR n=1 TO k2-2
LET P6=n+2
IF MOD(A(P6)+1,6)=0 THEN
LET r6=(A(P6)+1)/6
FOR i=1 TO k6
IF A(P6)*i-r6>k6/6 THEN EXIT FOR
LET A6(A(P6)*i-r6)=1
NEXT i
END IF
IF MOD(A(P6)-1,6)=0 THEN
LET r6=(A(P6)-1)/6
FOR i=1 TO k6
IF A(P6)*i+r6>k6/6 THEN EXIT FOR
LET A6(A(P6)*i+r6)=1
NEXT i
END IF
NEXT n
FOR n=1 TO k6/6
IF A6(n)=1 THEN GOTO 200
LET A7(6*n+1)=1
200 NEXT n
OPEN #1: TextWindow1
ERASE #1
PRINT #1:2;3
FOR n=1 TO k6
IF A7(n)=1 THEN
LET c1=c1+1
PRINT #1:STR$(n)&",";
END IF
NEXT n
PRINT c1+2
LET TM=TIME-t0
PRINT USING"####." & REPEAT$("#",2):TM;
PRINT "秒"
END
------------------------------------------
数値分析用プログラム
!6, 11, 13, 16, 20, 21, 24, 26, 27, 31, 34, 35, 36, 37, 41, 46, 48, 50
OPTION ARITHMETIC NATIVE !2進モード
LET k=2012
LET k2=305
DIM P(k)
DIM A(k2) !素数
SUB prime(v) !エラトステネスの奇数列篩
LET k9=v
LET h1=1
LET A(h1)=2
LET h1=2
FOR n1=3 TO k9 STEP 2
IF P(n1)=0 THEN
LET A(h1)=n1
LET h1=h1+1
IF h1>k9+1 THEN GOTO 20
END IF
FOR k1=n1 TO k9 STEP 2
LET m1=n1*k1
IF m1>k9 THEN GOTO 10
LET P(m1)=1
NEXT k1
10 NEXT n1
20
END SUB
CALL prime(k)
LET k6=1E4
DIM A6(k6)
FOR n=1 TO k2-2
LET P6=n+2
IF MOD(A(P6)+1,6)=0 THEN
LET r6=(A(P6)+1)/6
FOR i=1 TO k6
IF A(P6)*i+r6>k6 THEN EXIT FOR
LET A6(A(P6)*i+r6)=1
NEXT i
END IF
IF MOD(A(P6)-1,6)=0 THEN
LET r6=(A(P6)-1)/6
FOR i=1 TO k6
IF A(P6)*i-r6>k6 THEN EXIT FOR
LET A6(A(P6)*i-r6)=1
NEXT i
END IF
NEXT n
FOR n=1 TO k6
LET m=6*n-1
IF ISPRIME(m)=0 THEN PRINT TAB(6);n;
IF A6(n)=1 THEN PRINT n!;
NEXT n
END
EXTERNAL FUNCTION ISPRIME(N)
OPTION ARITHMETIC NATIVE
IF N=2 OR N=3 OR N=5 OR N=7 OR N=11 OR N=13 OR N=17 THEN
LET ISPRIME=1
EXIT FUNCTION
END IF
IF N=1 OR MOD(N,2)=0 THEN
LET ISPRIME=0
EXIT FUNCTION
END IF
LET D=(N-1)/2
LET S=0
DO WHILE MOD(D, 2)=0
LET D=INT(D/2)
LET S=S+1
LOOP
FOR I=1 TO 7
LET ISP=0
READ A !' n < 341550071728321 なら a=2,3,5,7,11,13,17
DATA 2,3,5,7,11,13,17
LET ISP=0
LET R=POWMOD(A,D,N)
IF R=1 OR R=N-1 THEN
LET ISP=1
END IF
LET R=POWMOD(R,2,N)
FOR J=0 TO S-1
IF R=N-1 THEN
LET ISP=1
END IF
LET R=POWMOD(R,2,N)
NEXT J
IF ISP=0 THEN
LET ISPRIME=0
EXIT FUNCTION
END IF
NEXT I
LET ISPRIME=1
END FUNCTION
EXTERNAL FUNCTION POWMOD(B,P,M)
OPTION ARITHMETIC NATIVE
LET RESULT=1
DO WHILE P>0
IF MOD(P,2)=1 THEN
LET RESULT=MOD(RESULT*B,M)
END IF
LET B=MOD(B*B,M)
LET P=INT(P/2)
LOOP
LET POWMOD=RESULT
END FUNCTION
------------------------------------------
数値分析用プログラム
!4, 8, 9, 14, 15, 19, 20, 22, 24, 28, 29, 31, 34, 36, 39, 41, 42, 43, 44, 48, 49, 50
OPTION ARITHMETIC NATIVE !2進モード
LET k=2012
LET k2=305
DIM P(k)
DIM A(k2) !素数
SUB prime(v) !エラトステネスの奇数列篩
LET k9=v
LET h1=1
LET A(h1)=2
LET h1=2
FOR n1=3 TO k9 STEP 2
IF P(n1)=0 THEN
LET A(h1)=n1
LET h1=h1+1
IF h1>k9+1 THEN GOTO 20
END IF
FOR k1=n1 TO k9 STEP 2
LET m1=n1*k1
IF m1>k9 THEN GOTO 10
LET P(m1)=1
NEXT k1
10 NEXT n1
20
END SUB
CALL prime(k)
LET k6=1E4
DIM A6(k6)
FOR n=1 TO k2-2
LET P6=n+2
IF MOD(A(P6)+1,6)=0 THEN
LET r6=(A(P6)+1)/6
FOR i=1 TO k6
IF A(P6)*i-r6>k6 THEN EXIT FOR
LET A6(A(P6)*i-r6)=1
NEXT i
END IF
IF MOD(A(P6)-1,6)=0 THEN
LET r6=(A(P6)-1)/6
FOR i=1 TO k6
IF A(P6)*i+r6>k6 THEN EXIT FOR
LET A6(A(P6)*i+r6)=1
NEXT i
END IF
NEXT n
FOR n=1 TO k6
LET m=6*n+1
IF ISPRIME(m)=0 THEN PRINT TAB(6);n;
IF A6(n)=1 THEN PRINT n!;
NEXT n
END
EXTERNAL FUNCTION ISPRIME(N)
OPTION ARITHMETIC NATIVE
IF N=2 OR N=3 OR N=5 OR N=7 OR N=11 OR N=13 OR N=17 THEN
LET ISPRIME=1
EXIT FUNCTION
END IF
IF N=1 OR MOD(N,2)=0 THEN
LET ISPRIME=0
EXIT FUNCTION
END IF
LET D=(N-1)/2
LET S=0
DO WHILE MOD(D, 2)=0
LET D=INT(D/2)
LET S=S+1
LOOP
FOR I=1 TO 7
LET ISP=0
READ A !' n < 341550071728321 なら a=2,3,5,7,11,13,17
DATA 2,3,5,7,11,13,17
LET ISP=0
LET R=POWMOD(A,D,N)
IF R=1 OR R=N-1 THEN
LET ISP=1
END IF
LET R=POWMOD(R,2,N)
FOR J=0 TO S-1
IF R=N-1 THEN
LET ISP=1
END IF
LET R=POWMOD(R,2,N)
NEXT J
IF ISP=0 THEN
LET ISPRIME=0
EXIT FUNCTION
END IF
NEXT I
LET ISPRIME=1
END FUNCTION
EXTERNAL FUNCTION POWMOD(B,P,M)
OPTION ARITHMETIC NATIVE
LET RESULT=1
DO WHILE P>0
IF MOD(P,2)=1 THEN
LET RESULT=MOD(RESULT*B,M)
END IF
LET B=MOD(B*B,M)
LET P=INT(P/2)
LOOP
LET POWMOD=RESULT
END FUNCTION
http://blogs.yahoo.co.jp/donald_stinger
|
|
|
投稿者:たろさ
投稿日:2017年 2月11日(土)23時23分20秒
|
|
|
> No.4207[元記事へ]
たろささんへのお返事です。
> !6n±1篩
!6n±1篩 1億までの素数をカウント
OPTION ARITHMETIC NATIVE !2進モード
LET t0=TIME
LET k=1E4 !SQR(1E8)
LET k2=1229
DIM P(k)
DIM A(k2) !素数
SUB prime(v) !エラトステネスの奇数列篩
LET k9=v
LET h1=1
LET A(h1)=2
LET h1=2
FOR n1=3 TO k9 STEP 2
IF P(n1)=0 THEN
LET A(h1)=n1
LET h1=h1+1
IF h1>k9+1 THEN EXIT SUB
END IF
FOR k1=n1 TO k9 STEP 2
LET m1=n1*k1
IF m1>k9 THEN EXIT FOR
LET P(m1)=1
NEXT k1
NEXT n1
END SUB
CALL prime(k)
LET k6=1E8 !篩の計算範囲
LET k5=IP(k6/6)+1
DIM A6(k5),A7(k5)
MAT A6 = ZER !(6*n-1)
FOR n=3 TO k2
LET P6=A(n)
IF MOD(P6+1,6)=0 THEN
LET r6=(P6+1)/6
FOR i=1 TO k5
IF P6*i+r6>k5 THEN EXIT FOR
LET A6(P6*i+r6)=1
NEXT i
END IF
IF MOD(P6-1,6)=0 THEN
LET r6=(P6-1)/6
FOR i=1 TO k5
IF P6*i-r6>k5 THEN EXIT FOR
LET A6(P6*i-r6)=1
NEXT i
END IF
NEXT n
MAT A7 = ZER !(6*n+1)
FOR n=3 TO k2
LET P6=A(n)
IF MOD(P6+1,6)=0 THEN
LET r6=(P6+1)/6
FOR i=1 TO k5
IF P6*i-r6>k5 THEN EXIT FOR
LET A7(P6*i-r6)=1
NEXT i
END IF
IF MOD(P6-1,6)=0 THEN
LET r6=(P6-1)/6
FOR i=1 TO k5
IF P6*i+r6>k5 THEN EXIT FOR
LET A7(P6*i+r6)=1
NEXT i
END IF
NEXT n
FOR n=1 TO k5
IF A6(n)=1 THEN GOTO 100
LET c1=c1+1
100 IF A7(n)=1 THEN GOTO 200
LET c1=c1+1
200 NEXT n
PRINT c1+2
LET TM=TIME-t0
PRINT USING"####." & REPEAT$("#",2):TM;
PRINT "秒"
END
-----------------------------------------
素数Counter 1億π(x)5761455
AMD 10進BASIC 28.01秒
AMD BASIC Acc 8.49秒
Intel i7 4.5GHz 1.67秒
-----------------------------------------
■ パソコン環境
ウィンドウズ : Microsoft Windows 8.1
システムの種類 : 32 ビット
プロセッサー : AMD Athlon(tm) 64 Processor 3800+
周波数 : 2.40 GHz
メモリー : 3.00 GB
-----------------------------------------
■ パソコン環境
ウィンドウズ : Microsoft Windows 7
システムの種類 : 32 ビット
メモリー : 3.00 GB
プロセッサー :Intel Core i7 4790K
-----------------------------------------
http://blogs.yahoo.co.jp/donald_stinger
|
|
|
投稿者:たろさ
投稿日:2017年 2月11日(土)23時32分23秒
|
|
|
> 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
|
|
|
投稿者:しばっち
投稿日:2017年 2月12日(日)14時33分32秒
|
|
|
> No.4263[元記事へ]
たろささんへのお返事です。
6n±1篩というのがどういうものかよくわかりませんが
たろささんのエラトステネスの篩はムダな処理が多いようです
LET T=TIME
LET k=1e+8
LET K2=1E+7
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 PRINT TIME-T
PRINT H1
MAT P=ZER
MAT A=ZER
LET T=TIME
LET H1=1
LET A(H1)=2
LET H1=2
FOR I=3 TO K STEP 2
IF P(I)=0 THEN
LET A(H1)=I
LET H1=H1+1
FOR J=I*I TO K STEP I
LET P(J)=1
NEXT J
END IF
NEXT I
PRINT TIME-T
PRINT H1
MAT P=ZER
MAT A=ZER
LET T=TIME
LET H1=1
LET A(H1)=2
LET H1=2
FOR I=3 TO SQR(K) STEP 2
IF P(I)=0 THEN
FOR J=I*I TO K STEP I
LET P(J)=1
NEXT J
END IF
NEXT I
FOR I=3 TO K STEP 2
IF P(I)=0 THEN
LET A(H1)=I
LET H1=H1+1
END IF
NEXT I
PRINT TIME-T
PRINT H1
END
|
|
|
投稿者:たろさ
投稿日:2017年 2月12日(日)19時01分51秒
|
|
|
しばっちさんへのお返事です。
お世話になります。エラトステネスの篩を組み込みました。6m±1篩を探究しています。
!6n±1篩 1億までの素数をカウント
OPTION ARITHMETIC NATIVE !2進モード
LET t0=TIME
LET k=1E4 !SQR(1E8)
LET k2=1229
DIM P(k)
DIM A(k2) !素数
SUB prime(k) !エラトステネスの篩
MAT P=ZER
MAT A=ZER
LET H1=1
LET A(H1)=2
LET H1=2
FOR I=3 TO SQR(K) STEP 2
IF P(I)=0 THEN
FOR J=I*I TO K STEP I
LET P(J)=1
NEXT J
END IF
NEXT I
FOR I=3 TO K STEP 2
IF P(I)=0 THEN
LET A(H1)=I
LET H1=H1+1
END IF
NEXT I
END SUB
CALL prime(k)
LET k6=1E8 !篩の計算範囲
LET k5=IP(k6/6)+1
DIM A6(k5),A7(k5)
MAT A6 = ZER !(6*n-1)
FOR n=3 TO k2
LET P6=A(n)
IF MOD(P6+1,6)=0 THEN
LET r6=(P6+1)/6
FOR i=1 TO k5
IF P6*i+r6>k5 THEN EXIT FOR
LET A6(P6*i+r6)=1
NEXT i
END IF
IF MOD(P6-1,6)=0 THEN
LET r6=(P6-1)/6
FOR i=1 TO k5
IF P6*i-r6>k5 THEN EXIT FOR
LET A6(P6*i-r6)=1
NEXT i
END IF
NEXT n
MAT A7 = ZER !(6*n+1)
FOR n=3 TO k2
LET P6=A(n)
IF MOD(P6+1,6)=0 THEN
LET r6=(P6+1)/6
FOR i=1 TO k5
IF P6*i-r6>k5 THEN EXIT FOR
LET A7(P6*i-r6)=1
NEXT i
END IF
IF MOD(P6-1,6)=0 THEN
LET r6=(P6-1)/6
FOR i=1 TO k5
IF P6*i+r6>k5 THEN EXIT FOR
LET A7(P6*i+r6)=1
NEXT i
END IF
NEXT n
FOR n=1 TO k5
IF A6(n)=1 THEN GOTO 100
LET c1=c1+1
100 IF A7(n)=1 THEN GOTO 200
LET c1=c1+1
200 NEXT n
PRINT c1+2
LET TM=TIME-t0
PRINT USING"####." & REPEAT$("#",2):TM;
PRINT "秒"
END
-------------------------------------------------
6n±1篩は、サンダラムの篩の出力部 2n+1 の例に倣って
6n±1 のnを篩っています。
EXTERNAL FUNCTION PrimeQ(n)のネットのダウンロードサイトlink切れです。
5+6n = 6n-1 , 7+6n = 6n+1 とても効率的な方法です。
DECLARE EXTERNAL FUNCTION count
DECLARE EXTERNAL FUNCTION PrimeQ
FOR n=1 TO 100
LET S=n*100-100
IF S=0 THEN LET S=1
LET T=n*100
PRINT S;"TO";T
PRINT count(S,T);"個"
PRINT
NEXT n
END
EXTERNAL FUNCTION count(S,T)
DIM A(S TO T)
MAT A=ZER
FOR n=S TO T
LET v=n+1
IF MOD(v,6)=0 AND PrimeQ(n)=1 THEN
LET C=C+1
LET A(n)=1
PRINT c;":";n
END IF
NEXT n
PRINT
LET count=C
END FUNCTION
EXTERNAL FUNCTION PrimeQ(n) !素数判定 1:素数、0:素数でない
LET PrimeQ=0
IF n<2 OR n<>INT(n) THEN EXIT FUNCTION !引数を確認する
!2以上の自然数なら
IF MOD(n,2)=0 THEN !2の倍数
IF n=2 THEN LET PrimeQ=1 !2は素数
ELSEIF MOD(n,3)=0 THEN !3の倍数
IF n=3 THEN LET PrimeQ=1 !3は素数
ELSE
LET k=5
DO WHILE k*k<=n !√nまで検証する
IF MOD(n,k)=0 THEN !5,11,17,23,29,…
EXIT FUNCTION
ELSEIF MOD(n,k+2)=0 THEN !7,13,19,25,31,…
EXIT FUNCTION
END IF !+1,+3,+5は2の倍数(偶数)、+1,+4は3の倍数、+5は5の倍数
LET k=k+6
LOOP
LET PrimeQ=1 !最後まで割り切れなければ、素数である
END IF
END FUNCTION
配列の再定義の方法については、外部関数定義だけの知識です。
配列を共有する方法があったらと思います。
http://blogs.yahoo.co.jp/donald_stinger
|
|
|
投稿者:たろさ
投稿日:2017年 2月13日(月)01時40分48秒
|
|
|
> No.4262[元記事へ]
たろささんへのお返事です。
1億では変わらずなので3億までの素数をカウントしました。
BASIC Acc 専用です。
------------------------------------------------
!6n±1篩 3億までの素数をカウント
OPTION ARITHMETIC NATIVE !2進モード
LET t0=TIME
LET k=17321 !SQR(3E8)
LET k2=1991
DIM P(k)
DIM A(k2) !素数
SUB prime(k) !エラトステネスの篩
MAT P=ZER
MAT A=ZER
LET H1=1
LET A(H1)=2
LET H1=2
FOR I=3 TO SQR(K) STEP 2
IF P(I)=0 THEN
FOR J=I*I TO K STEP I
LET P(J)=1
NEXT J
END IF
NEXT I
FOR I=3 TO K STEP 2
IF P(I)=0 THEN
LET A(H1)=I
LET H1=H1+1
END IF
NEXT I
END SUB
CALL prime(k)
LET k6=3E8 !篩の計算範囲
LET B6=IP(k6/30)+1
LET k5=IP(k6/6)+1
DIM A6(k5),A7(k5)
MAT A6 = ZER !(6*n-1)
MAT A7 = ZER !(6*n+1)
FOR n=3 TO k2
LET P6=A(n)
IF MOD(P6+1,6)=0 THEN
LET r6=(P6+1)/6
CALL nap(P6,r6)
CALL napi(P6,r6*(-1))
END IF
IF MOD(P6-1,6)=0 THEN
LET r6=(P6-1)/6
CALL nap(P6,r6*(-1))
CALL napi(P6,r6)
END IF
NEXT n
SUB nap(z,r6)
FOR i=1 TO B6
IF z*i+r6>k5 THEN EXIT SUB
LET A6(z*i+r6)=1
NEXT i
END SUB
SUB napi(z,r6)
FOR i=1 TO B6
IF z*i+r6>k5 THEN EXIT SUB
LET A7(z*i+r6)=1
NEXT i
END SUB
LET C1=2
FOR n=1 TO k5
IF A6(n)=1 THEN GOTO 100
LET c1=c1+1
IF c1>=16252325 THEN PRINT n*6-1
100 IF A7(n)=1 THEN GOTO 200
LET c1=c1+1
IF c1>=16252325 THEN PRINT n*6+1
200 NEXT n
PRINT c1
LET TM=TIME-t0
PRINT USING"####." & REPEAT$("#",2):TM;
PRINT "秒"
END
------------------------------------------------
計算結果
299999977
300000007
16252326 一つ余計に出ました。ので念のため素数も出力しました。
素数Counter 3億π(x)299999977(16252325th prime)
Intel i7 4.5GHz 5.02秒
-----------------------------------------
■ パソコン環境
ウィンドウズ : Microsoft Windows 7
システムの種類 : 32 ビット
メモリー : 3.00 GB
プロセッサー :Intel Core i7 4790K
-----------------------------------------
!6n±1篩 6億までの素数をカウント
OPTION ARITHMETIC NATIVE !2進モード
LET t0=TIME
LET k=24499 !SQR(3E8)
LET k2=2718
DIM P(k)
DIM A(k2) !素数
SUB prime(k) !エラトステネスの篩
MAT P=ZER
MAT A=ZER
LET H1=1
LET A(H1)=2
LET H1=2
FOR I=3 TO SQR(K) STEP 2
IF P(I)=0 THEN
FOR J=I*I TO K STEP I
LET P(J)=1
NEXT J
END IF
NEXT I
FOR I=3 TO K STEP 2
IF P(I)=0 THEN
LET A(H1)=I
LET H1=H1+1
END IF
NEXT I
END SUB
CALL prime(k)
LET k6=6E8 !篩の計算範囲
LET B6=IP(k6/30)+1
LET k5=IP(k6/6)+1
DIM A6(k5),A7(k5)
MAT A6 = ZER !(6*n-1)
MAT A7 = ZER !(6*n+1)
FOR n=3 TO k2
LET P6=A(n)
IF MOD(P6+1,6)=0 THEN
LET r6=(P6+1)/6
CALL nap(P6,r6)
CALL napi(P6,r6*(-1))
END IF
IF MOD(P6-1,6)=0 THEN
LET r6=(P6-1)/6
CALL nap(P6,r6*(-1))
CALL napi(P6,r6)
END IF
NEXT n
SUB nap(z,r6)
FOR i=1 TO B6
IF z*i+r6>k5 THEN EXIT SUB
LET A6(z*i+r6)=1
NEXT i
END SUB
SUB napi(z,r6)
FOR i=1 TO B6
IF z*i+r6>k5 THEN EXIT SUB
LET A7(z*i+r6)=1
NEXT i
END SUB
LET C1=2
FOR n=1 TO k5
IF A6(n)=1 THEN GOTO 100
LET c1=c1+1
IF c1>=31324703 THEN PRINT n*6-1
100 IF A7(n)=1 THEN GOTO 200
LET c1=c1+1
IF c1>=31324703 THEN PRINT n*6+1
200 NEXT n
PRINT c1
LET TM=TIME-t0
PRINT USING"####." & REPEAT$("#",2):TM;
PRINT "秒"
END
------------------------------------------
計算結果
599999971
600000001
600000007
31324705
10.22秒
http://blogs.yahoo.co.jp/donald_stinger
|
|
|
投稿者:たろさ
投稿日:2017年 2月16日(木)00時07分5秒
|
|
|
> No.4207[元記事へ]
仮称6n±1篩
プログラムの目的
6n-1,6n+1は、確率的素数です。素数に成らないnを篩、素数を生成します。
nの篩方は、私が偶然発見したものです。わたしは、一般化されたものを知りません。
6n-1, 合成数の数列
6, 11, 13, 16, 20, 21, 24, 26, 27, 31, 34, 35, 36, 37, 41, 46, 48, 50
6n+1, 合成数の数列
4, 8, 9, 14, 15, 19, 20, 22, 24, 28, 29, 31, 34, 36, 39, 41, 42, 43, 44, 48, 49, 50
上記の数列を生成したついでに、6n±1篩として素数生成プログラムを書いてきました。
上記の数列を生成時、エラトステネスの篩を使用して配列に素数を登録しています。
エラトステネスの篩は、しばっち様に教えて頂いたプログラムを実装しています。
Re: 6n±1篩 #4264
プログラム(6n±1篩)を書き始めてから一月が過ぎました。毎日プログラムを眺めているわけではないのですが、
LET S=6
DO WHILE S<IP(1E8/6)
LET S=S+5
LET C=C+1
LOOP
PRINT S;":";c
PRINT IP(1E8/6)/5
END
私の能力レベルでは、これは、ひらめき
BASIC Acc の配列上限の限界克服法は、サンダラムの篩と同じ方法です。
上記二点の変更で、飛躍的に処理速度が向上しました。
計算時間 BASIC Acc を使用
1億~100億
AMD 2.40 GHz 1005.68(16分45.68秒)
1億~1000億
AMD 2.40 GHz 10533.047(2時間55分33.047秒)10533/999=10.54
i7@4.5GHz 1912.56(31分52.56秒)1913/999=1.9149
1億~1兆
i7@4.5GHz 20411.903 (5時間40分12秒)
Intel Core i7 4790K(Win7 Pro 32bt)
AMD Athlon(tm) 64 Processor 3800+ (Win 8.1 32bt)
i7@4.5GHzの場合サンダラムの篩の約4倍速い。
-------------------------------------------------
DECLARE EXTERNAL FUNCTION cprime
DECLARE EXTERNAL SUB sqprime
OPTION ARITHMETIC NATIVE !2進モード
LET t0=TIME
LET k6=1E8
CALL sqprime(k6)
LET SA=2 !MIN 2 (1億to)
LET SB=1000 !MAX 10200 (1兆200億)
LET ki=SB
DIM Ba(ki)
OPEN #1:NAME "prime_n.txt",ACCESS INPUT
FOR i=1 TO ki
INPUT #1: BA(i)
NEXT i
CLOSE #1
DIM Bb(ki)
OPEN #2:NAME "prime_pi.txt",ACCESS INPUT
FOR i=1 TO ki
INPUT #2: BB(i)
NEXT i
CLOSE #2
!LET c1=4118054813 !1E11 (1000億)
!LET c1=450708777 !1E10 (100億)
!LET c1=50847534 !1E9 (10億)
LET c1=5761455 !1E8 (1億)
LET k6=SA*1E8-1E8
FOR n=SA TO SB
LET k=Ba(n) !SQR(1E8)
LET k2=Bb(n) !π(x)
LET k6=k6+1E8
LET C=cprime(k,k2,k6)
LET c1=c1+c
PRINT n;":";c1;":";c
NEXT n
LET TM=TIME-t0
PRINT USING"######." & REPEAT$("#",2):TM;
PRINT "秒"
END
EXTERNAL FUNCTION cprime (k,k2,k6)
OPTION ARITHMETIC NATIVE
!エラトステネスの篩
DIM P(k)
DIM A(k2) !素数
SUB prime(k)
MAT P=ZER
MAT A=ZER
LET H1=1
LET A(H1)=2
LET H1=2
FOR I=3 TO SQR(K) STEP 2
IF P(I)=0 THEN
FOR J=I*I TO K STEP I
LET P(J)=1
NEXT J
END IF
NEXT I
FOR I=3 TO K STEP 2
IF P(I)=0 THEN
LET A(H1)=I
LET H1=H1+1
END IF
NEXT I
END SUB
CALL prime(k)
LET k4=k6-1E8
LET B6=IP(k6/30)+1
LET U=IP(k6/6)+1 !k5=u
LET W=IP(k4/6)-1 !k3=w
LET M7=W-2
DIM x(W-M7 TO U-M7)
DIM y(W-M7 TO U-M7)
MAT x = ZER !(6*n-1)
MAT y = ZER !(6*n+1)
FOR n=3 TO k2
LET P6=A(n)
LET G1=IP(W/P6)-2
IF MOD(P6+1,6)=0 THEN !(6*n-1)
LET r6=(P6+1)/6
CALL nap(P6,G1,r6)
END IF
IF MOD(P6-1,6)=0 THEN
LET r6=(P6-1)/6
CALL nap(P6,G1,r6*(-1))
END IF
IF MOD(P6+1,6)=0 THEN !(6*n+1)
LET r6=(P6+1)/6
CALL napi(P6,G1,r6*(-1))
END IF
IF MOD(P6-1,6)=0 THEN
LET r6=(P6-1)/6
CALL napi(P6,G1,r6)
END IF
NEXT n
SUB nap(z,t1,r6) !(6*n-1)
FOR i=t1 TO B6
IF z*i+r6<W THEN GOTO 50
IF z*i+r6>U THEN EXIT SUB
LET x(z*i+r6-M7)=1
50 NEXT i
END SUB
SUB napi(z,t1,r6) !(6*n+1)
FOR i=t1 TO B6
IF z*i+r6<W THEN GOTO 60
IF z*i+r6>U THEN EXIT SUB
LET y(z*i+r6-M7)=1
60 NEXT i
END SUB
LET Cc=0
FOR n=W-M7 TO U-M7
LET ST=n+M7
IF x(n)=1 THEN GOTO 100
IF 6*ST-1>k4 AND 6*ST-1<k6 THEN
LET cc=cc+1
IF 1=cc THEN PRINT 6*ST-1;" :";cc;" 6*n-1"
END IF
100 IF y(n)=1 THEN GOTO 200
IF 6*ST+1>k4 AND 6*ST+1<k6 THEN
LET cc=cc+1
IF 1=cc THEN PRINT 6*ST+1;" :";cc;" 6*n+1"
END IF
200 NEXT n
LET cprime=cc
END FUNCTION
EXTERNAL SUB sqprime(x)
OPTION ARITHMETIC NATIVE
!エラトステネスの篩
LET k=1009997
DIM P(k)
DIM A(79251) !素数
MAT P=ZER
MAT A=ZER
LET H1=1
LET A(H1)=2
LET H1=2
FOR I=3 TO SQR(K) STEP 2
IF P(I)=0 THEN
FOR J=I*I TO K STEP I
LET P(J)=1
NEXT J
END IF
NEXT I
FOR I=3 TO K STEP 2
IF P(I)=0 THEN
LET A(H1)=I
LET H1=H1+1
END IF
NEXT I
OPEN #1:NAME "prime_n.txt",RECTYPE INTERNAL
ERASE #1
OPEN #2:NAME "prime_pi.txt",RECTYPE INTERNAL
ERASE #2
LET x1=SQR(x)
FOR i=1229 TO 79251
LET v=A(i)
IF x1=<v THEN
LET c=c+1
LET x=x+1E8
LET x1=SQR(x)
WRITE #1:v
WRITE #2:i
!PRINT c;":";v;":";i
END IF
NEXT i
CLOSE #1
CLOSE #2
END SUB
-------------------------------------
いつも分かりにくい。プログラム解説
基本的に1億間の素数をカウントします。
LET SA=2 !MIN 2 (1億to) 最小値
LET SB=1000 !MAX 10200 (1兆200億) 最大値
-------------------------------
LET k6=1E8
CALL sqprime(k6)まだ、未完成です。SQR(x)よりも余分に出ます。
1009997(79251) 1億単位の素数と個数リストを生成します。
6n±1篩のnを篩う素数は素数^2よりも少ない自然数になる?
5から100までの素数23個で、6n±1の合成数列1733まで篩えます。
1733*6-1=10397
SQR(10000)の範囲は暫定です。この6n±1篩の数値法則の検証目的でもあります。確認は1兆まで
現状でのプログラムは、手探り状態です。このSQR(10000)の範囲で重複する、6n±1の合成数列は約4倍見当でした。
ここの重複部分をどのようにするか? 今後の課題です。別の方法もある?
sqprime(k6)はリストを生成しますので、数値以下の場合は、何度も実行する必要なし。
1E14は、1E7^2なので、15桁の限界が100兆から1000兆の辺りにありますが、未確認です。
1000兆は、素数リスト生成可能領域なので、わたしの今後の課題です。
BASIC Accが2進モードで60桁になったらいいなー。
☆その他の手動入力
!LET c1=4118054813 !1E11 (1000億)
!LET c1=450708777 !1E10 (100億)
!LET c1=50847534 !1E9 (10億)
LET c1=5761455 !1E8 (1億)
プログラムを訂正しました。
100兆からの素数Counter 6n±1篩 BASIC Acc
計算結果
100000007 : 1 6*n-1 ☆ 1億から開始して最初の素数
2 : 11078937 : 5317482 ☆ 2億未満までの素数をカウント
200000033 : 1 6*n-1
3 : 16252325 : 5173388
300000007 : 1 6*n+1
プログラムに出力部を書く足せば素数リストも出力できます。精度は未確認です。
素数の個数は1兆まで確認しました。
最初のプログラム
6n±1篩 投稿者:たろさ 投稿日:2016年12月22日(木)05時53分9秒
#4207
http://blogs.yahoo.co.jp/donald_stinger
|
|
|
投稿者:たろさ
投稿日:2017年 2月19日(日)20時00分39秒
|
|
|
> No.4273[元記事へ]
追記 プログラムを修正しました。
1億~100億
AMD 2.40 GHz 998.74(16分38.74秒)BASIC Accを使用
990.81秒(16分30.81秒)BASICAcc0981 (win32 Lazarus + fpc 3.0.0)
精度確認中です。 現在10兆まで精度確認済
100000 : 346065536839 : 3339819
346065536839 !1E13 (10兆)
計算時間:2日と11時間0分39秒
-------------------------------------------
1 : 5761455 : 0
20000 : 73301896139 : 3531519
2000000000000 : 73301896139
11時間23分11秒 (Intel Core i7 4790K@4.5GHz)
-------------------------------------------
今回は、15桁までテストしました。
9999989E+8 TO 10000000E+8(1E+15)
9999989 : 0 : 0
9999990 : 2894210 : 2894210
9999991 : 5789728 : 2895518
9999992 : 8685927 : 2896199
9999993 : 11579320 : 2893393
9999994 : 14475753 : 2896433
9999995 : 17369832 : 2894079
9999996 : 20266976 : 2897144
9999997 : 23161706 : 2894730
9999998 : 26058360 : 2896654
9999999 : 28952608 : 2894248
10000000 : 31848339 : 2895731
AMD 2.40 GHz 229.88秒(3分49.88秒)旧プログラム
BASICAcc0981 (win32 Lazarus + fpc 2.6.4)176.88秒 (2分56.88秒)
BASICAcc0981 (win32 Lazarus + fpc 3.0.0)155.10秒 (2分35.1秒)
---------------------------------------------------------------
精度確認は、しばっち様のプログラムで確かめました。
エラトステネスの篩
ERATOS2_DLL(4スレッドで実行)68.47秒 (Intel Core i7 4790K@4.5GHz)
#4101
エラトステネスの篩 eratos_dll
#3985
#3986
#3987
-------------------------------------------------
!6n±1篩 prime number Counting !Ver.2.13
!素数計数関数(英: Prime-counting function)π(x)
DECLARE EXTERNAL FUNCTION cprime
DECLARE EXTERNAL SUB sqprime
OPTION ARITHMETIC NATIVE
!PRINT DATE$;"/"; TIME$
LET t0=TIME
LET k=31622809
LET k2=1951961
!エラトステネスの篩
LET Fu=5639
DIM P(Fu)
DIM A(740) !素数
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
DIM GT(k2)
LET Q=6
LET k7=k !篩の計算範囲
LET k5=IP(k7/Q)+1
DIM Au(k5),Av(k5)
MAT Au = ZER !(6*n-1)
MAT Av = ZER !(6*n+1)
FOR n=3 TO 740
LET Pu=A(n)
IF MOD(Pu+1,Q)=0 THEN !(6*n-1)
LET ru=(Pu+1)/Q
FOR i=1 TO k5
IF Pu*i+ru>k5 THEN EXIT FOR
LET Au(Pu*i+ru)=1
NEXT i
END IF
IF MOD(Pu-1,Q)=0 THEN
LET ru=(Pu-1)/Q
FOR i=1 TO k5
IF Pu*i-ru>k5 THEN EXIT FOR
LET Au(Pu*i-ru)=1
NEXT i
END IF
IF MOD(Pu+1,Q)=0 THEN !(6*n+1)
LET ru=(Pu+1)/Q
FOR i=1 TO k5
IF Pu*i-ru>k5 THEN EXIT FOR
LET Av(Pu*i-ru)=1
NEXT i
END IF
IF MOD(Pu-1,Q)=0 THEN
LET ru=(Pu-1)/Q
FOR i=1 TO k5
IF Pu*i+ru>k5 THEN EXIT FOR
LET Av(Pu*i+ru)=1
NEXT i
END IF
NEXT n
LET GT(1)=2
LET GT(2)=3
LET cz=2
FOR n=1 TO k5
IF 6*n-1>k7 THEN GOTO 100
IF Au(n)=0 THEN
LET cz=cz+1
LET GT(cz)=6*n-1
END IF
100 IF 6*n+1>k7 THEN EXIT FOR
IF Av(n)=0 THEN
LET cz=cz+1
LET GT(cz)=6*n+1
END IF
NEXT n
LET SA=2 !11092 ,634831,190331, 70141,26451,754901,250000, 9999990,4000001,MIN 2 (1億to)
LET SB=100 !11093 ,634840,190340, 70150,26461,754910,250010,10000000,4100000,MAX 1E15-1
CALL sqprime(SA,SB,k2,GT)
DIM Ba(SA TO SB)
DIM Bb(SA TO SB)
OPEN #1:NAME "prime_n1.txt",ACCESS INPUT
OPEN #2:NAME "prime_pi1.txt",ACCESS INPUT
FOR i=SA TO SB
INPUT #1: BA(i)
INPUT #2: BB(i)
NEXT i
CLOSE #1
CLOSE #2
! !SA=数値入力+1
!LET c1=12273824155491 !400兆
!LET c1=12270876688507 !3999009億
!LET c1=11678533758926 !380兆
!LET c1=3204941750802 !1E14 (100兆)1000001億
!LET c1=2894232250783 !9E13 (90兆) 900001億
!LET c1=2441437469602 !754900 : 2441437469602
!LET c1=1638923764567 !5E13 (50兆) 500001億
!LET c1=2064698005481 !634830 : 2064698005481
!LET c1=838534798134 !249999 : 838534798134
!LET c1=644296877669 !190330 : 644296877669
!LET c1=346065536839 !1E13 (10兆) 100001億
!LET c1=245751018905 !70140 : 245751018905
!LET c1=95957135910 !26450 : 95957135910
!LET c1=41548852740 !11091 : 41548852740
!LET c1=37607912018 !1E12 (1兆) 10001億
!LET c1=4118054813 !1E11 (1000億) 1001億
!LET c1=455052511 !1E10 (100億) 101億
!LET c1=450708777 !9.9E9 (99億) 100億
!LET c1=50847534 !1E9 (10億) 11億
LET c1=5761455 !1E8 (1億) 2億
PRINT SA-1;":";c1;":";c
LET k6=SA*1E8-1E8
FOR n=SA TO SB
!LET t1=TIME
LET k=Ba(n) !SQR(1E8)
LET k2=Bb(n) !π(x)
LET k6=k6+1E8
LET C=cprime(k,k2,k6,GT)
LET c1=c1+c
PRINT n;":";c1;":";c
!LET TM=TIME-t1
!PRINT USING"######." & REPEAT$("#",2):TM;
!PRINT "秒"
NEXT n
LET TM=TIME-t0
PRINT USING"######." & REPEAT$("#",2):TM;
PRINT "秒"
!PRINT DATE$;"/"; TIME$
END
EXTERNAL FUNCTION cprime (k,k2,k6,GT())
OPTION ARITHMETIC NATIVE
LET k4=k6-1E8
LET B6=IP(k6/30)+1
LET U=IP(k6/6)+1
LET W=IP(k4/6)-1
LET M7=W-2
DIM x(W-M7 TO U-M7)
DIM y(W-M7 TO U-M7)
MAT x = ZER !(6*n-1)
MAT y = ZER !(6*n+1)
FOR n=3 TO k2
LET P6=GT(n)
LET G1=IP(W/P6)!-2
IF MOD(P6+1,6)=0 THEN !(6*n-1)
LET r6=(P6+1)/6
FOR i=G1 TO B6
IF P6*i+r6<W THEN GOTO 140
IF P6*i+r6>U THEN EXIT FOR
LET x(P6*i+r6-M7)=1
140 NEXT i
END IF
IF MOD(P6-1,6)=0 THEN
LET r6=(P6-1)/6
FOR i=G1 TO B6
IF P6*i-r6<W THEN GOTO 150
IF P6*i-r6>U THEN EXIT FOR
LET x(P6*i-r6-M7)=1
150 NEXT i
END IF
IF MOD(P6+1,6)=0 THEN !(6*n+1)
LET r6=(P6+1)/6
FOR i=G1 TO B6
IF P6*i-r6<W THEN GOTO 160
IF P6*i-r6>U THEN EXIT FOR
LET y(P6*i-r6-M7)=1
160 NEXT i
END IF
IF MOD(P6-1,6)=0 THEN
LET r6=(P6-1)/6
FOR i=G1 TO B6
IF P6*i+r6<W THEN GOTO 170
IF P6*i+r6>U THEN EXIT FOR
LET y(P6*i+r6-M7)=1
170 NEXT i
END IF
NEXT n
LET Cc=0
FOR n=W-M7 TO U-M7
LET ST=n+M7
IF x(n)=1 THEN GOTO 180
IF 6*ST-1>k4 AND 6*ST-1<k6 THEN
LET cc=cc+1
! IF 1=cc THEN PRINT 6*ST-1;" :";cc;" 6*n-1"
! IF 3102679=cc OR 3099882=cc THEN PRINT 6*ST-1;" :";cc;" 6*n-1"
END IF
180 IF y(n)=1 THEN GOTO 200
IF 6*ST+1>k4 AND 6*ST+1<k6 THEN
LET cc=cc+1
! IF 1=cc THEN PRINT 6*ST+1;" :";cc;" 6*n+1"
! IF 3102679=cc OR 3099882=cc THEN PRINT 6*ST+1;" :";cc;" 6*n+1"
END IF
200 NEXT n
LET cprime=cc
END FUNCTION
EXTERNAL SUB sqprime(SA,SB,k2,GT())
OPTION ARITHMETIC NATIVE
OPEN #1:NAME "prime_n1.txt",RECTYPE INTERNAL
ERASE #1
OPEN #2:NAME "prime_pi1.txt",RECTYPE INTERNAL
ERASE #2
LET x=1E8
FOR i=1 TO k2-1
LET v=GT(i)^2
LET vi=GT(i+1)^2
LET vv=vi-v
IF x =< v THEN
CALL sqrp(1)
IF vv>=1E8 THEN
LET vt=IP(vv/1E8)
CALL sqrp(vt)
END IF
END IF
NEXT i
SUB sqrp(vo)
FOR ns=1 TO vo
LET C=C+1
LET X=X+1E8
IF C>=SA AND SB>=C THEN
WRITE #1:GT(i)
WRITE #2:i
END IF
NEXT ns
END SUB
CLOSE #1
CLOSE #2
END SUB
-------------------------------------------------
変数
LET SA=2 !MIN 2 (1億to) 最小値 2から1億も分岐を付ければ計算可能です。6n±1なので5からです。
LET SB=20000!MAX 1E15-1 15桁まで
LET c1=5761455 !1E8 (1億)
----------------------------------------
EXTERNAL SUB sqprime は、計算の無駄を省きました。
素数= pn
(pn+1)^2-pn^2 の性質を探究中です。
http://blogs.yahoo.co.jp/donald_stinger
|
|
|
戻る