(defn square [n] (* n n)) (defn even? [n] (= (mod n 2) 0)) (defn expmod [base exp m] (defn squaring-test [k] (cond (and (not (= k 1)) (not (= k (- m 1))) (= (mod (square k) m) 1)) 0 (mod (square k) m))) (cond (= exp 0) 1 (even? exp) (squaring-test (expmod base (/ exp 2) m)) (mod (* base (expmod base (- exp 1) m)) m))) (defn miller-rabin-test [n] (defn random [n] (math/floor (* (math/random) n))) (defn try-it [a] (def test (expmod a (- n 1) n)) (cond (= test 0) false true)) (try-it (+ 1 (random (- n 1))))) (defn prime? [n times] (cond (= times 0) true (miller-rabin-test n) (prime? n (- times 1)) false)) (print "Should be true") (print (prime? 11 100)) (print (prime? 13 100)) (print (prime? 5 100)) (print "Should be false") (print (prime? 561 100)) (print (prime? 1105 100)) (print (prime? 1729 100)) (print (prime? 2465 100)) (print (prime? 2821 100)) (print (prime? 6601 100))