30 lines
587 B
Plaintext
30 lines
587 B
Plaintext
(defn random [n]
|
|
(math/floor (* n (math/random))))
|
|
|
|
(defn square [n]
|
|
(* n n))
|
|
|
|
(defn divides? [a b]
|
|
(= (mod b a) 0))
|
|
|
|
(defn expmod [base exp m]
|
|
(cond
|
|
(= exp 0) 1
|
|
(even? exp) (mod (square (expmod base (/ exp 2) m)) m)
|
|
(mod (* base (expmod base (- exp 1) m)) m)))
|
|
|
|
(defn fermat-test [n]
|
|
(defn iter [a]
|
|
(cond
|
|
(= a 0) true
|
|
(= (expmod a n n) a) (iter (- a 1))
|
|
false))
|
|
(iter (- n 1)))
|
|
|
|
(print (fermat-test 561))
|
|
(print (fermat-test 1105))
|
|
(print (fermat-test 1729))
|
|
(print (fermat-test 2465))
|
|
(print (fermat-test 2821))
|
|
(print (fermat-test 6601))
|