J'ai fait quelques tests sur la méthode pow (exponent). Malheureusement, mes compétences en mathématiques ne sont pas assez fortes pour gérer le problème suivant.java.math.BigInteger pow (exposant) question
J'utilise ce code:
BigInteger.valueOf(2).pow(var);
Résultats:
- var | temps en ms
- 2000000 |
- 2500000 |
- 3000000 | 22379
- 3500000 | 32147
- 4000000 |
- 4500000 |
- 5000000 | 49922
Voir? 2,500,000 exposant est calculé presque aussi vite que 2,000,000. 4 500 000 est calculé beaucoup plus vite que 4 000 000.
Pourquoi est-ce?
Pour vous donner un peu d'aide, voici l'implémentation originale de BigInteger.pow (exposant):
public BigInteger pow(int exponent) {
if (exponent < 0)
throw new ArithmeticException("Negative exponent");
if (signum==0)
return (exponent==0 ? ONE : this);
// Perform exponentiation using repeated squaring trick
int newSign = (signum<0 && (exponent&1)==1 ? -1 : 1);
int[] baseToPow2 = this.mag;
int[] result = {1};
while (exponent != 0) {
if ((exponent & 1)==1) {
result = multiplyToLen(result, result.length,
baseToPow2, baseToPow2.length, null);
result = trustedStripLeadingZeroInts(result);
}
if ((exponent >>>= 1) != 0) {
baseToPow2 = squareToLen(baseToPow2, baseToPow2.length, null);
baseToPow2 = trustedStripLeadingZeroInts(baseToPow2);
}
}
return new BigInteger(result, newSign);
}
avez-vous fait un million de courses de chacun de ces appels et la moyenne des résultats pour obtenir la table que vous avez fournie? – vicatcu
De combien de temps calculez-vous le temps? –
@vicatcu: Je pense qu'il est sûr de supposer qu'il n'a pas attendu 3 ans pour obtenir les résultats. –