Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 朴素素性测试优化_Java_C++_Performance_Optimization - Fatal编程技术网

Java 朴素素性测试优化

Java 朴素素性测试优化,java,c++,performance,optimization,Java,C++,Performance,Optimization,我有一个算法来测试素性,它使用这里列出的朴素实现 静态布尔检查(int n) { 如果(n==2 | | n==3) { 返回true; } 如果(n

我有一个算法来测试素性,它使用这里列出的朴素实现

静态布尔检查(int n)
{
如果(n==2 | | n==3)
{
返回true;
}
如果(n<2 | | n%2==0 | | n%3==0)
{
返回false;
}

对于(int i=6;i*i如果您想坚持使用naive方法,那么下一步就是使用您链接到的wikipedia页面中列出的下一个属性:

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

除了你可能会选择比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;
   }
静态布尔检查(int n)
{

如果(我认为这属于codereview,类似的问题值得记住的是,大多数数字都会被
n%2
n%3
检查所消除,因此您在检查后所做的事情就不那么重要了。优化此模式的最简单方法是改变您调用它的方式。也就是说,优化调用方。您错过了17个。它是8/30=26。(6)%。平均而言,加速比较小,因为大多数数字已经被2和3捕获。@DanielFischer Oops-多么尴尬。现在修复它。
    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;
   }