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

63 lines
1.4 KiB
Plaintext

(defn square [n]
(* n n))
(defn divides? [a b]
(= (mod b a) 0))
(defn next [n]
(cond
(= n 2) 3
(+ n 2)))
(defn smallest-divisor [n]
(defn iter [n test]
(cond
(> (square test) n) n
(divides? test n) test
(iter n (+ test 1))))
(iter n 2))
(defn prime? [n]
(= n (smallest-divisor n)))
(defn smallest-divisor2 [n]
(defn iter [n test]
(cond
(> (square test) n) n
(divides? test n) test
(iter n (next test))))
(iter n 2))
(defn prime2? [n]
(= n (smallest-divisor2 n)))
(defn search-for-primes [start count]
(defn report-time [n elapsed-time1 elapsed-time2]
(printf "%d,%f,%f" n (* elapsed-time1 1000000.0) (* elapsed-time2 1000000.0)))
(defn start-prime-test [n start-time]
(def a (prime? n))
(def end-time-1 (os/clock :cputime))
(def elapsed (- end-time-1 start-time))
(def b (prime2? n))
(def elapsed2 (- (os/clock :cputime) end-time-1))
(if (and a b)
(do
(report-time n elapsed elapsed2)
true)
false))
(defn times-prime-test [n]
(start-prime-test n (os/clock :cputime)))
(defn iter [test n]
(cond
(= n 0) 0
(times-prime-test test) (iter (+ test 2) (- n 1))
(iter (+ test 2) n)))
(cond
(= 0 (mod start 2)) (iter (+ start 1) count)
(iter start count)))
(search-for-primes 1000 100000)
#(search-for-primes 10000 3)
#(search-for-primes 100000 3)
#(search-for-primes 1000000 3)