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

Algorithm for finding a prime with the least amount of computations

本文关键字:算法 计算      更新时间:2023-10-16

假设你要写一个函数/方法来找到一个素数,最有效的方法是什么?我想应该是这样的测试:

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

有人有更好的方法去解决这个问题,将需要更少的计算吗?

edit:稍微修改了代码两次。我写这篇文章时没有考虑到任何特定的语言,尽管我认为它是c++而不是java,因为bool这个词。

我会使用Miller Rabin检验,它可以很容易地对小于341,550,071,728,321的数字进行确定(而2^31比这小得多)。

伪代码:有很多不同的情况

  1. x小于9:返回(x & 1) != 0 || x == 2
  2. x小于约200(可调整):使用试用分割(您使用的)
  3. x小于1373653:使用以2和3为底的Miller Rabin
  4. x小于4759123141(这是其他的一切):使用米勒拉宾与基数2,7和61。

除2和3外,所有素数都比6的倍数多1或少1。利用这一事实将改进您的代码。像这样(未经测试)

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

当然,几个世纪以来,高等数学一直在试图找到更有效的素数测试。

维基百科上有一篇很好的文章:

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

你可以看看这篇论文谁测试了不同素数测试的性能:

priality TESTING by Richard p . Brent: http://cs.anu.edu.au/student/comp4600/lectures/comp4600_primality.pdf

(参见另一篇文章:对于2^1024到2^4096范围内的数字,最快的确定性素数测试是什么?)

您可以改进仅测试奇数值的代码。

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