gcd和擴展歐幾里得exgcd--zhengjun

gcd\gcd

定義:求出兩個數的最大公因數。

算法定律:gcd(a,b)=gcd(b,amodb)\gcd(a,b)=\gcd(b,a\bmod b)

證明:

gcd(a,b)=k,a=t1×k,b=t2×k\gcd(a,b)=k,a=t_1\times k,b=t_2\times k

可知,gcd(t1,t2)=1\gcd(t_1,t_2)=1,如果還有一個tt,那麼就可以說明a,ba,b還有一個公共素因數tt,與原意不符。

所以gcd(t2×k,(t1×k)mod(t2×k))\gcd(t_2\times k,(t_1\times k)\bmod(t_2\times k))

=gcd(t2×k,(t1modt2)×k)=\gcd(t_2\times k,(t_1\bmod t_2)\times k)

由於t1,t2t_1,t_2互質,所以t2t_2t1modt2t_1\bmod t_2互質,所以gcd(t2×k,(t1modt2)×k)=k\gcd(t_2\times k,(t_1\bmod t_2)\times k)=k,命題得證

代碼

int gcd(int x,int y){
	if(!y)return x;
	return gcd(y,x%y);
}

擴展歐幾里得,exgcd

定義:求出方程ax+by=cax+by=c的解

爲了使原方程有解,則gcd(a,b)c\gcd(a,b)|c,(cc能被gcd(x,y)\gcd(x,y)整除)

證明:反正就是一個裴蜀定理,我就不說了。

然後,只要我求出方程ax+by=gcd(a,b)ax+by=\gcd(a,b),就可以求出上面方程了。

b=0b=0時,x=1,y=0x=1,y=0

b0b\ne0時,因爲ax+by=gcd(a,b)=gcd(b,amodb)=bx+amodb×yax+by=\gcd(a,b)=\gcd(b,a\bmod b)=bx'+a\bmod b\times y'

所以ax+by=bx+amodb×y=bx+(aab×b)y=bx+ayab×b×y=ay+b(xaby)ax+by=bx'+a\bmod b\times y'=bx'+(a-\lfloor\frac{a}{b}\rfloor\times b)y'=bx'+ay'-\lfloor\frac{a}{b}\rfloor\times b\times y'=ay'+b(x'-\lfloor\frac{a}{b}\rfloor y')

所以,左右a,ba,b的係數對應得
{x=yy=xab×y \left\{ \begin{aligned} x=y'\\ y=x'-\lfloor\frac{a}{b}\rfloor\times y' \end{aligned} \right.
所以代碼就是:

int x,y;
void exgcd(int a,int b,int x,int y){
	if(b==0){x=1;y=0;return;}
	exgcd(b,a%b,x,y);
	int t=x;
	x=y;
	y=t-a/b*y;
}

謝謝–zhengjun

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