Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@michalmarczyk
Created January 27, 2010 16:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save michalmarczyk/287986 to your computer and use it in GitHub Desktop.
Save michalmarczyk/287986 to your computer and use it in GitHub Desktop.
transient incremental sieves
(defn transient-incremental-sieve []
(map first
(iterate (fn [[previous crossouts]]
(loop [current (inc previous)
crossouts (transient crossouts)]
(if-let [witnesses (crossouts current)]
(recur (inc current)
(dissoc! (loop [cs crossouts
ws witnesses]
(if-let [w (first ws)]
(if-let [ps (cs (+ w current))]
(recur (assoc! cs (+ w current) (conj ps w))
(rest ws))
(recur (assoc! cs (+ w current) #{w})
(rest ws)))
cs))
current))
[current (persistent! (assoc! crossouts (* current current) #{current}))])))
[2 {4 #{2}}])))
(defn odd-transient-incremental-sieve []
(cons 2
(map first
(iterate (fn [[previous crossouts]]
(loop [current (+ previous 2)
crossouts (transient crossouts)]
(if-let [witnesses (crossouts current)]
(recur (+ current 2)
(dissoc! (loop [cs crossouts
ws witnesses]
(if-let [w (first ws)]
(if-let [ps (cs (+ (* 2 w) current))]
(recur (assoc! cs (+ (* 2 w) current) (conj ps w))
(rest ws))
(recur (assoc! cs (+ (* 2 w) current) #{w})
(rest ws)))
cs))
current))
[current (persistent! (assoc! crossouts (* current current) #{current}))])))
[3 {9 #{3}}]))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment