我正在用 Java 玩数字,想看看我能做多大的数字。我的理解是 BigInteger 可以容纳无限大小的数字,只要我的计算机有足够的内存来容纳这样的数字,对吗?
我的问题是 BigInteger.pow 只接受一个 int,而不接受另一个 BigInteger,这意味着我只能使用不超过 2,147,483,647 的数字作为指数。是否可以这样使用 BigInteger 类?
BigInteger.pow(BigInteger)
谢谢。
我正在用 Java 玩数字,想看看我能做多大的数字。我的理解是 BigInteger 可以容纳无限大小的数字,只要我的计算机有足够的内存来容纳这样的数字,对吗?
我的问题是 BigInteger.pow 只接受一个 int,而不接受另一个 BigInteger,这意味着我只能使用不超过 2,147,483,647 的数字作为指数。是否可以这样使用 BigInteger 类?
BigInteger.pow(BigInteger)
谢谢。
您可以编写自己的,使用重复平方:
BigInteger pow(BigInteger base, BigInteger exponent) {
BigInteger result = BigInteger.ONE;
while (exponent.signum() > 0) {
if (exponent.testBit(0)) result = result.multiply(base);
base = base.multiply(base);
exponent = exponent.shiftRight(1);
}
return result;
}
可能不适用于负基数或指数。
您只能在Java中通过模运算来做到这一点,这意味着您可以做 a a^b mod c,其中a,b,c是BigInteger
数字。
这是使用以下方法完成的:
BigInteger modPow(BigInteger exponent, BigInteger m)
BigInteger 的底层实现仅限于 (2^31-1) * 32 位值。这几乎是 2^36 位。您将需要 8 GB 的内存来存储它,并且多次使用它来执行任何操作,例如 toString()。
顺便说一句:您将永远无法读取这样的数字。如果您尝试将其打印出来,则可能需要一生的时间才能阅读。
java不会让你做BigInteger.Pow(BigInteger),但你可以把它放在一个循环中的最大整数上,看看在哪里抛出了ArithmeticException或由于内存不足而引发的其他错误。
2^2,147,483,647 至少有 500000000 位,实际上计算 pow 是 NPC 问题,[Pow 是 NPC 的输入长度,2 个输入 (m,n),它们可以用 O(logm + logn) 编码,最多可以占用nlog(m) (最后答案占用 n log(m) 空间)这不是输入和计算大小之间的多项式关系],有一些简单的问题实际上并不容易,例如sqrt(2)是某种他们,你不能指定真正的精度(所有精度),即 BigDecimal 说可以计算所有精度,但它不能(事实上)因为到目前为止没有人解决这个问题。
我可以建议你使用 BigInteger modPow(BigInteger exponent, BigInteger m)
假设您有 BigInteger X 和 BigInteger Y,并且您想要计算 BigInteger Z = X^Y。
得到一个大的素数 P >>>> X^Y 并做 Z = X.modPow(Y,P);
对于从 Groovy 方面偶然发现这一点的任何人,完全可以将 BigInteger 传递给 BigInteger.pow()。
groovy> def a = 3G.pow(10G)
groovy> println a
groovy> println a.class
59049
class java.math.BigInteger
只需使用 .intValue() 如果您的 BigInteger 被命名为 BigValue2,那么它将是 BigValue2.intValue()
所以要回答你的问题,它是
BigValue1.pow(BigValue2.intValue())