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