Eratosthenes算法的筛选

时间:2009-12-07 17:40:17

标签: php algorithm sieve-of-eratosthenes

我做了一些搜索,无法找到有关此实施的任何信息,而不是我见过的其他信息。

function sieve($top)
{
    for($i = 11; $i<$top; $i+=2)
    {
         if($i % 3 == 0 || $i % 5 == 0 
            ||  $i % 7 == 0)
          {
             continue;
          }
       echo "$i <br />";
   }
}

是的,我知道它只是打印出来,但那不是重要的部分。无论是时间还是其他,主要的缺陷是什么?

编辑:除了可扩展性之外还有其他问题吗?同样感谢有关推进主要发现的评论。

5 个答案:

答案 0 :(得分:4)

这方面的主要缺陷是它没有扩展。一旦数字足够大,任何东西都将被退回。模拟排除器列表需要随搜索一起增长。

答案 1 :(得分:1)

您可以参考维基百科上的Sieve of Eratosthenes;和this link用于PHP实现。

答案 2 :(得分:0)

它限制为最多11个素数。要进一步扩展它,您需要添加|| $u % 11 == 0 || $i % 13 == 0 ...

答案 3 :(得分:0)

首先,您只检查三个数字(3,7和11)。对于Erathosthenes的筛子,你应该从一个数字列表开始,2..i。然后循环遍历该列表,并删除作为您正在迭代的数字因子的数字。例如,一旦你到达7,这是素数,你将需要删除49,56和其他7的倍数。

其次,我刚刚描述的方法扩展性很差 - 如果你试图从1..10 ^ 9中寻找素数,你的列表中需要10 ^ 9个值。除了Erathosthenes筛子之外还有其他方法可以找到素数 - 见http://en.wikipedia.org/wiki/Prime_number

答案 4 :(得分:0)

此功能使用&#34; Eratosthenes算法筛选&#34;

function getPrimaryNumbers($n)
{
    $sieve = [];
    for($i = 1; $i <= $n; $i++) {
        $sieve[$i] = $i;
    } 

    $i =2;
    while($i * $i <= $n) {      
        if(isset($sieve[$i])) {
            $k = $i;
            while ($k * $i <= $n) {         
                unset($sieve[$k * $i]);
                $k++;
            }   
        }
    $i++;
    }           
    return $sieve;
}