BigInteger.pow (BigInteger)? - PullRequest
       27

BigInteger.pow (BigInteger)?

20 голосов
/ 03 января 2011

Я играю с числами в Java, и хочу посмотреть, насколько большое число я могу сделать. Насколько я понимаю, BigInteger может содержать несколько бесконечных размеров, если на моем компьютере достаточно памяти для хранения такого числа, верно?

Моя проблема в том, что BigInteger.pow принимает только int, а не другой BigInteger, что означает, что я могу использовать в качестве показателя степени только число до 2 147 483 647. Можно ли использовать класс BigInteger как таковой?

BigInteger.pow(BigInteger)

Спасибо.

Ответы [ 8 ]

21 голосов
/ 03 января 2011

Вы можете написать свой, используя повторный квадрат :

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

может не работать для отрицательных оснований или показателей.

11 голосов
/ 10 января 2013

Вы можете сделать это только в Java с помощью модульной арифметики, что означает, что вы можете сделать a ^ b mod c , где a, b , c являются BigInteger числами.

Это делается с помощью:

 BigInteger modPow(BigInteger exponent, BigInteger m) 

Прочитайте документацию BigInteger.modPow здесь.

8 голосов
/ 03 января 2011

Базовая реализация BigInteger ограничена (2 ^ 31-1) * 32-битными значениями.что почти 2 ^ 36 бит.Вам потребуется 8 ГБ памяти для ее хранения и много раз, чтобы выполнить любую операцию над ней, например, toString ().

Кстати: вы никогда не сможете прочитать такое число.Если вы попытаетесь распечатать его, потребуется много времени, чтобы прочитать его.

2 голосов
/ 03 января 2011

2 ^ 2 147 483 647 имеет как минимум 500000000 цифр, фактически вычисление может быть проблемой NPC, [Pow - это NPC длины входа, 2 входа (m, n), которые они могут быть закодированы в O (logm + logn) и может занять до nlog (m) (наконец, ответ занимает n log (m) пространства), которое не является полиномиальным соотношением между входом и размером вычислений], есть некоторые простые проблемы, которые на самом деле не так просты, например sqrt ( 2) является своего рода, вы не можете указать истинную точность (все точности), то есть BigDecimal говорит, что может вычислить все точности, но не может (на самом деле), потому что до сих пор никто не решил это.

1 голос
/ 21 ноября 2016

Я могу предложить вам использовать BigInteger modPow (показатель BigInteger, BigInteger m)

Предположим, у вас есть BigInteger X и BigInteger Y, и вы хотите вычислить BigInteger Z = X ^ Y.

Получите большое простое число P >>>> X ^ Y и выполните Z = X.modPow (Y, P);

1 голос
/ 03 января 2011

java не позволит вам выполнить BigInteger.Pow (BigInteger), но вы можете просто поместить его в максимальное целое число в цикле и посмотреть, где выбрасывается исключение ArithmeticException или какая-то другая ошибка из-за нехватки памяти.

0 голосов
/ 01 мая 2015

Для любого, кто сталкивается с этим со стороны 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

0 голосов
/ 09 ноября 2013

Просто используйте .intValue () Если ваш BigInteger называется BigValue2, то это будет BigValue2.intValue ()

Итак, чтобы ответить на ваш вопрос, это

BigValue1.pow(BigValue2.intValue())
...