Learning/SICP/exercise_1_28.janet
2025-05-29 22:00:25 +02:00

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))