Last updated 6 years ago
给定正整数b,e,mb, e, mb,e,m,求:
按照次方运算的原理,初始化c=1c = 1c=1,重复eee次:
即为所求,该算法的时间复杂度为O(e)O(e)O(e)。
根据二进制可知,任何正整数eee都可以用nnn个222的次方和来表示:
因此模幂运算转换为:
快速求幂算法基于以下公式:
其中nnn是正整数eee中1的数量,aia_{i}ai要么为000要么为111,且an−1=1a_{n-1} = 1an−1=1。因此beb^{e}be可以转换为:
计算每个元素(b2i)ai(b^{2^{i}})^{a_{i}}(b2i)ai,若ai=0a_{i} = 0ai=0则结果必然为111,不必计算,若ai=1a_{i} = 1ai=1则需要2i2^{i}2i次乘法,即时间复杂度为O(2i)O(2^{i})O(2i)(其中0≤i≤n−10 \leq i \leq n-10≤i≤n−1)。
该算法的时间复杂度为O(∑i=0n−12i⋅ai)O(\sum_{i=0}{n-1} 2^{i} \cdot a_{i})O(∑i=0n−12i⋅ai)。
求正整数eee中所有为1的bit位的方法,与本书第三章DataStructure中FenwickTree一节使用的方法一样,不再赘述。
该算法的时间复杂度为O(log2e)O(log_2 e)O(log2e)。