歐幾里得算法及其證明


在數學中,輾轉相除法,又稱歐幾里得算法,是求最大公約數的算法。

輾轉相除法市一中遞歸算法,每一步計算的輸出值就是下一步計算時的輸入的值。設 \(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}}\)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM