(def primes
" The following routine produces a infinite sequence of primes
(i.e. can be infinite since the evaluation is lazy in that it
only produces values as needed). The method is from clojure primes.clj library
which produces primes based upon O'Neill's paper:
'The Genuine Sieve of Eratosthenes'.
Produces primes based upon trial division on previously found primes up to
(sqrt number), and uses 'wheel' to avoid
testing numbers which are divisors of 2, 3, 5, or 7.
A full explanation of the method is available at:
[https://g...content-available-to-author-only...b.com/stuarthalloway/programming-clojure/pull/12] "
(concat
[2 3 5 7]
(lazy-seq
(let [primes-from ; generates primes by only checking if primes
; numbers which are not divisible by 2, 3, 5, or 7
(fn primes-from [n [f & r]]
(if (some #(zero? (rem n %))
(take-while #(<= (* % %) n) primes))
(recur (+ n f) r)
(lazy-seq (cons n (primes-from (+ n f) r)))))
; wheel provides offsets from previous number to insure we are not landing on a divisor of 2, 3, 5, 7
wheel (cycle [2 4 2 4 6 2 6 4 2 4 6 6 2 6 4 2
6 4 6 8 4 2 4 2 4 8 6 4 6 2 4 6
2 6 6 4 2 4 6 2 6 4 2 4 2 10 2 10])]
(primes-from 11 wheel)))))
(defn between [lo hi]
"Primes between lo and hi value "
(->> (take-while #(<= % hi) primes)
(filter #(>= % lo))
))
(println "1,000,000th prime:" (nth primes (dec 1000000))) ; decrement by one since nth starts counting from 0; your code goes here
CihkZWYgcHJpbWVzCiIgVGhlIGZvbGxvd2luZyByb3V0aW5lIHByb2R1Y2VzIGEgaW5maW5pdGUgc2VxdWVuY2Ugb2YgcHJpbWVzIAogIChpLmUuIGNhbiBiZSBpbmZpbml0ZSBzaW5jZSB0aGUgZXZhbHVhdGlvbiBpcyBsYXp5IGluIHRoYXQgaXQgCiAgb25seSBwcm9kdWNlcyB2YWx1ZXMgYXMgbmVlZGVkKS4gIFRoZSBtZXRob2QgaXMgZnJvbSBjbG9qdXJlIHByaW1lcy5jbGogbGlicmFyeQogIHdoaWNoIHByb2R1Y2VzIHByaW1lcyBiYXNlZCB1cG9uIE8nTmVpbGwncyBwYXBlcjoKICAnVGhlIEdlbnVpbmUgU2lldmUgb2YgRXJhdG9zdGhlbmVzJy4gIAogCiAgIFByb2R1Y2VzIHByaW1lcyBiYXNlZCB1cG9uIHRyaWFsIGRpdmlzaW9uIG9uIHByZXZpb3VzbHkgZm91bmQgcHJpbWVzIHVwIHRvCiAgIChzcXJ0IG51bWJlciksIGFuZCB1c2VzICd3aGVlbCcgdG8gYXZvaWQKICAgdGVzdGluZyBudW1iZXJzIHdoaWNoIGFyZSBkaXZpc29ycyBvZiAyLCAzLCA1LCBvciA3LgogICBBIGZ1bGwgZXhwbGFuYXRpb24gb2YgdGhlIG1ldGhvZCBpcyBhdmFpbGFibGUgYXQ6CiAgIFtodHRwczovL2cuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmIuY29tL3N0dWFydGhhbGxvd2F5L3Byb2dyYW1taW5nLWNsb2p1cmUvcHVsbC8xMl0gIgogCiAgKGNvbmNhdAogICAgWzIgMyA1IDddCiAgICAobGF6eS1zZXEKICAgICAgKGxldCBbcHJpbWVzLWZyb20gICA7IGdlbmVyYXRlcyBwcmltZXMgYnkgb25seSBjaGVja2luZyBpZiBwcmltZXMgCiAgICAgICAgICAgICAgICAgICAgICAgICAgOyBudW1iZXJzIHdoaWNoIGFyZSBub3QgZGl2aXNpYmxlIGJ5IDIsIDMsIDUsIG9yIDcKICAgICAgICAgICAgKGZuIHByaW1lcy1mcm9tIFtuIFtmICYgcl1dCiAgICAgICAgICAgICAgKGlmIChzb21lICMoemVybz8gKHJlbSBuICUpKQogICAgICAgICAgICAgICAgICAgICAgICAodGFrZS13aGlsZSAjKDw9ICgqICUgJSkgbikgcHJpbWVzKSkKICAgICAgICAgICAgICAgIChyZWN1ciAoKyBuIGYpIHIpCiAgICAgICAgICAgICAgICAobGF6eS1zZXEgKGNvbnMgbiAocHJpbWVzLWZyb20gKCsgbiBmKSByKSkpKSkKIAogICAgICAgICAgICA7IHdoZWVsIHByb3ZpZGVzIG9mZnNldHMgZnJvbSBwcmV2aW91cyBudW1iZXIgdG8gaW5zdXJlIHdlIGFyZSBub3QgbGFuZGluZyBvbiBhIGRpdmlzb3Igb2YgMiwgMywgNSwgNwogICAgICAgICAgICB3aGVlbCAoY3ljbGUgWzIgNCAyIDQgNiAyIDYgNCAyIDQgNiA2IDIgNiAgNCAgMgogICAgICAgICAgICAgICAgICAgICAgICAgIDYgNCA2IDggNCAyIDQgMiA0IDggNiA0IDYgMiAgNCAgNgogICAgICAgICAgICAgICAgICAgICAgICAgIDIgNiA2IDQgMiA0IDYgMiA2IDQgMiA0IDIgMTAgMiAxMF0pXQogICAgICAgIChwcmltZXMtZnJvbSAxMSB3aGVlbCkpKSkpCiAKKGRlZm4gYmV0d2VlbiBbbG8gaGldCiAgIlByaW1lcyBiZXR3ZWVuIGxvIGFuZCBoaSB2YWx1ZSAiCiAgKC0+PiAodGFrZS13aGlsZSAjKDw9ICUgaGkpIHByaW1lcykKICAgICAgIChmaWx0ZXIgIyg+PSAlIGxvKSkKICAgICAgICkpCgoocHJpbnRsbiAiMSwwMDAsMDAwdGggcHJpbWU6IiAobnRoIHByaW1lcyAoZGVjIDEwMDAwMDApKSkgICAgOyBkZWNyZW1lbnQgYnkgb25lIHNpbmNlIG50aCBzdGFydHMgY291bnRpbmcgZnJvbSAwOyB5b3VyIGNvZGUgZ29lcyBoZXJl