欧几里得扩展

源网址
欧几里得扩展证明(自我感觉最好懂得一种写法)
① ,当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;

由此可以得出扩展欧几里德的递归程序

int 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;
    }
}

还可以这样写

#include<cstdio>
typedef long long LL;
void extend_Eulid(LL a, LL b, LL &x, LL &y, LL &d){
    if (!b) {d = a, x = 1, y = 0;}
    else{
        extend_Eulid(b, a % b, y, x, d);
        y -= x * (a / b);
    }
}
int main(){
    LL a, b, d, x, y;
    while(~scanf("%lld%lld", &a, &b)){
        extend_Eulid(a, b, x, y, d);
        printf("%lld*a + %lld*b = %lld\n", x, y, d);
    }
}

还可以这样

long long ext_gcd(long long a,long long b,LL &x,LL &y)
{

    if(b==0)
    {
        x = 1,y = 0;
        return a;
    }
    LL m;
    m = ext_gcd(b,a%b,y,x);
    y -= a / b * x; 
    return m;

}

posted on 2017-08-06 21:50  zzuzxy  阅读(127)  评论(0)    收藏  举报

导航