mirror of
https://github.com/darkrenaissance/darkfi.git
synced 2026-01-08 22:28:12 -05:00
35 lines
877 B
Python
35 lines
877 B
Python
|
|
# a general Euclidean algorithm for any number type with
|
|
# a divmod and a valuation abs() whose minimum value is zero
|
|
def gcd(a, b):
|
|
if abs(a) < abs(b):
|
|
return gcd(b, a)
|
|
|
|
while abs(b) > 0:
|
|
_,r = divmod(a,b)
|
|
a,b = b,r
|
|
|
|
return a
|
|
|
|
|
|
# extendedEuclideanAlgorithm: int, int -> int, int, int
|
|
# input (a,b) and output three numbers x,y,d such that ax + by = d = gcd(a,b).
|
|
# Works for any number type with a divmod and a valuation abs()
|
|
# whose minimum value is zero
|
|
def extendedEuclideanAlgorithm(a, b):
|
|
if abs(b) > abs(a):
|
|
(x,y,d) = extendedEuclideanAlgorithm(b, a)
|
|
return (y,x,d)
|
|
|
|
if abs(b) == 0:
|
|
return (1, 0, a)
|
|
|
|
x1, x2, y1, y2 = 0, 1, 1, 0
|
|
while abs(b) > 0:
|
|
q, r = divmod(a,b)
|
|
x = x2 - q*x1
|
|
y = y2 - q*y1
|
|
a, b, x2, x1, y2, y1 = b, r, x1, x, y1, y
|
|
|
|
return (x2, y2, a)
|