Blob


1 (define (expmod base exp m)
2 (cond ((= exp 0) 1)
3 ((even? exp)
4 (remainder (square (expmod base (/ exp 2) m)) m))
5 (else (remainder (* base (expmod base (- exp 1) m)) m))))
7 (define (fermat-test n)
8 (define (try-it a)
9 (= (expmod a n n) a))
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)))
15 (else false)))
17 (define (smallest-divisor n)
18 (find-divisor n 2))
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)
27 (load-option 'format)
28 (newline)
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)