【问题标题】:2^n mod (m) algorithm2^n mod (m) 算法
【发布时间】:2011-12-06 13:42:12
【问题描述】:

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

提前致谢。

【问题讨论】:

  • 什么你做了n次?你正在做一个求幂,一个模数,一个比较,也许还有一个减法。所以...
  • 我相信r=2^(n-1)mod(m);是对同一个函数的递归调用
  • O(n) 没问题。 O(n) == O(n*some_k)。尽管sizeof(m) 是针对我们允许任意大小的m 仅具有用于固定大小算术的硬件的情况。
  • 是的,这是递归的。您最多递归 n 次。我无法弄清楚哪些操作(或者可能是所有操作)在复杂性中占大小(m)。

标签: algorithm recursion complexity-theory modular


【解决方案1】:

n 部分很清楚,因为您已经了解自己。 size(m)(这是m中的位数,基本上是log(m))是因为mod。即使您的 CPU 在一条指令中为您执行此操作,它也需要 log(m)(比方说 32 位)时间。如果m 非常大,就像加密密钥一样,这可能会变得相当大。

为什么m 中有位数?记住除法:

abcdefghijk | xyz
            |-----
alm         | nrvd...
 opq
  stu
   wabc
    .......

你做减号的次数,最多是被除数的位数。

【讨论】:

    【解决方案2】:

    我相信这是在密码学中使用的(所谓的不可逆函数)。

    如果我们需要递归计算(2**n) mod m,这将是最明显的方法。由于递归的深度为nO(n)的复杂度显而易见。

    但是,如果我们想支持任意大小的m(512 位密钥在密码学中是可能的,并且比任何算术寄存器都大得多),我们还应该考虑到(在大多数情况下我们没有使用任意精度的算术,所以这个项通常是 1)。

    编辑 @Mysticial:该函数不会显式调用硬件mod 操作,它所做的只是移位和减法。 shift 总是O(1) 而加法/减法是O(ceil(m/sizeof_ALU_precision))

    【讨论】:

    • 这里的问题是m 大小的算术计算时间不是线性的。 O(m^2) 用于这些小尺寸,大致O(m * log(m)) 用于超大尺寸m
    • 是的,我们正在讨论 RSA。我没有把这就是我们考虑 m 的原因联系起来。我想 size(m) 项有一些系数,因为在标记 O(n*size(m)) 时不包括比较、减法等。谢谢!
    • 我在谈论 bignum 算术。 512 位整数的算术运算被认为是 bignum。所以从这个意义上说,加/减是O(m) 而不是O(1),其中m 是您的密钥的长度。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    相关资源
    最近更新 更多