【问题标题】:Multiplication of large numbers大数的乘法
【发布时间】:2012-08-05 15:32:34
【问题描述】:

在分析算法时,我发现我们通常假设乘法是采用单条计算机指令。但是这个假设在数字大小(就位数而言)时并不合适。在最基本的乘法形式中,将两个 n 位数相乘通常是 O(n^2)。在这种情况下,计算 x^n.(x 的 n 次方) 的复杂度(就位操作而言)可能是多少?

使用解释的方法,对我来说复杂性似乎是 n 的指数(但不确定确切的数字)

【问题讨论】:

  • O(n2) 似乎很荒谬。你的意思是 O(2 * n) 还是 O(n^2)?注意前者仍然是 O(n)。
  • 使用 right algorithm 乘法可以降低到略小于 O(N x log N x log log N)。
  • 您想考虑硬件的实际倍增方式吗?
  • 您肯定会使用乘方求幂来计算x^n,而不是将x 本身乘以n 倍?
  • @phant0m 但通过硬件实现无法得出一般限制

标签: algorithm complexity-theory


【解决方案1】:

计算x^n 的复杂度当然取决于用于计算幂和乘法的算法。如果通过平方计算每个指数的幂,则需要 O(log n) 乘法。在每个步骤中,您要么对一个数字求平方,要么将两个数字相乘,然后对两者中的一个求平方。

如果xd(x) 数字,x^n 有 Θ(n*d(x)) 数字,在最后一步中,您将大约 n/2*d(x) 数字平方(并可能乘以该数字一个较小的)然后通过将重复的平方x^(2^k)(如果是2^k <= n < 2^(k+1))与累加器相乘来完成算法。

S(m) 是对m-digit 数字求平方的成本(可能与将两个任意m-digit 数字相乘的成本M(m) 相同,也可能不同)。然后平方需要大约

S(2^(k-1)*d(x)) + S(2^(k-2)*d(x)) + S(2^(k-3)*d(x)) + ...

工作。由于S(m) >= m,即介于S(2^(k-1)*d(x))2*S(2^(k-1)*d(x)) 之间。所以平方的工作由最后一步控制。对于x^(2^s) 与累加器的乘法,同样成立,最终的乘法占主导地位。最终的累加器几乎可以与重复平方一样大,因此通过重复平方将x 提高到n 次方的总成本为

Θ(M(2^k*d(x)),

这是Θ(M(n*d(x)))。使用简单的乘法 - M(m) = O(m^2) - 你会得到 O(n^2*d(x)^2) 的总成本。使用更高级的乘法算法(Karatsuba、Toom-Cook、Schönhage-Strassen 等),您得到的复杂度要低得多,略高于 O(n*d(x)*log (n*d(x)) * log log (n*d(x)))

当通过与x 相乘来迭代计算幂时,在n 步骤中,让M(m,k) 表示将m 数字与k 数字相乘的成本。由于其中一个因素始终是x,因此总成本为

M(d(x),d(x)) + M(d(x),2*d(x)) + M(d(x),3*d(x)) + ... + M(d(x),(n-1)*d(x))

使用成本为M(m,k) = m*k 的教科书算法,总和为n*(n-1)/2*d(x)^2,因此总成本再次为Θ(n^2*d(x)^2)。但常数因子大于重复平方取幂。

当您将长度相差很大的数字相乘时,就像在几次迭代之后发生的那样,您不能 - 据我所知 - 将成本 M(m,k) 降低到远低于 Θ(m*k) - 如果 m < k,查看数字作为基数 b^m 中的 1 位数字和 r 位数字 (r*m <= k < (r+1)*m),如果 m 足够大,您可以使用更好的算法降低“数字”相乘的成本,但您不能减少r 因素。所以这个算法的复杂度是O(n^2*M(d(x))),不能排除n^2这个因素。

【讨论】:

    【解决方案2】:

    Wikipedia 很好地概述了各种乘法算法的复杂度时间。

    为了回答您的问题,假设将两个 m 位数字相乘的幼稚教科书方法(其复杂度为 O( m^2 )以及通过将数字乘以自身 n 次来提高幂的幼稚方法,你有 n 次乘法,所以复杂度为 O( n * m^2 ) 或简单 O( nm^2 )

    【讨论】:

    • m 是输入的数字长度,而 n 是输入的大小,在我看来,将它们混合在一起会产生轻微的误导(至少令人困惑)。
    • @harold 你能详细说明一下吗?
    • @krammer mx长度,但n 只是n 本身,而那种“隐藏”了复杂性以指数方式取决于n 的长度(通常在讨论事物的复杂性时使用)。
    • @harold 好的,如果我理解正确,那么在我的情况下,复杂度将是 O(n^3),但在这里具有欺骗性。
    【解决方案3】:

    n^k 成本:

    O((log(n))^k)
    

    log(n) - n 的位表示

    ^k - 因为将两个 n 位数字相乘的简单算法成本为 O(n^2)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-09
      • 2021-07-05
      • 2021-12-08
      • 2015-02-18
      • 1970-01-01
      • 2021-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多