Avaliação de Potências Inteiras
Nosso objetivo é tratar a avaliação computacional eficiente de potências
, onde
é um número real e
é um número inteiro,
usando somente as quatro operações algébricas fundamentais. Se
,
é a resposta trivial. Por outro lado, se
(e, obviamente,
), lembramos que
. Dessa forma, basta considerar o
caso em que
é inteiro e positivo.
Estratégia 1: o algoritmo mais intuitivo para
Consiste em usar multiplicações por .
P1:
;
Para faça
P2:
;
Fim Para
Retorne ;
Essa estratégia de avaliação requer produtos ponto-flutuante.
Estratégia 2: usando a expansão binária de
Consiste em varrer os algarismos binários da expansão de , da direita para a esquerda, aplicando duas operações: a de multiplicar por
e a de elevar ao quadrado, dependendo se o algarismo encontrado é
ou
. Três variáveis
,
e
são usadas.
O próprio algoritmo calcula a expansão binária de
, usando estratégia
clássica de dividir por
e determinar o resto.
P1:
;
P2:
;
P3:
;
Enquanto faça
P4:
;
P5:
;
P6: Se então faça
;
P7: Se então faça
;
Fim-Enquanto
Retorne ;
Essa estratégia de avaliação requer
produtos
de números reais, onde
é o número de algarismos unitários (1) na expansão binária de
.
No pior caso,
para algum inteiro
, e temos
e assim seriam necessários
produtos reais.
Exemplo: avaliar
![]() |
![]() |
![]() |
9 | 1 | ![]() |
4 | ![]() |
![]() |
2 | ![]() |
![]() |
1 | ![]() |
![]() |
0 | ![]() |
![]() |
Exemplo: avaliar
![]() |
![]() |
![]() |
15 | 1 | ![]() |
7 | ![]() |
![]() |
3 | ![]() |
![]() |
1 | ![]() |
![]() |
0 | ![]() |
![]() |
Referências:
[1] https://en.wikipedia.org/wiki/Exponentiation_by_squaring
[2] D. E. Knuth. Seminumerical Algorithms, vol. 2 of The Art of Computer Programming, ssec 4.6.3, 3rd edition. Addison-Wesley, 1998.