Anar al contingut

Exponenciación binaria

De L'Enciclopèdia, la wikipedia en valencià

La exponenciación binaria és un algoritme utilisat per a calcular de forma ràpida grans potencies sanceres d'un número x dau. També és conegut com a potenciació per quadrats o elevar al quadrat i multiplicar. Implícitament utilisa l'expansió binaria de l'exponent. És d'us prou regular en aritmètica modular. Este algoritme és similar al de la duplicació en la multiplicació.

Versió recurrent

[editar | editar còdic]

Fonaments

[editar | editar còdic]

L'algoritme està basat en les següents tres propietats de la potència:

(1) x1=x

(2) xa+b=xaxb

(3) xab=(xa)b

Usant a=n1 i b=1 en l'equació (2) se seguix que xn=xn1x. Prenent a=n2 i b=2 en l'equació (3) s'obté que xn=(xn2)2.

Algoritme

[editar | editar còdic]

El següent algoritme recursivo calcula xn per a un natural n dau:

xn={xsi n=1xn2×x2si n es parx×xn1si n es impar

Comparat en el método original de multiplicar x per sí mateix n1 voltes, este algoritme només utilisa O(log n) multiplicacions i accelera el càlcul de xn tremendament; més o menys de la mateixa forma que l'algoritme de la multiplicació accelera una multiplicació sobre el método més llent de realisar una suma repetida.

Aplicacions

[editar | editar còdic]

La mateixa idea permet el càlcul ràpit de potències molt grans en mòdul. Especialment en criptografia, és útil calcular potències en l'anell dels sancers mòdul q.

L'idea pot ser usada també per a computar potències d'número entero en un semigrupo, usant la regla

Potència(x, -n) = (Potència(x, n))-1.

Este método funciona en qualsevol semigrupo, i és usat freqüentment per a calcular potències de matrius.

Per eixemple, l'evaluació de

13789722341 (mod 2345)

prendria molt temps i espai d'almagasenament si el método ingenu és usat: calcular 13789722341 i prendre el residu quan és dividit per 2345. Inclús usant un método més efectiu prendrà temps considerable: elevar 13789 al quadrat , prendre el residu quan es dividix per 2345, multiplicar el resultat per 13789, i aixina successivament. Este procés realisarà 722340 multplicaciones modular. Este algoritme està basat en l'observació que 13789722341 = 13789(137892)361170. Llavors, si es calcula 137892, el càlcul complet prendria 361170 multiplicacions modular. Esta és un guany en un factor de dos. Pero com el nou problema seguix sent similar a l'anterior, es pot aplicar l'observació novament, reduint a la mitat la cantitat, aproximadament.

L'aplicació successiva d'este algoritme és equivalent a descompondre l'exponent (convertint-ho a base binaria) en una seqüència de quadrats i multiplicacions: per eixemple

x13 = x1101bin
= x(1*2^3 + 1*2^2 + 0*2^1 + 1*2^0)
= x1*2^3 * x1*2^2 * x0*2^1 * x1*2^0
= x2^3 * x2^2 * 1 * x2^0
= x8 * x4 * x1
= (x4)2 * (x2)2 * x
= (x4 * x2)2 * x
= ((x2)2 * x2)2 * x
= ((x2 * x)2)2 * x       → algoritme necessita només 5 multiplicacions en lloc de 13 - 1 = 12

Alguns eixemples més:

  • x10 = ((x2)2*x)2 perque 10 = (1,010)2 = 23+21, algoritme necessita 4 multiplicacions en lloc de

9 * x100 = (((((x2*x)2)2)2*x)2)2 perque 100 = (1,100,100)2 = 26+25+22, algoritme necessita 8 multiplicacions en lloc de 99

  • x1,000 = ((((((((x2*x)2*x)2*x)2*x)2)2*x)2)2)2 perque 103 = (1,111,101,000)2, algoritme necessita 14 multiplicacions en lloc de 999
  • x1,000,000 = ((((((((((((((((((x2*x)2*x)2*x)2)2*x)2)2)2)2)2*x)2)2)2*x)2)2)2)2)2)2 perque 106 = (11,110,100,001,001,000,000)2, algoritme necessita 25 multiplicacions
  • x1,000,000,000 = ((((((((((((((((((((((((((((x2*x)2*x)2)2*x)2*x)2*x)2)2)2*x)2*x)2)2*x)2)2*x)2*x)2)2)2*x)2)2*x)2)2)2)2)2)2)2)2)2 perque 109 = (111,011,100,110,101,100,101,000,000,000)2, algoritme necessita 41 multiplicacions

Vore també

[editar | editar còdic]