需要证明从右到左二进制方法的时间复杂度,用于模幂运算

时间:2016-05-24 14:57:55

标签: algorithm

我已经使用Right-to-Left Method来实现模幂运算的算法,但是我的教授说它的时间复杂度不能是O(log exponent),维基百科也不是可靠的源。

无论如何,我检查了伪代码的来源,但没有说明时间复杂度。任何人都可以帮我找到有效的学术资源吗?

1 个答案:

答案 0 :(得分:2)

您不需要学术资源来获取您可以自己安全获得的东西。

当您使用从右向左方法执行模幂运算时,您会从两个n位数开始,bm以及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上的原始数字。

最有可能的是,你的教授正在谈论一个更有趣的案例 - 即,当ebm - 数字时,n没有实际上限。

This page列出了M(n)的可能时间复杂度,具体取决于乘法算法。对于Fürer算法,复杂程度范围从教科书长乘法的O(n 2 )到O(n * log n * 2 O(log * n))。