・・・一応カーマイケル数の判定にも成功するけど、コレでいいのかどうか・・・
(追記:修正しました)
同じ計算を繰り返しているところがあって、効率はあまりよくない。
一番底で-1かどうかチェックするだけでいいのか。
(define (square x) (* x x))
(define (expmod base exp m)
(cond ((= exp 0) 1)
((even? exp)
(remainder (square (expmod base (/ exp 2) m))
m))
(else
(remainder (* base (expmod base (- exp 1) m))
m))))
(define (miller-rabin-test n)
(define (test-iter a b)
(if (odd? b)
(= (expmod a b n) 1)
(or (test-iter a (/ b 2))
(and (= (expmod a b n) 1)
(= (expmod a (/ b 2) n) (- n 1))))))
(test-iter (+ 1 (random (- n 1))) (- n 1)))
(define (good-prime? n times)
(cond ((= times 0) true)
((miller-rabin-test n) (good-prime? n (- times 1)))
(else false)))
No comments:
Post a Comment