【学习笔记】 欧几里得算法求最大公约数

本文介绍了欧几里得算法,用于求解两个整数的最大公约数。首先回顾了除数算法的预备知识,包括整除性质和推论。接着详细解释了欧几里得算法的原理,通过举例展示了如何利用该算法找到最大公约数,并给出了算法的具体实现。此外,还讨论了如何通过最大公约数求最小公倍数的方法。

预备知识

定理1:令a,b,c为整数,其中a ≠ 0,则
    (i)  如果a | b和a | c,则a | (b + c);
    (ii) 如果a | b,那么对所有整数c都有a | bc;
    (iii)如果a | b,b | c,则a | c。

    下面给出一个 (i) 的直接证明。假定a | b和a | c。则从整除性定义可知,存在整数 s 和 t 满足b = as和c = at。因此

b + c = as + at = a(s + t)

于是,a整除b + c。(ii) 和 (iii) 的证明略。

推论1:如果a,b,c是整数,其中a ≠ 0,使得a | b和a | c,那么当 m 和 n 是整数时有 a | mb + nc。

    采用直接证明法。由定理1中的 (ii) 可知,当 m 和 n 是整数时有 a | mb 和 a | nc。再由定理1中的 (i) 可得a | mb + nc。

定理2:除数算法(division algorithm)。令 a 为整数,d 为正整数。则存在唯一的整数 q 和 r,满足 0 ≤ r < d,使得a = dq + r。

      详细证明请参考《离散数学及其应用》5.2.5节-利用良序性证明

欧几里得算法

我们用gcd(a,b)表示a与b的最大公约数,lcm(a,b)表示a与b的最小公倍数。

1.利用素因子分解求最大公约数和最小公倍数
例:求 168 和 300 的最大公约数和最小公倍数
解:对 168 和 300 做素因子分解:
168=23×3×7,300=22×3×5168 = 2^{3}\times 3\times 7, 300 = 2^{2}\times 3\times 5168=23×3×7,300=22×3×5可把它们写成168=23×31×50×71,300=22×31×52×70168 = 2^{3}\times 3^{1}\times5^{0}\times 7^{1}, 300 = 2^{2}\times 3^{1}\times 5^{2}\times7^{0}168=23×31×50×71,300=22×31×52×70于是gcd(168,300)=22×31×50×70=12gcd(168,300) = 2^{2}\times 3^{1}\times5^{0}\times 7^{0} = 12gcd(168,300)=22×31×50×70=12lcm(168,300)=23×31×52×71=4200lcm(168,300) = 2^{3}\times 3^{1}\times5^{2}\times 7^{1} = 4200lcm(168,300)=23×31×52×71=4200
2.欧几里得算法又称辗转相除法求最大公约数
直接从整数的素因子分解式计算两个整数的最大公约数效率很低,原因是寻找素因子分解式非常耗时,而欧几里得算法非常高效。
欧几里得算法的基础是下面关于最大公约数和整除算法的结论。

引理1:令a = bq + r,其中a,b,q 和 r均为整数,则 gcd(a,b) = gcd(b,r)

:如果能证明 a 与 b 的公约数和 b 与 r 的公约数相同,也就证明了 gcd(a,b) = gcd(b,r),因为这两对整数必定有相同的最大公约数。
      因此,假定 d 整除 a 和 b,则可得 d 也整除 a - bq = r (根据推论1)。因此,a 和 b 的任何公约数也是 b 和 r 的公约数。
      类似地,假定 d 整除 b 和 r,则可得 d 也整除 bq + r = a。因此,b 和 r 的任何公约数也是 a 和 b 的公约数。
      因此,gdc(a,b) = gcd(b,r)。
      假定 a 和 b 为正整数,且 a ≥ b。令 r0=ar_{0}=ar0=ar1=br_{1}=br1=b。当连续应用整除算法时,可得
r0=r1q1+r2        0⩽r2<r1r_{0}= r_{1}q_{1}+ r_{2} \, \, \, \, \, \, \, \, 0 \leqslant r_{2}< r_{1}r0=r1q1+r20r2<r1r1=r2q2+r3        0⩽r3<r2r_{1}= r_{2}q_{2}+ r_{3} \, \, \, \, \, \, \, \, 0 \leqslant r_{3}< r_{2}r1=r2q2+r30r3<r2⋮\vdots rn−2=rn−1qn−1+rn        0⩽rn<rn−1r_{n-2}= r_{n-1}q_{n-1}+ r_{n} \, \, \, \, \, \, \, \, 0 \leqslant r_{n}< r_{n-1}rn2=rn1qn1+rn0rn<rn1rn−1=rnqn        r_{n-1}= r_{n}q_{n} \, \, \, \, \, \, \, \, rn1=rnqn最终在这一连续相除序列中会出现余数为0,因为在余数序列 a=r0>r1>r2>⋯⩾0a = r_{0}> r_{1}> r_{2}> \cdots \geqslant 0a=r0>r1>r2>0中至多包含a项,再者从引理1可知gdc(a,b)=gcd(r0,r1)=gcd(r1,r2)=⋯=gcd⁡(rn−2,rn−1)gdc(a,b)=gcd(r_{0},r_{1})=gcd(r_{1},r_{2})= \cdots =\gcd(r_{n-2},r_{n-1})gdc(a,b)=gcd(r0,r1)=gcd(r1,r2)==gcd(rn2,rn1)=gcd(rn−1,rn)=gcd(rn,0)=rn=gcd(r_{n-1},r_{n})=gcd(r_{n},0)=r_{n}=gcd(rn1,rn)=gcd(rn,0)=rn因此,最大公约数是除法序列中最后一个非零余数。
例:用欧几里得算法寻找 414 和 662 的最大公约数。
解:连续相除得:662=414⋅1+248662=414\cdot 1+248662=4141+248414=248⋅1+166414=248\cdot 1+166414=2481+166248=166⋅1+82248=166\cdot 1+82248=1661+82166=82⋅2+2166=82\cdot 2+2166=822+282=2⋅4182=2\cdot 4182=241因此,gcd(414,662)=2gcd(414,662)=2gcd(414,662)=2,因为2是最后一个非零余数。

算法和具体实现如下:

算法 欧几里得算法
procedure gcd(a,b:正整数)
x := a
y := b
while y ≠ 0
	r := x mod y
	x := y
	y := r
return x{gcd(a,b)是x}
欧几里得算法实现
int gcd(int a, int b)
{
	int x = a;
	int y = b;
	int r;				// 余数
	while (y != 0) {
		r = x % y;
		x = y;
		y = r;
	}
	return x;
}

3.求最小公倍数
除了运用1中的质因数分解法外,可以用公式法求两个数的最小公倍数。由于两个数的乘积等于这两个数的最大公约数与最小公倍数的积。即a×b=gcd(a,b)×lcm(a,b)a \times b = gcd(a,b)\times lcm(a,b)a×b=gcd(a,b)×lcm(a,b)。所以,求两个数的最小公倍数,就可以先求出它们的最大公约数,然后用上述公式求出它们的最小公倍数。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值