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;
}