扩展欧几里德

对于不完全为0的非负整数a, b.  gcd(a, b)表示a, b 的最大公约数。那么存在整数x y使得 gcd(a, b) = a * x + b * y;

不妨设a > b

 ,当b = 0 时,gcd(a, b) = a , 此时 x = 1, y = 0;

 ,当 a * b <> 0 时,

  a * x + b * y = gcd(a, b);   (1)

    b * x0 + (a % b) * y0 = gcd( b, a % b);   (2)

由朴素的欧几里德公式; gcd(a, b) = gcd (b, a % b);

(1)(2)  a * x + b * y = b * x0 + (a % b) * y0

                     = b * x0 + (a – a / b * b) * y0               

                     = a * y0 + ( x0 – a / b * y0 ) * b

          所以 x = y0, y = x0 – a / b * y0;

 

void extend_euild(int a, int b)
{
    if(b == 0)
    {
        t = 1;
        p = 0;
        c = a;
    }
    else {
        extend_euild(b, a%b);
        int temp = t;
        t = p;
        p = temp - a/b*p;
    }
}

 

posted on 2016-08-14 11:27  JASONlee3  阅读(195)  评论(0编辑  收藏  举报

导航