Я думаю, что в целом на ваши вопросы о производительности ответили здесь. Википедия: модульное возведение в степень
В статье описывается
- Прямое возведение в степень
- Эффективное возведение в степень памяти
- Двоичное возведение в степень
Прямое возведение в степень
поднимите до степени e и возьмите по модулю.Это прямолинейно, но размер числа по модулю чрезвычайно велик.
Возведение в степень эффективного использования памяти
Замена операции питания с умножением на e позволяет накопленному результату всегда находиться в пределахдиапазон по модулю.Это ограничивает размер bignum
и ускоряет операцию.
Двоичное возведение в степень
Если вы преобразуете мощность в двоичное число
, если e = 13 =>1101 pow (n, 13) = pow (n, 8) * pow (n, 4) * pow (n, 1) Так что для показателя m битов нужно выполнить только около m операций.
Объединение эффективного использования памяти и двоичного возведения в степень решает большую часть производительности.
Python предлагает реализацию этих улучшений, используя функцию мощности с 3 аргументами, например,
>>> import timeit
>>> t = timeit.Timer( 'print(pow( 10,14918179, 15372757))' )
>>> t.timeit(1)
10140931
0.06365180000000237
>>> u = timeit.Timer( 'print(pow( 10,14918179) % 15372757)' )
>>> u.timeit(1)
10140931
15.021656000000007
Параметр 3 pow
занимает 0,06 с, в то время как версия с 2 параметрами pow
занимает 15 секунд.