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)))
|