web-dev-qa-db-fra.com

BigInteger.pow (BigInteger)?

Je joue avec des nombres en Java et je veux voir combien je peux faire. D'après ce que je comprends, BigInteger peut contenir un nombre infini de tailles, tant que mon ordinateur dispose de suffisamment de mémoire pour contenir un tel nombre, n'est-ce pas?

Mon problème est que BigInteger.pow accepte uniquement un entier, pas un autre BigInteger, ce qui signifie que je ne peux utiliser qu'un nombre allant jusqu'à 2 147 483 647 en tant qu'exposant. Est-il possible d'utiliser la classe BigInteger en tant que telle?

BigInteger.pow(BigInteger)

Merci.

17
PeterW

Vous pouvez écrire le vôtre en utilisant quadrature répétée :

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

pourrait ne pas fonctionner pour les bases négatives ou les exposants.

20
Keith Randall

Vous ne pouvez le faire que dans Java par une arithmétique modulaire, ce qui signifie que vous pouvez faire una ^ b mod c, où a, b, c sont BigIntegernumbers.

Ceci est fait en utilisant:

 BigInteger modPow(BigInteger exponent, BigInteger m) 

Lisez la documentation BigInteger.modPow ici.

10
Raul Rene

L'implémentation sous-jacente de BigInteger est limitée à (2 ^ 31-1) * valeurs 32 bits. ce qui fait presque 2 ^ 36 bits. Vous aurez besoin de 8 Go de mémoire pour le stocker et plusieurs fois pour effectuer toute opération telle que toString ().

BTW: Vous ne serez jamais capable de lire un tel numéro. Si vous essayez de l’imprimer, il vous faudra toute une vie pour le lire.

7
Peter Lawrey

2 ^ 2.147.483.647 a au moins 500000000 chiffres, en fait, la puissance de calcul est NPC problème, [Pow est NPC dans la longueur de l'entrée, 2 entrée (m, n) qu'ils peuvent être codé en O (logm + logn) et peut prendre jusqu’à nlog (m) (enfin la réponse prend n log (m) d’espace) qui n’est pas une relation polynomiale entre l’entrée et la taille de calcul], il existe quelques problèmes simples qui ne sont pas faciles en fait, par exemple, sqrt (2) est une sorte d'entre eux, vous ne pouvez pas spécifier la précision vraie (toutes les précisions), c'est-à-dire que BigDecimal dit qu'il peut calculer toutes les précisions, mais il ne peut pas (en fait) car personne n'a résolu le problème. ceci jusqu'à maintenant.

2
Saeed Amiri

Java ne vous laissera pas faire BigInteger.Pow (BigInteger) mais vous pouvez simplement le définir sur l'entier maximal d'une boucle et voir où une exception ArithmeticException est générée ou une autre erreur due à un manque de mémoire.

1
Abraham Adam

Je peux vous suggérer d'utiliser BigInteger modPow (exposant BigInteger, BigInteger m)

Supposons que vous ayez BigInteger X et BigInteger Y et que vous souhaitiez calculer BigInteger Z = X ^ Y.

Obtenez un grand P >>>> X ^ Y et faites Z = X.modPow (Y, P);

1
panto111088

Pour tous ceux qui tombent sur ce problème du côté Groovy, il est tout à fait possible de passer un 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
haventchecked