輾轉相除法是用來計算兩個整數的最大公約數。假設兩個整數為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