2009-10-19 10 views
7

次のPythonコードのClojure相当(正確なアルゴリズム用)は何ですか?Clojure素数レイジーシーケンス

from itertools import count 
from math import sqrt 

def prime_gen(): 
    primes = [] 
    for n in count(2): 
     if all(n%p for p in primes if p <= sqrt(n)): 
      primes.append(n) 
      yield n 
+0

よりもはるかに高速です。 Alex Martelliの効率的な無限素数生成器を探してください。 –

+0

http://stackoverflow.com/questions/2211990/how-to-implement-an-efficient-infinite-generator-of-prime-numbers-in-python –

答えて

10

私はそれを作ることができるので、これはPythonishの通りです:

(def prime-gen 
    (let [primes (atom [])] 
     (for [n (iterate inc 2) 
      :when (not-any? #(zero? (rem n %)) 
          (filter #(<= % (Math/sqrt n)) 
            @primes))] 
     (do (swap! primes conj n) 
      n)))) 

(take 10 prime-gen) ; => (2 3 5 7 11 13 17 19 23 29) 

Clojureのは、ブール値falseに整数0を考慮しません。あなたのPythonコードがこれを利用していたことを理解するのに数分かかりました。

Hereは、Clojureのいくつかの他の素数アルゴリズムです。 clojure.contrib.lazy-seqsには素数の実装もあります。

+0

それはピトーニシである必要はありません:)もしあれば同じアルゴリズムのためのもっと慣用的なクロージャーソリューションでも、それを送ってください。 – Roskoto

+2

あなたはリンクをたどるべきです。そこに多くの例と答えがあります。また、http://clj-me.cgrand.net/2009/07/30/everybody-loves-the-sieve-of-eratosthenes/#comments。 – dnolen

+1

「原子」を突然変異させる以外のことは、Clojurish以外ではありません。それは、しかし、原子を使用することを避けるためにいくつかの曲げをとるでしょう。いくつかのアルゴリズムは、副作用と非機能的なプログラミングスタイル(特にソート・イン・プレース、シャッフル、特定の数学関数など)を必要とします。これらのケースでは、変更可能なデータ構造を使用することに切り替えても問題ありません。だからClojureはそれらを利用可能にしています。これらの種類のJavaデータ構造をネイティブに使用することもできます。 –

0

このバージョンでは、FYI Pythonで正確なアルゴリズムが弱い@Brian Carperの

(def prime-gen 
    (let [primes (atom [2N])] 
    (iterate 
     #(let [ps @primes] 
     (loop [n (inc %)] 
      (if (loop [i 0] 
       (let [p (nth ps i)] 
        (cond 
        (< n (* p p)) true 
        (zero? (mod n p)) false 
        :else (recur (inc i))))) 
      (do (swap! primes conj n) n) 
      (recur (inc n))))) 
     (first @primes)))) 
関連する問題