Ich habe einige Tests auf Pow (Exponent) -Methode. Leider sind meine mathematischen Fähigkeiten nicht stark genug, um das folgende Problem zu lösen.java.math.BigInteger pow (Exponent) Frage
Ich verwende diesen Code:
BigInteger.valueOf(2).pow(var);
Ergebnisse:
- var | Zeit in ms
- 2000000 |
- 2500000 |
- 3000000 | 22379
- 3500000 | 32147
- 4000000 |
- 4500000 |
- 5000000 | 49922
Sehen? 2.500.000 Exponenten werden fast so schnell wie 2.000.000 berechnet. 4.500.000 wird viel schneller als 4.000.000 berechnet.
Warum ist das?
Sie etwas Hilfe zu geben, ist hier die ursprüngliche Implementierung von BigInteger.pow (Exponent):
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);
}
haben Sie eine Million Durchläufe jeder dieser Anrufe zu tun und die Ergebnisse im Durchschnitt die bekommen Tabelle Sie zur Verfügung gestellt? – vicatcu
Aus wie vielen Läufen schätzen Sie die Zeit? –
@vicatcu: Ich denke, es ist sicher anzunehmen, dass er nicht 3 Jahre gewartet hat, um die Ergebnisse zu erhalten. –