Skip to content

Instantly share code, notes, and snippets.

@rasoliveira
Last active December 7, 2018 18:34
Show Gist options
  • Save rasoliveira/cd6a832252ab5a172836 to your computer and use it in GitHub Desktop.
Save rasoliveira/cd6a832252ab5a172836 to your computer and use it in GitHub Desktop.
primes in clojure
(ns primes)
(defn divides? [number divisor]
(zero? (mod number divisor)))
(divides? 4 2) ;; => true
(divides? 8 1) ;; => true
(divides? 3 2) ;; => false
(divides? 2 4) ;; => false
(defn is-prime? [p]
(let [possible-divisors (range 2 p)
divides-p? (partial divides? p)]
(not-any? divides-p? possible-divisors)))
(is-prime? 5) ;; => true
(is-prime? 9) ;; => false
;; counting primes in a range
(let [numbers (range 2 1000)]
(-> (filter is-prime? numbers)
count ;; remove/comment this line to see the numbers
))
(defn sieve [s]
(cons (first s)
(lazy-seq (sieve (remove #(zero? (mod % (first s))) s)))))
(take 100 (sieve (iterate inc 2))) ;; works fine, but 10000 explodes the stack
(defn not-divisable-by-any
[number primes]
(when (not-any? (partial divides? number) primes)
number))
(defn next-prime [primes]
(let [last-prime (last primes)
next-possible (iterate inc (inc last-prime))]
(->> (inc last-prime)
(iterate inc)
(some #(not-divisable-by-any % primes))
(conj primes))))
(next-prime [2 3 5 7]) ;; [2 3 4 5 7 11]
(defn nth-prime [n]
(last (last (take n (iterate next-prime [2])))))
(time (nth-prime 20000)) ;;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment