Kann die Ausführungszeit dieses Primzahlengenerators verbessert werden?

Mein ursprüngliches Ziel beim Schreiben war es, den kleinstmöglichen Platzbedarf zu haben. Ich kann mit Zuversicht sagen, dass dieses Ziel erreicht wurde. Dies führt leider zu einer recht langsamen Implementierung. Das Generieren aller Primzahlen unter 2 Millionen dauert auf einem 3 GHz-Intel-Chip ungefähr 8 Sekunden.

Gibt es überhaupt eine Möglichkeit, die Ausführungszeit dieses Codes zu verbessern, ohne den geringen Speicherbedarf zu beeinträchtigen? Oder gehe ich das falsch an, wenn ich es vom funktionalen Standpunkt aus betrachte?

CODE

/// 6.5s for max = 2,000,000
let generatePrimeNumbers max =    
    let rec generate number numberSequence =
        if number * number > max then numberSequence else
        let filteredNumbers = numberSequence |> Seq.filter (fun v -> v = number || v % number <> 0L)
        let newNumberSequence = seq { for i in filteredNumbers -> i }
        let newNumber = newNumberSequence |> Seq.find (fun x -> x > number)
        generate newNumber newNumberSequence                
    generate 2L (seq { for i in 2L..max -> i })

Aktualisieren

Ich habe den Algorithmus optimiert und es geschafft, 2 Sekunden zu sparen, aber den Speicherverbrauch zu verdoppeln.

/// 5.2s for max = 2,000,000
let generatePrimeNumbers max =    
    let rec generate number numberSequence =
        if number * number > max then numberSequence else
        let filteredNumbers = numberSequence |> Seq.filter (fun v -> v = number || v % number <> 0L) |> Seq.toArray |> Array.toSeq
        let newNumber = filteredNumbers |> Seq.find (fun v -> v > number)
        generate newNumber filteredNumbers                
    generate 2L (seq { for i in 2L..max -> i })

Aktualisieren

Anscheinend habe ich einen alten Compiler verwendet. Mit der neuesten Version dauert mein ursprünglicher Algorithmus 6,5s anstatt 8s. Das ist eine ziemliche Verbesserung.

Antworten auf die Frage(5)

Ihre Antwort auf die Frage