2018/6/8 星期五
今天跟乐乐讲解扩展欧几里得算法的时候,突然明白了解系的最小间距是怎么得来的, 下面写一下推导过程.
int ext_gcd(int a,int b, int &x ,int &y)
{
if(b == 0)
{
x=1; y=0;
return a;
}
int c = ext_gcd(a, b, x, y);
int xt = x;
x = y;
y = xt - a / b * y;
return c;
}
通常要求的是 ax+by=n的一组解,设c=gcd(a,b), 我们一般会先通过ext_gcd()函数求出
ax+by=c的一组解(x0,y0)使得ax0+by0=c, 然后判断n是否能被c整除, 如果不可以
整除,则原方程无解. 否则, 令k=n/c,则a⋅kx0+b⋅ky0=kc=n,此时(kx0,ky0)
即为原方程的解, 实际上, 从(x0,y0)我们扩展出了解系:
X=x0+T1⋅t=x0+b/gcd(a,b)⋅t
Y=y0−T2⋅t=y0−a/gcd(a,b)⋅t
t取任意整数,都可以得到一组解(Xi,Yi)满足aXi+bYi=n成立. 下面证明为什么
T1=b/gcd(a,b)
T2=a/gcd(a,b)
(因为a,b,gcd(a,b)都是正整数, 所以T1,T2也都是正整数)
将(X,Y)代入原方程得: aX+bY=n
⇒a(x0+T1⋅t)+b(y0−T2⋅t)=n
⇒ax0+by0+(aT1−bT2)⋅t=n
∵ax0+by0=n,∴(aT1−bT2)⋅t=0
当t̸=0时, 有aT1−bT2=0,即aT1=bT2, 我们要求最小的T1,T2
令T=aT1=bT2, 显然当T最小的时候, T1,T2也最小, 那么T最小为多少呢,
因为T既是a的倍数, 也是b的倍数, 所以T是a和b的公倍数, 所以当T为a和b的最小
公倍数时,即T=ab/gcd(a,b)时,T1,T2最小,此时有:
aT1=ab/gcd(a,b)⇒T1=b/gcd(a,b)
bT2=ab/gcd(a,b)⇒T2=a/gcd(a,b)
证毕.
下面用一个实例演示一下: 3x+4y=1
显然(x0,y0)=(−1,1)是原方程的一组解(3⋅−1+4⋅1=1),
T1=b/gcd(a,b)=4/1=4
T2=a/gcd(a,b)=3/1=3
取t=1,得:
x1=x0+T1⋅1=−1+4=3
y1=y0−T2⋅1=1−3=−2
⇒x1+4y1=3⋅3+4⋅(−2)=1
取t=2,得:
x2=x0+T1∗2=−1+4∗2=7
y2=y0−T2∗2=1−3∗2=−5
⇒3x2+4y2=3∗7−4∗5=1;