@evthim 即使您使用了 BigInteger 类的 modPow 函数,您也无法获得正确选择的范围内的所有素数。为了进一步澄清问题,您将获得该范围内的所有质数,但您拥有的一些数字不是质数。如果您使用 BigInteger 类重新排列此代码。当您尝试所有 64 位数字时,一些非素数也会写入。这些数字如下;
341, 561, 645, 1105, 1387, 1729, 1905, 2047, 2465, 2701, 2821, 3277, 4033, 4369, 4371, 4681, 5461, 6601, 7957, 8321, 8481, 8911, 10261, 10585, 11305, 12801, 13741, 13747, 13981, 14491, 15709, 15841, 16705, 18705, 18721, 19951, 23001, 23377, 25761, 29341, ...
https://oeis.org/a001567
161038, 215326, 2568226, 3020626, 7866046, 9115426, 49699666, 143742226, 161292286, 196116194, 209665666, 213388066, 293974066, 336408382, 376366, 666, 566, 566, 666 2001038066, 2138882626, 2952654706, 3220041826, ...
https: //oeis.org/a006935
作为一种解决方案,通过从下面的链接获取这些数字的列表,确保您测试的数字不在此列表中。
http://www.cecm.sfu.ca/Pseudoprimes/index-2-to-64.html
C#的解决方案如下。
public static bool IsPrime(ulong number)
{
return number == 2
? true
: (BigInterger.ModPow(2, number, number) == 2
? (number & 1 != 0 && BinarySearchInA001567(number) == false)
: false)
}
public static bool BinarySearchInA001567(ulong number)
{
// Is number in list?
// todo: Binary Search in A001567 (https://oeis.org/A001567) below 2 ^ 64
// Only 2.35 Gigabytes as a text file http://www.cecm.sfu.ca/Pseudoprimes/index-2-to-64.html
}