#c_sharp #алгоритм #простые_числа
Добрый день. Реализовал вероятностный алгоритм определение простоты числа на основе
малой теоремы Ферма. Однако, есть проблема, что тип при даже 11-значном числе, переполняется.
Вопрос как можно элегантно решить эту проблему не используя BigInteger?
Сам метод
public static ulong IsPrimeNumb(ulong n, ulong a)
{
ulong e = 1, b=a;
for (var i = n; i > 0;)
{
if (i % 2 == 1)
{
e = (e * b) % n;
}
b = (b * b) % n;
i /= 2;
}
return e == a ? n : 0;
}
Ответы
Ответ 1
e = (e * b) % n; b = (b * b) % n; Произведение чисел при делении на некоторое число дает тот же остаток, что и произведение их остатков. Например, посчитаем остаток 107*207 по модулю 4. Числа 107 и 207 при делении на 4 дают остаток 3, если перемножить эти остатки получится 9. А 9 при делении на 4 дает остаток 1, значит, и 107*207 дает остаток 1. e = ((e % n) * (b % n)) % n; b = ((b % n) * (b % n)) % n; Теперь переполнения быть не должно. Что касается типов данных, то можно использовать decimal, если тебе просто не хватает разрядов для входных значений.
Комментариев нет:
Отправить комментарий