我练习算法创造了我能想到的最快的素数发生器。这是我最新的工作代码:
$p = array();
function isPrime($i) {
global $p;
$s = $i / 2;
foreach ($p as $n) {
if ($n >= $s) return true;
if ($i % $n == 0) return false;
}
return true;
}
$start = microtime(true);
for ($i = 3, $k = 20000; $i <= $k; $i += 2) {
isPrime($i) and $p[] = $i;
}
echo(microtime(true) - $start);
但后来我意识到我可以优化$s = $i / 2;
到$s = sqrt($i);
,这会测试更少的数字。当我测试时,代码失败并将每个数字作为素数。本质上,que sqrt失败并始终返回true。
发生了什么事?
答案 0 :(得分:2)
原因是这句话
$s = $i / 2;
在$i
及此声明
$s
变量的一半值
$s = sqrt($i);
将$i
的平方根存储在$s
$p = array();
function isPrime($i) {
global $p;
//$s = $i / 2;
$s = sqrt($i);
foreach ($p as $n) {
if ($n > $s) return true; // The condition here should be $n > $s not $n >= $s
if ($i % $n == 0) return false;
}
return true;
}
$start = microtime(true);
for ($i = 3, $k = 20000; $i <= $k; $i += 2) {
isPrime($i) and $p[] = $i;
}
//echo(microtime(true) - $start);
echo "<pre>";
print_r($p);
Array
(
[0] => 3
[1] => 5
[2] => 7
[3] => 11
[4] => 13
[5] => 17
[6] => 19
[7] => 23
[8] => 29
[9] => 31
.......