我正在做一些大整数计算,我需要将 BigInteger 提升到另一个 BigInteger 的幂。.pow() 方法可以满足我的要求,但需要一个 int 值作为参数。.modPow 方法将 BigInteger 作为参数,但我不希望得到与我要计算的值一致的答案。
我的 BigInteger 指数太大而无法表示为 int,有人可以建议一种解决此限制的方法吗?
我正在做一些大整数计算,我需要将 BigInteger 提升到另一个 BigInteger 的幂。.pow() 方法可以满足我的要求,但需要一个 int 值作为参数。.modPow 方法将 BigInteger 作为参数,但我不希望得到与我要计算的值一致的答案。
我的 BigInteger 指数太大而无法表示为 int,有人可以建议一种解决此限制的方法吗?
您不应该尝试用另一个极大数来计算极大数的幂。结果数字将使用大量内存。如果你计算a.pow(b)
它会有大约log(a)*b
数字。如果b
太大而无法放入整数,那么即使是非常小a
的结果值也将有数十亿位。
尝试重新考虑您要实现的目标以及如何在不执行此操作的情况下实现它。
实际的解决方案是将指数从 BigInteger 转换为 int。
如果您因为指数太大而无法做到这一点,那么您的算法将无法实现。结果数字几乎肯定会太大而无法表示为 BigInteger。(BigInteger 使用字节数组来表示数字,Java 数组的最大大小是2**31 - 1
元素,无论堆有多大。)即使您实现了一个表示数字的“BiggerInteger”类,您也会很快就会突破机器物理内存大小的限制。(并且进行计算所花费的时间N.pow(M)
将是...... NP棘手......O((MlogN)^M)
我认为)。
当然,如果你取的幂是0
,1
或-1
,那么结果很容易适合BigInteger
。但在这些情况下,有更好的方法来计算功率:-)。
您找不到“Java BigInteger to-the-power BigInteger”的值,因为根据 JavaDoc“BigInteger 必须支持 -2^Integer.MAX_VALUE(不包含)到 +2^Integer.MAX_VALUE(不包含)范围内的值”并且可能支持该范围之外的值。”
因此,Java BigInteger 不支持大于 2^Integer.MAX_VALUE 的任何内容。这就是为什么 pow 方法不接受任何高于 int 的参数的原因。
希望这个答案有帮助。