我用PHP sqrt练习不起作用

时间:2013-04-24 03:49:06

标签: php algorithm optimization primes

我练习算法创造了我能想到的最快的素数发生器。这是我最新的工作代码:

    $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。

发生了什么事?

1 个答案:

答案 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);

Fiddle

输出

 Array
(
[0] => 3
[1] => 5
[2] => 7
[3] => 11
[4] => 13
[5] => 17
[6] => 19
[7] => 23
[8] => 29
[9] => 31
.......