先写代码
(defn square [x] (* x x))
(defn expmod[base exp m]
(cond (= exp 0) 1
(even? exp) (mod (square (expmod base (/ exp 2) m)) m)
:else (mod (* base (expmod base (- exp 1) m)) m)
)
)
(defn fermat-test[n]
(defn try-it [a]
(cond (= a n) (println "test end" n);
(= (expmod a n n) (mod a n)) (try-it (+ 1 a))
:else (println "no")
)
)
(try-it (+ 1 0))
)
执行结果如下
输出结果显示,对于每一个小于561的数字,他的561次方 和他与561的模相同,也就是通过了测试。
对于一个非素数,执行结果显示为no,表明没有逃过费曼检查测试。