我在http://www.javascripter.net/faq/numberisprime.htm中看到了下面的代码
leastFactor = function(n){
if (isNaN(n) || !isFinite(n)) return NaN;
if (n==0) return 0;
if (n%1 || n*n<2) return 1;
if (n%2==0) return 2;
if (n%3==0) return 3;
if (n%5==0) return 5;
var m = Math.sqrt(n);
for (var i=7;i<=m;i+=30) {
if (n%i==0) return i;
if (n%(i+4)==0) return i+4;
if (n%(i+6)==0) return i+6;
if (n%(i+10)==0) return i+10;
if (n%(i+12)==0) return i+12;
if (n%(i+16)==0) return i+16;
if (n%(i+22)==0) return i+22;
if (n%(i+24)==0) return i+24;
}
return n;
}这是否意味着质数在数字7之后的每30个都有相同的模式?
这是否意味着从7开始,当你加上30,这个数字的结果是质数,+4是质数,+6总是质数,以此类推,直到+24,它们之间不会有更多的质数?
发布于 2013-01-22 10:58:38
不,但这段代码之所以有效,是因为它只是简单地检查所有值(某种程度上)。你知道,如果一个数是偶数,它是2的倍数,而不是质数。同样,如果它最右边的数字是5,你就知道它可以被5整除,而不是质数。使用许多这样的规则,我们可以避免检查满足这些参数之一的许多不同的值。
因此,脚本检查2,发现2不是输入的倍数,并且知道它永远不需要再次检查偶数,依此类推。
for循环并不是只生成质数。它可以生成187,这不是质数,但在实践中,它永远不会生成,因为一旦函数检查11,它就会返回。
发布于 2013-01-22 11:01:56
它基本上只是避免重新检查那些不可能的因子,因为它们是已经检查过的2,3或5的倍数。这是一个仍然可能的因子的重复模式,因为2,3和5的乘积是30。
素数根本没有被发现遵循一种非常可预测的模式。
发布于 2013-01-22 10:48:40
这段代码所做的是高度优化的--它本质上是在做同样的事情:“3是否均匀地划分为n?4是否均匀地划分为n?5是否均匀地划分为n?”但是它使用了诸如“2之后,没有偶数是质数”这样的重要知识来跳过检查所有偶数(请注意,它将做7+偶数,37 +偶数,67 +偶数等等-所以永远不会是偶数)。同样,它跳过每六个因子,因为它将是3的倍数。
https://stackoverflow.com/questions/14450730
复制相似问题