java math biginteger pow

java - BigInteger.pow(BigInteger)?



math (8)

Para cualquiera que tropiece con esto desde el lado Groovy de las cosas, es totalmente posible pasar un BigInteger a 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

Estoy jugando con números en Java, y quiero ver qué tan grande puedo hacer un número. Tengo entendido que BigInteger puede contener un número de tamaño infinito, siempre que mi computadora tenga suficiente memoria para contener ese número, ¿correcto?

Mi problema es que BigInteger.pow solo acepta un int, no otro BigInteger, lo que significa que solo puedo usar un número hasta 2.147.483.647 como exponente. ¿Es posible usar la clase BigInteger como tal?

BigInteger.pow(BigInteger)

Gracias.


2 ^ 2,147,483,647 tiene al menos 500000000 dígitos, de hecho, el pow es un problema NPC, [Pow es NPC en la longitud de entrada, 2 entradas (m, n) que pueden codificarse en O (logm + logn) y pueden tomar hasta nlog (m) (por fin la respuesta toma n log (m) espacio) que no es una relación polinomial entre la entrada y el tamaño de cálculo], hay algunos problemas simples que de hecho no son fáciles, por ejemplo, sqrt (2) es algún tipo de ellos, no se puede especificar la precisión verdadera (todas las precisiones), es decir, BigDecimal dice que puede calcular todas las precisiones pero no puede (de hecho) porque nadie resolvió esto hasta ahora.


La implementación subyacente de BigInteger está limitada a (2 ^ 31-1) * valores de 32 bits. que es casi 2 ^ 36 bits. Necesitará 8 GB de memoria para almacenarlo y muchas veces esto para realizar cualquier operación en él, como toString ().

Por cierto: nunca podrás leer tal número. Si trataste de imprimirlo, llevaría mucho tiempo leerlo.


Puedes escribir el tuyo, usando la escuadra repetida :

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

podría no funcionar para bases negativas o exponentes.


java no le permitirá hacer BigInteger.Pow (BigInteger) pero puede simplemente ponerlo en el entero máximo en un bucle y ver dónde se arroja una ArithmeticException u otro error debido a que se está quedando sin memoria.


Solo use .intValue () Si su BigInteger se llama BigValue2, entonces sería BigValue2.intValue ()

Entonces, para responder a su pregunta, es

BigValue1.pow(BigValue2.intValue())


Solo puede hacer esto en Java mediante aritmética modular, lo que significa que puede hacer un a ^ b mod c , donde a, b, c son números BigInteger .

Esto se hace usando:

BigInteger modPow(BigInteger exponent, BigInteger m)

Lea la documentación de BigInteger.modPow aquí.


Puedo sugerirle que haga uso de BigInteger modPow (BigInteger exponente, BigInteger m)

Supongamos que tiene BigInteger X y BigInteger Y y desea calcular BigInteger Z = X ^ Y.

Obtenga un gran P principal >>>> X ^ Y y haga Z = X.modPow (Y, P);