我做了一些搜索,无法找到有关此实施的任何信息,而不是我见过的其他信息。
function sieve($top)
{
for($i = 11; $i<$top; $i+=2)
{
if($i % 3 == 0 || $i % 5 == 0
|| $i % 7 == 0)
{
continue;
}
echo "$i <br />";
}
}
是的,我知道它只是打印出来,但那不是重要的部分。无论是时间还是其他,主要的缺陷是什么?
编辑:除了可扩展性之外还有其他问题吗?同样感谢有关推进主要发现的评论。答案 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;
}