Exponenciación modular

De testwiki
Saltar á navegación Saltar á procura

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, bec(modm), 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 modularmente538(mod13).

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:

bec(modm) sería dec(modm) con bd1(modm).

Por exemplo 342(mod7) pois 542(mod7) sendo 351(mod7).

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

Modelo:Math.

Consiste en procurar a potencia e1 de Modelo:Mvar máis próxima ao módulo Modelo:Mvar, calcular o módulo de be1c1(modm) e calculando a división enteira dos expoñentes ee1 con e=e1d+r transformamos a expresión orixinal con cifras moito menores.

Exemplo: 413c(mod497)

45=1024 e 13=25+3 e tamén 102430(mod497)
30243=57600445(mod497).

Por tanto c=445.

Se a base é maior que o módulo pódese aplicar primeiro o módulo á base, por exemplo: 50113c(mod497) implica 413c(mod497).

Este método tamén podería aproximar a equivalencias negativas, por exemplo para 213c(mod7), temos:

231(mod7) e 13=43+1,
(1)422(mod7) e por tanto c=2

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:

413c(mod497)

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 50113c(mod497) se non reducimos a base previamente temos 50113 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

Modelo:Math

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:

e=i=0n1ai2i

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:

be=b(i=0n1ai2i)=i=0n1bai2i

A solución Modelo:Math é polo tanto:

ci=0n1bai2i(modm)

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 R a 1 e garda o valor de Modelo:Math na variable Modelo:Math:

R1(=b0) e xb=4 .
Paso 1) o bit 1 é 1, así que se estabelece
RR44(mod497) ;
agora xx2 (=b2)4216(mod497) .
Paso 2) o bit 2 é 0, polo que non recalculamos Modelo:Math;
así xx2 (=b4)162256(mod497) .
Paso 3) o bit 3 é 1, así que recalculamos Modelo:Math
RRx (=b5)425630(mod497);
agora xx2 (=b8)2562429(mod497).
Paso 4) o bit 4 é 1, así que recalculamos Modelo:Math
RRx (=b13)30429445(mod497) ;

Resultado c=497 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

Modelo:Reflist

Véxase tamén

Bibliografía

Outros artigos

Ligazóns externas


Modelo:Control de autoridades