From 317ee36636ebeec986971ef857cd297f0320e58d Mon Sep 17 00:00:00 2001 From: Guillermo Ramos Date: Mon, 27 May 2013 10:31:48 +0200 Subject: start --- clojure/primos.clj | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 clojure/primos.clj (limited to 'clojure/primos.clj') 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))) -- cgit v1.2.3