我已经使用Right-to-Left Method来实现模幂运算的算法,但是我的教授说它的时间复杂度不能是O(log exponent),维基百科也不是可靠的源。
无论如何,我检查了伪代码的来源,但没有说明时间复杂度。任何人都可以帮我找到有效的学术资源吗?
答案 0 :(得分:2)
您不需要学术资源来获取您可以自己安全获得的东西。
当您使用从右向左方法执行模幂运算时,您会从两个n
位数开始,b
和m
以及k
位指数e
。
modular_pow(b, m, e)
if m = 1 {
return 0
}
res = 1
b = b mod m
while e != 0
if e mod 2 == 1 {
res := (res * b) mod m
}
e >>= 1
b = (b * b) mod m
return res
在循环停止之前执行指数k
的{{1}}位移,这相当于执行log 2 e除以2.循环的每一步执行一次或两次乘法,以及一次或两次mod操作。这导致O(k * M(n))的总时间复杂度,其中M(n)是乘法算法的时间复杂度。
教授说它的时间复杂度不能是O(log exponent)
在特定条件下,时间复杂度可以是O(log exponent) - M(n)的时间复杂度是O(1)。这适用于大多数现代CPU上的原始数字。
最有可能的是,你的教授正在谈论一个更有趣的案例 - 即,当e
和b
是m
- 数字时,n
没有实际上限。
This page列出了M(n)的可能时间复杂度,具体取决于乘法算法。对于Fürer算法,复杂程度范围从教科书长乘法的O(n 2 )到O(n * log n * 2 O(log * n))。