Re: 素数判定

 投稿者:SHIRAISHI Kazuo  投稿日:2021年 6月14日(月)08時49分11秒
  十進BASIC Ver.7, Ver.8 では,
十進モードのとき,数値変数の精度は15桁,数値式の精度は16桁超,
2進モードのとき,数値変数は倍精度(仮数部53ビット),数値式は拡張精度(仮数部64ビット)です。
なので,十進モード,2進モードのいずれでも,変数に代入しなければ,1E8以下の数の平方は正確に計算されます。
Windows版BASICAccが生成する64ビットコードは,途中の計算まで含めてすべて倍精度で処理するので,2^53を超える数値を正確に扱うことができません。
(Win64版以外のBASICAccは,計算の途中結果を拡張精度で計算する可能性があります)

次のプログラムを実行してみると,途中がどうなっているかわかると思います(580行)。

100 PRINT  ISPRIME(94910639) !94910639 素数 (5484841st)
110 END
120 EXTERNAL  FUNCTION ISPRIME(N)
140 IF N = 2 THEN
150    LET ISPRIME=1
160    EXIT FUNCTION
170 END IF
180 IF N = 1 OR MOD(N , 2) = 0 THEN
190    LET ISPRIME=0
200    EXIT FUNCTION
210 END IF
220 LET D = (N - 1) / 2
230 LET S = 0
240 DO WHILE MOD(D , 2) = 0
250    LET D = INT(D / 2)
260    LET S=S+1
270 LOOP
280 FOR I=1 TO 10
290    LET ISP=0
300    READ A    !' n < 341550071728321 なら a = 2, 3, 5, 7, 11, 13, 17
310    DATA 2,3,5,7,11,13,17,23,29,31
320    LET ISP = 0
330    LET R = POWMOD(A, D, N)
340    IF R = 1 OR R = N - 1 THEN
350       LET ISP = 1
360    END IF
370    LET R = POWMOD(R, 2, N)
380    FOR J = 0 TO S-1
390       IF R = N - 1 THEN
400          LET ISP = 1
410       END IF
420       LET R = POWMOD(R, 2, N)
430    NEXT J
440    IF ISP=0 THEN
450       LET ISPRIME=0
460       EXIT FUNCTION
470    END IF
480 NEXT I
490 LET ISPRIME=1
500 END FUNCTION
510 EXTERNAL  FUNCTION POWMOD(B,P,M)
520 !OPTION ARITHMETIC RATIONAL
530 LET RESULT = 1
540 DO WHILE P > 0
550    IF MOD(P , 2)= 1 THEN
560       LET RESULT = MOD(RESULT * B , M)
570    END IF
580    PRINT USING "########    ################": B , B * B
590    LET B = MOD(B * B, M)
600    LET P = INT(P / 2)
610 LOOP
620 LET POWMOD=RESULT
630 END FUNCTION
 

戻る