How does clojure look?

Plain text code posted
created at 14 May 20:28

Edit | Back
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
(ns dma.euler.primes
  (:use dma.euler.numeric clojure.contrib.math))

;; Returns a lazy sequence of primes
;; Shamefully lifted from Christophe Grand's site:
;; http://clj-me.cgrand.net/2009/07/30/everybody-loves-the-sieve-of-eratosthenes/
(defn primes []
  (letfn [(enqueue [sieve n step]
                   (let [m (+ n step)]
                     (if (sieve m)
                       (recur sieve m step)
                       (assoc sieve m step))))
          (next-sieve [sieve candidate]
                      (if-let [step (sieve candidate)]
                        (-> sieve
                            (dissoc candidate)
                            (enqueue candidate step))
                        (enqueue sieve candidate (+ candidate candidate))))
          (next-primes [sieve candidate]
                       (if (sieve candidate)
                         (recur (next-sieve sieve candidate) (+ candidate 2))
                         (cons candidate
                               (lazy-seq (next-primes (next-sieve sieve candidate)
                                                      (+ candidate 2))))))]
    (cons 2 (lazy-seq (next-primes {} 3)))))

(defn- simple-brute-force-prime? [n]
  (cond (< n 2) false
        (< n 4) true
        :else (every? identity (for [x (range 3 (inc (sqrt n)) 2)]
                                 (not (div? n x))))))

(defn prime? [n]
  (and (.isProbablePrime (bigint n) 1)
       (simple-brute-force-prime? n)))

(defn- times-divisible
  ([n div] (times-divisible n div 0))
  ([n div times]
     (if (div? n div)
       (recur (/ n div) div (inc times))
       [times n])))

(defn prime-factorization [n & ps]
  (loop [factors []
         value n
         ps (or (first ps) (primes))]
    (if (or (empty? ps) (> (square (first ps)) value))
      (if (> value 1)
        (conj factors [value 1])
        factors)
      (let [[times rem] (times-divisible value (first ps))]
        (if (zero? times)
          (recur factors value (rest ps))
          (recur (conj factors [(first ps) times]) rem (rest ps)))))))

(defn flat-prime-factorization [n]
  (mapcat #(replicate (second %) (first %)) (prime-factorization n)))

(defn prime-factors [n]
  (map first (prime-factorization n)))
2.25 KB in 2 ms with coderay