summaryrefslogtreecommitdiff
path: root/clojure/primos.clj
blob: 2dc908ee2e7bcb74ffbda4f26d0eebbe1fdf40f7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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)))