Für einen Siebalgorithmus, brauchen Sie nur ein Bit für jede Zahl zu testen ...
Suchen Sie nach einer bitset Implementierung (https://github.com/tdegrunt/bitset zum Beispiel). Dieser wird dynamisch wachsen, wenn Sie Bits darin setzen. Sie können Bits setzen und erhalten, und jedes Bit wird Ihnen sagen, ob n
eine Primzahl ist.
Allerdings empfehle ich Sie mit max 100 testen, nicht 2^32 ... weil es langsam sein ...
Eigentlich bitset Pausen zwischen 10M und 100M auf meinem Mac. Ich schätze, sie verwenden kein Byte-Array.
In Kaffee-Skript, weil es weniger ausführlich ist ...
Bitset = require 'bitset'
sieve = (maxSize)=>
mark = (bitset)->
markMultiplesOf = (n)->
bitset.set(n*each) for each in [2..(maxSize/n)]
markMultiplesOf each for each in [2..(maxSize/2)] when bitset.get(each) is false
showPrimes = (bitset)->
console.log each for each in [0..(bitset.length())] when bitset.get(each) is false
timestamp = Date.now()
bitset = new Bitset(maxSize)
mark bitset, maxSize
console.log "took #{Date.now() - timestamp} ms"
showPrimes(bitset)
sieve(10000000) # takes < 4s
Verwendung ein Objekt statt spärlich Arrays. – dandavis
Das sind 4 Milliarden Elemente. Warum brauchen Sie ein Array dieser Größe? – Andy
Wie auch immer, versuchen Sie stattdessen 4294967295 ((2^32) - 1). – Andy