时间:2010-07-23 21:32:51

标签: c biginteger c99

4 个答案:

答案 0 :(得分:5)

答案 1 :(得分:1)

答案 2 :(得分:0)

答案 3 :(得分:0)

我能想到的最有效的算法如下。它应该具有O(n·(log n)²·log log n)的运行时复杂度,而不是具有二次运行时复杂度的朴素算法。

  1. 假设不失一般性,数字A是2 n + 1 位长。它可能有前导零。
  2. 如果这是最顶层的递归级别,则通过重复平方计算数字2 2 i 的最小值为n的十进制表示。
  3. 将输入数字的位序列分为B和C两部分。具有较低有效位的部分C包括A的2 n 最低有效位,而B部分是其余更重要的部分。
  4. 将B和C转换为十进制表示,使用 二次运行时算法,如果它们足够短,或者通过递归调用该算法。
  5. 将B的十进制表示乘以2 2 n 的缓存十进制表示,并添加C的十进制表示以获得A的十进制表示。
  6. 在步骤2和5中,您需要一个十进制乘法算法。对于具有数万个数字的数字,您应该使用在基数10中运行的Schönhage-Strassen算法版本。这将导致上述运行时复杂性。对于较短的数字,根据其长度,应使用Toom-Cook算法,Karatsuba算法或长乘法。但是,我目前无法告诉如何在基数10中实现Schönhage-Strassen算法,因为我能找到的所有完整描述都是针对基数2的,我不知道有足够的数论可以自己推导出来。