Diamo un'occhiata a questa uguaglianza
ab mod n =(a mod n ) (b mod n) mod n.
spiega il tuo algoritmo.
L'intero trucco è pensare alle tre possibilità per exponent
: può essere nullo, se può essere pari o può essere dispari.
Se exponent
è 0 , è facile: qualsiasi numero elevato alla potenza dell'esponente 0 è 1. Questa è la prima dichiarazione di ritorno.
Se exponent
è pari a , exponent%2
è 0. Ciò significa che puoi scrivere l'esponente come 2*k
, dove k è exponent/2
:
pow(a,exponent,n) = a^exponent mod n
= a^(2*k) mod n
= (a^2)^k mod n
= (a*a)^k mod n
= pow (a*a, k, n)
= pow (a*a, exponent/2, n)
= newexp
Poiché questa espressione è modulo n, l'applicazione di modulo n una volta di più non la cambierà, quindi è uguale a newexp % n
. Ecco la spiegazione dell'ultima dichiarazione di reso.
Se exponent
è dispari , exponent%2
è 1. Ciò significa che puoi scrivere l'esponente come 2*k+1
, dove k è exponent/2
(divisione intera):
pow(a,exponent,n) = a^exponent mod n
= a^(2*k+1) mod n
= (a^(2k)*a) mod n
= (a^(2k) mod n) * (a mod n) mod n
= ((a^2)^k mod n) * (a mod n) mod n
= ((a*a)^k mod n) * (a mod n) mod n
= pow (a*a, k, n) * (a mod n) mod n
Perché pow(a*a, k, n)
è un numero modulo n, sappiamo che:
pow(a*a, k, n) mod n = pow(a*a, k, n)
Quindi possiamo continuare la nostra uguaglianza:
pow(a,exponent,n) = pow (a*a, k, n) * (a mod n) mod n
= (pow (a*a, k, n) mod n) * (a mod n) mod n
= (a*pow (a*a, k, n)) mod n
= (a*pow (a*a, exponent/2, n)) mod n
= (a*newexp) mod n
E qui hai la spiegazione per la seconda dichiarazione di ritorno.