大数的乘法

时间:2012-08-05 15:32:35

标签: algorithm complexity-theory

在分析算法时,我发现我们通常假设乘法来进行单一计算机指令。但是当数量的大小(就位数而言)时,这种假设是不合适的。在最基本的乘法形式中,乘以两个n位数通常是O(n ^ 2)。在这种情况下,计算x ^ n的复杂度(就位操作而言)可能是什么(x增加到n的幂)?

通过解释的方法,我的复杂性似乎是n的指数(但不确定确切的数字)

3 个答案:

答案 0 :(得分:3)

计算x^n的复杂性当然取决于用于计算功率和乘法的算法。如果通过平方计算每次指数的功率,则需要O(log n)次乘法。在每个步骤中,您可以将一个数字平方,或者将两个数字相乘并将两个数字中的一个相加。

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

2^k <= n < 2^(k+1)S(m) - 位数的平方成本(可能与可能乘以两个任意m的成本M(m)相同或不同号)。然后大约需要

m

的工作。自S(2^(k-1)*d(x)) + S(2^(k-2)*d(x)) + S(2^(k-3)*d(x)) + ... 起,即S(m) >= mS(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)。使用更先进的乘法算法(Karatsuba,Toom-Cook,Schönhage-Strassen,......),您可以获得更低的复杂度,低于O(n^2*d(x)^2)

通过乘以O(n*d(x)*log (n*d(x)) * log log (n*d(x)))迭代计算功率,在x步骤中,让n表示将M(m,k) - 位数乘以{{1}的成本}}-数字。由于其中一个因素始终为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)以下 - 如果{{1在基数M(m,k)中查看数字为1位数字和Θ(m*k) - 位数字(m < k),您可以降低使用“数字”倍增数字的成本算法如果r足够大,但您无法减少r*m <= k < (r+1)*m因子。因此,此算法的复杂度为b^m,因此m的因子无法消除。

答案 1 :(得分:2)

Wikipedia可以很好地概述各种乘法算法的复杂性时间。

回答你的问题,假设天真的教科书方法乘以两个m位数字(复杂度为O(平方公尺))和通过将数字乘以n次来提高功率的天真方法,你有n次乘法,因此复杂度为O(n * m ^ 2)或简单为O(nm ^ 2)

答案 2 :(得分:1)

n ^ k费用:

O((log(n))^k)

log(n) - n

的位表示

^ k - 因为用于乘以两个n位数的简单算法花费O(n ^ 2)