如何实现(快速)bigint部门?

时间:2012-01-16 17:07:40

标签: javascript algorithm biginteger integer-division

我正在创建自己的BigInt类,将数字拆分为7位数。 (即以10,000,000为基数)

我实现了加法,减法和乘法,现在我正在实现除法和mod。我编写了一个代码,通过长除法进行除法(通过除以最高有效数字来估算数字),并且它可以工作。

然而,它太慢了。当我测试108位数字和67位数字的操作时,计算除法需要1.9ms,比其他操作慢得多(计算加法/减法0.007~0.008ms,计算乘法0.1ms)。

与用于快速乘法的Karatsuba和FFT算法一样,存在用于计算除法的算法? Wikipedia演示了一些除法算法(计算除数的乘法逆并将其与除数相乘),但我认为这对我实施除法没有多大帮助。我也阅读了“大整数方法”部分,但这对我也没有帮助...... :(

3 个答案:

答案 0 :(得分:3)

大整数算术的标准参考是Donald Knuth的书计算机编程艺术,第2卷,第4.3节。他的划分算法基本上是小学校算法,有一些小的改进。

顺便说一句,实现大整数运算的most people使用2的幂而不是10的幂作为其数字系统的基数。

答案 1 :(得分:1)

我建议您查看GMP library的源代码,并了解JavaScript所需的功能,或了解它是如何完成的。

如果有一个好的算法,这个库很可能会有它;它是在LGPL下发布的。

答案 2 :(得分:1)

对于合理快速的除法算法,请查看http://myweb.lmu.edu/dmsmith/MComp1996.pdf

它仍然是O(n ^ 2)但对中等长度有效。当您使用小于字大小的基础时,它尤其适用。几年前,我用Python实现了它。代码隐藏在http://home.comcast.net/~casevh/decint_041.tar.gz中。查找函数smithdiv()和remainder_norm()。