假设您要编写一个函数/方法来查找素数,那么最有效的方法是什么?我认为这将是一个类似的测试:
下面的代码在半c ++中
bool primeTest (int x) { //X is the number we're testing
int testUpTo = (int)((sqrt(x))+1);
for (int i=3; i<testUpTo; i+=2){
if ((x%i)==0) {
return false;
}
}
return true;
}
有人有更好的方法来解决这个需要较少计算的事情吗?
编辑:略微改变代码,两次。我没有用任何特定的语言来写这个,虽然我认为这是因为bool这个词而不是java的C ++。
答案 0 :(得分:10)
我会使用Miller Rabin test,对于小于341,550,071,728,321(并且2 ^ 31远小于此数字)的数字,可以很容易地确定{{3}}。
伪代码:有许多不同的情况。
x
:返回(x & 1) != 0 || x == 2
x
小于约200(可调整):使用试验部门(您使用的是什么)x
小于1373653:使用Miller Rabin,基础2和3。x
小于4759123141(就是其他所有东西):使用Miller Rabin的基础2,7和61。答案 1 :(得分:3)
除了2和3之外,所有素数都是一个或多于六的倍数。使用这一事实可以改善您的代码。像这样(未经测试)
bool primeTest (int x){//X is the number we're testing
if (x == 1) return false;
if (x == 2 || x == 3) return true;
if(x%2 == 0 || x%3 == 0)
return false;
int testUpTo = (int)((sqrt(x))+1);
for(int i=6; i<testUpTo; i+=6){
if ((x%(i-1))==0 || x%(i+1)==0){
return false;
}
}
return true;
}
当然,有数百年的高等数学试图找到更有效的素性测试。
答案 2 :(得分:2)
维基百科有一篇非常好的文章:
答案 3 :(得分:1)
您可以改进代码测试仅奇数值。
bool primeTest (int x){//X is the number we're testing
if(x == 2)
return true;
int testUpTo = (int)((sqrt(x))+1);
for(int i=3; i<testUpTo; i+=2){
if ((x%i)==0){
return false;
}
}
return true;
}
答案 4 :(得分:1)
您可以查看本文测试不同素性测试的表现:
Richard P. Brent的原始性测试:http://cs.anu.edu.au/student/comp4600/lectures/comp4600_primality.pdf
(参见另一篇文章:What is the fastest deterministic primality test for numbers in the range 2^1024 to 2^4096?)