2010-09-02 57 views
10

我想知道BigInt和其他类似的东西是如何实现的。我试图查看JAVA源代码,但它对我来说都是希腊语和拉丁语。 你能否用言语解释我的算法 - 没有代码,以便我明白当我使用JAVA API中的某些东西时我实际使用的是什么。 关于BigNums实现如何工作?

回答

11

从概念上讲,就像你手动任意大小算术一样。你有类似于数组值的东西,以及用于数组上的各种操作的算法。如果你想添加100901。你开始用两个数字作为数组:

[0, 1, 0, 0] 
[0, 9, 0, 1] 

当您添加,您除了算法从右边开始,需要0+1,给人10+0,给人0,并且 - 现在棘手的问题 - 9+110,但现在我们需要进行,所以我们在下一列加1,并将(9+1)%10放入第三列。

当你的数字变得足够大 - 在这个例子中大于9999 - 那么你必须以某种方式分配更多的空间。

当然,如果您将号码存储在反向的顺序中,这当然会稍微简化。

真正的实现使用完整的单词,所以模数实际上是两个大的幂,但概念是相同的。

Knuth上有很好的一节。

+1

非常感谢:) – shahensha 2010-09-03 10:39:18

+1

在Numerical Recipes中还有一个部分(它紧随Knuth)。棘手的部分是获得乘法权。学校算法不能很好地扩展,所以你使用技巧(例如FFT)。一旦你有乘法,你可以用它来表达很多事情。 – 2011-11-02 08:32:14