如何确定一个令人难以置信的大数字是否是素数?

时间:2011-09-28 20:22:22

标签: c# algorithm primes

我想弄清楚的数字是这种形式(一些例子):

2 ^ 7 - 12 ^ 31 - 12 ^ 127 - 1等等。

这不是一个功课问题,我只是在研究素数,而且很多信息都在我的头上(傅立叶变换)。最初我只是使用这样的函数:

public static bool IsPrime(int candidate)
{
    if ((candidate & 1) == 0)
    {
        return candidate == 2;
    }

    for (int i = 3; (i * i) <= candidate; i += 2)
    {
        if ((candidate % i) == 0)
        {
            return false;
        }
    }

    return candidate != 1;
}

但是一旦数字太大,那就停止了工作。我也查看了Sieve of Eratosthenes,但显然只适用于数量更小的数字。

为了澄清,我不打算编写程序来查找素数,而是确定给定的数字是否为素数。我正在研究.NET Framework中的BigInteger结构,如果我能编写一个足够有效的算法(我会满足于几天内完成的东西),它看起来很有希望。

我不确定在这种情况下数学证明是否会更好但我在该领域没有太多的知识而不是编程但如果有一个专门用于这些数字的证明,那肯定是值得期待。

感谢。

4 个答案:

答案 0 :(得分:3)

保理数字是一个大问题。它很难成为现代密码学的基础。

取决于您的号码有多大...您可以获得所有素数的列表,直到您要查找的数字的平方根。这将远远低于每次上升2。问题是找到一个大的列表。如果你的数字是10 ^ 100,那么你需要10 ^ 50或更少的所有素数,这仍然是一个庞大的数字。

答案 1 :(得分:2)

您列出的数字:2 ^ 7 - 1, 2 ^ 31 - 1, 2 ^ 127 - 1被称为Mersenne Numbers。已经有一个完整的分布式计算项目可以找到它们。它被称为GIMPS

所以你的问题的答案并非微不足道。此表中列出了该表格中所有当前已知的素数:

http://en.wikipedia.org/wiki/Mersenne_prime#List_of_known_Mersenne_primes

答案 2 :(得分:0)

你的数字有上限吗?你提到你已经安顿好几天了。 如果是这样,除非您的数字非常大,否则您当前的算法将会有效。

您还可以查看Miller–Rabin primality test

答案 3 :(得分:0)

Java附带了一个概率素性测试的实现 - 请参阅java.math.BigInteger.isProbablePrime()。我认为这意味着C#在语言上看起来很像。我找不到一个,但是找了一个我在网上http://www.codeproject.com/KB/cs/biginteger.aspx找到了一些代码。