计算Prime的最快方法

时间:2013-02-27 18:33:11

标签: c# performance primes

我正在尝试在我的程序中实现素数类型。在其中一个Exponent Of Mersenne中,要计算的公式是(2 power P) -1这里P is Prime.并检查输出是否为素数。

在计算中,我能够获得力量,但在检查素数时,过程是悬挂的。如果我离开它很长一段时间,那么它正在计算中。

例子是,(2 power 10090)-1并计算这是否为素数

我正在使用Big Integer

我正在使用此代码

int prime1 = CalculatePrime(n);
BigInteger powerPrime = BigInteger.Pow(2, prime1);
bool isPrime = CheckPrime(powerPrime - 1);

private bool CheckPrime(BigInteger num)
{
    if (num == 0 || num == 1) 
        return false;

    bool isPrime = true;
    for (int j = 2; j < num; j++)
    {
        if ((num % j) == 0)
        {
            isPrime = false;
            break;
        }
    }
    return isPrime;
}

怎么会这样 - http://www.dotnetperls.com/prime

3 个答案:

答案 0 :(得分:1)

Sieve of Eratosthenes是一种特别好的算法,用于生成少于几百万的素数。

答案 1 :(得分:1)

Lucas-Lehmer test专门用于检查Mersenne数是否为素数。您应该优先使用它,而不是您已经实现的测试,正如您所注意到的那样,这可能非常慢。

答案 2 :(得分:0)

由于以下原因,您可以减少一些工作:

  1. 您只需检查j < sqrt(num),而不是j < num
  2. 您不必检查每个偶数:只需在开头尝试2,然后只检查奇数(这是因为每个偶数都可以除以2,所以如果x不能除以2则不能除以任何其他偶数)