如何实现(快速)bigint 除法?

Posted

技术标签:

【中文标题】如何实现(快速)bigint 除法?【英文标题】:How to implement (fast) bigint division? 【发布时间】:2012-01-16 17:07:40 【问题描述】:

我目前正在制作自己的 BigInt 类,将数字分成 7 位数字。 (即以 10,000,000 为基数)

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

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

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

【问题讨论】:

好问题,但您可以考虑programmers.stackexchange.com 而不是***。 简单的谷歌搜索展示了关于这个的文章,我认为这不是一件容易的工作,但主要的想法是使用快速乘法,所有的算法都是围绕这个。例如你可以看看fast division in large integers 你有机会开源这个吗?目前还没有一个好的 JS 的 bigint 库。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

我建议您查看 GMP library 的源代码并将您需要的功能移植到 javascript,或者了解它是如何完成的。

如果有一个好的算法,这个库很可能会有它;它是根据 LGPL 分发的。

【讨论】:

你也可以使用 LLVM -> javascript (emscripten) 编译器来自动移植整个库 @Raynos 我不会打赌 emscripten 的输出可以从 JS 调用而没有重大痛苦,尤其是跨 emscription 版本。 我读了一些代码(divexact.cdivegcd.c),似乎包含了按位运算,但我无法实现(因为我表示的是基数为 10^7 的数字) ...【参考方案3】:

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

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

【讨论】:

以上是关于如何实现(快速)bigint 除法?的主要内容,如果未能解决你的问题,请参考以下文章

快速精确 bigint 阶乘

android中如何实现除法的保留小数点后2位,四舍五入!

FPGA中如何实现除法?

如何使 postgres 快速搜索

使用按位运算符实现除法

SQL如何做除法