def inverse(n, p):
initial_p = p
n_coefs = (1, 0)
p_coefs = (0, 1)
r = -1
while r != 1:
d, r = divmod(n, p)
n_coefs, p_coefs = p_coefs, (n_coefs[0] - d * p_coefs[0], n_coefs[1] - d * p_coefs[1])
n, p = p, r
return p_coefs[0] % initial_p
The variables n_coefs
and p_coefs
express the current values of n
and p
(typically m
and n
in Euclid’s algorithm) as a linear combination of the input values of n
and p
. By keeping track of these coefficients, we end up with an expression for 1 as a linear combination of n
and p
. The coefficient of n
is then the modular inverse of n
mod p
.