Как рассчитать (a^b) % c
, где 0 <= a, b, c <= 10^18
. Здесь (a^b)
означает a
на питание b
, а не a xor b
.Вычислить (a^b)% c, где 0 <= a, b, c <= 10^18
Мой текущий код проблемы:
unsigned long long bigMod(unsigned long long b,
unsigned long long p,
unsigned long long m){
if(b == 1) return b;
if(p == 0) return 1;
if(p == 1) return b;
if(p % 2 == 0){
unsigned long long temp = bigMod(b, p/2ll, m);
return ((temp) * (temp))% m;
}else return (b * bigMod(b, p-1, m)) % m;
}
Для этого входа:
a = 12345 b = 123456789 and c = 123456789
ожидаемый результат должен быть:
59212459031520
[Экспоненты по квадратуре] (https://en.wikipedia.org/wiki/Exponentiation_by_squaring) может быть полезной отправной точкой. Не сложно добавить модуль в формулу, если вы заметили, что '(a ** b)% c == ((a% c) ** b)% c)'. – Kevin
Возможный дубликат [вычисления a^b mod c] (http://math.stackexchange.com/questions/26722/calculating-ab-mod-c). –
Я пытался ((a% m) * (b% m))% m, но может быть мой подход неправильный. –