1. 程式人生 > 其它 >歐幾里德演算法、拓展歐幾里德、中國剩餘定理

歐幾里德演算法、拓展歐幾里德、中國剩餘定理

技術標籤:演算法密碼學

目錄

歐幾里德演算法(Euclidean algorithm)(輾轉相除法)

歐幾里德演算法又稱輾轉相除法,主要是用於計算兩個整數a,b的最大公約數。

簡單點說一下演算法原理:兩個整數的最大公約數等於其中小的那個數跟大除以小余數的最大公約數。
即: gcd(a,b)=gcd(b,a mod b) 。

舉個簡單的例子:
比如求 10跟 24 的最大公約數a = gcd(10, 24):

  1. 求10和24的最大公約數等於求10跟4的最大公約數 :
    a = gcd(10, 24) = gcd(10, 4)
  2. 求10跟4的最大公約數等於求4跟2的最大公約數,為2 :
    a = gcd(10, 24) = gcd(10, 4) = gcd(4, 2) = 2
# python
def gcd(a, b):
    return a if b == 0 else gcd(b, a % b)
print(gcd(10,24)) # 2

拓展歐幾里德演算法

演算法原理:若a和b為正整數,則存在整數x, y 使得gcd(a,b)=ax+by;
通俗點說就是 gcd(a,b)可以表示為a,b的整數線性組合。

舉個簡單的例子:
gcd(10, 24) = 2
2 = 10*(-7) + 24*3

主要應用有以下三方面:

  1. 求解不定方程;

    例題:求 435x + 783y = 87 的一組整數解:

    先通過歐幾里得演算法得:

     783 = 1× 435 + 348
     435 = 348×1 + 87
     348 = 87 × 4 + 0
     ∴ 87 = 435 – 348
     87 = 435 – (783 – 435)
     87 = (–1)(783) + 2(435)
     ∴ x = 2, y = −1是此不定方程的一組整數解。
    
  2. 求解模的逆元(乘法逆元),參考上一篇同餘方程、尤拉函式、乘法逆元、定義在Zm上的矩陣求逆

  3. 求解模線性方程(線性同餘方程);

    1. 求解同餘方程 ax ≡ b (mod m), x = ?

      舉個極端代表性的例子: 15x = 1 mod 26
      這道題轉化成15x - 26y = 1 既可以當做1求解不定方程 ,也可以當做2求乘法逆元

       解法如下:
       26 = 1× 15 + 11
       15 = 11×1 + 4
       11 = 4 × 2 + 3
       4 = 1 × 3 + 1
       3 = 1 × 3 
       
       ∴ 1 = 4 – 3
       	  = 4 – (11 – 4×2)
       	  = 4×3 – 11
       	  = (15-11) ×3 - 11
       	  = 15×3 - 11×4
       	  = (26-11)×3 - 11 ×4
       	  = 26×3 - (26 - 15)×7
       	  =26×(-4) + 15×7
       ∴ x = 7, y = −4 為此不定方程的一組整數解,15關於模26的乘法逆元為7
      
    2. 求解同餘方程組 繼續往下看中國剩餘定理

中國剩餘定理

在《孫子算經》中有這樣一個問題:“今有物不知其數,三三數之剩二(除以3 餘2),
五五數之剩三(除以5 餘3),七七數之剩二(除以7 餘2),問物幾何?”

宋朝數學家秦九韶於1247年《數書九章》卷一、二《大衍類》對“物不知數”問題做出了完整系統的解答。明朝數學家程大位將解法編成易於上口的《孫子歌訣》:

三人同行七十稀,
五樹梅花廿一支,
七子團圓正半月,
除百零五便得知。

意思是隻要是除以3餘了一個1,就加上一個70;
只要是除以5餘了一個1,就加上一個21;
只要是除以7餘了一個1,就加上一個15。然後累加。
最後計算這個總和除以105的餘數。
也就是 (2×70 + 3×21 + 15×2 ) mod 105 = 23

解法如下:

先從3和5、3和7、5和7的公倍數中相應地找出分別被7、5、3除均餘1的較小數15、21、70 ( 此步又稱為求"模逆"運算,參考乘法逆元解法)。即:
15÷7=2……餘1,
21÷5=4……餘1,
70÷3=23……餘1.
再用找到的三個較小數分別乘以所要求的數被7、5、3除所得的餘數的積連加,
15×2+21×3+70×2=233.
最後用和233除以3、5、7三個除數的最小公倍數.
233÷105=2……餘23,
這個餘數23就是合乎條件的最小數.

拓展到一般情況:
假設整數m1, m2, … , mn兩兩互質,則對任意的整數:a1, a2, … , an 方程組:
在這裡插入圖片描述
都存在整數解,且若X , Y 都滿足該方程組,則必有 X ≡ Y (mod N) 其中:
在這裡插入圖片描述
公式如下:
在這裡插入圖片描述

課本上的公式符號實在不想看,就拿作業來舉兩個例子吧。

作業1:

求解同餘方程組:
x ≡ 12 (mod 25)
x ≡ 9 (mod 26)
x ≡ 23 (mod 27)

以上方程組等價於 x = 25a + 12 = 26b + 9 = 27c + 23
移一下項 得:
① : 25a - 27c = 23-12 = 11
②: 26b - 25a = 12-9 = 3

首先對①式運用拓展歐幾里得:

27 = 25×1 + 2
25 = 2×7 + 11
則: 
11 = 25 - 2×7
	 = 25 - (27-25) ×7
	 = 25×8 - 27×7
所以a=8, c=7 
代入x = 25a + 12  = 27c + 23 得:
x = 212

得到合併方程 x = 212 + 25 × 27t 即:x ≡ 212 (mod 675)
然後再跟x ≡ 9 (mod 26) 合併

x = 212 + 675t = 26b + 9
26b - 675t = 203
675 = 26×25+25
25 = 25×1
所以:  
203 = (26-25)×203
	= (26 - (675-26*25))×203
	=  26×5278 - 675×203
b=5278 , t=203
代入得x = 137237

得到合併方程 x = 137237 + 25 × 27×26t 即:x ≡ 137237 (mod 17550) , x=14387
x = 14387 + 17550n (n∈Z)

作業2:

求解如下同餘方程組:
13x ≡ 4 (mod 99)
15x ≡ 56 (mod 101)

這類同餘方程組帶著係數讓人頭大,但是也不妨礙使用拓展歐幾里德,
首先去掉係數:
x ≡ 46 (mod 99)
x ≡ 98 (mod 101)

求解方法很多,這裡列舉利用二元一次不定方程方法:
13x ≡ 4 (mod 99) 轉化為 13x-99y = 4
然後用拓展歐幾里德:
13×46-99×6 = 4
x=46, y=6
所以不定方程13x-99y = 4 的所有解為
x=46 + 99t
y=6+13t
所以原同餘方程解為:x ≡ 46 (mod 99)

消去x得: 99a - 101b = 52
拓展歐幾里德走你:x = 7471 (mod 9999)
x = 9999 n + 7471 (n ∈ Z)