恒邪

扩展欧几里德算法

不定方程ax+by=c
重点:解二元一次不定方程。看起来扩展Euclid算法是不定方程的一种特殊情况,实际上呢,不定方程却是用Euclid算法解的。
对 于不定方程ax+by=c,设gcd(a,b)=d,如果ax+by=c有解,则d|c(这也是许多奥数题的切入点)。所以一旦d不是c的约数,那么 ax+by=c一定无解。当d|c时,先求出ax'+by'=d=gcd(a,b)的x'和y',则x=x'*c/d,y=y'*c/d。由上一段可知, 只要ax+by=c有一个解,它就有无数个解。
Euclid算法还可以求解同余方程ax≡b(mod m)。这其实和不定方程ax+my=b没有区别。(不定方程和同余方程一般都有范围限制,这其实也很容易解决,就不说了)

基本原理
设 a 和b 不全为 0,则存在整数 x,y 使得 gcd(a,b)=xa+yb 对于辗转相除法的最后一项
此时 b=0,则gcd(a,b)=1*a+0*b,因为 gcd(a,b)=gcd(b,a%b)则有 x*a+y*b=x1*b+y1*(a%b)
将等式右边变形,b*x1+(a%b)*y1=b*x1+(a-(a/b)*b)*y1=a*y1+b*(x1-(a/b)*y1)
则,x=y1,y=x1-(a/b)*y1 则可由后向前迭代得到 x,y

解题思路
对于扩展欧几里德定理的题,一般都需要进行一定的推导之后得到一个形式为xa+yb=c 的方程,然后根据 c 确定解是否存在,
如果 c 可以被 gcd(a,b)整除,那么方程有解,否则方程无解。而且所得的解释不唯一的,对于一组解 x0,y0 则其所有解可以表示为
x=x0+b/gcd(a,b)*t,y-y0-a/gcd(a,b)*t,t=0,+1,+2……一般会要求找出 x 或者 y 的最小正整数解,这个时候需要做一些调整。

 

 

 1 int exgcd(int a,int b,int &x,int &y) 
 2 { 
 3     if(b==0) 
 4     { 
 5         x=1; 
 6         y=0; 
 7         return a; 
 8     } 
 9     int d=exgcd(b,a%b,x,y); 
10     int t=x; 
11     x=y; 
12     y=t-a/b*y; 
13     return d; 
14  } 

 注:

 

从最简单的情况开始。当b=0时,我们取x=1,y=0。当b≠0时呢?
假设gcd(a,b)=d,则gcd(b,a mod b)=d。若我们已经求出了gcd(b,a mod b)的线性组合表示bx'+(a mod b)y',则
gcd(a,b)=d
        =bx'+(a mod b)y'
        =bx'+(a-[a/b]b)y'
        =ay'+b(x'-[a/b]y')
那么,x=y',y=x'-[a/b]y'。这样就可以在Euclid的递归过程中求出x和y。

posted on 2014-04-07 20:48  恒邪  阅读(252)  评论(0编辑  收藏  举报

导航