This is my Clojure code for finding prime numbers.
Note: this is an advanced version which starts eliminating from i*i with step i, instead of filtering all list against mod i == 0 (Sieve of Eratosthenes).
It has better asymptotic runtime: O(n log log n) instead of O(n log n) in typical examples of finding primes in Clojure.
What can be done better? Do I use some slow constructions? Can I make it more concise? Gain more performance? Format it better?
(defn primes [n]
(let [mark (fn [i di v]
(if (<= i (count v))
(recur (+ i di) di (assoc v (dec i) di))
v))
step (fn [i ps v]
(if (<= i (count v))
(if (= (v (dec i)) 1)
(recur (inc i) (conj ps i) (mark (* i i) i v))
(recur (inc i) ps v))
ps))]
(->> (repeat 1) (take n) vec (step 2 []))))
(defn -main
[& args]
(println (primes 50)))
n log (log n)only if(assoc v (dec i) di)is O(1). \$\endgroup\$