summaryrefslogtreecommitdiff
path: root/clojure/primos.clj
diff options
context:
space:
mode:
authorGuillermo Ramos2013-05-27 10:31:48 +0200
committerGuillermo Ramos2013-05-27 10:31:48 +0200
commit317ee36636ebeec986971ef857cd297f0320e58d (patch)
tree88c10fdbf166beae22f6c9d6c79970ae2240f4b0 /clojure/primos.clj
downloadeuler-317ee36636ebeec986971ef857cd297f0320e58d.tar.gz
start
Diffstat (limited to 'clojure/primos.clj')
-rw-r--r--clojure/primos.clj29
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)))