一、扩展欧几里得算法:

找出一对整数(x,y),使得ax+by=gcd(a,b)

gcd(a,b)=gcd(b,a%b) 欧几里得定理

∴a x1 + b y1 = b x2 + (a%b)y2

∴a x1 + b y1 = b x2 + [a-(a/b)*b] y2 在整除意义下,a%b=a-(a/b)*b

∴a x1 + b y1 = b x2 + a y2 - b*(a/b)y2 右边展开

∴a x1 + b y1 = a y2 + b [x2 - (a/b)y2] 右边合并同类项

根据恒等定理得,x1 = y2 ,y1 = x2 - (a/b)y2

递归求解

边界条件:gcd(a,0)= 1 * a - 0 * 0 = a

void gcd(int a,int b,int &d,int &x,int &y)
{
    if(!b) {d=a;x=1;y=0;}
    else {gcd(b,a%b,d,y,x);y-=x*(a/b);}
}

扩展欧几里得算法只是求出其中的一组解,如何得到其他解?

 

结论1:

设a,b,c 为任意整数。若 方程a x + b y = c 的一组整数解为(x0,y0),
(前提:方程有解)
则它的任意整数解都可以写成(x0 + k b’,y0 - k a’)。
其中a’=a / gcd(a,b) b’=b / gcd(a,b),k取任意整数

证明:

由扩展欧几里得可以求出a x + b y = gcd (a,b)的一组解(x1,y1),
任取另外一组解 (x2,y2)

∴ a x1 + b y1 = a x2 + b y2

∴ a (x1 - x2) = b(y2 - y1)

令 a’= a / gcd(a,b) b’=b / gcd(a,b),那么 (a’,b’)= 1

∴ a’(x1 - x2) = b’ (y2 - y1)

∴ b’能整除(x1 - x2)

令 (x1 - x2) = k b’

则 (y2 - y1)= k a’

∴ x2 = x1 - k b’     y2 = k a’ + y1

推倒过程并没有用到 a x + b y 的 右边是什么 ,所以结论1 成立

 

结论1的前提是方程有解,那么什么情况下方程才有解?

对于方程 a x + b y = c  

由上面已经推导出了 若 c=gcd(a,b),那么方程一定有解 (x,y)

若c!=gcd(a,b)

①、c是gcd(a,b)的倍数,令 c=gcd(a,b)*d

   那么 ( a x + b y)/d = c /d = a * x / d + b * y / d = gcd (a,b) 方程有解(x’,y’)

x’ = x / d,y’ = y / d    ∴x’=x c / g   y’ = y c / g   

②、c不是gcd(a,b)的倍数,那么无解

 

所以,结论2:

 设a,b,c 为任意整数,g = gcd (a,b),方程 a x + b y = g 的一组解是 (x0,y0),

则当 c 是 g 的倍数时,ax + by = c 的一组解是 (x0 c / g ,y0 c / g)

 

二、同余方程

定理1  若gcd(a,b)=d,则一定能找出一组(x,y),满足ax+by=d

证明:还原欧几里得算法的过程

a = b*q1 + r1

b=  r1*q2+ r2

r1= r2*q3+r3

……

r1=q-b*q1

r2=b-r1*q2

r3=r1-r2*q3

……

所以d一定能写成ax+by的形式

定理2  若gcd(a,b)=1,则方程ax≡c(mod b) 在[0,b-1]上有唯一解

定理3  若gcd(a,b)=d,则方程ax≡c(mod b) 在[0,b/d-1]上有唯一解

 

所以,求解同余方程:

  ax≡c (mod b)

方程转化为ax-by=c

先用上面讲的结论二判断是否有解

再用扩展欧几里得求出其中一组解

最后用结论二求出其他的解

作者:xxy
本文版权归作者所有,转载请用链接,请勿原文转载,Thanks♪(・ω・)ノ。