Exponenciació binària

L'exponenciació binària és un algorisme que es fa servir per a calcular potències d'un nombre. També se'l coneix com a algorisme d'elevar al quadrat i multiplicar o exponenciació ràpida. Fa servir de forma implícita l'expressió binària de l'exponent. Es pot fer servir de forma força general, per exemple en aritmètica modular.

Anàlisi del problema modifica

La forma immediata de plantejar el càlcul d'una potència  , és multiplicar n per si mateix p cops. Tanmateix existeixen mètodes més eficients, on el nombre d'operacions necessàries en comptes de ser d'ordre p és de l'ordre de  .

Per exemple, es pot escriure   per  , i llavors es comprova que:

 

Calen d operacions per a calcular els  , més d operacions per a formar el producte dels  . El nombre total d'operacions és doncs 2d, que és de l'ordre del logaritme de p (d és el logaritme en base 2 de p). Aquesta senzilla observació algebraica condueix a l'algorisme següent.

Algorisme modifica

Sia n un enter estrictament superior a 1,l'algorisme es basa en els següents fets.

  • Si n és parell llavors xn=(x²)n/2. Llavors n'hi ha prou amb calcular yn/2 amb y=x².
  • Si n és senar i n>1, llavors xn=x•(x²)(n-1)/2. N'hi ha prou amb calcular y(n-1)/2 amb y=x² i multiplicar el resultat per x.

Això porta a l'algorisme recursiu següent que calcula xn per a un enter estrictament positiu n:

 

El mètode no només funciona en els nombres reals sinó en qualsevol semigrup, en particular en criptografia per a calcular les potències d'un anell d'enters mòdul q. També es pot fer servir per a calcular les potències d'un element d'un grup, si es fa servir per a les potències negatives la regla : potència(x, -n) = (potència(x, n))−1.

Alternatives i generalitzacions modifica

La exponenciació a base d'elevar al quadrat es pot veure com un algorisme que calcula l'exponent via una cadena de sumes consistent en doblar repetidament l'exponent i/o incrementant-lo en una unitat(multiplicant per x). De forma més general, si es permet que se sumin qualsevulla exponents prèviament calculats (a base de multiplicar aquestes potències de x), de vegades es pot realitzar la exponenciació fent servir menys multiplicacions (però normalment fent servir més memòria). La potència més petita en què això passa és n=15:

  (6 multiplicacions, amb l'algorisme d'elevar al quadrat)
  (5 multiplicacions amb una cadena òptima de sumes, si es reutilitza x3)

En general, trobar una cadena de sumes òptima per a un exponent donat és un problema difícil, per al qual no es coneixen algorismes eficients, per tant les cadenes òptimes normalment només es fan servir per a exponents petits (per exemple en compiladors on s'han pretabulat les cadenes per a potències petites). Ara bé, hi ha uns quants algorismes heurístics que, tot i que no són òptims, arriben a menys multiplicacions que la exponenciació per elevació al quadrat a canvi del cost addicional de fer servir més memòria. Respecte al nombre de multiplicacions mai creix més a poc a poc que Θ(log n), per tant, aquests algorismes només milloren l'eficiència de l'algorisme d'exponenciació per elevació al quadrat de forma asimptòtica per un factor constant en el millor dels casos.