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 .
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:
Por lo tanto, el algoritmo de exponenciación rápida se reduce a un análogo multiplicativo del esquema de Horner [6] :
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] .
Aplicando el algoritmo, calculamos 21 13 :
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.
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 |
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] .
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.
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:
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.
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] .