# 最大公约数与最小公倍数
在整数论中,最大公约数与最小公倍数是两个重要的概念
取整数 a,b,若整数 d 满足
- d∣a
- d∣b
则称 d 为 a,b 的一个 公约数
在所有公约数中,最大的那个称为 a,b 的 最大公约数,记作 gcd(a,b)
同样地,取整数 m,n,若整数 l 满足
- m∣l
- n∣l
则称 l 为 m,n 的一个 公倍数
在所有公倍数中,最小的那个称为 m,n 的 最小公倍数,记作 lcm(m,n)
# Euclidean 算法
Euclidean 算法是一种用于计算两个整数的最大公约数的有效算法
其原理基于以下性质
命题
设 a,b 为非负整数,且 b=0,则 gcd(a,b)=gcd(b,amodb)
证明
设 d=gcd(a,b),则 d∣a 且 d∣b,所以 d∣(a−kb) 对任意整数 k 成立
取 k=⌊a/b⌋,则 a−kb=amodb,所以 d∣(amodb)
因此,d 是 b 和 amodb 的公约数
设 d′=gcd(b,amodb),则 d′∣b 且 d′∣(amodb)
所以 d′∣(kb+(amodb))=a
因此,d′ 是 a 和 b 的公约数
由于 d 和 d′ 分别是它们各自的最大公约数,所以 d=d′,即 gcd(a,b)=gcd(b,amodb)
Euclidean 算法的步骤如下
- 给定两个非负整数 a 和 b,其中 a≥b
- 计算 a 除以 b 的余数 r
- 如果 r=0,则 gcd(a,b)=b,算法结束
- 否则,令 a=b,b=r,重复步骤 2 和 3
通过不断地用较小的数去除较大的数,并取余数,最终会得到最大公约数
示例
使用 Euclidean 算法计算 gcd(484,186)
解
484÷186=2+112
186÷112=1+74
112÷74=1+38
74÷38=1+36
38÷36=1+2
36÷2=18+0
所以 gcd(484,186)=2
# 扩张 Euclidean 算法
扩张 Euclidean 算法不仅可以计算最大公约数,还可以找到整数 x,y 使得
ax+by=gcd(a,b)
此算法尤其在求解线性同余方程时非常有用,特别是对于互质问题 gcd(a,b)=1⟺ax+by=1
通常利用矩阵代为计算,步骤如下
- 给定两个非负整数 a 和 b,其中 a≥b
- 设定矩阵
(1001ab)
- 通过反复行基本变换,每次用第一行减去第二行乘以某个整数,但是保证第三个数一直非负
- 交换两行,重复步骤 3,直到第一行的第三个数为 gcd(a,b),第二行的第三个数为 0
- 最终矩阵的第一行前两个数即为所求的 x 和 y,即
(xmyngcd(a,b)0)
其中 x,y 满足 ax+by=gcd(a,b),m,n 满足 am+bn=0
示例
使用扩张 Euclidean 算法计算 gcd(484,186) 并找到整数 x,y 使得 484x+186y=gcd(484,186)
解
初始矩阵
(1001484186)
经过一系列行基本变换,最终得到
(5−1−13120)
所以 gcd(484,186)=2,且 484⋅5+186⋅(−13)=2