gcd和扩展欧几里得exgcd--zhengjun

\(\gcd\)

定义:求出两个数的最大公因数。

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

证明:

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

可知,\(\gcd(t_1,t_2)=1\),如果还有一个\(t\),那么就可以说明\(a,b\)还有一个公共素因数\(t\),与原意不符。

所以\(\gcd(t_2\times k,(t_1\times k)\bmod(t_2\times k))\)

\(=\gcd(t_2\times k,(t_1\bmod t_2)\times k)\)

由于\(t_1,t_2\)互质,所以\(t_2\)\(t_1\bmod t_2\)互质,所以\(\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=c\)的解

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

证明:反正就是一个裴蜀定理,我就不说了。

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

\(b=0\)时,\(x=1,y=0\)

\(b\ne0\)时,因为\(ax+by=\gcd(a,b)=\gcd(b,a\bmod b)=bx'+a\bmod b\times y'\)

所以\(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,b\)的系数对应得

\[\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

posted @ 2022-06-10 20:01  A_zjzj  阅读(35)  评论(0编辑  收藏  举报