Euclidean Algorithm
Greatest Common Divisor -- gcd(a,b): greatest integer divides both a and b:gcd(a,b)=gcd(a,a-b)
gcd(a,0)=a
gcd(a,b) is the smallest positive number in {aX+bY}
int gcd(int a, int b)
{
if(b == 0) return a;
return gcd(b, a%b);
}
def gcd(m,n):
...: while n:
...: m,n=n,m%n
...: return m
Running time: O(log(a + b))
Extended Euclidean Algorithm
keep the original algorithm, but write all intermediate numbers as integer combinations of a and b
设如下方程:ax+by = gcd(a,b) = d;
bx’+(a%b)y’ = gcd(b,a%b);
那么有gcd(a,b) = gcd(b,a %b),
那么ax+by = bx’+(a%b)y’ = bx’ +(a – [a/b]*b)y’ = ay’ + b(x’ – [a/b]y’),
由恒等关系有: x = y’ , y = (x’ – [a/b]y’),[a/b]表示a/b的值向下取整。
........
用exgcd(a,b,d,x,y)表示方程ax+by = d,那么由上面一直递归下去,直到 b = 0,递归结束,此时 d = gcd(a,0) =a , x = 1,y =0;
int extend_Euclid(int a, int b, int &x, int &y)
{
if(b==0)
{
x = 1;
y = 0;
return a;
}
int r = extend_Euclid(b, a%b, y, x);
y -= a/b*x;
return r;
}