Project Euler içine gezimi başlıyorum. Ve diğerleri gibi ben bir asal sayı jeneratör yapmak gerekir düşündüm. Sorun: PHP büyük sayılar sevmez. Ben standart Sieve of Eratosthenes function kullanın ve 2 milyon sınırını ayarlarsanız, kilitlenmesine. O boyutta dizileri oluştururken sevmez. Anlaşılabilir.
Yani şimdi ben bunu optimize çalışıyorum. Bir yolu, buldum, bunun yerine, 2 milyon değişken ile bir dizi oluşturma, ben sadece 1 milyona ihtiyacım oldu (sadece tek sayıların asal sayılar olabilir). Bu maksimum yürütme süresini aştığından Ama şimdi çökmesini bulunuyor ...
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;
}
Işlevi çalışır, ama dediğim gibi, ... herhangi bir öneriniz biraz yavaş?
Biraz daha hızlı yapmak için bulduğum bir şey etrafında döngü geçmektir.
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++;
}
Ve zaman ve bellek sınırı (teşekkürler Greg) ayarı ek olarak, ben nihayet bir cevap almak başardınız. phjew.