簡體   English   中英

查找下一個素數算法

[英]Find next prime number algorithm

我期待改進我的算法,以找到給定數字右邊的下一個素數。 我到目前為止所擁有的是:

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

這種算法在經常運行時效率不高。 有人可以提供有關如何加快或改進算法的建議嗎?

當只能找到一個質數時,Eratosthenes篩並不是最佳解決方案。 這是為此目的有用的解決方案。 它基於所有素數均為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;

}

最終結果是,該循環在我嘗試過的大量數字上運行非常快。

如果只檢查每個質數之前的每個質數,直到質數的平方根,就可以大大改善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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM