(define (expmod-or-zero base exp m) (define (one-to-zero n) (if (= n 1) 0 n)) (define (test n m) (if (or (= n (- m 1)) (= n 1)) (remainder (square n) m) (remainder (one-to-zero (square n)) m))) (cond ((= exp 0) 1) ((even? exp) (remainder (test (expmod-or-zero base (/ exp 2) m) m) m)) (else (remainder (* base (expmod-or-zero base (- exp 1) m)) m)))) (define (miller-rabin n) (define (try-it a) (= (expmod-or-zero a (- n 1) n) 1)) (try-it (+ 1 (random (- n 1))))) (define (miller-rabin-prime? n times) (cond ((= times 0) true) ((miller-rabin n) (miller-rabin-prime? n (- times 1))) (else false)))