Ich beginne meine Expedition ins Projekt Euler. Und wie viele andere habe ich gedacht, ich muss einen Primzahlengenerator machen. Problem ist: PHP mag keine großen Zahlen. Wenn ich den Standard Sieve of Eratosthenes function verwende und das Limit auf 2 Millionen setze, stürzt es ab. Es mag nicht, Arrays dieser Größe zu erstellen. Verständlich.prime Generator Optimierung
Also jetzt versuche ich es zu optimieren. Ein Weg, den ich fand, war, anstatt ein Array mit 2 Millionen Variablen zu erstellen, brauche ich nur 1 Million (nur ungerade Zahlen können Primzahlen sein). Aber jetzt stürzt es, weil sie die maximale Ausführungszeit überschreitet ...
function getPrimes($limit) {
$count = 0;
for ($i = 3; $i < $limit; $i += 2) {
$primes[$count++] = $i;
}
for ($n = 3; $n < $limit; $n += 2) {
//array will be half the size of $limit
for ($i = 1; $i < $limit/2; $i++) {
if ($primes[$i] % $n === 0 && $primes[$i] !== $n) {
$primes[$i] = 0;
}
}
}
return $primes;
}
Die Funktion arbeitet, aber wie gesagt, es ist ein bisschen langsam ... irgendwelche Vorschläge?
Eine Sache, die ich gefunden habe, um es ein bisschen schneller zu machen, ist, die Schleife herum zu schalten.
foreach ($primes as $value) {
//$limitSq is the sqrt of the limit, as that is as high as I have to go
for ($n = 3; $n = $limitSq; $n += 2) {
if ($value !== $n && $value % $n === 0) {
$primes[$count] = 0;
$n = $limitSq; //breaking the inner loop
}
}
$count++;
}
Und zusätzlich Zeit und Speicherlimit (Dank Greg), habe ich endlich eine Antwort bekommen. Phjew.
Ich weiß nicht, ob sie in PHP verfügbar sind, aber ich bevorzuge Bit-Sets zur Darstellung von Primzahlen, da sie kompakter sind. – starblue
Es gibt einen Grund, warum Sie in der inneren Schleife der Funktion an der Rosetta Code-Site keine if- oder% -Operationen sehen: Sie brauchen sie nicht. Werden Sie sie los und die Leistung wird sich stark verbessern. Ich habe darüber gebloggt: http://numericalrecipes.wordpress.com/2009/03/16/prime-numbers-2-the-sieve-of-erathostenes/ – Jaime