预备知识
定理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。因此
于是,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=a 和 r1=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+r20⩽r2<r1r1=r2q2+r3 0⩽r3<r2r_{1}= r_{2}q_{2}+ r_{3} \, \, \, \, \, \, \, \, 0 \leqslant r_{3}< r_{2}r1=r2q2+r30⩽r3<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}rn−2=rn−1qn−1+rn0⩽rn<rn−1rn−1=rnqn r_{n-1}= r_{n}q_{n} \, \, \, \, \, \, \, \, rn−1=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(rn−2,rn−1)=gcd(rn−1,rn)=gcd(rn,0)=rn=gcd(r_{n-1},r_{n})=gcd(r_{n},0)=r_{n}=gcd(rn−1,rn)=gcd(rn,0)=rn因此,最大公约数是除法序列中最后一个非零余数。
例:用欧几里得算法寻找 414 和 662 的最大公约数。
解:连续相除得:662=414⋅1+248662=414\cdot 1+248662=414⋅1+248414=248⋅1+166414=248\cdot 1+166414=248⋅1+166248=166⋅1+82248=166\cdot 1+82248=166⋅1+82166=82⋅2+2166=82\cdot 2+2166=82⋅2+282=2⋅4182=2\cdot 4182=2⋅41因此,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)。所以,求两个数的最小公倍数,就可以先求出它们的最大公约数,然后用上述公式求出它们的最小公倍数。
本文介绍了欧几里得算法,用于求解两个整数的最大公约数。首先回顾了除数算法的预备知识,包括整除性质和推论。接着详细解释了欧几里得算法的原理,通过举例展示了如何利用该算法找到最大公约数,并给出了算法的具体实现。此外,还讨论了如何通过最大公约数求最小公倍数的方法。

2079

被折叠的 条评论
为什么被折叠?



