首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >质数在7 +30之后总是有相同的模式吗?

质数在7 +30之后总是有相同的模式吗?
EN

Stack Overflow用户
提问于 2013-01-22 10:43:27
回答 3查看 166关注 0票数 1

我在http://www.javascripter.net/faq/numberisprime.htm中看到了下面的代码

代码语言:javascript
复制
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,它们之间不会有更多的质数?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-22 10:58:38

不,但这段代码之所以有效,是因为它只是简单地检查所有值(某种程度上)。你知道,如果一个数是偶数,它是2的倍数,而不是质数。同样,如果它最右边的数字是5,你就知道它可以被5整除,而不是质数。使用许多这样的规则,我们可以避免检查满足这些参数之一的许多不同的值。

因此,脚本检查2,发现2不是输入的倍数,并且知道它永远不需要再次检查偶数,依此类推。

for循环并不是只生成质数。它可以生成187,这不是质数,但在实践中,它永远不会生成,因为一旦函数检查11,它就会返回。

票数 3
EN

Stack Overflow用户

发布于 2013-01-22 11:01:56

它基本上只是避免重新检查那些不可能的因子,因为它们是已经检查过的2,3或5的倍数。这是一个仍然可能的因子的重复模式,因为2,3和5的乘积是30。

素数根本没有被发现遵循一种非常可预测的模式。

票数 2
EN

Stack Overflow用户

发布于 2013-01-22 10:48:40

这段代码所做的是高度优化的--它本质上是在做同样的事情:“3是否均匀地划分为n?4是否均匀地划分为n?5是否均匀地划分为n?”但是它使用了诸如“2之后,没有偶数是质数”这样的重要知识来跳过检查所有偶数(请注意,它将做7+偶数,37 +偶数,67 +偶数等等-所以永远不会是偶数)。同样,它跳过每六个因子,因为它将是3的倍数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14450730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档