辗转相除法

来自GSXAB的知识库
(重定向自Euclid 算法
欧几里得算法
术语名称 欧几里得算法
英语名称 Euclidean algorithm
别名 Euclid's algorithm

辗转相除法欧几里得算法(Euclidean algorithm),指对两个整数,通过对其不断互相做带余除法得到其最大公因数的算法。

定理

算法

对整数 [math]\displaystyle{ a, b }[/math] ,其中 [math]\displaystyle{ b\neq 0 }[/math][math]\displaystyle{ b\not\mid a }[/math] ,记 [math]\displaystyle{ r_0=a, r_1=b }[/math] ,则存在以下 [math]\displaystyle{ k+1 }[/math] 个等式:

[math]\displaystyle{ \begin{align} r_0 = q_0 r_1 + r_2 &, 0 \leq r_2 \lt |r_1| \\ r_1 = q_1 r_2 + r_3 &, 0 \leq r_3 \lt r_2 \\ \dots\\ r_{k-1} = q_{k-1} r_k + r_{k+1} &, 0 \leq r_{k+1} \lt r_k \\ r_k = q_k r_{k+1} + 0 \end{align} }[/math]

终止条件

对数 [math]\displaystyle{ a, b }[/math] ,做带余除法 [math]\displaystyle{ a = b q + r, 0 \leq r \lt |b| }[/math] ,则 [math]\displaystyle{ \operatorname{gcd}(a, b) = \operatorname{gcd}(b, r) }[/math] 。且 [math]\displaystyle{ r \leq |b| }[/math] 。所以 [math]\displaystyle{ |b| \gt r_2 \gt r_3 \gt \dots }[/math] 是递减的自然数列。

算法不强制带余除法中的余数为最小非负余数,只需要保证递减。若为绝对最小余数 [math]\displaystyle{ a = bq + r, -\left\lfloor \tfrac{|b|}{2} \right\rfloor \lt r \leq \left\lfloor \tfrac{|b|}{2} \right\rfloor }[/math] ,则 [math]\displaystyle{ \operatorname{gcd}(a, b) = \operatorname{gcd}(b, r) = \operatorname{gcd}(b, |r|)\ }[/math][math]\displaystyle{ |r| \leq \frac{|b|}{2} }[/math] 。所以 [math]\displaystyle{ |b| \gt |r_2| \gt |r_3| \gt \dots }[/math] 是递减的自然数列。

因此,余数(或余数的绝对值)总是构成了一个递减的序列,会有一个递减到 0 为止。

最大公因数不变

由于 [math]\displaystyle{ \operatorname{gcd}(a, b) = \operatorname{gcd}(b, r) }[/math] ,在这个算法过程中,一定有

[math]\displaystyle{ \operatorname{gcd}(r_0, r_1) = \operatorname{gcd}(r_1, r_2) = \operatorname{gcd}(r_2, r_3) = \dots = \operatorname{gcd}(r_k, r_{k+1}) = \operatorname{gcd}(r_{k+1}, 0) = r_{k+1} }[/math]

因此,序列最后一个不是 0 的数就是两个数的最大公因数。

算法

原理

对整数 [math]\displaystyle{ a,b }[/math] ,记 [math]\displaystyle{ r_0 = |a|, r_1 = |b| }[/math] ,不断用较大数对较小数取余,并用结果替代较大数,即 [math]\displaystyle{ r_{k+1} = r_{k-1} - r_{k} q }[/math] 。直到某个 [math]\displaystyle{ r_{m+1} = 0 }[/math] ,此时较小数 [math]\displaystyle{ r_m }[/math] 即是两个数的公约数。

由于上述定理中,较大数对较小数运算得到余数时,除数、余数及以后所有余数,其绝对值一定会变小,构成一个严格递减数列。同时自然数上从给定数开始不存在无穷下降链,必然有限次内减小到 0 ,余数绝对值序列必然会在有限次内减小到 0 。

实际人工计算时,使用绝对值并取绝对最小余数的带余除法可以更快收敛。 对计算机而言,硬件实现一般进行的是无符号数的取余,有符号数会通过处理成无符号数计算, 因此通常会将两数绝对值后进行基于普通的(最小非负余数的)带余除法的辗转相除法,此外有一些对大数的优化算法。

伪代码

过程 欧几里得算法
别名 euclidean_algorithm
参数 a, b : 整数 // 被求最大公因数的两个数
返回 : 自然数 // 最大公因数

令 r₀ ← |a| // 自然数
令 r₁ ← |b| // 自然数

循环 k ← 1
当 rₖ ≠ 0 时
执行
    记 rₖ₊₁ ← rₖ mod rₖ₋₁
继续循环 k ← k + 1

返回 rₖ₋₁


整除理论
整除关系 整除、倍数、因数 带余除法
正整数的分类 1质数、合数
质数测试 试除法埃氏筛线性筛
最大公约数理论 公倍数、最小公倍数 [math]\displaystyle{ \operatorname{lcm} }[/math]公因数、最大公因数 [math]\displaystyle{ \operatorname{gcd} }[/math] 辗转相除法
互质
算术基本定理 算术基本定理 标准质因数分解