Euclid GCD算法原理

[轉(zhuǎn)載于] https://thiscute.world/posts/mathematics-in-euclidean-gcd/

很早就學(xué)過歐幾里得算法,但是一直不知道它的原理。幾乎每本算法書都會(huì)提到它,但是貌似只有數(shù)學(xué)書上才會(huì)見到它的原理。。。前段時(shí)間粗粗看了點(diǎn)數(shù)論(《什么是數(shù)學(xué)》),驚訝于這個(gè)原理的奇妙?,F(xiàn)在把它通俗地寫下來,以免自己忘記。歐幾里得算法是求兩個(gè)數(shù)的最大公約數(shù)(Greatest Common Divisor (GCD))的算法,我們首先假設(shè)有兩個(gè)數(shù) ab,其中 a 是不小于 b 的數(shù),記 ab 除的余數(shù)為 r,那么 a 可以寫成這樣的形式:
a = bq + r 其中 q 是整數(shù)(我們不需要去管 q 到底是多少,這和我們的目標(biāo)無(wú)關(guān))?,F(xiàn)在假設(shè) ab 的一個(gè)約數(shù)為 u,那么 ab 都能被 u 整除,即
a = su b = tu st 都是整數(shù)(同樣的,我們只需要知道存在這樣的整數(shù) st 就行)。這樣可以得出
r = a - bq = su - (tu)q = (s - tq)u 所以 r 也能被 u 整除,一般規(guī)律如下

ab 的約數(shù)也整除它們的余數(shù) r,所以 ab 的任一約數(shù)同時(shí)也是 br 的約數(shù)。 —— 條件一

反過來可以得出

br 的任一約數(shù)同時(shí)也是 ab 的約數(shù)。 ——條件二

這是因?yàn)閷?duì) br 每一個(gè)約數(shù) v,有
b = kv r = cv 于是有
a = bq + r = (kv)q + cv = (kq + c)v 由條件一和條件二可知

ab 的約數(shù)的集合,全等于 br 的約數(shù)的集合。

于是

ab 的最大公約數(shù),就是 br 的最大公約數(shù)。

接下來用遞推法,
a \div br,現(xiàn)在設(shè)
b \div rr_1
r \div r_1r_2
……
r_{n-3} \div r_{n-2}r_{n-1}
r_{n-2} \div r_{n-1}r_n=0

因?yàn)?a \ge b,可以看出余數(shù) r_n 會(huì)越來越小,最終變成 0.
當(dāng) r_{n-1} \neq 0r_n = 0 時(shí),可知 r_{n-2} 可被 r_{n-1} 整除(余數(shù)為 0 嘛)
此時(shí) r_{n-2}r_{n-1} 的約數(shù)就只有:r_{n-1}r_{n-1} 的因數(shù),
所以他們的最大公約數(shù)就是 r_{n-1}!
所以 r_{n-1} 就是 ab 的最大公約數(shù)。(若 r = 0,則 b 為最大公約數(shù))

這個(gè)遞推法寫成c語(yǔ)言函數(shù)是這樣的(比推導(dǎo)更簡(jiǎn)潔…):

unsigned int Gcd(unsigned int M,unsigned int N){
    unsigned int Rem;
    while(N){
        Rem = M % N;
        M = N;
        N = Rem;
    }
    return Rem;
}

可以發(fā)現(xiàn)這里沒有要求 M>=N,這是因?yàn)槿绻菢?,循環(huán)會(huì)自動(dòng)交換它們的值。

P.S. 此外,還有最小公倍數(shù)(Least Common Multiple (LCM))算法,詳見 GCD and LCM calculator

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容