65 lines
1.5 KiB
Plaintext
65 lines
1.5 KiB
Plaintext
(defn filtered-accumulate [predicate comb null-val term next a b]
|
|
(defn iter [a result]
|
|
(if (> a b)
|
|
result
|
|
(iter (next a) (cond
|
|
(predicate a b) (comb (term a) result)
|
|
result))))
|
|
(iter a null-val))
|
|
|
|
(defn prime? [n x]
|
|
(defn random [k]
|
|
(math/floor (* (math/random) k)))
|
|
(defn square [k]
|
|
(* k k))
|
|
(defn even? [k]
|
|
(= (mod k 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 [k]
|
|
(defn try-it [a]
|
|
(cond
|
|
(= (expmod a (- k 1) k) 0) false
|
|
true))
|
|
(try-it (+ 1 (random (- k 1)))))
|
|
(defn iter [k times]
|
|
(cond
|
|
(= times 0) true
|
|
(miller-rabin-test k) (iter k (- times 1))
|
|
false))
|
|
(iter n 100))
|
|
|
|
(defn rel-prime? [a b]
|
|
(defn gcd [x y]
|
|
(if (= y 0)
|
|
x
|
|
(gcd y (mod x y))))
|
|
(cond
|
|
(= (gcd a b) 1) true
|
|
false))
|
|
|
|
(defn prime-sum [a b]
|
|
(defn identity [n] n)
|
|
(defn next [n] (+ n 1))
|
|
(defn add [a b] (+ a b))
|
|
(filtered-accumulate prime? add 0 identity next a b))
|
|
|
|
(defn rel-prime-sum [n]
|
|
(defn identity [n] n)
|
|
(defn next [n] (+ n 1))
|
|
(defn mul [a b] (* a b))
|
|
(filtered-accumulate rel-prime? mul 1 identity next 1 n))
|
|
|
|
(print (prime-sum 2 5))
|
|
(print (rel-prime-sum 6))
|