查找下一个素数算法

Posted

技术标签:

【中文标题】查找下一个素数算法【英文标题】:Find next prime number algorithm 【发布时间】:2015-05-05 11:57:27 【问题描述】:

我期待改进我的算法,以找到给定数字右侧的下一个素数。 我到目前为止是这样的:

int NextPrime(int a)

    int i, j, count, num;
    for (i = a + 1; 1; i++)
    
        for (j = 2, count = 0; j <= i; j++)
        
            if (i%j == 0)
            
                count++;
            
        
        if (count == 1)
        
            return i;
            break;
        
    

虽然这种算法在经常运行时效率不高。 有人可以就如何加速或改进算法提供建议。

【问题讨论】:

en.wikipedia.org/wiki/Sieve_of_Eratosthenes 两个基本的加速是将 j 增加 2(从 3 开始,在测试 2 之后),因为只有 2 以外的奇数是素数。另外,只检查到数的平方根(因为任何数的因数之一是 另见this related question count++;之后使用break; 您是否尝试在内循环开始之前进行一些概率素性测试? en.wikipedia.org/wiki/Primality_test 【参考方案1】:

当只能找到一个素数时,埃拉托色尼筛法并不是最佳解决方案。这是对此有用的解决方案。它基于所有素数都是 6k+-1 形式的想法,所以我只测试 2、3 和 6+-1 形式的数字。当然,当除数违反 sqrt(a) 时,循环退出,因为所有这些数字都已经过测试。

bool IsPrime(int number)


    if (number == 2 || number == 3)
        return true;

    if (number % 2 == 0 || number % 3 == 0)
        return false;

    int divisor = 6;
    while (divisor * divisor - 2 * divisor + 1 <= number)
    

        if (number % (divisor - 1) == 0)
            return false;

        if (number % (divisor + 1) == 0)
            return false;

        divisor += 6;

    

    return true;



int NextPrime(int a)


    while (!IsPrime(++a)) 
     
    return a;


最终结果是这个循环在我尝试过的几个大数字上运行得非常快。

【讨论】:

函数IsPrime并不总是正常工作,例如数字64144081 = 8009 ^ 2的结果是true 嗨@AlexeiShestakov,感谢您报告此案例。实际上,我的代码中的停止条件是错误的 - 而不是在除数 ^ 2 如果你在 while 循环之前在 NextPrime 中检查 2,你可以做 ++++a,加 2 而不是 1,因为 2 是唯一的偶数。【参考方案2】:

如果您只检查每个数字与每个素数之前的每个素数,直到素数的平方根,您可以大大提高 Eratosthenes 的筛子。为此,您需要保留到目前为止所有素数的列表。这会增加内存成本,但会大大提高执行速度。

伪代码:

List foundPrimes;
foundPrimes.add(1)
foundPrimes.add(2)

bool isPrime(int x) 
    for (int divisor in foundPrimes) 
        if (divisor*divisor > x) 
            foundPrimes.add(x);
            return true;
         else if (x % divisor==0) 
            return false;
        
    
    // Invalid, need to run the algo from 3 on to fill the list


int nextPrime(int x) 
    while (!isPrime(++x)) 
    return x;

【讨论】:

以上是关于查找下一个素数算法的主要内容,如果未能解决你的问题,请参考以下文章

通过埃拉托色尼筛算法(C++)查找素数

华为OJ079-查找组成一个偶数最接近的两个素数

求一个数的最大素数的算法

我有一个新算法可以在线性时间内找到因子或素数 - 需要对此进行验证

6-22——“ == ”不能用来比较两个字符串是否相等,解决方法——折半查找算法找素数的简单算法

6-22——“ == ”不能用来比较两个字符串是否相等,解决方法——折半查找算法找素数的简单算法