Я пытаюсь реализовать модульный алгоритм возведения в степень.
У меня есть некоторый класс:
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.
Что я делаю неправильно? Неправильная реализация или я должен использовать какой-то другой алгоритм?
П.С .: Меня не интересует использование функций из некоторых библиотек, меня интересует алгоритм или хотя бы некоторый код, который реализует правильный алгоритм работы, чтобы я мог понять, как он работает.
Проблема была в целочисленном переполнении при умножении.
Других решений пока нет …