Проще всего возводить в большую степень по модулю бинарным алгоритмом.
Вот код на maple:
Код:
bin_deg := proc(x, d, m)
local i, c, s, dd, xx;
s := 1;
dd := d;
xx := x;
for i while 0 < dd do
dd := iquo(dd, 2, 'c');
if c = 1 then s := s*xx mod m end if;
xx := xx*xx mod m
end do;
s
end proc
Для возведения в степень порядка 1 000 000 000 000 000 000 по модулю 20-значного числа требуется порядка трех сотых секунды.
Но бинарный алгоритм использует не наименьшее число умножений.
Для нахождения наименьшего числа умножений требуется строить степенное дерево. О нем можно почитать у Кнута во втором томе "Искусства программирования".
Только пока это дерево построишь...
Так что, для больших показателей вполне достаточно бинарного алгоритма.