# 最大公约数与最小公倍数

在整数论中,最大公约数与最小公倍数是两个重要的概念
取整数 a,ba,b,若整数 dd 满足

  • dad \mid a
  • dbd \mid b
    则称 dda,ba,b 的一个 公约数

在所有公约数中,最大的那个称为 a,ba,b最大公约数,记作 gcd(a,b)\gcd(a,b)

同样地,取整数 m,nm,n,若整数 ll 满足

  • mlm \mid l
  • nln \mid l
    则称 llm,nm,n 的一个 公倍数

在所有公倍数中,最小的那个称为 m,nm,n最小公倍数,记作 lcm(m,n)\mathrm{lcm}(m,n)

# Euclidean 算法

Euclidean 算法是一种用于计算两个整数的最大公约数的有效算法
其原理基于以下性质

命题
a,ba,b 为非负整数,且 b0b \neq 0,则 gcd(a,b)=gcd(b,amodb)\gcd(a,b) = \gcd(b,a \bmod b)

证明

d=gcd(a,b)d = \gcd(a,b),则 dad \mid adbd \mid b,所以 d(akb)d \mid (a - kb) 对任意整数 kk 成立
k=a/bk = \lfloor a/b \rfloor,则 akb=amodba - kb = a \bmod b,所以 d(amodb)d \mid (a \bmod b)
因此,ddbbamodba \bmod b 的公约数
d=gcd(b,amodb)d' = \gcd(b,a \bmod b),则 dbd' \mid bd(amodb)d' \mid (a \bmod b)
所以 d(kb+(amodb))=ad' \mid (kb + (a \bmod b)) = a
因此,dd'aabb 的公约数
由于 dddd' 分别是它们各自的最大公约数,所以 d=dd = d',即 gcd(a,b)=gcd(b,amodb)\gcd(a,b) = \gcd(b,a \bmod b)

Euclidean 算法的步骤如下

  1. 给定两个非负整数 aabb,其中 aba \geq b
  2. 计算 aa 除以 bb 的余数 rr
  3. 如果 r=0r = 0,则 gcd(a,b)=b\gcd(a,b) = b,算法结束
  4. 否则,令 a=ba = bb=rb = r,重复步骤 2 和 3

通过不断地用较小的数去除较大的数,并取余数,最终会得到最大公约数

示例
使用 Euclidean 算法计算 gcd(484,186)\gcd(484,186)

484÷186=2+112484 \div 186 = 2 + 112

186÷112=1+74186 \div 112 = 1 + 74

112÷74=1+38112 \div 74 = 1 + 38

74÷38=1+3674 \div 38 = 1 + 36

38÷36=1+238 \div 36 = 1 + 2

36÷2=18+036 \div 2 = 18 + 0

所以 gcd(484,186)=2\gcd(484,186) = 2

# 扩张 Euclidean 算法

扩张 Euclidean 算法不仅可以计算最大公约数,还可以找到整数 x,yx,y 使得

ax+by=gcd(a,b)ax + by = \gcd(a,b)

此算法尤其在求解线性同余方程时非常有用,特别是对于互质问题 gcd(a,b)=1ax+by=1\gcd(a,b) = 1 \iff ax + by = 1

通常利用矩阵代为计算,步骤如下

  1. 给定两个非负整数 aabb,其中 aba \geq b
  2. 设定矩阵

(10a01b)\begin{pmatrix} 1 & 0 & a \\ 0 & 1 & b \\ \end{pmatrix}

  1. 通过反复行基本变换,每次用第一行减去第二行乘以某个整数,但是保证第三个数一直非负
  2. 交换两行,重复步骤 3,直到第一行的第三个数为 gcd(a,b)\gcd(a,b),第二行的第三个数为 00
  3. 最终矩阵的第一行前两个数即为所求的 xxyy,即

(xygcd(a,b)mn0)\begin{pmatrix} x & y & \gcd(a,b) \\ m & n & 0 \\ \end{pmatrix}

其中 x,yx,y 满足 ax+by=gcd(a,b)ax + by = \gcd(a,b)m,nm,n 满足 am+bn=0am + bn = 0

示例
使用扩张 Euclidean 算法计算 gcd(484,186)\gcd(484,186) 并找到整数 x,yx,y 使得 484x+186y=gcd(484,186)484x + 186y = \gcd(484,186)

初始矩阵

(1048401186)\begin{pmatrix} 1 & 0 & 484 \\ 0 & 1 & 186 \\ \end{pmatrix}

经过一系列行基本变换,最终得到

(5132110)\begin{pmatrix} 5 & -13 & 2 \\ -1 & 1 & 0 \\ \end{pmatrix}

所以 gcd(484,186)=2\gcd(484,186) = 2,且 4845+186(13)=2484 \cdot 5 + 186 \cdot (-13) = 2