4

我正在寻找一个 Java 库,它可以处理真正巨大的数字或关于如何自己实现它的建议。我们正在谈论超越BigInteger例如2^39614081257132168796771974655+1怎么样。

显然,理论上,我可以使用一个TreeSet<BigInteger>, 每位一个条目并做所有的数学老派,但我正在寻找可以使用内置数学硬件对这些数字进行一些真正数学运算的东西。我不期待任何真正快速的东西,但我非常想接近。

设置位的数量可能非常少 - 我代表 G2 多项式。

有人知道那里有什么吗?

我怀疑包的一个功能必须是setBit(BigInteger i).

添加

感谢Apfloat的建议。可悲的是,以下是不可能的。它抱怨第二个参数必须是 a long

    Apint two = new Apint(2);
    Apint big = new Apint("39614081257132168796771974655");
    ApintMath.pow(two, big);

请注意,我也愿意接受有关如何自己执行此操作的建议。

添加- 尝试重新打开。

请参阅user2246674 的帖子,提醒我们这些数字有多么惊人——我可以向你保证,我们在这里讨论的不是一些普通的数学库,而是一些严肃Math.pow(age-of-the-universe,atoms-in_the_galaxy)的数字——我们当然不是在寻找固执己见的答案

4

2 回答 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 字节:它需要超过 QUADRILLION TERABYTES 才能在这个数量级上使用标准编码

于 2013-06-18T00:35:23.030 回答
2

您可以对此进行数学运算,但只能进行基于符号的计算,即您不能将其减少为实数,您只能将其处理为表达式。

你能举一些你想要执行的操作的例子吗?

于 2013-06-18T01:45:19.707 回答