數論(算法概述)

1. 模運算
模運算很有用, 最常用的是鐘錶.
還有二進制負數的補碼, 有2n 個數, [-2n-1 , 2n-1 -1]

正數當然直接表示成2進制即可, 對於負數就需要用補碼, 即[1, 2n-1 ] 的二進制表示的取反再加一.

以前對這個補碼不理解, 所以也一直記不住, 其實:

Any number in the range -2n-1 to 2n-1 - 1 is stored modulo 2n. Negative numbers -x therefore end up as 2n -x.

原來如此.

 

模運算對於加,減,乘,指數運算, 都很容易理解, 也都可以先進行模運算再加減乘. 就是除比較複雜, 後面會談到.

 

2. 最大公約數-euclid算法

Euclid's rule: If x and y are positive integers with x >= y, then gcd(x, y) = gcd(x mod y, y)

對於這個的證明, 用反證顯而易見.

我們還可以得到以下定理:

Lemma: If a > b, then a mod b < a/2.

這個的證明分爲兩種情況b>a/2, b<a/2, 當b>a/2的時候, a mod b < a/2是顯然的.

當b<a/2的時候, a mod b < b < a/2. 所以得證.

有了這個定理, 我們可以知道euclid算法每次遞歸都會做x mod y, 因爲x mod y < x/2, 所以每次遞歸x的位數都會減1(2進制).

所以euclid的算法最多需要遞歸len(x)+len(y), 即2n次

而每次遞歸都要做個除法算x mod y, 這個是O(n2 ), 所以算最大公約數是O(n3 )的.

 

3. 擴展euclid算法

由上面的算法我們可以算出兩個數的最大公約數, 但是如果給出d是最大公約數, 怎麼驗證呢.

Lemma: If d divides both a and b, and d = ax + by for some integers x and y, then necessarily
d = gcd(a, b).

證明: 首先d<= gcd(a, b)的, 這個顯然. 而d = ax + by, ax + by是可以整除gcd(a,b)的, 所以d也可以整除gcd(a,b), 即d>=gcd(a,b). 得證.

擴展euclid算法就是可以證明在用euclid算法算最大公約數的時候可以一起算出x, y. 所以x, y是一定存在, 且可以找出的.

 

4. 模除法

4/3 mod N 這個應該怎麼算

4* 1/3 mod N, 4 mod N是沒有問題的, 那麼1/3 mod N應該怎麼算了, 這個確實看上去沒法算.

3* 1/3 = 1 (mod N), 把1/3換成x, 3x = 1 (mod N), 而 x = 1/3 (mod N), 所以我們只需求出x的整數解.

We say x is the multiplicative inverse(乘法逆元素) of a modulo N if ax = 1 (mod N).

而這個x是否能解出是有條件的, 比如2x = 1 (mod 6)就無解.

Modular division theorem: For any a mod N, a has a multiplicative inverse modulo N if and only if it is relatively prime to N.

即當a和N互質的時候, 這個x是有解的.

ax + Ny = 1 (互質, 所以最大公約數爲1), 兩邊mod N

ax = 1 mod N, 而這個x是可以通過擴展euclid算法求出的, 所以複雜度也是O(n3 )的.

且x有解時, a和N一定互質

ax mod N = ax - KN = 1, 兩邊除gcd(a, N)

而ax-KN/gcd(a,N)一定是個整數, 所以1/gcd(a,N)也一定是個整數, 所以gcd(a, N)只能爲1.

 

5. 質性判定

給一個整數怎麼判斷是否是質數? 費馬小定理

Fermat's little theorem If p is prime, then for every 1 <= a < p,
ap-1 = 1 (mod p):

證明: 我們可證(p-1)!*ap-1 = (p-1)! (mod p) 是成立的. 對p取模, 餘數的可能性爲[1,p-1]

S = {1, 2, ... , p-1} = {a * 1 mod p, a * 2 mod p, ..., a * (p - 1) mod p} 可證這兩個集合是一樣的

由於P是質數, p和[1,p-1]中的數都互質, 所以上面的式子兩邊都除(p-1)!, 得證.

 

但費馬小定理只能保證質數都滿足這個條件, 但不能保證滿足條件的都是質數.

如341 = 11* 31 is not prime, 但它就滿足費馬小定理

不過這種例子很少見, 稱爲Carmichael numbers

 

而且對於合數, 即不滿足費馬小定理的數, 可以證明至少有一半以上的a值不滿足.

Lemma: If aN-1 != 1 mod N for some a relatively prime to N, then it must hold for at least
half the choices of a < N.

 

所以判斷一個數是否爲質數, 只需多隨機抽取k個a, 來判斷是否滿足ap-1 = 1 (mod p), 錯判的概率爲1/2k , k足夠大時, 正確的概率很大.

 

而要隨機生成大質數, 方法也很簡單.

Lagrange's prime number theorem:  the number of primes <= x 無限接近 x/(ln x).

也就是說質數是很多的, 於是找質數就是隨機生成一個規定長度的整數, 然後判斷是否爲質, 不是繼續找.

 

6. 公鑰加密 RSA

Property: Pick any two primes p and q and let N = pq. For any e relatively prime to (p -1)(q - 1):

1. The mapping x -> xe mod N is a bijection on {0, 1, ... ,N-1}.

2. Moreover, the inverse mapping is easily realized:

let d be the inverse of e modulo (p -1)(q -1). Then for all x {0,...,N- 1},
(xe )d   =  x mod N:

找兩個大質數p, q, 然後N = pq, 找一個e與 (p -1)(q -1)互質.

加密的時候用xe mod N得到x的密文, 所以e, N爲公鑰, 公開的

d爲私鑰, ed = 1 mod(p -1)(q -1), 因爲e與 (p -1)(q -1)互質, 所以d必有解.

解密的時候用(xe )d mod N 來得到原文x.

RSA就是機遇大數分解非常的難, 所以你知道N, 但是無法短時間內知道p, q, 即得不到d.

證明(xe )d   =  x mod N:

ed = 1 mod(p -1)(q -1), 即 ed = 1+k(p -1)(q -1)

(xe )d = x1+k(p -1)(q -1)

由於p,q都是質數, 所以xp-1 = 1 (mod p)

x1+k(p -1)(q -1) - x 可以被p整除, 同樣可證可被q整除, 由於p,q都是質數, 所以也可以被N = pq 整除

即(xe )d - x =0 mod N

所以得證.

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章