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