26

我正在用 Java 玩数字,想看看我能做多大的数字。我的理解是 BigInteger 可以容纳无限大小的数字,只要我的计算机有足够的内存来容纳这样的数字,对吗?

我的问题是 BigInteger.pow 只接受一个 int,而不接受另一个 BigInteger,这意味着我只能使用不超过 2,147,483,647 的数字作为指数。是否可以这样使用 BigInteger 类?

BigInteger.pow(BigInteger)

谢谢。

4

8 回答 8

23

您可以编写自己的,使用重复平方

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;
}

可能不适用于负基数或指数。

于 2011-01-03T06:16:57.110 回答
13

您只能在Java中通过模运算来做到这一点,这意味着您可以做 a a^b mod c,其中a,b,cBigInteger数字。

这是使用以下方法完成的:

 BigInteger modPow(BigInteger exponent, BigInteger m) 

在此处阅读BigInteger.modPow文档。

于 2013-01-10T17:32:16.047 回答
10

BigInteger 的底层实现仅限于 (2^31-1) * 32 位值。这几乎是 2^36 位。您将需要 8 GB 的内存来存储它,并且多次使用它来执行任何操作,例如 toString()。

顺便说一句:您将永远无法读取这样的数字。如果您尝试将其打印出来,则可能需要一生的时间才能阅读。

于 2011-01-03T09:18:16.443 回答
1

java不会让你做BigInteger.Pow(BigInteger),但你可以把它放在一个循环中的最大整数上,看看在哪里抛出了ArithmeticException或由于内存不足而引发的其他错误。

于 2011-01-03T05:51:08.243 回答
1

2^2,147,483,647 至少有 500000000 位,实际上计算 pow 是 NPC 问题,[Pow 是 NPC 的输入长度,2 个输入 (m,n),它们可以用 O(logm + logn) 编码,最多可以占用nlog(m) (最后答案占用 n log(m) 空间)这不是输入和计算大小之间的多项式关系],有一些简单的问题实际上并不容易,例如sqrt(2)是某种他们,你不能指定真正的精度(所有精度),即 BigDecimal 说可以计算所有精度,但它不能(事实上)因为到目前为止没有人解决这个问题。

于 2011-01-03T06:00:11.630 回答
1

我可以建议你使用 BigInteger modPow(BigInteger exponent, BigInteger m)

假设您有 BigInteger X 和 BigInteger Y,并且您想要计算 BigInteger Z = X^Y。

得到一个大的素数 P >>>> X^Y 并做 Z = X.modPow(Y,P);

于 2016-11-21T10:18:20.903 回答
0

对于从 Groovy 方面偶然发现这一点的任何人,完全可以将 BigInteger 传递给 BigInteger.pow()。

groovy> def a = 3G.pow(10G) 
groovy> println a 
groovy> println a.class 

59049
class java.math.BigInteger

http://docs.groovy-lang.org/2.4.3/html/groovy-jdk/java/math/BigInteger.html#power%28java.math.BigInteger%29

于 2015-05-01T05:33:51.377 回答
-5

只需使用 .intValue() 如果您的 BigInteger 被命名为 BigValue2,那么它将是 BigValue2.intValue()

所以要回答你的问题,它是

BigValue1.pow(BigValue2.intValue())
于 2013-11-09T04:48:59.607 回答