2011-01-03 3 views
15

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

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

BigInteger.pow(BigInteger) 

Спасибо.

+0

'BigInteger' не может представлять числа бесконечного размера, он может представлять только числа« close to »произвольного размера. Максимальное отображаемое число зависит от вашей реализации (внутренние структуры данных) и доступной памяти кучи. –

+0

Зачем вам это нужно? Как и Саид, ниже даже наименьшее такое значение, когда int недостаточно, слишком велико ... – Fakrudeen

+0

Это имеет смысл, когда вы вычисляете modulo 'BigInteger', в этом случае он существует: http://download.oracle.com/javase /6/docs/api/java/math/BigInteger.html#modPow(java.math.BigInteger,%20java.math.BigInteger) – starblue

ответ

1

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

2

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

+0

@Fakrudeen, это NPC в космосе. –

+0

Вычислительная мощность не является NPC. Это много многочлен. Для примера algo. см. ответ Кейта. Вычисление n^m является самым большим (mlogn)^2 * logm, которое явно меньше (max (n, m))^4. Также ваше определение NPC неверно. NPC означает, что вы можете проверить ответ в полиномиальное время, но решение NP сложно (полином в недетерминированной модели ТМ). – Fakrudeen

+0

NPC в космосе подразумевал бы atleast NPC вовремя, потому что использование этого самого пространства займет время NPC! – Fakrudeen

17

Вы можете написать свой собственный, используя 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

+1 за то, что это возможно (хотя это, вероятно, не очень хорошая идея) –

+0

@Sean Patrick Floyd, @Keith Randall, Можно писать код как простой как это, но это невозможно использовать, что такое использование большого целого коэффа в этом случае? Вы могли использовать диапазон большого целого, который не в int ????? Этот код просто sl ow, потому что biginteger очень медленнее, чем int. –

+1

Да, это будет довольно медленно и, вероятно, не очень полезно. Но он отвечает на вопрос OP о том, как проверить, насколько большой BigInteger он может сделать. И тот же алгоритм полезен при использовании модульной арифметики - см. BigInteger.modPow, который принимает показатель BigInteger. –

6

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

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

+0

плюс один для части «BTW» ... вопрос еще больше, а что, если я только храню такой «БОЛЬШОЙ» BigInteger в переменной типа BigInteger? Я сделал это, разделил его на другой BigInteger и попытался получить остаток. Затем я попытался распечатать остаток, но консоль занимает слишком много времени, чтобы показать остаток. – Mukit09

+0

@ Mukit09, если все, что вам нужно, это остаток, а это относительно мало, скорее всего, более эффективно просто рассчитывать остаток вместо большого значения. например 'pow' может быть очень дорогим, но' modPow' может быть значительно быстрее. Примечание. Консоли esp консоли DOS очень медленные. Вместо этого попробуйте записать номер в файл. –

+0

Спасибо за ваш ответ. Моя проблема решена, но я хочу знать этот факт сейчас. Когда я пытался хранить такой BIG BigInteger в переменной, я думаю, это тоже проблема, так как моя оперативная память не может дать такие пробелы этой переменной. Не могли бы вы рассказать мне, не ошибаюсь ли я? – Mukit09

8

Вы можете сделать это только в Java модульной арифметики, то есть вы можете сделать а^Ь Mod C, где а, Ь, с являются BigInteger номера.

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

BigInteger modPow(BigInteger exponent, BigInteger m) 

Read the BigInteger.modPow documentation here.

-4

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

Так ответьте на ваш вопрос, это

BigValue1.pow(BigValue2.intValue()) 
+0

Не поднимает ограничения, о которых спрашивает ОП. – EJP

0

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

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

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