2 ^ n mod(m)算法

时间:2011-10-12 23:57:00

标签: algorithm recursion complexity-theory modular

在课堂上,我们得到了一个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),除非是因为涉及减法。任何人都可以对此有所了解吗?

提前致谢。

2 个答案:

答案 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
    .......

您执行减号的次数最多是被除数中的位数。