Модульное экспонирование с большими числами

Я пытаюсь реализовать модульный алгоритм возведения в степень.

У меня есть некоторый класс:

template< typename T>
class SomeMathFun {
.....
}

и у него есть метод:

static T ModularExp(T base, T exp, T modulo) {
T result(1);
base %= modulo;
while (exp > 0) {
if (exp & 1)
result = (result * base) % modulo;
exp >>= 1;
base = (base * base) % modulo;
}
return result;
}

Он отлично работает для небольших чисел, таких как 5 ^ 117 mod 19: результат равен 1. Но когда я пытаюсь работать с большими числами, он не работает хорошо.

Например:

unsigned int a(SomeMathFun<unsigned int>::ModularExp(120, 17, 80223667));
std::cout << a;

Результат: 34313651. Но это не правильно. Так должно быть 70781811.

Что я делаю неправильно? Неправильная реализация или я должен использовать какой-то другой алгоритм?

П.С .: Меня не интересует использование функций из некоторых библиотек, меня интересует алгоритм или хотя бы некоторый код, который реализует правильный алгоритм работы, чтобы я мог понять, как он работает.

1

Решение

Проблема была в целочисленном переполнении при умножении.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector