同構——費馬小定理

劉新宇發表於2019-08-25

費馬小定理

費馬小定理是法國數學家費馬於1636年發現的。他在1640年10月18日寫給友人法國數學家貝西(Bernard Frénicle de Bessy)的信中首次提出了這個定理。1736年,尤拉給出了費馬小定理的一個證明。但從萊布尼茨未發表的手稿中發現他在1683年以前已經得到幾乎相同的證明。之所以命名為“小定理”是為了區別於舉世聞名的費馬大定理。

enter image description here

數論中費馬小定理是說:若p是素數,對任何滿足0 < a < p的整數a都有,a^(p−1) − 1能被p整除。

應用

今天,費馬小定理已經走進人們的日常生活中,不管是網路購物還是電子交易。1976年,美國史丹佛大學的教授馬丁·赫爾曼(Martin Hellman)和惠特菲爾德·迪菲(Whitfield Diffie)提出了非對稱公鑰加密演算法的思想。1977年美國麻省理工學院的羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Len Adleman)提出了構造單向函式的數論方法,從而產生了以這三個人姓氏首字母命名的RSA演算法。

RSA演算法的核心思想是人們可以容易地將兩個大素數乘在一起得到一個合數,然而在不事先知道這兩個素數的情況下,對這個合數做因數分解卻非常困難。對於一個200位以上的的大數做因式分解,即使用強大的超級計算機,所耗費的時間也要超過宇宙的年齡。因此,如果能夠迅速地找到大素數,就可以構造難以破解的金鑰。但是素數的存在規律是神祕的,人們沒有找到素數的“通項公式”。最原始的辦法是挑選一個數n,然後逐一驗證從1到√n之間的整數能否整除n。但這種方法非常低效,對大數進行素數檢測,同樣會超過宇宙年齡所需的時間。稍好的方法是埃拉託斯特尼篩法。 列出從2開始到n之間的整數,然後從2開始,先篩除所有2的倍數,然後再篩除3的倍數,這樣每次都從沒有被篩除的第一個數開始重複這一步驟,直到把不大於√n的所有倍數都篩除為止。這樣就可以獲得n以內的所有素數。但這樣方法同樣只是對較小的整數n有效。無法達到大素數檢測的目的。

費馬小定理恰好給出了一種大素數檢驗的辦法。對於一個大整數n,我們可以隨機挑選一個小於n的正整數a,將其稱為“證人”(witness),然後檢查a^(n−1)模n的餘數是否等於1,如果不是1,根據費馬小定理,n一定不是素數。如果等於1,則n有可能是素數。

根據這一思想構造的“費馬素數檢測”演算法如下:

function primality(n)
    隨機選擇正整數a < n 
    if a^(n−1) ≡1 mod n then
        return 素數 
    else
        return 合數

我們並不需要真的計算a的n − 1次方然後再求除n的餘數,而是通過模乘運算。並且還可以進一步利用中間的計算結果加速,例如當我們得到b = a^2 mod n時,可以直接計算b^2 mod n從而得到a^4 mod n。假設要計算a^11 mod n,因為: a^11 = a^(8+2+1) = ((a^2)^2)^2 * a^2 * a mod n 所以我們真正需要計算的只有a^2 mod n, (a^2)^2 mod n, ((a^2)^2)^2 mod n。為此,我們可以把n表示為2進位制,然後僅僅迭代計算數字為1所在位上的模乘結果,這是一個複雜度為O(lg n)的演算法。因此費馬素數檢測的速度很快。

但某個數即使通過了費馬素數檢測,仍然不一定是素數,例如341 = 11 × 31,但是2^340 ≡ 1 mod 341。為了減少費馬檢驗的“假陽性”,人們進行了一系列改進。首先是適當增加證人的數量。人們發現,如果一個數無法通過費馬檢驗,那麼至少存在一半小於n的數都無法通過費馬檢驗。

實際的RSA演算法採用“米勒——拉賓”進行素數測試。它也是一種概率演算法。如果選擇超過100個證人,錯誤率會低於1/2^100 。高德納說:“該測試的錯誤率要比計算機因為宇宙輻射而丟失某個二進位制位的概率還要低。”

同構的證明

