輾轉相除法是用來計算兩個整數的最大公約數。假設兩個整數為a和b,他們的公約數可以表示為gcd(a,b)。如果gcd(a,b) = c,則必然a = mc和b = nc。a除以b得商和余數,余數r可以表示為r = a - bk,k這里是系數。因為c為 a和b的最大公約數,所以c也一定是r的最大公約數,因為r = mc - nck = (m-nk)c。
因此gcd(a,b) = gcd(b,r),相當於把較大的一個整數用一個較小的余數替換了,這樣不斷地迭代,直到余數為0,則找到最大公約數。
舉例兩個整數為1071和462:
第一步:1071 / 462 = 2 * 462 + 147
第二步:462 / 147 = 3 * 147 + 21
第三步:147 / 21 = 7 * 21 + 0
此時余數為零,則21為兩個數的最大公約數。
貝祖公式表明對於任意兩個整數a和b,都可以找到一對可為負的整數x和y,可以使等式xa + yb = m,其中m為a和b的最大公約數,合理性稍加思考可得。如果m為1說明a和b互素。所以在互素的情況下,xa + yb = 1。這個等式對於求乘法逆元有很大的幫助。
那么如何通過貝祖公式及擴展歐幾里得算法來求乘法逆元呢?舉一個例子來描述什么是乘法逆元。如果ab mod m = 1,或者可以表示為ab ≡ 1 mod m,這里b就是a關於模數m的乘法逆元。計算乘法逆元的方法就是擴展歐幾里得算法,以下通過一個例子來幫助理解:
假設我們要求3 關於模26的乘法逆元(隱含了3和26的最大公約數為1,即互素)。當a = 3,b = 26,則根據貝祖公式,存在整數x和y,3x + 26y = 1。
思路就是等號兩邊同時mod 26,等式則變成(3x + 26y) mod 26 = 1 mod 26,根據模運算的性質(a + b) mod m = (a mod m + b mod m) mod m。
所以展開等式(3x mod 26 + 26y mod 26) mod 26 = 1 mod 26。化簡最終得到(3x mod 26) mod 26 = 1 mod 26。我們發現3x mod 26 = 1正好符合了乘法逆元的定義,所以歐幾里得算法就是解x的關鍵。
下面將通過輾轉相除法來求x:
第一步:26 = 3 * 8 + 2
第二步:3 = 2 * 1 + 1
統一將余數換到等號左邊:
2 = 26 - 3 * 8
1 = 3 - 2 * 1
將第一行的2替換到第二行,保證等式左邊永遠為1,等式右邊變成僅由3x + 26y組成。
1 = 3 - (26 - 3 * 8) * 1 = 3 * 9 + (-1) * 26
可得x = 9
最后9就是3關於模26的乘法逆元。它可以應用於仿射加密。
附:仿射加密的公式e(x) = ax + b mod m, 其中a與m互素, b為移動距離。
仿射解密公式d(x) = a-1(x - b) mod m
https://www.jianshu.com/p/7876eb2dff89
