扩展欧几里得算法

 用一个线性组合来表示最大公约数, 即d=gcd(a, b)=ax+by, 要求计算出满足等式的整数x, y;要解决这个问题,就要用到扩展欧几里得算法了。

(1)若b=0的话, d= gcd(a, b) =a, 此时x=1, y=0;

(2)若b!=0的话, 可令d1=gcd(b, a%b) , 则存在x' 和 y',使得d1=bx'+( a%b )y'。 

                        由欧几里得公式可得到:d=d1;

                        所以 d1=bx'+( a%b )y'=bx'+( a - a/b*b)y'=ay'+b(x' - a/b*y')=ax+by

                        所以 x=y',  y=x' - a/b y' ;

代码:

void extended_euclid(int a, int b, int &x, int &y)
{
    int temp;
    if( b==0 )
    {
        x=1;y=0;
        return;
    }
    else
    {
        extended_euclid(b, a%b, x, y);
        //!x=y',  y=x' - a/b y'
        temp=x;
        x=y;
        y=temp-a/b*y;
    }
}


你可能感兴趣的:(算法,扩展)