Нам даны 3 числа: a, s и b, каждый из которых варьируется в диапазоне от 1 до 1000000. Нам нужно найти pow (a, s)% b. Очевидно, мы не можем использовать простую функцию pow, потому что мы не смогли создать большое число, такое как 1000000 . Это решение проблемы:Нахождение найти a^s mod b
sol=1
for(int i=0;i<s;i++)
{
sol = sol * a;
sol = sol % b;
}
print sol
Я не понимаю этот алгоритм. Может кто-нибудь объяснить это мне?
P.S. Где можно найти больше алгоритмов для решения нетривиальных математических задач, таких как этот? Приветствия!
Для записи это очень медленный алгоритм: он работает в O (s) времени. Не сложнее написать алгоритм, который работает в O (log s), что делает его пригодным для гораздо больших значений s (например, для использования в реальном RSA-шифровании). – ruakh
Хмм. Да, это довольно субоптимально. Вместо повторного размножения нужно действительно попробовать повторное возведение в квадрат. –