在课堂上,我们得到了一个2 ^ n mod(m)的算法。
to find 2^n mod(m){
if n=0 {return 1;}
r=2^(n-1)mod(m);
if 2r < m {return 2r;}
if 2r > =m {return 2r-m;}
}
我们被告知运行时为O(n * size(m)),其中m的大小是以m为单位的位数。
我理解n部分,但我无法解释尺寸(m),除非是因为涉及减法。任何人都可以对此有所了解吗?
提前致谢。
答案 0 :(得分:0)
我相信这用于加密(所谓的不可逆函数)。
如果我们需要递归地计算(2**n) mod m
,这将是最明显的方法。由于递归深度为n
,因此O(n)
复杂度很明显。
但是,如果我们想支持任意大小的m
(密码学中可以使用512位密钥,并且比任何算术寄存器都大得多),我们也应该考虑(在大多数情况下我们不会)必须使用任意精度的算术,所以这个术语通常是1)。
编辑 @Mysticial:该函数没有明确地调用硬件mod
操作,它只是移位和减法。移位总是O(1)
,而加/减是O(ceil(m/sizeof_ALU_precision))
答案 1 :(得分:0)
n
部分很清楚,因为您已经了解自己。 size(m)
(m
中的位数,基本上是log(m)
)是因为mod。即使您的CPU在一条指令中为您执行此操作,也需要log(m)
(比如说32位)。如果m
非常大,就像加密密钥一样,这可能会变得相当大。
为什么m
中的位数?记住分裂:
abcdefghijk | xyz
|-----
alm | nrvd...
opq
stu
wabc
.......
您执行减号的次数最多是被除数中的位数。