Here's my awful terrible code which is a direct translation from a java version I wrote and needs a fast functional sieve: I prefer Cristophe Grande's.
http://clj-me.cgrand.net/index.php?s=Everybody%20loves%20the%20Sieve%20of%20Eratosthenes The one in contrib is pretty good as well. (letfn [(n-p [n prime pow] (if (zero? (rem n prime)) (recur (/ n prime) prime (inc pow)) [n pow])) (get-primes [lim n primes] (let [p (first primes)] (cond (= n 1) (list) (or (empty? primes) (> (* p p) lim)) [[n 1]] :else (let [np (n-p n p 0)] (if (zero? (second np)) (recur lim n (rest primes)) (lazy-cat [[p (second np)]] (get-primes lim (first np) (rest primes))))))))] (defn prime-factors ([n primes] (if (< n 2) (list) (lazy-seq (get-primes n n primes)))) ([n] (prime-factors n (take-while #(<= (* % %) n) (primes)))))) On Jun 11, 2:15 pm, russellc <russell.christop...@gmail.com> wrote: > Not sure it's better than Uncle Bobs version but it seems a little > more idiomatic? > > (defn of [n] > (letfn [(f [res k] > (if (= 0 (rem (:n res) k)) > (assoc (assoc res :n (quot (:n res) k)) :fs (conj (:fs > res) k)) > res))] > (:fs (reduce f {:n n :fs []} (range 2 n))))) > > Uncle Bob version below (http://blog.objectmentor.com/articles/ > 2010/05/15/clojure-prime-factors) > > (defn of > ([n] > (of [] n 2)) > ([factors n candidate] > (cond > (= n 1) factors > (= 0 (rem n candidate)) (recur (conj factors candidate) (quot n > candidate) candidate) > (> candidate (Math/sqrt n)) (conj factors n) > :else (recur factors n (inc candidate)) > ) > ) > ) -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en