49 lines
998 B
Plaintext
49 lines
998 B
Plaintext
(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))
|