首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >朴素素性测试优化

朴素素性测试优化
EN

Stack Overflow用户
提问于 2012-02-10 12:29:01
回答 1查看 416关注 0票数 3

我有一个用来测试素性的算法,它使用如下所示的朴素实现http://en.wikipedia.org/wiki/Primality_test#Naive_methods

代码语言:javascript
复制
       static boolean check(int n)
   {
           if(n == 2 || n == 3)
           {
                   return true;
           }
           if(n < 2 || n % 2 == 0 || n % 3 == 0)
           {
                   return false;
           }
           for(int i = 6; i * i <= n; i += 6)
           {
                   if(n % (i - 1) == 0 || n % (i + 1) == 0)
                   {
                           return false;
                   }
           }
           return true;
   }

我一直走到6k+1区,但在那之后,我就迷路了。除此之外,我还能如何进一步优化速度呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-10 13:29:32

如果您想坚持使用naive方法,那么下一步就是使用您链接到的wikipedia页面中列出的下一个属性:

因此,当i= 1,7,11,13,17,19,23,29时,所有质数都是30k +i的形式(即对于i< 30,使得

(i,30)= 1)。

除了您可能会选择与2.3.5略有不同/更多的素数

您可以用30步循环替换6步循环(并手动检查所有小于30的素数)

代码可能如下所示:

代码语言:javascript
复制
    static boolean check(int n)
   {
           if(n<30)
           {
              return n==2 || n==3 || n==5 || n==7 || ...
           }

           for(int i = 30; i * i <= n; i += 30)
           {
              if (n % (i + 1))==0 return false;
              if (n % (i + 7))==0 return false;
              if (n % (i + 11))==0 return false;
              if (n % (i + 13))==0 return false;
              if (n % (i + 17))==0 return false;
              if (n % (i + 19))==0 return false;
              if (n % (i + 23))==0 return false;
              if (n % (i + 29))==0 return false;
           }
           return true;
   }

但是您会注意到,这个循环扫描8/30 (=27%)数字,而6步进循环扫描2/6 (=33%),所以它扫描的数字减少了大约20%,所以您预计速度最多会提高20%。当你将更多的素数添加到列表中时,你会得到递减的回报。

真的,如果你需要快速质数检查,那么你需要远离幼稚的方法。之前有很多关于堆栈溢出的问题。

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

https://stackoverflow.com/questions/9222694

复制
相关文章

相似问题

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