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

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