Modular Exponentiation - 模幂运算


问题

给定正整数,求:

简单算法

按照次方运算的原理,初始化,重复次:

即为所求,该算法的时间复杂度为

二进制算法

根据二进制可知,任何正整数都可以用的次方和来表示:

其中是正整数中1的数量,要么为要么为,且。因此可以转换为:

因此模幂运算转换为:

计算每个元素,若则结果必然为,不必计算,若则需要次乘法,即时间复杂度为(其中)。

该算法的时间复杂度为

求正整数中所有为1的bit位的方法,与本书第三章DataStructure中FenwickTree一节使用的方法一样,不再赘述。

快速求幂算法

快速求幂算法基于以下公式:

该算法的时间复杂度为


源码

ModularExponentiation.h

ModularExponentiation.cpp

测试

ModularExponentiationTest.cpp