BigInteger.pow(BigInteger的)?

时间:2011-01-03 05:39:34

标签: java math biginteger pow

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

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

BigInteger.pow(BigInteger)

感谢。

8 个答案:

答案 0 :(得分:21)

您可以使用repeated squaring编写自己的代码:

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

可能不适用于否定基础或指数。

答案 1 :(得分:11)

您只能通过模块化算法在 Java 中执行此操作,这意味着您可以执行 a ^ b mod c ,其中 a,b,c BigInteger个数字。

这是使用:

完成的
 BigInteger modPow(BigInteger exponent, BigInteger m) 

Read the BigInteger.modPow documentation here.

答案 2 :(得分:8)

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

顺便说一句:你永远无法读懂这样的数字。如果您试图将其打印出来,则需要一生的时间来阅读它。

答案 3 :(得分:2)

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

答案 4 :(得分:1)

java不会让你做BigInteger.Pow(BigInteger)但是你可以把它放到循环中的最大整数中,看看抛出ArithmeticException的地方或者由于内存不足导致的其他错误。

答案 5 :(得分:1)

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

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

获取大型Prime P>>>> X ^ Y并且做Z = X.modPow(Y,P);

答案 6 :(得分: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

答案 7 :(得分:-4)

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

所以回答你的问题,这是

BigValue1.pow(BigValue2.intValue())