什么是疯狂大整数除法的最快算法?
Posted
技术标签:
【中文标题】什么是疯狂大整数除法的最快算法?【英文标题】:What is the fastest algorithm for division of crazy large integers? 【发布时间】:2013-06-26 12:10:52 【问题描述】:我需要将表示为字节数组中数字的数字与非标准字节数相除。它可能是 5 个字节或 1 GB 或更多。除法应该用表示为字节数组的数字来完成,而不需要任何数字转换。
【问题讨论】:
类似Java's BigInteger? 巴雷特归约计算的是模数,而不是商数。 对于像这样的一般性问题,您应该使用***并在您阅读***并尝试过之后来这里。 ***没有回答最快的问题。我不需要应该运行几天的部门。 @Tyler: ...它通过首先计算商,然后减去除数的适当倍数来获得余数。 【参考方案1】:对于真正的大整数,分而治之的除法比教科书方法快得多。
GMP 是一个最先进的大数字库。对于几乎所有的事情,它都有几种不同算法的实现,每种算法都针对特定的操作数大小进行了调整。
Here 是 GMP 的“除法算法”文档。算法描述有点简洁,但是当你想了解更多时,它们至少可以为你提供一些信息。
Brent and Zimmermann's Modern Computer Arithmetic 是一本关于大数运算理论和实现的好书。如果您想了解已知内容,可能值得一读。
【讨论】:
是的,但是...正如我所说,这些算法比算法 D 复杂得多。分治法的主要原因是你可以使用 Karatsuba 算法,让我告诉你你编写所有这些加上一个 Karatsuba 实现将是很多工作,我的意思是 LOTTA LOTTA 工作。我不知道 OP 的程序员有多优秀,但即使是非常优秀的程序员也可以花费 MONTHS 使用分而治之的方式编写正确的实现。 @TylerDurden:嗯,他问的是“疯狂的大数”。 Karatsuba 本身还不错,因为您不会遇到二次方问题。当您开始想要实现 Toom-Cook 和各种基于 FFT 的方法,然后找出交叉点时,它开始变成大量工作。这就是你使用 GMP 的原因:) @TylerDurden:一旦你有一个快速的乘法黑盒,分而治之的除法就不会太糟糕了。取分子和分母的高半部分,递归除法,然后做一点清理。同样,调整和找到教科书和分而治之之间的交叉点是一项相当多的工作。【参考方案2】:标准的长除法算法,类似于小学长除法,是Knuth 4.3.1中描述的算法D。 Knuth 在他书中的那一部分对除法进行了广泛的讨论。这样做的结果是,有比算法 D 更快的方法,但它们并没有快很多,而且比算法 D 复杂得多。
如果您确定要获得尽可能快的算法,则可以求助于所谓的 SRT 算法。
***Division Algorithm上的方式涵盖了所有这些以及更多内容。
【讨论】:
在***链接上列出的算法中,您可能会发现 long 除法 是最有用的。不过要注意符号。 D(0) 表示数字中最不重要的值,而左移表示数字以大端方式存储(这意味着 LSD 应位于 D(n-1) )。以上是关于什么是疯狂大整数除法的最快算法?的主要内容,如果未能解决你的问题,请参考以下文章