BigInteger.pow(BigInteger)?

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

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

BigInteger.pow(BigInteger)

Спасибо.

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

 BigInteger modPow(BigInteger exponent, BigInteger m) 

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

Ответ 7

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

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

Получить большой Prime P → → X ^ Y и сделать Z = X.modPow(Y, P);

Ответ 8

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

Чтобы ответить на ваш вопрос,

BigValue1.pow(BigValue2.intValue())