2009-10-19 16 views
7

Was ist das Clojure-Äquivalent (für den genauen Algorithmus) des folgenden Python-Codes?Clojure Primzahlen Lazy Sequenz

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

FYI die genaue Algorithmus in Python ist schwach. Suchen Sie nach Alex Martellis effizientem Generator für unendliche Primzahlen. –

+0

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

Antwort

10

Dies ist als Pythonish, wie ich es machen kann:

(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 nicht betrachtet, die ganze Zahl 0 boolean falsch. Ich brauchte ein paar Minuten, um herauszufinden, dass Ihr Python-Code das ausnutzte.

Here sind einige andere Primzahl-Algorithmen in Clojure. Es gibt auch eine Primzahl-Implementierung in clojure.contrib.lazy-seqs.

+0

Es muss nicht Pitonish :) Wenn es ist eine idiomatische clojure Lösung für den gleichen Algorithmus, bitte senden Sie es auch. – Roskoto

+2

Sie sollten dem Link folgen. Dort gibt es viele Beispiele und Antworten. Auch http://clj-me.cgrand.net/2009/07/30/everybody-loves-the-sieve-of-eratosthenes/#comments. – dnolen

+1

Nun, es ist nicht alles, was nicht Clojurish anders als mutieren ein "Atom". Es würde einige Verzerrungen benötigen, um zu vermeiden, ein "Atom" zu verwenden. Einige Algorithmen erfordern Nebeneffekte und einen nicht-funktionalen Programmierstil (insbesondere Dinge wie das Sortieren vor Ort, Mischen, bestimmte mathematische Funktionen usw.), und es ist in Ordnung, in diesen Fällen auf veränderbare Datenstrukturen umzustellen. Deshalb stellt Clojure sie zur Verfügung. Sie könnten sogar tauchen und native Java-Datenstrukturen für diese Art von Dingen verwenden. –

0

Diese Version ist viel schneller als @ Brian Carper des

(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))))