在数学中,辗转相除法,又称欧几里得算法,是求最大公约数的算法。
辗转相除法市一中递归算法,每一步计算的输出值就是下一步计算时的输入的值。设 \(k\) 表示步骤数(从 \(0\) 开始计数),算法计算过程如下。
每一步的输入都是前两次计算的非负余数 $r_{k - 1} $ 和 \(r_{k - 2}\)。因为每一步计算出的余数都在不断减小,所以,\(r_{k-1} < r_{k - 2}\)。在第 \(k\) 步中,算法计算出满足已下等式的商 \(q_k\) 和余数 \(r_k\):
\(r_{k - 2} = q_k r_{k - 1} + r_k\)
其中 \(0 \le r_k < r_{k - 1}\)。也就是 \(r_{k - 2}\) 要不断减去 \(r_{k - 1}\) 直到比 \(r_{k - 1}\) 小。
为求简明,以下只说明如何求两个非负整数 \(a\) 和 \(b\) 的最大公约数(负数的情况是简单的)。在第一步计算时 \((k = 0)\),设 \(r_{-2}\) 和 \(r_{-1}\) 分别等于 \(a\) 和 \(b\),第二步 \((k = 1)\) 时计算 \(r_{-1}\)(即 \(b\))和 \(r_0\)(第一步计算产生的余数)相除产生的商和余数,以此类推。整个算法可以用如下等式表示:
\(a = q_0 b + r_0\)
\(b = q_1 r_0 + r_1\)
\(r_0 = q_2 r_1 + r_2\)
\(r_1 = q_3 r_2 + r_3\)
\(\cdots\)
如果有 \(a < b\),算法的第一步实际上会把两个数字交换,因为这时 \(a\) 除以 \(b\) 所得的商会等于 \(0\),余数 \(r_0\) 则等于 \(a\)。然后,算法的第二步便是把 \(b\) 除以 \(a\),再计算所得之商和余数。所以,对于 \(k \ge 0\) 总有 \(r_k \le r_{k - 1}\),即运算的每一步中得出的余数一定小于上一步计算的余数。
由于每一步的余数都在减小并且不为负数,必然存在第 \(N\) 步是 \(r_N\) 等于 \(0\) 使算法终止,\(r_{N - 1}\) 就是 \(a\) 和 \(b\) 的最大公约数。其中 \(N\) 不可能无穷大,因为在 \(r_0\) 和 \(0\) 之间只有有限个自然数。
正确性的证明:
辗转相除法的正确性可以分成两步来证明。在第一步,证明算法的最终结果 \(r_{N - 1}\) 同时整除 \(a\) 和 \(b\)。因为它是一个公约数,所以必然小于或等于最大公约数 \(g\)。在第二步,证明 \(g\) 能整除 \(r_{N-1}\)。所以 \(g\) 一定小于或等于 \(r_{N - 1}\)。两个不等式只在 \(r_{N - 1} = g\) 时同时成立。具体证明如下。
证明 \(r_{N - 1}\) 同时整除 \(a\) 和 \(b\):
余数 \(r_N = 0\),\(r_{N - 1} \mid r_{N - 2}:\)
\(r_{N - 2} = q_N r_{N - 1}\)
因为 \(r_{N - 1} \mid r_{N - 2}\),所以 \(r_{N - 1} \mid r_{N - 3}\):
\(r_{N - 3} = q_{N - 1} r_{N - 2} + r_{N - 1}\)
同理可证 \(r_{N - 1}\) 可以整除所有之前步骤的余数,包括 \(a\) 和 \(b\),即 \(r_{N - 1}\) 是 \(a\) 和 \(b\) 的公约数,\(r_{N - 1} \le g\)。
证明最大公约数 \(g\) 能整除 \(r_{N - 1}\):
根据定义,\(a\) 和 \(b\) 可以写成 \(g\) 的倍数:\(a = mg、b = ng\),其中 \(m\) 和 \(n\) 是自然数。因为 \(r_0 = a - q_0 b = mg -q_0 ng = (m - q_0 n)g\),所以 \(g \mid r_0\)。同理可证 \(g \mid r_1 , r_2 , \cdots , r_{N - 1}\)。因为最大公约数 \(g\) 整除 \(r_{N - 1}\) 因而 \(g \le r_{N - 1}\)。
因为第一步的证明告诉我们 \(r_{N - 1} \le g\),所以 \(g = r_{N - 1}\)。即:
\(g = \gcd(a , b) = \gcd(b , r_0) = \gcd(r_0 , r_1) = \cdots = \gcd(r_{N - 2} , r_{N - 1}) = r_{N - 1}\)
证毕。
在每个步骤 \(k\) 中,辗转相除法都需要计算两个数 \(r_{k - 1}\) 和 \(r_{k - 2}\) 的商 \(q_k\) 和余数 \(r_k\):
\(r_{k - 2} = q_k r_{k - 1} + r_k\)
其中 \(0 \le r_k \le r_{k - 1}\)。除法的算法保证这样的商和余数总是存在。自然数的除法算法还指出这样的商和余数是惟一的,但这对辗转相除法而言并非必要。
在欧几里得最初的描述中,商和余数是通过连续的减法计算的,即从 \(r_{k - 2}\) 不断减去 \(r_{k - 1}\) 直到小于 \(r_{k - 1}\)。一个更高效的做法是使用整数除法和模除来计算商和余数:
\(r_k \equiv r_{k - 2} \pmod{r_{k - 1}}\)