採用初等數論的方法證明費馬小定理比較複雜。我們可以採用同構的方法,把這一較難的證明問題“同構”成一個簡單的數數的問題,從而攻破它。

考慮有a種不同顏色的珍珠,我們要串一條長為p的珍珠串。其中p為素數。顯然一共有a^p種不同的串,這是因為串中每個位置都可以在a種顏色的珍珠中選擇,共選p次。

例如有兩種顏色A紅、B綠的珍珠,要串長度為5的串。即a = 2, p = 5,一共有2^5 = 32種不同的串:

AAAAA, AAAAB, AAABA, ..., BBBBA, BBBBB.

對應

紅紅紅紅紅, 紅紅紅紅綠, 紅紅紅綠紅, ..., 綠綠綠綠紅, 綠綠綠綠綠.

我們要證明,在這a^p串珍珠中,如果去掉a個顏色完全相同的串(在上述例子中是串AAAAA和BBBBB), 剩下的a^p − a串珍珠可以分成若干組,每個組恰好有p串珍珠。也就是說p整除a^p − a。 如果把每串珍珠首尾連線起來做成項鍊。原來有些不同的串會變成相同的項鍊。如果一個串可以通過旋轉變換成另一個,這兩個串必然做成相同的項鍊。例如下面的5個串珍珠可以做成相同的項鍊:

AAAAB, AAABA, AABAA, ABAAA, BAAAA.

enter image description here

一串含3種顏色的項鍊代表7種不同的串:ABCBAAC, BCBAACA, CBAACAB, BAACABC, AACABCB, ACABCBA, CABCBAA

enter image description here

相同顏色珍珠串成的項鍊只代表一種串:AAAAAAA

用這種方法,上面例子中的32串珍珠可以分成5種不同顏色的項鍊和2種同色的項鍊:

[AAABB, AABBA, ABBAA, BBAAA, BAAAB];
[AABAB, ABABA, BABAA, ABAAB, BAABA];
[AABBB, ABBBA, BBBAA, BBAAB, BAABB];
[ABABB, BABBA, ABBAB, BBABA, BABAB];
[ABBBB, BBBBA, BBBAB, BBABB, BABBB];
[AAAAA];
[BBBBB].

一串項鍊可以代表多少種不同的串呢?如果一個串S由若干相同的子串T 複製連線而成,而T 無法再繼續分拆成相同的子串,則由S構成的項鍊可代表|T |種不同的串,其中|T |表示串T 的長度。例如 串S =ABBABBABBABB,由相同的子串T=ABB複製多次而成,如果我們一次旋轉一顆珍珠,一共可以得到3串不同的結果:

ABBABBABBABB,
BBABBABBABBA,
BABBABBABBAB.

除去這3種之外,不可能再有其它不同種類的串了。ABB的長度為3,再次旋轉必然會迴圈得到相同的結果。這樣,所有的a^p串珍珠可分成兩類。一類是a串顏色相同的串;另一類顏色不同,但是由於這些串的長度p是素數,它絕不可能由若干子串複製連線出來。所以任何一個這樣的串連成的項鍊,總共代表p種不同的串。而這樣的串總共有a^p − a種,它們可以通過連成項鍊後分組,每組恰好p個串,代表一種不同的項鍊。因此a^p − a = a^(p−1)一定可以被p整除。

證畢

項鍊證明法可能是費馬小定理已知證法中最容易的,它不需要太多的數學知識。核心思想是利用兩種不同的方式數數的結果必然是一樣的。

同構到群論中的拉格朗日定理

如果我們進一步把這一問題同構到群,則可以用群論中的拉格朗日定理給出更加簡短的證明:

考慮整數模p乘法群。這個群的元素由所有模p的非零餘數構成,因為p是素數,所以群元素為 1, 2, ..., p − 1,單位元e = 1,群的階為p − 1。根據拉格朗日定理的推論,有: a^(p−1) = e 因為單位元為1,所以上式可寫為:

a^(p−1)≡1 mod p

故p整除a^(p−1) − 1。

證畢

擴充套件

同構——程式設計中的數學》中文版已可以從github上下載:https://github.com/liuxinyu95/unplugged

enter image description here

相關文章