有没有一个适用于大整数的库?

4
我正在寻找一个可以处理真正巨大数字的Java库,或者关于如何自己实现这个的建议。我们谈论的远远超出了BigInteger。例如,2^39614081257132168796771974655+1。
显然,理论上我可以利用TreeSet,每个位一个条目,并使用老式的方法进行所有数学计算,但我正在寻找一些可以使用内置数学硬件对这些数字进行实际数学运算的东西。我不指望任何真正快速的东西,但我非常希望能够接近。
很可能设置位数可能相当小-我正在表示G2多项式。
有人知道外面有什么吗?
我怀疑包的一个特点必须是setBit(BigInteger i)。
添加
感谢Apfloat的建议。不幸的是,以下操作不可能。它抱怨第二个参数必须是long。
    Apint two = new Apint(2);
    Apint big = new Apint("39614081257132168796771974655");
    ApintMath.pow(two, big);

请注意,我也愿意听取如何自己完成此操作的建议。 < p > < strong > 添加 - 尝试重新打开。 < / p > 请参见 user2246674's post 提醒我们这些数字是多么惊人 - 我可以向您保证,我们不是在谈论一些普通的数学库,而是在谈论一些严肃的 Math.pow(age-of-the-universe,atoms-in_the_galaxy) 类型的数字 - 我们 当然 不是在寻找只有 意见性答案 的解决方案。

添加了或者建议我如何自己实现它 - OldCurmudgeon
@user2246674 - 不确定您的英语是否正确,请再确认一下。 - OldCurmudgeon
@user2246674 - 大幅简化 - 好吗? - OldCurmudgeon
@OldCurmudgeon 考虑搜索可以“解代数方程”的数学库(例如像Matlab一样);可能会有一些相关的结果。 - user2246674
一个 TreeSet<BigInteger> 对我来说听起来不错,老实说。 - Louis Wasserman
显示剩余6条评论
2个回答

8
这不是一个答案;我认为重要的是意识到这样一个数字有多么大,以及为什么标准的任意精度数学库永远无法工作。
该库必须直接支持处理高阶方程(例如驱动 Wolfram|Alpha的方程)。我认为这是一个很好的问题,特别是因为这种数量级的数字必须被特别处理。
一个标准的比特编码在这里行不通 - 如果可能的话,那么 BigInteger (以及提到的 Apfloat) 也可能足够。根本问题在于2^39614081257132168796771974655是巨大的。像,真的,非常非常大。只有使用方程才有意义处理这么大的数字!
让我们通过查看几个常见的最大整数值所需的存储来推断一个标准的一位或二位补码编码需要多少:
- 2^8需要8位;或1字节(8/8) - 2^32需要32位;或4字节(32/8) - 2^64需要64位;或8字节(64/8)
因此,如果使用类似的编码,则2^39614081257132168796771974655需要39614081257132168796771974655/8(约为5x10^27)字节的内存。
1 TB内存仅为1x10^12字节:使用标准编码处理这么大的数字需要超过1千万亿TB

1
好的叙述 - 其中讽刺的部分是,2^39614081257132168796771974655 只有 一个 位被设置。你四千万亿字节中的每一个其他位实际上都是零!! - OldCurmudgeon

2
你可以对此进行数学计算,但只能进行符号计算,即不能将其简化为实数,只能处理表达式。
你能举一些你想执行的操作的例子吗?

我想测试一个96位的G(2)多项式的原始性 - OldCurmudgeon
为此,您需要一个代数库,这样您就不需要计算值,并且您需要一些聪明的数学来避免暴力搜索,例如您需要类似于 (a^n + b^n) 的东西,其中 n 是奇数 = (a + b)*sumOf(i from 0 to n, - * -1 ^ i * a^i * b^(n-1-i)) 这意味着由于您的幂是奇数,因此可以应用此方法并将其分解。 - Peter Lawrey
感谢您的建议。在G(2)中工作的好处是大多数标准数学函数都有二进制等效物。例如,如果将多项式表示为位,则加/减实际上都是异或运算。 - OldCurmudgeon
1
这是一个很棒的介绍,请点击此处 - OldCurmudgeon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接