2014-01-22 2 views
3

LargeInteger, похоже, не имеет функции pow, или если да, то он не может обрабатывать pow(0), хотя BigInteger can.pow for LargeInteger

я пытался построить мой собственный, но память, кажется, шип плохо, и может быть бесконечный цикл, как он работает бесконечно:

public static LargeInteger liPow(LargeInteger base, int exponent){ 
    if(exponent == 0){ 
     return LargeInteger.valueOf(1); 
    } 
    else if(exponent == 1){ 
     return base; 
    } 
    else{ 
     for(int i=1; i<exponent; i++){ 
      base = base.times(base); 
     } 
     return base; 
    } 
} 

Как метод pow быть разработан для LargeInteger?

+2

Ваш фактически не вычисляет 'pow()', а некоторую большую функцию 'base^(2^exp)'. – Sirko

+0

@Mysticial Спасибо, Мистицизм! Я обязательно посмотрю на это! –

+1

Проклятье. Я удалил свой комментарий так же, как вы ответили. Здесь снова: используйте этот алгоритм: http://en.wikipedia.org/wiki/Exponentiation_by_squaring – Mysticial

ответ

2

LargeInteger, находящийся от Number, действительно имеет функцию pow.

+0

Спасибо Quirlom! Я заметил, что он не жалуется, когда аргумент не '0'. Так что я должен просто проверить это вместо этого? Огромное спасибо заранее! –

+0

Из [источника] (http://grepcode.com/file/repo1.maven.org/maven2/org.jscience/jscience/4.3.1/org/jscience/mathematics/number/Number.java#Number.pow % 28int% 29) кажется, что они генерируют исключение, если показатель <= 0, поэтому я бы проверял, равен ли показатель 0 и возвращает 1. – Sinkingpoint

+0

Еще раз спасибо Quirlon! Я еще раз посмотрю назад в классе «цепочка» для ответов в следующий раз, когда я знаю, что это такое, если я хотя бы не знаю, как это называется. ;)) –

4

Каждый раз, когда через for петли, вы эффективно квадратуры результат этой линии:

base = base.times(base); 

Вы бы ветер с base к власти (2 к exponent мощности), не base к мощность exponent.

Начать с 1 и умножать на base каждый цикл.

LargeInteger result = LargeInteger.valueOf(1); 
for(int i = 0; i < exponent; i++){ 
    result = result.times(base); 
} 
return result; 

Для оптимизации, вы можете попробовать модифицировать алгоритм, чтобы использовать exponentiation-by-squaring.

+0

Спасибо, rgettman! Я попытаюсь использовать это после того, как я уверен, что 'pow' только жалуется на <= 0. –