欢迎。我正在尝试实施 MillerRabin 测试来检查给定的大数是否是素数。这是我的代码:
public static bool MillerRabinTest(BigInteger number)
{
BigInteger d;
var n = number - 1;
var s = FindK(n, out d);
BigInteger a = 2;
BigInteger y = Calc(a, d, number); //a^d mod number
if (y != BigInteger.One && y != n)
{
for (var r = 1; r <= s - 1; r++)
{
y = Calc(y, 2, number);
if (y == 1)
return false;
}
if (y != n)
return false;
}
return true; //it is probably prime
}
它适用于小型 Bigintegers。但是如果我的程序需要计算超过 16 位的数字,程序就会冻结。例如,在成功检查数字是否为素数后,程序突然没有响应。我不明白这怎么可能。如果它检查了一个大数字,那么再次检查另一个应该没有问题。甚至调试器也没有帮助,因为 step options
消失了。如果需要,我可以分享更多功能代码。上述功能对于小数字正常工作。
编辑。更改 BigInteger.ModPow 的模函数有帮助。不幸的是,现在对于更大的数字,超过 3000 位它永远不会返回质数,这是相当不可能的。还是真的很难找到 prme 号码?