欧几里得算法及拓展欧几里得算法


前言

本文主要介绍的是求 gcd ⁡ ( a , b ) \gcd(a,b) gcd(a,b)及方程 a x + b y = gcd ⁡ ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b)的解的方法,即欧几里得算法和拓展欧几里得算法。


欧几里得算法

定理: ∀ a , b ∈ N , b ≠ 0 , gcd ⁡ ( a , b ) = gcd ⁡ ( b , a   m o d   b ) \forall a,b\in\N,b\ne 0,\gcd(a,b)=\gcd(b,a\bmod b) a,bN,b=0,gcd(a,b)=gcd(b,amodb)
证明:
a < b a<b a<b ,则 gcd ⁡ ( b , a   m o d   b ) = gcd ⁡ ( b , a ) = gcd ⁡ ( a , b ) \gcd(b,a\bmod b)=\gcd(b,a)=\gcd(a,b) gcd(b,amodb)=gcd(b,a)=gcd(a,b),命题成立。
a ≥ b a\ge b ab,设 a = q b + r a=qb+r a=qb+r,其中 0 ≤ r < b 0\le r<b 0r<b。显然 r = a   m o d   b r=a\bmod b r=amodb。而对于 a , b a,b a,b的任意公约数 d ∣ a , d ∣ q × b d|a,d|q\times b da,dq×b,故 d ∣ ( a − q b ) d|(a-qb) d(aqb),即 d ∣ r d|r dr。因此 d d d也是 b , r b,r b,r的公约数。反之亦成立。故 a , b a,b a,b的公约数集合与 b , a   m o d   b b,a\bmod b b,amodb的公约数集合相同,他们的最大公约数自然也相等。
证毕。

int gcd(int a,int b)
{
	if(b==0)
		return a;
	return gcd(b,a%b);
}

拓展欧几里得算法

求方程 a x + b y = gcd ⁡ ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b)的整数解。
设方程 a x + b y = gcd ⁡ ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b)的一组解为 { x = x 1 y = y 1 \begin{cases}x=x_1\\y=y_1\end{cases} {x=x1y=y1。由欧几里得算法得知,方程 a x + b y = gcd ⁡ ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b)可转化为 b x + ( a   m o d   b ) y = gcd ⁡ ( a , b ) bx+(a\bmod b)y=\gcd(a,b) bx+(amodb)y=gcd(a,b),则有另一组解为 { x = x 2 y = y 2 \begin{cases}x=x_2\\y=y_2\end{cases} {x=x2y=y2。此时把方程变形一下就可以变成:
a x 1 + b y 1 = b x 2 + ( a   m o d   b ) y 2 a x 1 + b y 1 = b x 2 + ( a − ⌊ a b ⌋ × b ) y 2 a x 1 + b y 1 = a y 2 + b x 2 − ⌊ a b ⌋ × b y 2 ax_1+by_1=bx_2+(a\bmod b)y_2 \\ ax_1+by_1=bx_2+\left(a-\left\lfloor\frac{a}{b}\right\rfloor\times b\right)y_2 \\ ax_1+by_1=ay_2+bx_2-\left\lfloor\frac{a}{b}\right\rfloor\times by_2 ax1+by1=bx2+(amodb)y2ax1+by1=bx2+(aba×b)y2ax1+by1=ay2+bx2ba×by2
根据恒等定理,有一组解为 { x = y 2 y = x 2 − ⌊ a b ⌋ × y 2 \begin{cases}x=y_2\\y=x_2-\left\lfloor\frac{a}{b}\right\rfloor\times y_2\end{cases} {x=y2y=x2ba×y2。可以发现, x , y x,y x,y基于 x 2 , y 2 x_2,y_2 x2,y2,于是在求最大公约数的时候,可以顺便求出。

int x,y;
int exgcd(int a,int b)
{
	if(b==0)
	{
		x=1,y=0;
		return a;
	}
	int temp=exgcd(b,a%b);
	int tx=x;
	x=y;
	y=tx-a/b*y;
	return temp;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值