Algorithm 需要证明用于模幂运算的从右向左二进制方法的时间复杂性

Algorithm 需要证明用于模幂运算的从右向左二进制方法的时间复杂性,algorithm,Algorithm,我曾经实现过一个模块求幂算法,但我的教授说它的时间复杂度不能是O(对数指数),而且维基百科不是一个可信的来源 无论如何,我检查了伪代码的来源,但它没有说明时间复杂度。有人能帮我找到一个有效的学术来源吗?你不需要一个学术来源,你可以安全地从中获得一些东西 使用从右到左的方法执行模幂运算时,从两个n-位数开始,b和m,以及一个k-位指数e modular_pow(b, m, e) if m = 1 { return 0 } res = 1 b = b

我曾经实现过一个模块求幂算法,但我的教授说它的时间复杂度不能是O(对数指数),而且维基百科不是一个可信的来源


无论如何,我检查了伪代码的来源,但它没有说明时间复杂度。有人能帮我找到一个有效的学术来源吗?

你不需要一个学术来源,你可以安全地从中获得一些东西

使用从右到左的方法执行模幂运算时,从两个
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
在循环停止之前执行指数
e
k
位移位,这相当于执行log2e除以2。循环的每一步执行一个或两个乘法,以及一个或两个mod操作。这导致总体时间复杂度为O(k*M(n)),其中M(n)是乘法算法的时间复杂度

教授说它的时间复杂度不能是O(对数指数)

在特定条件下,时间复杂度可以是O(对数指数)——M(n)的时间复杂度为O(1)。对于大多数现代CPU上的原始数字来说,这是正确的

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


根据乘法算法,列出M(n)可能的时间复杂度。复杂度范围从教科书长乘法的O(n2)到费勒算法的O(n*logn*2O(logn))。

你不需要学术来源就可以安全地推导出你自己

使用从右到左的方法执行模幂运算时,从两个
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
在循环停止之前执行指数
e
k
位移位,这相当于执行log2e除以2。循环的每一步执行一个或两个乘法,以及一个或两个mod操作。这导致总体时间复杂度为O(k*M(n)),其中M(n)是乘法算法的时间复杂度

教授说它的时间复杂度不能是O(对数指数)

在特定条件下,时间复杂度可以是O(对数指数)——M(n)的时间复杂度为O(1)。对于大多数现代CPU上的原始数字来说,这是正确的

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


根据乘法算法,列出M(n)可能的时间复杂度。复杂度从教科书长乘法的O(n2)到O(n*logn*2O(logn))对于Fürer的算法。

你能给我们看一下你的代码吗?代码是维基百科页面上显示的伪代码的精确版本吗?你能给我们看一下你的代码吗?代码是维基百科页面上显示的伪代码的精确版本你建议算法不再在b的O(对数(指数))中,m的任意长度只是在实际实现中,对吗?或者我缺少了什么?@thcpx这个算法的任何实现都需要O(1)乘法才能成为O(对数(指数))。由于我们在选择乘法算法时有很多选择,正确的方法是根据我们使用的乘法算法的复杂性来表示该算法的复杂性,即M(n)。注意:如果
n
有一个固定的上限(比如,不超过1000位),那么再次声明算法是O(log(exponent))是公平的,因为即使使用最慢的O(n*n)乘法算法,我们也有O(1000000*log(exponent)),即O(log(exponent))。您建议对于b,算法不再是O(log(exponent)),m的任意长度只是在实际实现中,对吗?或者我缺少了什么?@thcpx这个算法的任何实现都需要O(1)乘法才能成为O(对数(指数))。由于我们在选择乘法算法时有很多选择,正确的方法是根据我们使用的乘法算法的复杂性来表示该算法的复杂性,即M(n)。注意,如果
n
有一个固定的上限(比如,不超过1000位),那么可以再次声称算法是O(对数(指数)),因为即使使用最慢的O(n*n)乘法算法,我们也有O(1000000*log(指数)),即O(对数(指数))。