Java 计算量最小的素数求法
假设您要编写一个函数/方法来查找素数,那么最有效的方法是什么?我认为这将是一个类似这样的测试: 下面的代码是semi-c++Java 计算量最小的素数求法,java,c++,algorithm,function,methods,Java,C++,Algorithm,Function,Methods,假设您要编写一个函数/方法来查找素数,那么最有效的方法是什么?我认为这将是一个类似这样的测试: 下面的代码是semi-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;
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;
}
boolprimetest(intx){//x是我们正在测试的数字
int testUpTo=(int)((sqrt(x))+1);
对于(inti=3;i,您可以改进只测试奇数值的代码
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;
}
boolprimetest(intx){//x是我们正在测试的数字
如果(x==2)
返回true;
int testUpTo=(int)((sqrt(x))+1);
对于(inti=3;i维基百科有一篇关于这方面的非常好的文章:
除了2和3之外,所有素数都是6的倍数的一倍或一倍。使用这一事实可以改进您的代码。类似这样的内容(未经测试)
boolprimetest(intx){//x是我们正在测试的数字
如果(x==1)返回false;
如果(x==2 | | x==3)返回true;
如果(x%2==0 | | x%3==0)
返回false;
int testUpTo=(int)((sqrt(x))+1);
对于(int i=6;i我将使用,对于小于341550071728321的数字(2^31比这个小得多),可以很容易地使其具有确定性
伪代码:有许多不同的情况
x
小于9:Return(x&1)!=0 | | x==2
x
小于约200(可调整):使用试算法(您使用的)
x
小于1373653:使用带基数2和基数3的Miller Rabin
x
小于4759123141(这是其他所有内容):将Miller Rabin与基数2、7和61一起使用
你可以看看这篇测试不同素性测试性能的论文:
Richard p.Brent的素性测试:
(请参阅另一篇帖子:)请参阅Eratosthenes筛。如果需要重复此操作,可能会更有用。我们讨论的是运行时计算还是编译时计算?从一开始就拒绝偶数。只对奇数进行模测试。将计算减半,耶!请参阅:你真的想要最快的吗(当然,我假设你是指运行时的复杂性),或者只是一个没有任何复杂数学的快速测试?最快的,你可以使用一些质数测试的AKS类。除此之外,你还可以测试质数值:dex除了它对x==2不起作用之外,这仍然是非常低效的。@jambjo第一行:if(x%2==0)返回false;这是一个错误。2是素数,因此它应该返回true。我已经编辑了我的代码。@ricky:Ackar完全正确。最初的测试声称2不是素数。Ackar刚刚编辑了他的回答,但代码仍然不正确。现在它声称所有偶数都是素数。此函数为数字1、2和3给出了错误的结果。此alg算法不准确,我不知道它为什么有3个投票。25和35不是一个素数,但是你的算法说它是一个素数,甚至更多。请考虑更新这个。
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;
}