歐幾里得算法(輾轉相除法)


輾轉相除法是用來計算兩個整數的最大公約數。假設兩個整數為ab,他們的公約數可以表示為gcd(a,b)。如果gcd(a,b) = c,則必然a = mcb = nc。a除以b得商和余數,余數r可以表示為r = a - bkk這里是系數。因為cab的最大公約數,所以c也一定是r的最大公約數,因為r = mc - nck = (m-nk)c

因此gcd(a,b) = gcd(b,r),相當於把較大的一個整數用一個較小的余數替換了,這樣不斷地迭代,直到余數為0,則找到最大公約數。

舉例兩個整數為1071462
第一步:1071 / 462 = 2 * 462 + 147
第二步:462 / 147 = 3 * 147 + 21
第三步:147 / 21 = 7 * 21 + 0

此時余數為零,則21為兩個數的最大公約數。

貝祖公式表明對於任意兩個整數ab,都可以找到一對可為負的整數xy,可以使等式xa + yb = m,其中m為ab的最大公約數,合理性稍加思考可得。如果m1說明ab互素。所以在互素的情況下,xa + yb = 1。這個等式對於求乘法逆元有很大的幫助。

那么如何通過貝祖公式及擴展歐幾里得算法來求乘法逆元呢?舉一個例子來描述什么是乘法逆元。如果ab mod m = 1,或者可以表示為ab ≡ 1 mod m,這里b就是a關於模數m的乘法逆元。計算乘法逆元的方法就是擴展歐幾里得算法,以下通過一個例子來幫助理解:

假設我們要求3 關於模26的乘法逆元(隱含了326的最大公約數為1,即互素)。當a = 3b = 26,則根據貝祖公式,存在整數xy3x + 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, 其中am互素, b為移動距離。
仿射解密公式d(x) = a-1(x - b) mod m


https://www.jianshu.com/p/7876eb2dff89


免責聲明!

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



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