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.
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.
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 BigInteger
numbers.
Ceci est fait en utilisant:
BigInteger modPow(BigInteger exponent, BigInteger m)
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.
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.
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.
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);
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