【问题标题】:Naive Primality Testing Optimization朴素素性测试优化
【发布时间】:2012-03-02 14:55:47
【问题描述】:

我有一个算法来测试素数,它使用此处列出的幼稚实现http://en.wikipedia.org/wiki/Primality_test#Naive_methods

       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 部分,但在那之后,我迷路了。我还能如何进一步优化速度?

【问题讨论】:

  • 我觉得这个属于codereview,类似问题codereview.stackexchange.com/q/8667/9534
  • 值得记住的是,大多数数字将被n % 2n % 3 检查消除,因此您之后做什么并不那么重要。优化此模式的最简单方法是更改​​调用方式。即优化调用者。

标签: java c++ performance optimization


【解决方案1】:

如果您想坚持使用幼稚的方法,那么下一步是使用您链接到的维基百科页面中列出的下一个属性:

所以所有素数都是 30k + i 的形式,因为 i = 1, 7, 11, 13, 17, 19, 23, 29(即对于 i

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

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

代码可能如下所示:

    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%。当您向列表中添加更多素数时,您会得到递减的回报。

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

【讨论】:

  • 你错过了 17。它是 8/30 = 26.(6)%。平均而言,加速比较小,因为大多数数字已经被 2 和 3 捕获。
  • @DanielFischer 哎呀 - 多么令人尴尬。现在修好了。
猜你喜欢
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
  • 2022-11-09
  • 2017-06-09
  • 2014-08-13
  • 2012-11-28
  • 2017-02-18
  • 1970-01-01
相关资源
最近更新 更多