Algoritmos de exponenciación rápida

Los algoritmos de exponenciación rápida ( algoritmo de exponenciación dicotómica , algoritmo de exponenciación binaria) son algoritmos diseñados para elevar un número a una potencia natural en menos multiplicaciones de las necesarias para determinar el grado [1] . Los algoritmos se basan en que para elevar un número a una potencia no es necesario multiplicar una vez el número por sí mismo , sino que se pueden multiplicar potencias ya calculadas. En particular, si es la potencia de dos, entonces para elevar a una potencia basta con elevar el número al cuadrado , gastando multiplicaciones en lugar de . Por ejemplo, para elevar un número a la octava potencia, en lugar de realizar siete multiplicaciones , puedes elevar el número al cuadrado ( ), luego elevar el resultado al cuadrado nuevamente para obtener la cuarta potencia ( ), y finalmente elevar el resultado nuevamente al cuadrado y obtener la respuesta ( ).

Además, algunos algoritmos para una mayor optimización utilizan el hecho de que la operación de elevar al cuadrado es más rápida que la operación de multiplicación debido al hecho de que los dígitos en el factor se repiten al elevar al cuadrado [2] .

El algoritmo de exponenciación binaria fue propuesto por primera vez en el siglo XV por el matemático persa Al-Kashi [3] .

Estos algoritmos no siempre son óptimos. Por ejemplo, cuando se usa el esquema de izquierda a derecha, exponenciar rápidamente n = 15 requerirá tres multiplicaciones y tres elevaciones al cuadrado, aunque elevar a la potencia 15 se puede realizar en 3 multiplicaciones y 2 elevaciones al cuadrado [4] . La potenciación óptima corresponde a la construcción de la cadena aditiva más corta .

Descripción

El algoritmo principal para la exponenciación rápida es el esquema de "izquierda a derecha". Recibe su nombre del hecho de que los bits del exponente se ven de izquierda a derecha, es decir, de mayor a menor [5] .

Dejar

 es una representación binaria de grado n , es decir,

donde _ Después

[5] .

La secuencia de acciones al usar este esquema se puede describir de la siguiente manera:

  1. Representa el exponente n en forma binaria
  2. Si = 1, entonces el resultado actual se eleva al cuadrado y luego se multiplica por x. Si = 0, entonces el resultado actual simplemente se eleva al cuadrado [6] . El índice i cambia de k -1 a 0 [7] .

Por lo tanto, el algoritmo de exponenciación rápida se reduce a un análogo multiplicativo del esquema de Horner [6] :

Generalizaciones

Sea el par ( S , *) un semigrupo , entonces podemos llamar a la operación * multiplicación y definir la operación de elevar a una potencia natural:

Entonces, para calcular los valores de un n en cualquier semigrupo (en particular, en un grupo abeliano ), se pueden usar algoritmos de exponenciación rápida [8] .

Ejemplos de resolución de problemas

Aplicando el algoritmo, calculamos 21 13 :

Esquema de derecha a izquierda

En este esquema, a diferencia del esquema "de izquierda a derecha", los bits del exponente se visualizan de menor a mayor [5] .

La secuencia de acciones en la implementación de este algoritmo.

  1. Exprese el exponente n en binario.
  2. Establezca la variable auxiliar z igual al número x.
    1. Si , entonces el resultado actual se multiplica por z y el número z se eleva al cuadrado. Si = 0, entonces solo necesitas elevar al cuadrado z [6] . En este caso, el índice i , a diferencia del esquema de izquierda a derecha, varía de 0 a k - 1 inclusive [7] .

Este circuito contiene tantas multiplicaciones y cuadraturas como el circuito de "izquierda a derecha". Sin embargo, a pesar de esto, el esquema de izquierda a derecha es más rentable que el esquema de derecha a izquierda, especialmente si el exponente contiene muchas unidades. El punto es que en el esquema, de izquierda a derecha, la operación resultado = resultado · x contiene un multiplicador x constante . Y para x pequeña (que suele ser el caso en las pruebas de primalidad), la multiplicación será rápida. Por ejemplo, para x = 2 podemos reemplazar la operación de multiplicación con la operación de suma [7] .

La justificación matemática del funcionamiento de este algoritmo se puede representar mediante la siguiente fórmula:

[9] .

ejemplo _ Calculemos el valor 21 13 usando el esquema de exponenciación de derecha a izquierda .

