7 23 слишком велик, чтобы поместиться в long long
(при условии, что он 64-битный). Значение становится усеченным.
Редактировать: О, почему вы не сказали, что вы хотели pow(b, e) % m
вместо просто pow(b, e)
? Это делает все намного проще, потому что вам не нужны bigints в конце концов. Просто сделай весь свой арифметический мод m
. Решение Пабби работает, но вот более быстрое (O (log e) вместо O (e)).
unsigned int powmod(unsigned int b, unsigned int e, unsigned int m)
{
assert(m != 0);
if (e == 0)
{
return 1;
}
else if (e % 2 == 0)
{
unsigned int squareRoot = powmod(b, e / 2, m);
return (squareRoot * squareRoot) % m;
}
else
{
return (powmod(b, e - 1, m) * b) % m;
}
}