Modular Inversion
Python code for two algorithms to compute the inverse of an arbitrary
element of a prime field is presented below.
The first is an implementation of algorithm 2.107 in the
Handbook of Applied
Cryptography.
def inverse_mod(x, p):
assert 0 < x < p
a, b, x2, x1, y2, y1 = p, x, 1, 0, 0, 1
while b > 0:
[q, b], a = divmod(a, b), b
x1, x2 = x2 - q * x1, x1
y1, y2 = y2 - q * y1, y1
return y2 if y2 >= 0 else y2 + p
The second is an implementation of algorithm 14.61 in the same book.
def inverse_mod_binary(x, p):
assert 0 < x < p
v, a, c = p, 1, 0
while True:
while not x & 1:
if a & 1: a = a + p
a = a >> 1
x = x >> 1
while not v & 1:
if c & 1: c = c + p
c = c >> 1
v = v >> 1
if x == v:
return c
if x > v:
x = x - v
a = a - c
if a < 0: a = a + p
else:
v = v - x
c = c - a
if c < 0: c = c + p
Notes:
- The second algorithm usually performs slower than the first on
desktop computers. On the other hand it doesn't require bigint
divisions, it just needs additions and shifts. This may be
interesting especially for microcontroller implementations.