diff options
author | Guillermo Ramos | 2013-05-27 10:31:48 +0200 |
---|---|---|
committer | Guillermo Ramos | 2013-05-27 10:31:48 +0200 |
commit | 317ee36636ebeec986971ef857cd297f0320e58d (patch) | |
tree | 88c10fdbf166beae22f6c9d6c79970ae2240f4b0 /clojure/primos.clj | |
download | euler-317ee36636ebeec986971ef857cd297f0320e58d.tar.gz |
start
Diffstat (limited to 'clojure/primos.clj')
-rw-r--r-- | clojure/primos.clj | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/clojure/primos.clj b/clojure/primos.clj new file mode 100644 index 0000000..2dc908e --- /dev/null +++ b/clojure/primos.clj @@ -0,0 +1,29 @@ +(ns primos) + +(defn not-divide? [m n] + (or + (= m n) + (not (zero? (mod m n))))) + +(defn criba [n] + (let [raiz (-> n (Math/sqrt) (Math/ceil) (int))] + (loop [lista (cons 2 (range 3 (inc n) 2)) + elm 3] + (if (< elm raiz) + (let [nueva_lista (filter (fn [n] (not-divide? n elm)) lista)] + (recur nueva_lista + (some #(if (> % elm) % false) nueva_lista))) + lista)))) + +(defn divisores [n] + (let [criba-n (criba (/ n 2))] + (loop [n-actual n + divis []] + (if (> n-actual 1) + (let [divisible? (fn [primo] (if (zero? (mod n-actual primo)) primo false)) + divisor (or (some divisible? criba-n) n-actual)] + (recur (/ n-actual divisor) + (cons divisor divis))) + divis)))) + +;(println (divisores (* 2 128473))) |