您的位置:首页 > 其它

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

2016-08-18 17:19 309 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息