用于找到具有最少量计算的素数的算法

时间:2011-08-26 13:31:18

标签: java c++ algorithm function methods

假设您要编写一个函数/方法来查找素数,那么最有效的方法是什么?我认为这将是一个类似的测试:

下面的代码在半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 ++。

5 个答案:

答案 0 :(得分:10)

我会使用Miller Rabin test,对于小于341,550,071,728,321(并且2 ^ 31远小于此数字)的数字,可以很容易地确定{{3}}。

伪代码:有许多不同的情况。

    小于9的
  1. x:返回(x & 1) != 0 || x == 2
  2. x小于约200(可调整):使用试验部门(您使用的是什么)
  3. x小于1373653:使用Miller Rabin,基础2和3。
  4. 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)

维基百科有一篇非常好的文章:

http://en.wikipedia.org/wiki/Primality_test

答案 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?