|
> No.3894[元記事へ]
しばっちさんへのお返事です。
> https://ja.wikipedia.org/wiki/ミラー?ラビン素数判定法
>
> !'素数判定 Miller-Rabin法
> OPTION ARITHMETIC RATIONAL
> LET L=100000000000000 !'100兆
> FOR N=L+1 TO L+10001 STEP 2
> IF ISPRIME(N)=1 THEN
> !'PRINT N
> LET COUNT=COUNT+1
> END IF
> NEXT N
> PRINT COUNT;"個"
> END
>
> EXTERNAL FUNCTION ISPRIME(N)
> OPTION ARITHMETIC RATIONAL
> IF N = 2 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 10
> LET ISP=0
> READ A !' n < 341550071728321 なら a = 2, 3, 5, 7, 11, 13, 17
> DATA 2,3,5,7,11,13,17,23,29,31
> 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 RATIONAL
> 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
>
素数判定の実験中遭遇しました。
十進BASIC Version 7.8.5.4 計算結果 11
BASIC Accelerator Ver. 2.0.2.0 計算結果 10
BASIC Accelerator Ver. 1.2.0.5 計算結果 10
それぞれ計算結果が違います。
!OPTION ARITHMETIC RATIONAL
PRINT ISPRIME(94910593) !94910593 素数 (5484840th)
PRINT ISPRIME(94910639) !94910639 素数 (5484841st)
END
EXTERNAL FUNCTION ISPRIME(N)
!OPTION ARITHMETIC RATIONAL
IF N = 2 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 10
LET ISP=0
READ A !' n < 341550071728321 なら a = 2, 3, 5, 7, 11, 13, 17
DATA 2,3,5,7,11,13,17,23,29,31
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 RATIONAL
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
|
|