Processing math: 100%

中國剩餘定理 Chinese remainder theorem

RSA演算法的解碼方法是CdmodNd 是一個很大的數,要算這個值比較辛苦,可以利用中國剩餘定理來簡化。
中國剩餘定理處理的問題就是韓信點兵這種題目
兵不知其數,三三數之剩二,五五數之剩三,七七數之剩二
寫成數學式就是
{x2(mod3)x3(mod5)x2(mod7)

以下紀錄幾種計算方式

方法1.利用同餘的加性

將題目拆成成3部分

{a2(mod3)a0(mod5)a0(mod7)    {b0(mod3)b3(mod5)b0(mod7)    {c0(mod3)c0(mod5)c2(mod7)

{(a+b+c)2(mod3)(a+b+c)3(mod5)(a+b+c)2(mod7)

分別求出 a,b,c ,就能得到一組解

{a2(mod3)a0(mod5)a0(mod7)
a=35kk=1 為其中一組解,則a=35

同樣的方式,可以算出b=63,c=30
a+b+c=35+63+30=128128 就是 x 的其中一組解
x128(mod105)
x23(mod105)


方法2.利用同餘的加性和乘性

與方法1類似,將題目拆成成3部分

{a1(mod3)a0(mod5)a0(mod7)    {b0(mod3)b1(mod5)b0(mod7)    {c0(mod3)c0(mod5)c1(mod7)

求出 a,b,c 後,2a+3b+2c 就是一組解

{a1(mod3)a0(mod5)a0(mod7)
a=35kk=2 為其中一組解,則a=70
因為 mod 的數很小,很容易可以挑出來,但是希望可以用一種比較有系統的方式去求出a
35k1(mod3)
其實就是在算35對模3的模反原素,可以利用輾轉相除法的過程求得,這樣以後遇到比較大的模數也能有效率的算出k

利用相同的方法,b=21,c=15
2a+3b+2c=140+63+30=233
x128(mod105)
x23(mod105)

孫子算經裡就是用這種解法
今有物,不知其數。三、三數之,賸二;五、五數之,賸三;七、七數之,賸二。問物幾何?
答曰:二十三。
術曰:「三、三數之,賸二」,置一百四十;「五、五數之,賸三」,置六十三;「七、七數之,賸二」,置三十。并之,得二百三十三。以二百一十減之,即得。凡三、三數之,賸一,則置七十;五,五數之,賸一,則置二十一;七、七數之,賸一,則置十五。一百六以上,以一百五減之,即得。

算法統宗(明 程大位)
物不知總 孫子歌曰 又云韓信點兵也
三人同行七十稀 五樹梅花廿一枝
七子團員正半月 除百令五便得知
今有物不知數只云三數剩二箇五數剩三箇七數剩二箇問共若干
答曰 共二十三箇

射鵰英雄傳裡黃蓉念給瑛姑的就是這首歌訣,桃花島的人真是厲害,明代的書隨口就念了出來

這種方法很有系統,先求反原素,乘上餘數,再相加,很適合拿來寫程式

方法3.利用代數解題

{x2(mod3)x3(mod5)x2(mod7)
{x=3a+2x=5b+3x=7c+2

3a+23(mod5)
3a1(mod5)
a2(mod5)
a=5b+2
x=3a+2=3(5b+2)+2=15b+8

15b+82(mod7)
15b1(mod7)
b1(mod7)
b=7c+1

x=15b+8=15(7c+1)+8=105c+23

2 則留言:

  1. 方法2 最後倒數第二行 ⇒x≡122(mod105) 應該是 ⇒x≡128(mod105) 才對 小筆誤哦^^

    回覆刪除