如何实现大数字的长划分(bignums)

时间:2010-07-07 23:45:53

标签: division bignum gmp

我正在尝试为bignums实施长期划分。由于嵌入式编程的局限性,遗憾的是我无法使用像GMP这样的库。此外,我希望学习如何实施它的智力练习。到目前为止,我已经使用任意长度的字节数组完成了加法和乘法运算(所以每个字节就像一个基数为256的数字)。

我只是想开始实施除法/模数,我想知道从哪里开始?我在网上找到了很多高度优化(又名不可读)的代码,这对我没有帮助,而且我发现了很多高技术的数学白皮书,我无法弥合理论和实现之间的差距。

如果有人可以推荐一种流行的算法,并指出一个简单易懂的解释,它倾向于暗示,那就太棒了。

-edit:我需要算法,当被除数为~4000位,除数为~2000位

-edit:这个算法是否适用于base-256? http://courses.cs.vt.edu/~cs1104/BuildingBlocks/divide.030.html

-edit:这是我应该真正使用的算法(牛顿师)吗? http://en.wikipedia.org/wiki/Division_(digital)#Newton.E2.80.93Raphson_division

3 个答案:

答案 0 :(得分:5)

如果您想学习,请从小学时使用的铅笔和纸张方法开始。信不信由你,这与大多数bignum库中使用的O(n ^ 2)算法基本相同,用于您正在寻找的范围内的数字。棘手的第一步称为“商估计”,这可能是最难理解的。一旦你明白了,其余部分应该很容易。

一个很好的参考是Knuth的“Seminumerical Algorithms”。他在文本和练习中都有很多关于进行商估计的方法的讨论。那本书的章节专门讨论了bignum的实现。

答案 1 :(得分:1)

你在你的代码中使用void Four1(long double [],int,int)然后进行卷积然后进行逆变换,我得到了乘法运算但是当我试图以相同的方式进行除法时它吐出来一个结果然后退出所以我忍不住,但如果你有一个名为" C ++中的数字食谱"转到接近尾声,你会发现你正在寻找的东西实际上从第916页到第926页开始。

答案 2 :(得分:0)

此问题已超过2年,但对于此大小的数字,您可以查看OpenSSL源代码。它使用这个大小的数字进行RSA,因此有许多数学例程针对1000到4000位数进行了优化。