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