Algorithm Implementation/Mathematics/Extended Euclidean algorithm
< Algorithm Implementation < MathematicsPython
Both functions take positive integers a, b as input, and return a triple (g, x, y), such that ax + by = g = gcd(a, b).
Iterative algorithm
def xgcd(b, n):
x0, x1, y0, y1 = 1, 0, 0, 1
while n != 0:
q, b, n = b // n, n, b % n
x0, x1 = x1, x0 - q * x1
y0, y1 = y1, y0 - q * y1
return b, x0, y0
Recursive algorithm
import sys
sys.setrecursionlimit(1000000) # long type,32bit OS 4B,64bit OS 8B(1bit for sign)
# return (g, x, y) a*x + b*y = gcd(x, y)
def egcd(a, b):
if a == 0:
return (b, 0, 1)
else:
g, x, y = egcd(b % a, a)
return (g, y - (b // a) * x, x)
Modular inverse
An application of extended GCD algorithm to finding modular inverses:
# x = mulinv(b) mod n, (x * b) % n == 1
def mulinv(b, n):
g, x, _ = egcd(b, n)
if g == 1:
return x % n
Haskell
Unextended
euclid :: Integral a => a -> a -> a
euclid 0 b = abs b
euclid a 0 = abs a
euclid a b = euclid b $ rem a b
Extended
eGCD :: Integer -> Integer -> (Integer,Integer,Integer)
eGCD 0 b = (b, 0, 1)
eGCD a b = let (g, s, t) = eGCD (b `mod` a) a
in (g, t - (b `div` a) * s, s)
This article is issued from Wikibooks. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.