1 (define (expmod base exp m)
4 (remainder (square (expmod base (/ exp 2) m)) m))
5 (else (remainder (* base (expmod base (- exp 1) m)) m))))
7 (define (fermat-test n)
10 (try-it (+ 1 (random (- n 1)))))
12 (define (fast-prime? n times)
13 (cond ((= times 0) true)
14 ((fermat-test n) (fast-prime? n (- times 1)))
17 (define (smallest-divisor n)
19 (define (find-divisor n test-divisor)
20 (cond ((> (square test-divisor) n) n)
21 ((divides? test-divisor n) test-divisor)
22 (else (find-divisor n (+ test-divisor 1)))))
23 (define (divides? a b)
24 (= (remainder b a) 0))
26 (define (test-case actual expected)
29 (format #t "Actual: ~A Expected: ~A" actual expected))
31 (test-case (smallest-divisor 199) 199)
32 (test-case (smallest-divisor 1999) 1999)
33 (test-case (smallest-divisor 19999) 7)