欧几里德和扩展欧几里德算法

欧几里德算法:
用途: 得到两个数的最大公约数
公式: g c d ( a , b ) = g c d ( b , a % b ) gcd(a,b)=gcd(b,a\%b) gcd(a,b)=gcd(b,a%b)
证明: g c d ( a , b ) = g c d ( b , a % b ) gcd(a,b)=gcd(b,a\%b) gcd(a,b)=gcd(b,a%b)

  1. 证明 a , b a,b a,b的公约数一定是 b , a % b b,a\%b b,a%b的公约数:
    因为 a % b = a − ⌊ a b ⌋ × b a\%b=a-\lfloor \frac{a}{b} \rfloor \times b a%b=aba×b,这里设 c = ⌊ a b ⌋ c=\lfloor \frac{a}{b} \rfloor c=ba
    对于 a , b a,b a,b的任意公约数 d d d,有 d ∣ a , d ∣ b d|a,d|b da,db,必然有 d ∣ ( a x + b y ) d|(ax+by) d(ax+by)
    所以 d ∣ b , d ∣ ( a − c × b ) d|b,d|(a-c\times b) db,d(ac×b)必然成立,即 a , b a,b a,b的公约数一定是 b , a % b b,a\%b b,a%b的公约数
  2. 证明 b , a % b b,a\%b b,a%b的约数数一定是 a , b a,b a,b的公约数:
    因为 a % b = a − ⌊ a b ⌋ × b a\%b=a-\lfloor \frac{a}{b} \rfloor \times b a%b=aba×b,这里设 c = ⌊ a b ⌋ c=\lfloor \frac{a}{b} \rfloor c=ba
    对于 b , a − c × b b,a-c\times b b,ac×b的任意公约数 d d d,有 d ∣ b , d ∣ ( a − c × b ) d|b,d|(a-c\times b) db,d(ac×b)
    所以必然有 d ∣ ( a − c × b + c × b ) = d ∣ a , d ∣ b d|(a-c\times b + c\times b)=d|a,d|b d(ac×b+c×b)=da,db,即 b , a % b b,a\%b b,a%b的公约数一定是 a , b a,b a,b的公约数

所以 a , b a,b a,b的公约数集合与 b , a % b b,a\%b b,a%b的公约数集合一致,所以 g c d ( a , b ) = g c d ( b , a % b ) gcd(a,b)=gcd(b,a\%b) gcd(a,b)=gcd(b,a%b)
代码:

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

扩展欧几里德算法:
定义: 对于 a a a b b b,一定存在 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)
代码:

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

得到的 x = x 0 , y = y 0 x=x_0,y=y_0 x=x0,y=y0

通解: x = x 0 + k × b g c d ( a , b ) , y = y 0 − k × a g c d ( a , b ) x=x_0+k\times \frac{b}{gcd(a,b)},y=y_0-k\times \frac{a}{gcd(a,b)} x=x0+k×gcd(a,b)b,y=y0k×gcd(a,b)a
通解证明:
d = g c d ( a , b ) d = gcd(a,b) d=gcd(a,b)
a x 0 + b y 0 = d ax_0+by_0=d ax0+by0=d
a x + b y = a ( x 0 + k × b d ) + b ( y 0 − k × a d ) = a x 0 + b y 0 + k a b d − k a b d ax+by=a(x_0+k\times \frac{b}{d})+b(y_0-k\times \frac{a}{d})=ax_0+by_0+\frac{kab}{d}-\frac{kab}{d} ax+by=a(x0+k×db)+b(y0k×da)=ax0+by0+dkabdkab
= a x 0 + b y 0 = d =ax_0+by_0=d =ax0+by0=d

证明代码中的部分: y = y − a / b × x y = y - a / b \times x y=ya/b×x
证明:
e x g c d ( b , a % b , y , x ) exgcd(b,a\%b,y,x) exgcd(b,a%b,y,x)得到:
b y + ( a % b ) x = d by+(a\%b)x=d by+(a%b)x=d
b y + ( a − ⌊ a b ⌋ × b ) x = d by+(a-\lfloor \frac{a}{b} \rfloor \times b)x=d by+(aba×b)x=d
a x + b ( y − ⌊ a b ⌋ x ) = d ax+b(y-\lfloor \frac{a}{b} \rfloor x)=d ax+b(ybax)=d
那么得到的就是 x x x不变, y = y − a / b × x y=y-a/b\times x y=ya/b×x

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值