Loading

欧几里得算法及其证明

在数学中,辗转相除法,又称欧几里得算法,是求最大公约数的算法。

辗转相除法市一中递归算法,每一步计算的输出值就是下一步计算时的输入的值。设 \(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}}\)

posted @ 2021-07-19 19:27    阅读(1578)  评论(0编辑  收藏  举报