五十嵐真人さんへのお返事です。
> mod(3^(p-1),p)の計算ですが、
べき乗を2進展開して計算すれば、掛け算の回数が減ります。
LET t0=TIME
LET p=1987829
PRINT modpow(3,p-1,p)
PRINT "計算時間=";TIME-t0
LET t0=TIME
LET s=1
FOR k=1 TO p-1
LET s=MOD(s*3,p)
NEXT k
PRINT s
PRINT "計算時間=";TIME-t0
END
EXTERNAL FUNCTION modpow(a,n,b) !a^n≡x mod b のxを返す ※nは非負整数
IF n<0 OR n<>INT(n) THEN !非負整数以外なら
PRINT "modpow関数でパラメータが不適当です。"
STOP
ELSE
LET S=1
DO WHILE n>0 !べき乗nを2進展開する
IF MOD(n,2)=1 THEN LET S=MOD(S*a,b) !ビットが1なら計算する
LET a=MOD(a*a,b)
LET n=INT(n/2)
LOOP
LET modpow=S
END IF
END FUNCTION