Я сделал несколько тестов по методу pow (exponent). К сожалению, мои математические навыки недостаточно сильны для решения следующей проблемы.java.math.BigInteger pow (экспоненциальный) вопрос
Я использую этот код:
BigInteger.valueOf(2).pow(var);
Результаты:
- уаг | время в мс
- 2000000 |
- 2500000 |
- 3000000 | 22379
- 3500000 | 32147
- 4000000 |
- 4500000 |
- 5000000 | 49922
См.? Показатель 2,500,000 рассчитывается почти так же быстро, как 2 000 000. 4,500,000 рассчитывается намного быстрее, чем 4 000 000.
Почему?
Чтобы дать вам некоторую помощь, вот оригинальная реализация BigInteger.pow (экспоненты):
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);
}
вы сделали миллион прогонов каждого из этих вызовов и усреднить результаты, чтобы получить таблицу, которую вы предоставили? – vicatcu
Сколько пробегов вы усредняете время? –
@vicatcu: Я думаю, можно с уверенностью предположить, что он не ждал 3 года, чтобы получить результаты. –