Максимальное значение Java Biginteger в pow

У меня есть код, который получит значение экспоненты из заданного ввода:

BigInteger a= new BigInteger(2,10);       
BigInteger b; 
b=a.pow(9999999999);

Он работает, когда значение меньше 7 цифр. Например:

BigInteger a= new BigInteger(2,10);       
BigInteger b; 
b=a.pow(1234567);

Мой код позволяет или невозможно иметь 10 цифр в показателе степени?

Я использую JDK 1.8.


person Drian Drian    schedule 01.10.2019    source источник
comment
pow принимает параметр int, а 9999999999 не находится в диапазоне int.   -  person Michał Krzywański    schedule 01.10.2019
comment
это не проблема bigInteger, как сказал @michalk, это параметр, который является int   -  person pvpkiran    schedule 01.10.2019
comment
Посмотрите на повторяющийся вопрос и проверьте, почему это невозможно (или как это преодолеть)   -  person Michał Krzywański    schedule 01.10.2019
comment
есть ли обходной путь или его невозможно преодолеть?   -  person Drian Drian    schedule 01.10.2019


Ответы (2)


BigInteger.pow() существует только для int параметров, так что нельзя сразу взять мощность больше Integer.MAX_VALUE.

Эти числа также были бы невероятно большими (например, «быстро приближаться к количеству частиц в наблюдаемой Вселенной и проходить мимо»), если бы вы могли это сделать, и для этого очень мало применений.

Обратите внимание, что операция «мощность по модулю», которая часто используется в криптографии, реализуется с помощью BigInteger.modPow(), который действительно принимает BigInteger аргументов и поэтому может эффективно обрабатывать произвольно большие значения.

person Joachim Sauer    schedule 01.10.2019
comment
Так что я должен использовать modPow, чтобы это работало @joachim - person Drian Drian; 01.10.2019
comment
@DrianDrian: это действительно зависит от того, для чего вам это нужно, поэтому я не знаю. Если вы планировали позвонить pow, а затем позвонить mod по этому номеру, то да, modPow даст тот же результат, будет гораздо быстрее, а также будет работать со значительно большими числами. Если вы на самом деле хотите продолжать обрабатывать чрезвычайно большое число, которое производит pow, каким-то другим способом, то modPow не замена, которая вам поможет. - person Joachim Sauer; 01.10.2019

powint. диапазон int равно от -2147483648 до 2147483647, поэтому ответ зависит от того, какие 10 цифр вы используете. Если эти 10 цифр равны 1 234 567 890, ничего страшного, они в пределах допустимого диапазона (хотя потенциально вы получите очень, очень большое BigInteger, что может расширить пределы вашей памяти); если они 9999999999, как в вашем вопросе, это не нормально, это вне диапазона.

Например, это компилирует:

int a = 1234567890;

Это не:

int b = 9999999999;
        ^--------------- error: integer number too large: 9999999999
person T.J. Crowder    schedule 01.10.2019
comment
так что если мне нужно изменить свой код или найти другой способ выполнить задачу? - person Drian Drian; 01.10.2019
comment
@DrianDrian - Да, . Но две вещи: 1. BigInteger не требуется для поддержки числа в нужном вам диапазоне. Требуется только поддерживать числа до 2 в степени Integer.MAX_VALUE. 2. Даже если бы это было так, на вычисление ушло бы долгое время, а результатом было бы действительно огромное число. Я подозреваю, что у вас закончилась память. Учтите, что 2 в степени 999 – это примерно 536xxx, где xxx – 297 нулей. - person T.J. Crowder; 01.10.2019