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.
A exponenciación modular é o resto cando un enteiro b (a base) elévase á potencia e (o expoñente) e se divide por un enteiro positivo m (o módulo); é dicir, b e ≡ c ( mod m ) {\displaystyle b^{e}\equiv c{\pmod {m}}}, onde 0 ≤ c < m.
Por exemplo, dados b
5, e
3 e m
13, dividindo 53
125 por 13 deixa un resto de c 8. Escrito modularmente, 53 ≡ 8 ( mod 13 ) {\displaystyle 5^{3}\equiv 8{\pmod {13}}}.
A exponenciación modular pódese realizar cun expoñente negativo atopando a inversa multiplicativa modular d de b módulo m usando o algoritmo de Euclides estendido. É dicir: b − e ≡ c ( mod m ) {\displaystyle b^{-e}\equiv c{\pmod {m}}} sería d e ≡ c ( mod m ) {\displaystyle d^{e}\equiv c{\pmod {m}}} con b ⋅ d ≡ 1 ( mod m ) {\displaystyle b\cdot d\equiv 1{\pmod {m}}}.
Por exemplo 3 − 4 ≡ 2 ( mod 7 ) {\displaystyle 3^{-4}\equiv 2{\pmod {7}}} pois 54 ≡ 2 ( mod 7 ) {\displaystyle 5^{4}\equiv 2{\pmod {7}}} sendo 3 ⋅ 5 ≡ 1 ( mod 7 ) {\displaystyle 3\cdot 5\equiv 1{\pmod {7}}}.
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 e cando se dan b, c e m. 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
(a ⋅ b) mod m [(a mod m) ⋅ (b mod m)] mod m.
Consiste en procurar a potencia e 1 {\displaystyle e_{1}} de b máis próxima ao módulo m, calcular o módulo de b e 1 ≡ c 1 ( mod m ) {\displaystyle b^{e_{1}}\equiv c_{1}{\pmod {m}}} e calculando a división enteira dos expoñentes e e 1 con e
e 1 ⋅ d + r {\displaystyle {\frac {e}{e_{1}}}{\text{ con }}e
e_{1}\cdot d+r} transformamos a expresión orixinal con cifras moito menores.
Exemplo: 413 ≡ c ( mod 497 ) {\displaystyle 4^{13}\equiv c{\pmod {497}}} 45
1024 {\displaystyle 4^{5}
1024} e 13
2 ⋅ 5 + 3 {\displaystyle 13
2\cdot 5+3} e tamén 1024 ≡ 30 ( mod 497 ) {\displaystyle 1024\equiv 30{\pmod {497}}} 302 ⋅ 43
57600 ≡ 445 ( mod 497 ) {\displaystyle 30^{2}\cdot 4^{3}
57600\equiv 445{\pmod {497}}}.
Por tanto c
445 {\displaystyle c
445}.
Se a base é maior que o módulo pódese aplicar primeiro o módulo á base, por exemplo: 50113 ≡ c ( mod 497 ) implica 413 ≡ c ( mod 497 ) {\displaystyle 501^{13}\equiv c{\pmod {497}}{\text{ implica }}4^{13}\equiv c{\pmod {497}}}.
Este método tamén podería aproximar a equivalencias negativas, por exemplo para 213 ≡ c ( mod 7 ) {\displaystyle 2^{13}\equiv c{\pmod {7}}}, temos: 23 ≡ − 1 ( mod 7 ) {\displaystyle 2^{3}\equiv -1{\pmod {7}}} e 13
4 ⋅ 3 + 1 {\displaystyle 13
4\cdot 3+1}, ( − 1 ) 4 ⋅ 2 ≡ 2 ( mod 7 ) {\displaystyle (-1)^{4}\cdot 2\equiv 2{\pmod {7}}} e por tanto c
2 {\displaystyle c
2} Método directo
O método máis directo de calcular un expoñente modular é calcular be e despois tomar este número módulo m. Co exemplo anterior temos: 413 ≡ c ( mod 497 ) {\displaystyle 4^{13}\equiv c{\pmod {497}}} Calculando 41367108864. Tomando este valor módulo 497, a resposta c determínase que é 445.
Teña en conta que b ten só un díxito de lonxitude e que e só ten dous díxitos de lonxitude, mais o valor be é de 8 díxitos. E no caso de 50113 ≡ c ( mod 497 ) {\displaystyle 501^{13}\equiv c{\pmod {497}}} se non reducimos a base previamente temos 50113 {\displaystyle 501^{13}} 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 (a ⋅ b) mod m [(a mod m) ⋅ (b mod m)] mod m
En resumo, este algoritmo aumenta e′ nunha unidade ata que sexa igual a e. En cada paso multiplicando o resultado da iteración anterior, c, por b e realizando unha operación de módulo sobre o produto resultante, mantendo así o c resultante nun número enteiro pequeno.
Preséntase de novo o exemplo b
4, e
13 e m
497. O algoritmo realiza a iteración trece veces: (e′
1) c
(4 ⋅ 1) mod 497
4 mod 4974
(e′
2) c
(4 ⋅ 4) mod 497
16 mod 497
16
(e′
3) c
(4 ⋅ 16) mod 497
64 mod 497
64
(e′
4) c
(4 ⋅ 64) mod 497
256 mod 497
256
(e′
5) c
(4 ⋅ 256) mod 497
1024 mod 497
30
(e′
6) c
(4 ⋅ 30) mod 497
120 mod 497
120
(e′
7) c
(4 ⋅ 120) mod 497
480 mod 497
480
(e′
8) c
(4 ⋅ 480) mod 497
1920 mod 497
429
(e′
9) c
(4 ⋅ 429) mod 497
1716 mod 497
225
(e′
10) c
(4 ⋅ 225) mod 497
900 mod 497
403
(e′
11) c
(4 ⋅ 403) mod 497
1612 mod 497
121
(e′
12) c
(4 ⋅ 121) mod 497
484 mod 497
484
(e′
13) c
(4 ⋅ 484) mod 497
1936 mod 497
445
A resposta final para c é 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 e se converta en notación binaria. É dicir, e pódese escribir como: e
∑ i
0 n − 1 a i 2 i {\displaystyle e
\sum _{i
0}^{n-1}a_{i}2^{i}} En tal notación, a lonxitude de e é n bits. ai pode tomar o valor 0 ou 1 para calquera i tal que 0 ≤ i < n. Por definición, an − 11.
O valor be escribirse como: b e
b ( ∑ i
0 n − 1 a i 2 i )
∏ i
0 n − 1 b a i 2 i {\displaystyle b^{e}
b^{\left(\sum _{i
0}^{n-1}a_{i}2^{i}\right)}
\prod _{i
0}^{n-1}b^{a_{i}2^{i}}} A solución c é polo tanto: c ≡ ∏ i
0 n − 1 b a i 2 i ( mod m ) {\displaystyle c\equiv \prod _{i
0}^{n-1}b^{a_{i}2^{i}}{\pmod {m}}} Neste exemplo, a base b elévase ata o expoñente e
13. O expoñente é 1101 en binario. Hai catro díxitos binarios, polo que o bucle execútase catro veces, cos valores a0
1, a1
0, a2
1 e a31.
Primeiro, inicializa o resultado R {\displaystyle R} a 1 e garda o valor de b na variable x: R ← 1 (
b 0 ) {\displaystyle R\leftarrow 1\, (
b^{0})} e x ← b
4 {\displaystyle x\leftarrow b
4}.
Paso 1) o bit 1 é 1, así que se estabelece R ← R ⋅ 4 ≡ 4 ( mod 497 ) {\displaystyle R\leftarrow R\cdot 4\equiv 4{\pmod {497}}};
agora x ← x 2 (
b 2 ) ≡ 42 ≡ 16 ( mod 497 ) {\displaystyle x\leftarrow x^{2}{\text{ }}(
b^{2})\equiv 4^{2}\equiv 16{\pmod {497}}}.
Paso 2) o bit 2 é 0, polo que non recalculamos R;
así x ← x 2 (
b 4 ) ≡ 162 ≡ 256 ( mod 497 ) {\displaystyle x\leftarrow x^{2}{\text{ }}(
b^{4})\equiv 16^{2}\equiv 256{\pmod {497}}}.
Paso 3) o bit 3 é 1, así que recalculamos R R ← R ⋅ x (
b 5 ) ≡ 4 ⋅ 256 ≡ 30 ( mod 497 ) {\displaystyle R\leftarrow R\cdot x{\text{ }}(
b^{5})\equiv 4\cdot 256\equiv 30{\pmod {497}}};
agora x ← x 2 (
b 8 ) ≡ 2562 ≡ 429 ( mod 497 ) {\displaystyle x\leftarrow x^{2}{\text{ }}(
b^{8})\equiv 256^{2}\equiv 429{\pmod {497}}}.
Paso 4) o bit 4 é 1, así que recalculamos R R ← R ⋅ x (
b 13 ) ≡ 30 ⋅ 429 ≡ 445 ( mod 497 ) {\displaystyle R\leftarrow R\cdot x{\text{ }}(
b^{13})\equiv 30\cdot 429\equiv 445{\pmod {497}}};
Resultado c
497 {\displaystyle c
497} igual que nos métodos anteriores. Xeneralizacións
Matrices
O m-é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 k termos anteriores pódese calcular eficientemente módulo n calculando Am mod n, onde A é matriz compañeira k×k 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 n, por exemplo.