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

Reply via email to