Как можно посчитать (a ^ b) % c
, где 0 <= a, b, c <= 10^18
. Здесь (a ^ b)
означает a
в степени b
, а не a xor b
.
Мой текущий код проблемы:
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 = 123456789012345
ожидаемый результат должен быть:
59212459031520
(a**b)%c == ((a%c)**b)%c)
, добавить модуль к формуле не так уж и сложно. - person Kevin   schedule 09.09.2015__int128
для промежуточного умножения. Если его нет, напишите собственное 128-битное умножение. Ссылка: Самый быстрый способ вычислить 128-битное целое число по модулю 64-битного целого, Самый точный способ выполнить комбинированную операцию умножения и деления в 64-разрядной версии? - person phuclv   schedule 09.09.2015c > 0
. - person chux - Reinstate Monica   schedule 20.09.2017