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

gcd \gcd

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

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

证明:

gcd ( a , b ) = k , a = t 1 × k , b = t 2 × k \gcd(a,b)=k,a=t_1\times k,b=t_2\times k

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

所以 gcd ( t 2 × k , ( t 1 × k ) m o d ( t 2 × k ) ) \gcd(t_2\times k,(t_1\times k)\bmod(t_2\times k))

= gcd ( t 2 × k , ( t 1 m o d t 2 ) × k ) =\gcd(t_2\times k,(t_1\bmod t_2)\times k)

由于 t 1 , t 2 t_1,t_2 互质,所以 t 2 t_2 t 1 m o d t 2 t_1\bmod t_2 互质,所以 gcd ( t 2 × k , ( t 1 m o d t 2 ) × 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

定义:求出方程 a x + b y = c ax+by=c 的解

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

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

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

b = 0 b=0 时, x = 1 , y = 0 x=1,y=0

b 0 b\ne0 时,因为 a x + b y = gcd ( a , b ) = gcd ( b , a m o d b ) = b x + a m o d b × y ax+by=\gcd(a,b)=\gcd(b,a\bmod b)=bx'+a\bmod b\times y'

所以 a x + b y = b x + a m o d b × y = b x + ( a a b × b ) y = b x + a y a b × b × y = a y + b ( x a b 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 a,b 的系数对应得
{ x = y y = x a b × 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

原创文章 115 获赞 118 访问量 6499

猜你喜欢

转载自blog.csdn.net/A_zjzj/article/details/105675729