我对 pow(exponent) 方法做了一些测试。不幸的是,我的数学能力不足以处理以下问题。
我正在使用这段代码:
BigInteger.valueOf(2).pow(var);
结果:
- 变量 | 以毫秒为单位的时间
- 2000000 | 11450
- 2500000 | 12471
- 3000000 | 22379
- 3500000 | 32147
- 4000000 | 46270
- 4500000 | 31459
- 5000000 | 49922
看?2,500,000 指数的计算速度几乎与 2,000,000 一样快。4,500,000 的计算速度比 4,000,000 快得多。
这是为什么?
为了给你一些帮助,这里是 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);
}