欧几里德算法与扩展(中国剩余定理)

来源:互联网 发布:java选择排序代码 编辑:程序博客网 时间:2024/05/21 17:49

1.欧几里德算法(最大公约数)

int gcd(int  a,int b){    if(!b)        return a;    else        return gcd(b,a%b);}

最小公倍数=a*b/gcd(a,b)




2.扩展欧几里德算法


   该算法用于求二元一次方程:a*x+b*y=c;


   原理:(1)a*x+b*y=gcd(a,b)一定有解,要想求出(2)a*x+b*y=c的解,必须满足c%gcd(a,b)==0, 结果为:方程(1)的解为x0,y0,则方程(2)的解为x=x0*c/gcd(a,b),y=y0*c/gcd(a,b);   


   注意:1. (x+k*b,y-k*a),都为方程(2)的解,k为任意值。

              2. 最小非负解为:(x0 * (c / gcd(a,b)) % b + b) % b;


   核心代码:

void ext_gcd(ll a,ll b,ll c,ll &x,ll &y)  //a*x+b*y=c{     if(!b) {c=a;x=1;y=0;return;}     ext_gcd(b,a%b,c,y,x);     y-=a/b*x;}



0 0