擴展歐幾里得算法與其應用

擴展歐幾里得的證明及其算法

定理:對於任意一對整數a,b,一定存在x,y使得ax+by=gcd(a,b)

證明:假設a>b。

1.若b=0,一定存在x=1,y=0,使得ax+by=gcd(a,b)

2.若b>0,假設存在bx+(a%b)y=gcd(b,a%b),那麼也存在bx+(a%b)y=gcd(a,b)

又因爲bx+(a-b*(a/b))y=gcd(a,b)=ax+by,所以整理得到:ay+b*(x-(a/b)y)=gcd(a,b)

所以令x'=y,y'=x-(a/b)y,就可以得到ax'+by'=gcd(a,b)

那麼在知道a,b的情況下,我們就可以用遞歸的方式得到x,y

當然這是一組特解。通解是:x=x0+k*(b/d),y=y0+k*(a/d) (其中d=gcd(a,b),x0 y0 是一組特解)

ll exgcd(ll a,ll b,ll &x,ll &y)
{
	if(b==0) {x=1,y=0;return a;}
	ll d=exgcd(b,a%b,x,y);
	ll z=x;x=y;y=z-y*(a/b);
	return d;
}

推廣一下:如何解一個不定方程。

首先,所有的不定方程ax+by=c若是有解,一定滿足gcd(a,b)|c。(小學生都知道吧。。。)

通解就是:我們可以把2邊都除以d=gcd(a,b),得到等價方程(a/d)x+(b/d)y=(c/d),然後用擴展歐幾里得到(a/d)x+(b/d)y=1的解。(因爲gcd(a/d,b/d)=1)x1,y1,那麼通解就是c*(x1+k*(b/d)),c*(y1-k*(a/d))。

當然也可以寫成這樣:x=(c/d)x0+k*(b/d),y=(c/d)y0-k*(a/d),其中x0,y0是ax+by=gcd(a,b)的一組特解。

解線性同餘方程

給定a,b,m,求x滿足a*x%m=b%m。因爲未知數的係數是1,所以稱之爲線性同餘方程。

a*x-b一定是m的倍數,不妨設爲-y倍。得到:a*x+m*y=b。有擴展歐幾里得得到:gcd(a,m)|b。

若是有解,那麼就先解決:a*x+m*y=gcd(a,m),得到一組特解x0,y0,因爲我們並不關心y是啥,所以只需要x0正確即可。

那對於原方程的解就是:x=x0/gcd(a,m)*b

通解:x+k*(m/d),d=gcd(a,m)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章