こっちの方が多分だいぶマシ。
(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) (or (= (expmod a b n) (- n 1)) (= (expmod a b n) 1)) (or (test-iter a (/ b 2)) (= (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