Fast Prime Number Generation in Clojure

后端 未结 16 1857
萌比男神i
萌比男神i 2020-12-02 12:30

I\'ve been working on solving Project Euler problems in Clojure to get better, and I\'ve already run into prime number generation a couple of times. My problem is that it is

16条回答
  •  日久生厌
    2020-12-02 12:58

    From: http://steloflute.tistory.com/entry/Clojure-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EC%B5%9C%EC%A0%81%ED%99%94

    Using Java array

    (defmacro loopwhile [init-symbol init whilep step & body]
      `(loop [~init-symbol ~init]
         (when ~whilep ~@body (recur (+ ~init-symbol ~step)))))
    
    (defn primesUnderb [limit]
      (let [p (boolean-array limit true)]
        (loopwhile i 2 (< i (Math/sqrt limit)) 1
                   (when (aget p i)
                     (loopwhile j (* i 2) (< j limit) i (aset p j false))))
        (filter #(aget p %) (range 2 limit))))
    

    Usage and speed:

    user=> (time (def p (primesUnderb 1e6)))
    "Elapsed time: 104.065891 msecs"
    

提交回复
热议问题