Добро пожаловать. Я пытаюсь выполнить тест MillerRabin для проверки того, является ли большое заданное число простым. Вот мой код:Тест на примитивность MillerRabin в C#
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
исчезают. При необходимости я могу предоставить больше кода функций. Выше функция работает правильно для небольших чисел.
EDIT. Изменение моей функции модуляции для BigInteger.ModPow помогло. К сожалению, теперь для больших чисел, более 3000 бит, он никогда не возвращает простое число, что является весьма невозможным. Или действительно цифры prme трудно узнать?
Замораживание после возвращения функции? Или во время функции? – TheLethalCoder
Главным виновником, IMHO, является 'Calc (a, d, number)' он должен быть 'BigInteger.ModPow' –
Например. Я хочу 8-битное случайное число. После нескольких попыток моя программа вернет его. Если я хочу большего числа, у меня вообще нет ответа. Просто зависает после 1 или более попыток. – Dago