辗转相除法的证明
輾轉相除法(歐幾里得算法)
該算法常用于計算兩數的最大公約數。算法表示如下:
現有A, B兩正整數,其中A為較大者,A>=B; 通過一下算法求其最大公約數
1> A / B = C … D 使用較大者除以較小者,獲得余數D是否為0,若為0,則最大公約數為除數B
2> 若不能整除,則B作為較大者,余數D作為較小者(由除法性質知B >= D),重復該算法
豎式計算如下:
設A = 899, B = 493。
1 | 899 | 493 || 493 |---------------- =》 | 406 |1 | 899 | 493 | 1| 493 | 406 |---------------- =》| 406 | 87 |4 | 406 | 87 || 87 | ---------------- =》| 58 |4 | 406 | 87 | 1| 87 | 58 |---------------- =》| 58 | 29|2 | 58 | 29| | 29 | ---------------- =》 29| 0 |輾轉相除法證明
到此,我們發現該算法確實能夠很快的求解兩數的最大公約數問題,但是為什么這個算法是正確的,如何通過合理的證明,來驗證該算法的合理性呢?
證明過程如下:
現有正整數A, B。 其中A >= B; 有除法過程A / B = K … D 其中K為商,D為余數。 使用 A | B 表示 A被B整除
求證:A, B 的最大公約數 等于 B 與余數 D的最大公約數
設 A , B 的最大公約數為 C, 側有 A | C, 與 B | C
有除法定義知:BK + D = A,且 B | C 所以:BK | C
有 A | C 即 (BK + D) | C 得 D | C
到此可證,若 C為A和B的公約數,則必為B和D的公約數。由于終止條件為兩者求余為0,即 A = KB則得到最終的最大公約數。
更相減損術
九章算術中,使用減法進行計算,求取最大公約數的算法。與輾轉相除法如出一轍
可半者半之,不可半者,副置分母、子之數,以少減多,更相減損,求其等也。以等數約之。
白話文譯文:
(如果需要對分數進行約分,那么)可以折半的話,就折半(也就是用2來約分)。如果不可以折半的話,那么就比較分母和分子的大小,用大數減去小數,互相減來減去,一直到減數與差相等為止,用這個相等的數字來約分。
Stein算法
輾轉相除法依賴于出觸發運算,對于64位現代計算機能夠很快處理,但對于更大的數,超出浮點計算能力時,計算效率將會急劇下降。比如在一個64位字寬的浮點處理器上,計算一個128位甚至更長的數字,需要在除法算法上層做很多運算,而不能直接有機器在幾條指令內求解。
stein算法對大數求最大公約數做了優化。
參考
GCD(Greatest Common Divisor)最大公約數
總結
- 上一篇: VSCode 设置为 Monaco字体
- 下一篇: 2011年11月份第二周51Aspx源码