1.28

こんな感じかな。

(define (square x)
  (* x x))

(define (expmod base ex m)
  (cond ((= ex 0)   1)
        ((and (not (= base 1))
              (not (= base (- m 1)))
              (= (remainder (square base) m) 1)) 0)
        ((even? ex) (remainder (square (expmod base (/ ex 2) m)) m))
        (else       (remainder (* base (expmod base (- ex 1) m)) m))))

(define (miller-rabin-test n)
  (define (try-it a)
    (= (expmod a (- n 1) n) 1))
  (try-it (+ 1 (random (- n 1)))))

(define (fast-prime? n times)
  (cond ((= times 0) #t)
        ((miller-rabin-test n) (fast-prime? n (- times 1)))
        (else #f)))

これからは行けそうにないので"独"書会に。
aがnより小さい任意の正の整数で、aが1でもn-1でもなくa^2 ≡ 1 (mod n)であるときnが素数でないことの証明はこれでいいのかな。
1 < a < n - 1としていい。
a^2 ≡ 1 (mod n) なので、 a^2 = mn + 1 とできる。 (m: 整数)
∴ n = (a^2 - 1)/m = (a + 1)(a - 1)/m.
ここでnが素数であると仮定すると、m = k(a+1) または m = k(a-1). (k: 自然数)
なら n = (a + 1)/k または n = (a - 1)/k. これはaの範囲と矛盾しているので仮定は誤り。
nは素数でない。