i 0 una 2 3
21 441 194 481 37 822 859 361
una 0 una una
  1. 21 194 481 = 4084 101
  2. 4084 101 37 822 859 361 = 154 472 377 739 119 461

Complejidad computacional

Tanto para los esquemas de izquierda a derecha como de derecha a izquierda, el número de operaciones de elevación al cuadrado es el mismo y es igual a k, donde k  es la longitud del exponente n en bits, . El número de operaciones de multiplicación necesarias es igual al peso de Hamming , es decir, el número de elementos distintos de cero en la representación binaria del número n . En promedio, se requieren operaciones de multiplicación [6] .

Por ejemplo, para elevar un número a la centésima potencia, este algoritmo requerirá solo 8 operaciones de multiplicación y elevación al cuadrado [5] .

A modo de comparación, con el método de exponenciación estándar, se requiere una operación de multiplicación, es decir, el número de operaciones se puede estimar como [10] .

Optimización de algoritmos

Generalmente, la operación de elevar al cuadrado es más rápida que la operación de multiplicación. El método de la ventana le permite reducir el número de operaciones de multiplicación y, por lo tanto, hacer que el algoritmo de exponenciación sea más óptimo [8] .

La ventana es en realidad la base del sistema numérico [7] . Sea w  el ancho de la ventana, es decir, se tienen en cuenta w caracteres del indicador a la vez.

Considere el método de la ventana.

  1. Para x i precalculado
  2. El exponente se presenta de la siguiente forma: , donde
  3. Sea y  la variable en la que se calculará el resultado final. deja _
  4. Para todo i = k/w  - 1, k/w  - 2, ..., 0, haga lo siguiente:
    1. [8] .

Este algoritmo requiere k elevar al cuadrado, pero el número de multiplicaciones se reduce a k/w en promedio [8] .

Aún más eficaz es el método de la ventana deslizante. Se encuentra en el hecho de que el ancho de la ventana durante la ejecución del proceso puede cambiar:

  1. El exponente se representa como , donde , y e i+1  — e i ≥ w .
  2. Para x i se calcula . Además, designaremos x i como x i .
  3. Sea y  la variable en la que se calculará el resultado final. deja _
  4. Para todo i = l  - 1, l  - 2, ..., 0, haga lo siguiente:
    1. Para todo j de 0 a e i+1  - e i  - 1 y cuadrado
  5. Para todo j de 0 a e 0  - 1 y cuadrado [8] .

El número de operaciones de exponenciación en este algoritmo es el mismo que en el método de la ventana, pero el número de operaciones de multiplicación se ha reducido a l , es decir, a la media [8] .

Por ejemplo, elevemos el número x a la potencia de 215 usando el método de la ventana deslizante El ancho de la ventana es w = 3.

  1. 215 = 27 + 5 24 + 7
  2. y=1
  3. y = y x = x
  4. y se eleva al cuadrado 3 veces, ya que en este paso e 2  - e 1 -1 \u003d 7 - 4 - 1 \u003d 2, y la cuenta regresiva es desde cero, es decir, y \u003d y 8 \u003d x 8
  5. y \u003d y x 5 \u003d x 13
  6. y se eleva al cuadrado 4 veces, ya que en este paso e 1  - e 0 -1 \u003d 4 - 0 - 1 \u003d 3, es decir, y \u003d y 16 \u003d x 208
  7. y \u003d y x 7 \u003d x 215

Aplicación

El algoritmo de exponenciación rápida se ha generalizado en los criptosistemas de clave pública . En particular, el algoritmo se utiliza en el protocolo RSA , el esquema ElGamal y otros algoritmos criptográficos [11] .

Véase también

Notas

  1. Shvets AN Exponenciación rápida . Fecha de acceso: 13 de noviembre de 2015. Archivado desde el original el 17 de noviembre de 2015.
  2. Pankratova, 2009 , pág. 7.
  3. Pankratova, 2009 , pág. once.
  4. Pankratova, 2009 , pág. diez.
  5. 1 2 3 4 Ryabko, Fionov, 2004 .
  6. 1 2 3 4 Manual, 2006 .
  7. 1 2 3 4 Crandall, Pomerance, 2011 .
  8. 1 2 3 4 5 6 Criptografía, 2005 .
  9. Gabidulin, Kshevetsky, Kolybelnikov, 2011 .
  10. Mahovenko, 2006 .
  11. Criptografía aplicada, 2002 .

Literatura