Tôi đã thực hiện một số thử nghiệm về phương pháp pow (số mũ). Thật không may, kỹ năng toán học của tôi không đủ mạnh để xử lý vấn đề sau.câu hỏi java.math.BigInteger pow (số mũ)
Tôi đang sử dụng mã này:
BigInteger.valueOf(2).pow(var);
Kết quả:
- var | thời gian trong ms
- 2000000 |
- 2500000 |
- 3000000 | 22379
- 3500000 | 32147
- 4000000 |
- 4500000 |
- 5000000 | 49922
See? 2.500.000 số mũ được tính toán gần như nhanh chóng là 2.000.000. 4.500.000 được tính toán nhanh hơn nhiều, sau đó là 4.000.000.
Tại sao lại như vậy?
Để cung cấp cho bạn một số giúp đỡ, đây là việc thực hiện ban đầu của BigInteger.pow (mũ):
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);
}
bạn đã làm một triệu chạy của mỗi người trong số những cuộc gọi và trung bình các kết quả để có được bảng bạn cung cấp? – vicatcu
Bạn tính trung bình bao nhiêu lần chạy? –
@vicatcu: Tôi nghĩ rằng nó an toàn để cho rằng anh ta không đợi 3 năm để có được kết quả. –