Exponenciación modular
A exponenciación modular é a exponenciación realizada sobre un módulo. É útil en informática, especialmente no campo da criptografía de clave pública, onde se usa tanto no intercambio de claves Diffie-Hellman como nas claves públicas/privadas RSA.[1]
A exponenciación modular é o resto cando un enteiro Modelo:Math (a base) elévase á potencia Modelo:Math (o expoñente) e se divide por un enteiro positivo Modelo:Math (o módulo); é dicir, , onde Modelo:Math .
Por exemplo, dados Modelo:Math, Modelo:Math e Modelo:Math, dividindo Modelo:Math por Modelo:Math deixa un resto de Modelo:Math. Escrito modularmente.
A exponenciación modular pódese realizar cun expoñente negativo atopando a inversa multiplicativa modular Modelo:Math de Modelo:Math módulo Modelo:Math usando o algoritmo de Euclides estendido. É dicir:
- sería con .
Por exemplo pois sendo .
O cálculo da exponenciación modular é eficiente, mesmo para enteiros moi grandes. Por outra banda, é difícil calcular o logaritmo discreto modular, é dicir, atopar o expoñente Modelo:Math cando se dan Modelo:Math, Modelo:Math e Modelo:Math. Este comportamento de función unidireccional fai que a exponenciación modular sexa candidata para o seu uso en algoritmos criptográficos.
Método de módulo próximo
Este método usa a propiedade modular seguinte
Consiste en procurar a potencia de Modelo:Mvar máis próxima ao módulo Modelo:Mvar, calcular o módulo de e calculando a división enteira dos expoñentes transformamos a expresión orixinal con cifras moito menores.
Exemplo:
- e e tamén
- .
Por tanto .
Se a base é maior que o módulo pódese aplicar primeiro o módulo á base, por exemplo: .
Este método tamén podería aproximar a equivalencias negativas, por exemplo para , temos:
- e ,
- e por tanto
Método directo
O método máis directo de calcular un expoñente modular é calcular Modelo:Math e despois tomar este número módulo Modelo:Math. Co exemplo anterior temos:
Calculando 413 = 67 108 864. Tomando este valor módulo 497, a resposta Modelo:Math determínase que é 445.
Teña en conta que Modelo:Math ten só un díxito de lonxitude e que Modelo:Math só ten dous díxitos de lonxitude, mais o valor Modelo:Math é de 8 díxitos. E no caso de se non reducimos a base previamente temos unha cifra de 35 díxitos.
Método de memoria eficiente
Manter os números máis pequenos require operacións de redución modulares adicionais, mais o tamaño reducido fai que cada operación sexa máis rápida, aforrando tempo (así como memoria) en xeral.
Este algoritmo tamén fai uso da identidade
En resumo, este algoritmo aumenta Modelo:Mvar nunha unidade ata que sexa igual a Modelo:Mvar. En cada paso multiplicando o resultado da iteración anterior, Modelo:Mvar, por Modelo:Mvar e realizando unha operación de módulo sobre o produto resultante, mantendo así o Modelo:Mvar resultante nun número enteiro pequeno.
Preséntase de novo o exemplo Modelo:Math, Modelo:Math e Modelo:Math. O algoritmo realiza a iteración trece veces:
- Modelo:Math
- Modelo:Math
- Modelo:Math
- Modelo:Math
- Modelo:Math
- Modelo:Math
- Modelo:Math
- Modelo:Math
- Modelo:Math
- Modelo:Math
- Modelo:Math
- Modelo:Math
- Modelo:Math
A resposta final para Modelo:Mvar é polo tanto 445, como no método directo e o método de módulo próximo.
Método binario de dereita a esquerda
Un cuarto método reduce drasticamente o número de operacións para realizar a exponenciación modular, mantendo o mesmo uso de memoria que no método anterior. É unha combinación do método anterior e un principio máis xeral chamado exponenciación binaria.
En primeiro lugar, é necesario que o expoñente Modelo:Math se converta en notación binaria. É dicir, Modelo:Math pódese escribir como:
En tal notación, a lonxitude de Modelo:Math é Modelo:Math bits. Modelo:Math pode tomar o valor 0 ou 1 para calquera Modelo:Math tal que Modelo:Math . Por definición, Modelo:Math .
O valor Modelo:Math escribirse como:
A solución Modelo:Math é polo tanto:
Neste exemplo, a base Modelo:Mvar elévase ata o expoñente Modelo:Math . O expoñente é 1101 en binario. Hai catro díxitos binarios, polo que o bucle execútase catro veces, cos valores Modelo:Math e Modelo:Math .
Primeiro, inicializa o resultado a 1 e garda o valor de Modelo:Math na variable Modelo:Math:
- e .
- Paso 1) o bit 1 é 1, así que se estabelece
- ;
- agora .
- Paso 2) o bit 2 é 0, polo que non recalculamos Modelo:Math;
- así .
- Paso 3) o bit 3 é 1, así que recalculamos Modelo:Math
- ;
- agora .
- Paso 4) o bit 4 é 1, así que recalculamos Modelo:Math
- ;
Resultado igual que nos métodos anteriores.
Xeneralizacións
Matrices
O Modelo:Mvar-ésimo termo de calquera secuencia recursiva constante (como os números de Fibonacci ou os números de Perrin) onde cada termo é unha función linear de Modelo:Mvar termos anteriores pódese calcular eficientemente módulo Modelo:Mvar calculando Modelo:Math, onde Modelo:Mvar é matriz compañeira Modelo:Math correspondente . Os métodos anteriores adáptanse facilmente a esta aplicación. Isto pódese usar para os test de primalidade de grandes números Modelo:Mvar, por exemplo.
Notas
Véxase tamén
Bibliografía
Outros artigos
- Redución de Montgomery, para calcular o resto cando o módulo é moi grande.
- Multiplicación de Kochanski, método serializábel para calcular o resto cando o módulo é moi grande
- Redución de Barrett, algoritmo para calcular o resto cando o módulo é moi grande.
Ligazóns externas
- Paul Garrett, Fast Modular Exponentiation Java Applet