扩展欧几里得小结

来源:互联网 发布:163邮箱数据生成 编辑:程序博客网 时间:2024/06/06 00:15

既然说了有个计划,那就得完成

不要被这么一个高端的名字吓到,其实说到底就是gcd,不过是extended gcd,也厉害不到哪里去

首先,我们先来了解一下gcd。。很辣机的一个东西

int gcd(int a,int b){return b==0?a:gcd(b,a%b);} 

俗称辗转相除法,用来求最大公约数,不难对吧。

接下来这个东西,也不难,只不过是用来求个不定方程。

不定方程,一般也就长这样:ax+by=c(不难发现它就是a=c(mod b)的兄弟呀)

怎么求?不难!首先c当然应该可以整除a和b的最大公倍数,不然一切努力都会白费。


那么我们把目标转向ax1+by1=gcd(a,b)①

单个式子不好求,我们给它一个兄弟bx2+(a%b)y2=gcd(b,a%b)②

①②两式结合,我们得到ax1+by1=bx2+(a%b)y2

恒等定理得到:x1=y2,y1=x2-[a/b]y2;

意思就是说,我们有希望在不断的替换系数中求出最后的答案(即出现a%b==0消去了一个未知数的情况)


有了上面的铺垫,代码也就不那么难看懂了

int extended_gcd(int a,int b,int &x,int &y){if(!b){x=1; y=0;return a;}int ret,t;ret=extended_gcd(b,a%b,x,y);t=x-(int)(a/b)*y;x=y; y=t;return ret;}

用起来的难度并不比gcd难。

0 0