歡迎。我正在嘗試實施MillerRabin測試來檢查大給定數是否爲素數。這裏是我的代碼:C#中的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比特,它永遠不會返回素數,這是不可能的。或者真的數字很難找到?
函數返回後是否凍結?或者在功能? – TheLethalCoder
主要的罪魁禍首,恕我直言,是'Calc(a,d,數字)'它應該是'BigInteger.ModPow' –
例如。我想要一個8位隨機數。經過幾次嘗試我的程序返回它。如果我想要更大的號碼,我根本沒有答案。一次或多次嘗試後,凍結。 – Dago