10
我想知道BigInt和其他类似的东西是如何实现的。我试图查看JAVA源代码,但它对我来说都是希腊语和拉丁语。 你能否用言语解释我的算法 - 没有代码,以便我明白当我使用JAVA API中的某些东西时我实际使用的是什么。 关于BigNums实现如何工作?
我想知道BigInt和其他类似的东西是如何实现的。我试图查看JAVA源代码,但它对我来说都是希腊语和拉丁语。 你能否用言语解释我的算法 - 没有代码,以便我明白当我使用JAVA API中的某些东西时我实际使用的是什么。 关于BigNums实现如何工作?
从概念上讲,就像你手动任意大小算术一样。你有类似于数组值的东西,以及用于数组上的各种操作的算法。如果你想添加100
到901
。你开始用两个数字作为数组:
[0, 1, 0, 0]
[0, 9, 0, 1]
当您添加,您除了算法从右边开始,需要0+1
,给人1
,0+0
,给人0
,并且 - 现在棘手的问题 - 9+1
给10
,但现在我们需要进行,所以我们在下一列加1,并将(9+1)%10
放入第三列。
当你的数字变得足够大 - 在这个例子中大于9999 - 那么你必须以某种方式分配更多的空间。
当然,如果您将号码存储在反向的顺序中,这当然会稍微简化。
真正的实现使用完整的单词,所以模数实际上是两个大的幂,但概念是相同的。
Knuth上有很好的一节。
非常感谢:) – shahensha 2010-09-03 10:39:18
在Numerical Recipes中还有一个部分(它紧随Knuth)。棘手的部分是获得乘法权。学校算法不能很好地扩展,所以你使用技巧(例如FFT)。一旦你有乘法,你可以用它来表达很多事情。 – 2011-11-02 08:32:14