• 沒有找到結果。

數論輕鬆遊

N/A
N/A
Protected

Academic year: 2022

Share "數論輕鬆遊"

Copied!
27
0
0

加載中.... (立即查看全文)

全文

(1)

數論輕鬆遊

沈淵源

數論, 特別是模算術 (modular arithmetic) [9] 在近代密碼學當中是非常重要的。 這是 大數學家戈德福瑞·哈洛德·哈地1(Godfrey Harold Hardy) 在上一世紀的四十年代所無法想 像的事情。 當年他曾提到 [12]: 數論乃純數中的純數, 是遠離一般人類活動的一門學科。 其實早 在三十多年前, 數論就已經用在一般人類活動中, 如資訊傳輸裏的錯誤更正碼及密碼。 我們在此 介紹密碼學中用到的一些基本數論 [5, 14, 17], 至於更專門的課題如因數分解 [10] 與質數檢驗 [6]、 離散對數 [7] 及橢圓曲線理論 [15, 20] 就等另外的時候再作介紹。 不過首先要進場的是與 我們為伴的數學運算大師Mathematica。 其他的數學套裝軟體如 MATLAB 或是任何你所 熟悉的系統都可拿來使用。

1. 數學運算大師簡介

數學運算大師Mathematica是美國 Wolfram Research 公司所研發出來的一套由電 腦來演算數學的系統。 自從 1988 年發行上市以來, 由於其多才多藝, 早已建立起自己的形象 而成為眾多使用者所選擇的電腦代數系統 [8] (Computer Algebra System, 簡稱為 CAS)。

它提供了一強有力的數學程式環境包括數值的 (numerical)、 符號的 (symbolical) 及圖形的 (graphical) 工具, 來協助我們解決數學方面的問題。 已有相當多的人使用它來觀察並分析工 程、 數學、 物理學、 經濟學及其他科學領域上的問題。 它也可當成高階的程式語言來使用。 其工 作的平台相當廣泛, 從 Cray 的超級電腦到桌上型及膝上型輕便電腦皆可。 在將近兩百萬個使 用者中其分佈大約如下 [22]: 工程 25%, 物理學 20%, 數學 18%, 電腦科學 14%, 化學及化工 6%, 財經 4%, 生命科學 4%, 社會科學 3%, 其他 6%。 約有三分之二的使用者是在工業界及政 府部門工作, 而僅僅 8%為學生使用者。

Mathematica 是由兩大部分組合而成的, 就是所謂的前端 (Front End) 以及核心 (Kernel)。 核心乃是其計算的引擎, 負責所有的計算工作。 前端則透過記事本介面 (notebook

1哈地(1877-1947)英國數學家。 跟李特伍德(J.E. Littlewood, 1885-1977)19101945年間, 人合作發表了將近 100篇的論文: 包括數論、 不等式及黎曼假設方面的著作。 在黎曼假設方面證明了 Zeta 函數在直線x=12 上有無限多個零點。 哈地曾邀請印度數學家雷曼紐卷(Ramanujan, 1887-1920)到英格 蘭訪問,兩人在19141917年間合作, 特別是在數的分割之研究最具原創性, 可參見數學傳播, 273, 4 ,顏一清 「探求 『無限』 奧秘的數學家—Srinivasa Ramanujan ()()」。

45

(2)

interface) 來作為使用者與核心之間的溝通橋樑。 當你啟動 Mathematica 之後, 它會自動 開啟一個工作視窗2 和一個常用的基本輸入面板 (Basic Input Palette)。 我們稱此工作視窗 為記事本 (notebook), 而 Mathematica 則用一種特殊的檔案格式來儲存工作視窗的內容, 其附加檔名為 .nb。 這些記事本有如一般的文字處理軟體一樣, 你可在上面加註解3、 做結論還 可匯入或匯出多種不同格式的圖形檔。 要發表的論文資料或上課講義可在此預備, 也可在此下 達指令將這些文件列印出來。 其中的資料可在記事本之內或之間互相剪貼, 目的就是希望能再 使用或是經過修改其文字、 圖形或計算式子後成為我們所需要的文件。

前端記事本檔案將裡面的資料分類安排放在所謂的 「細胞 (cells)」 當中, 所以這些細胞就 是構成此記事本檔案最基本的單元。 在這些文字、 圖形或計算式的細胞之最右端都有 「右中括 弧」, 而這些 「右中括弧」 就代表整個文字、 圖形或計算式單元。 輸入細胞 (input cells) 含有 Mathematica 的指令者可按下 SHIFT-RETURN 鍵 (先按住 SHIFT 鍵然後再按 RETURN 鍵) 來執行這些指令。 文字細胞僅包含有文字信息, 所以不需經由核心來計算。 圖細胞則包含有 描繪圖及曲線圖。

我們可以把細胞格式化使其具備各式各樣的屬性, 如展示的字體之大小與顏色等。 這些細 胞也可用摘要的形式來組織一文件, 其方法如下: 先點取此細胞最右端的 「右中括弧」, 再從工 作視窗上點取 Format 選單中的 Style 然後選取 Title, Subtitle, Section, Subsection, · · · 即可。

接著我們介紹一下 Mathematica 所用的慣用語法, 你可透過這些規則來了解它是怎 麼樣發號司令的。

• 基本四則運算及指數所用的語法跟其他的程式語言完全一樣。

• 變數通常用小寫字母表示, 但也可以是一個字串如 yvalue= · · ·。

• 函數的變數 x,y,... 以中括弧 [x,y,...] 括起來, 而小括弧則用來達到分組的效果。

• 串列 (list) 是 Mathematica 最原始的資料結構, 以大括弧 {} 括起來, 其中的元素則 用逗點分開。 如一維串列 {1,2,3} 為一向量, 而二維串列 {{1,2,3},{4,5,6}} 則表 矩陣其第一列就是第一個元素 {1,2,3}。

• 所有的指令 (除了符號之外), 包括內建函數與內建常數都是以大寫字母起頭, 如 Sin[Pi/2] 指的就是 sin(π/2)。

2這是一個未命名的空白檔案, 名稱為untitled-1,亦即未命名的第一個檔案。

3若程式過於龐大, 使用者得發很多時間從頭看起; 所以一旦加上註解, 使用者便可以清楚的知道程式的 內容。 一般的註解可直接寫在畫面上, 但如此一來電腦在執行計算時便容易產生混亂。 因此我們可先點取最 右端的 「右中括弧」,再從工作視窗上點取Format選單中的Style 然後選取Text即可。

(3)

• 乘號是用 * 或是空格來代表, 如 a*b 或 a b。 變數與整個括號相乘可不用留空格, 如 a(b-1)。 數字與變數應注意前後次序, 如 7x 表示 7*x, 但 x7 表示一變數名為 x7, 而 x 7 則表示乘積 x*7。

• 符號 = 意指代換, 如 t=1 , 而相等則以符號 == 表示之,

如 Equal[x,t] 或 x==t 只有當 x 與 t 有相同的值才會為真。

• 否定指令 Not 可用 ! 表示之, 如 x!=t 為真若 x 與 t 有不同的值時。

• 上一個輸入以 % 表示之, 而 % n 指的是第 n 個輸入即 In[n]。 所以 %% 意指上上一 個輸入· · · 等等。

• 每一個細胞都是以 In[n]:= 開始的, 但你絕不可鍵入這些, 而只需鍵入你要的文字或指 令, 因為 Mathematica 會自動在你執行 (即按下 SHIFT-RETURN 鍵) 之後將之冠在 前頭的位置。

若想做進一步的探討, 可透過 Wolfram 的書 [23] 或其他入門書 [1, 11, 13, 24] 來達成 你的美夢。 或者也可以從 Help 視窗當中輸入你所要了解的指令, 詳細的介紹就會出現在你的 眼前。 注意 Mathematica 對大小寫是敏感的 (case sensitive), 字母是大寫就必須大寫, 否 則會出現錯誤信息。

2. 數論基本概念

• 整除 (Divides): a 整除 b, 以符號 a | b 表示之, 意即 b 為 a 的整數倍。 換句話說, a 除 b 之後沒有餘數。 例如: 6 | 12, −14 | 98, 然而 7∤ 11 (不整除) 。 在理論性的論證當中, 通常 我們把 a | b 改寫成為 b = ak (k 為一整數) 較為方便。 在數學運算大師 Mathematica 中與此有關的指令如下:

– Divisors[ n ] 列舉整數 n 所有的正因數。

• 質數(Primes):你知道他們是什麼玩意兒? 2, 3, 5, 7, 11, 13, 17, · · · 而且你也知道有無窮 多個質數。 但你可知道

「目前已知最大的質數是多少嗎?」

答案當然不是 「要有多大就有多大」, 為什麼呢? 想想看, 隨便給你一個整數, 你能馬上 回答此數就是質數嗎? 也許你說: 給我些許時間我就可以給你答案。 好吧! 那你就隨便挑 一個一百位數, 再試試看如何? 其實, 你的知道只是理論上的知道, 而不是實作上的知道。

(4)

判斷一整數是否為質數乃是一個大挑戰, 但已被證實存在有演算法, 可在多項式時間內完 成[3]。 在此先介紹兩類有趣的質數。

1. 梅仙尼質數(Mersenne Primes):形如 Mp = 2p− 1 的質數稱之為梅仙尼質數。 此 類質數與完全數有關, 目前已知最大的質數就是這一類的質數為

225964951− 1。

這是已被發現的第四十二個梅仙尼質數, 由 GIMPS4 團隊於 2005 年 2 月 26 日發 現。 請進入 Chris K. Caldwell 所精心設計的質數網頁5 遨遊一番。

2. 費馬質數(Fermat Primes): 形如 Fn= 22n+ 1 的質數稱之為費馬質數。 前面五個 費馬質數為

F0 = 3, F1 = 5, F2 = 17, F3 = 257, 與 F4 = 65537。

當年費馬因此推斷所有這一類型的數都是質數, 但奇怪的是, 這五個數是目前僅有的 費馬質數。 於是有人猜測說: 僅存在有限多個費馬質數。 你認為呢?

在數學運算大師 Mathematica 中與質數有關的一些指令如下:

– Prime[k] 顯示第 k 個質數。

– Prime/@Range[ k ] 列舉前 k 個質數。

– PrimePi[x] 數論函數 π(x), 就是 ≤ x 質數的個數。

– PrimeQ[n] 判斷整數 n 是否為質數。 是則輸出 True, 否則輸出 False。 此判別法實際上是 一擬質數性 (pseudoprimality) 的判別法。 為一非常可信賴的方法, 而且已被證明至少正確 到十位數。 若要保證絕對正確的結果, 則用指令 ProvablePrimeQ[ n ], 描述如下。

– ProvablePrimeQ[n]6 判斷整數 n 是否為質數。 是則輸出 True, 否則輸出 False。 這個判 別法是一真正質數性 (primality) 的判別法, 故其結果保證絕對正確。

例題01: 我們現在就用指令 PrimeQ 一同來確認上面所提的第五個費馬數真是質數, 但第六則否。 首先在 Mathematica 中定義函數 Fn= F [n], 然後列出 F [n], n = 4, 5 再判斷之。

4The Great Internet Mersenne Prime Search的縮寫。 這是此大搜索團隊所發現的第八個,之前的 兩個為224036583− 1220996011− 1分別在2004515日與20031117日發現。 詳情請進 入其網站, 網址為http://www.mersenne.org/prime.htm

5The Prime Pages,網址為http://www.utm.edu/research/primes/largest.html

6注意: 在下達這個指令之前, 得先載入 「Number Theory」 的套裝軟體,指令如下:

<< NumberTheory‘PrimeQ’

(5)

In[1]:= F[n_]:=2^(2^n)+1;{F[4],F[5]}

Out[1]= {65537, 4294967297}

In[2]:= PrimeQ[{F[4],F[5]}]

Out[2]= {True, False}

例題02: 由上 Out[1] 可知第五個費馬數是 5 位數, 但第六則變成 10 位數。 這並不 稀奇, 因為從定義就可看出來後一個大約是前一個的平方。 試列出前八個一起觀察並判斷 是否為質數。

In[3]:=Table[F[n],{n,0,7}]

Out[3]={3,5,17,257,65537,4294967297,18446744073709551617, 340282366920938463463374607431768211457}

In[4]:=PrimeQ[Table[F[n],{n,0,7}]]

Out[4]={True, True, True, True, True, False, False, False}

• 最大公因數(Greatest Common Divisor): 兩整數 a 與 b 的最大公因數, 符號為 gcd(a, b), 就是可以同時整除 a 與 b 的那個最大的正整數。 例如: gcd(64, 14) = 2, gcd(7, 11)

= 1, gcd(48, 60) = 12。 若 gcd(a, b) = 1, 我們就稱 a 與 b 為互質。 眾所週知, 有兩個 標準的方法可以用來求最大公因數。

1. 因數分解法: 若你有辦法將 a 與 b 這兩個數分解成質因數的乘積, 那就做吧! 對每一 個質因數, 看看它出現在 a 與 b 的分解式中的次冪。 取兩者中較小的那個次冪, 然後 將這些較小的質數次冪放在一起即可得到最大公因數。 透過實例最容易瞭解這一切, 且看: gcd(5184, 189) = gcd(2634, 337) = 33 = 27,

gcd(3528, 700) = gcd(233272, 22527) = 227 = 28(= 22305071)。

注意: 若一質數不出現在任何一個分解式中, 則此質數當然就不會出現在這個最大公 因數當中。

2. 輾轉相除法: 若 a 與 b 是兩個大數, 所以有可能不容易分解因數。 此時我們可透過所 謂的歐幾里德演算法, 即輾轉相除法來計算最大公因數。 這可追溯到每個人在小學時 所學過的帶餘數的除法。 舉個例子遠勝過千言萬語的解說或僅僅列出公式, 且看:

例題03: 試計算 gcd(482, 1180)。

(6)

解: 將 482 除 1180, 其商為 2 而餘數為 216 。 然後將此餘數 216 除 482, 其商為 2 而餘數為 50 。 再將此餘數 50 除前一個餘數 216, 其商為 4 而餘數為 16 。 如此 這般的進行下去, 即將最新的餘數除前一個餘數。 最後那個非零的餘數就是所要求的 最大公因數, 在此例為 2:

1180 = 2 · 482 + 216 482 = 2 · 216 + 50 216 = 4 · 50 + 16

50 = 3 · 16 + 2 16 = 8 · 2 + 0

注意: 觀察一下這些數的角色是怎麼個變動法,

餘數 −→ 除數 −→ 被除數 −→ 退隱山林或下臺一鞠躬。

例題04: 試計算 gcd(1234567, 1111111)。

解: 輾轉相除之得

1234567 = 1 · 1111111 + 123456 1111111 = 9 · 123456 + 7

123456 = 17636 · 7 + 4 7 = 1 · 4 + 3 4 = 1 · 3 + 1 3 = 3 · 1 + 0 因此得到 gcd(1234567, 1111111) = 1。

注意: 關於輾轉相除這個演算法, 值得一提的有

– 不需要將此兩數 a, b 加以分解, 所以演算的速度相當快。

– 但是還有比這個方法更快的演算法, 稱之為二進 GCD 演算法 (Binary GCD Algorithm), 由 Josef Stein 於 1961 年所提出的, 下面會特別介紹。

在數學運算大師 Mathematica 中與此有關的指令如下:

(7)

– FactorInteger[n] 將 n 分解成質因數乘積之標準分解式。 例如,

FactorInteger[90]輸出為{{2,1},{3,2},{5,1}}, 意表 90 = 2 · 32· 5。

– FactorInteger[n,FactorComplete->False] 找出小於 216 之 n 的質因子。

– GCD[ a, b ] a, b 的最大公因數, 即 gcd(a, b) 。 例題05: 試分解 F5, F6, F7 三個費馬數。

解: 執行 FactorInteger 指令如下:

In[5]:=Table[F[n], {n, 5, 7}] // FactorInteger Out[5]={{{641,1},{6700417,1}},

{{274177,1},{67280421310721,1}}, {{59649589127497217,1},

{5704689200685129054721,1}}}

所以得到此三個費馬數的分解式如下:

F5= 641 × 6700417

F6= 274177 × 67280421310721

F7= 59649589127497217 × 5704689200685129054721 例題06: 試計算 gcd(123456789, 987654321)。

解: 我們用上面的指令得到 gcd(123456789, 987654321) = 9。

In[6]:= GCD[123456789,987654321]

Out[6]= 9

3. 二進GCD 演算法: 假設 1 < a < b 為二正整數。 記得嗎? 在上面的輾轉相除法中, 我們所用到的基本原理是:

gcd(a, b) = gcd(a, b − ma),

其中所取的 m 乃最大的正整數使得 b − ma ≥ 0。 此 m 是透過長除法完成的, 但長 除法之運算相對地說來是挺花時間的。 若取 m = 1, 則速度當然會很快。 另外除以 2 之運算也是極端快速的, 特別是在機器語言中。 若 a 與 b 都是偶數, 則我們有

gcd(a, b) = 2 × gcd(a/2, b/2)。

(8)

若 a 為奇數, b 為偶數, 則我們有

gcd(a, b) = gcd(a, b/2)。

所以得到這個二進GCD 演算法的步驟如下:

(a) 若 a 與 b 都是偶數, 則將二數同時除以 2 ; 亦即將 a 與 b 分別用 a/2 與 b/2 來取代。 重複此步驟直到有奇數出現為止。 令 r 為執行此步驟的次數。

(b) 若有偶數, 將此偶數擺在 b 的位置並將 b 用 b/2 來取代。 重複此步驟直到變成 奇數為止。

(c) 若 b = 1, 則 gcd(a, b) = 2r

(d) 若都是大 1 的相異奇數, 則將大數擺在 b 的位置並將 b 取代為 b − a 並回到步驟 (b)。

(e) 若 b = a, 則 gcd(a, b) = 2r× a。

為方便起見, 我們用 (a, b) 來表示 gcd(a, b)。 且看下面的例子:

– (30, 42) = 2(15, 21) = 2(15, 6) = 2(15, 3) = 2(3, 15) = 2(3, 12) = 2(3, 6)

= 2(3, 3) = 6。

– (56, 72) = 2(28, 36) = 22(14, 18) = 23(7, 9) = 23(7, 2) = 23(7, 1) = 23。 – (77, 133) = (77, 56) = (77, 28) = (77, 14) = (77, 7) = (7, 77) = (7, 70)

= (7, 35) = (7, 28) = (7, 14) = (7, 7) = 7。

3. 整係數二元一次方程之整數解

在上面輾轉相除法中, 我們並沒有去驚動到商 q1, q2, q3, . . ., 甚至連碰都沒碰一下。 感覺 上, 他們應該很有用才對, 且看下面的分析。 通常談到最大公因數時, 我們都會提到一個非常基 本的事實: 給予二整數 a 與 b, 必存在有整數 x 與 y 使得

ax + by = gcd(a, b)。

換句話說, a 與 b 的最大公因數可以用這兩個數的一個線性組合來表示。 在理論上, 這個事實有 著很重要的應用, 特別是當 a 與 b 互質時。 但怎麼證明呢? 可簡單描述如下: 考慮形如 ax+by 之整數所成的集合。 透過正整數之良序性, 我們知道這個集合有一最小的正整數, 姑且稱之為 d。

然後再利用長除法可證明這個集合中的每一個元素都是 d 的一個倍數。 由此很容易就可推論得 到我們所要的結果 (試將完整的證明寫下來)。 這樣的證明, 雖說是簡潔漂亮; 但美中不足的是, 在整個證明的過程當中, 我們尋不到怎麼樣去找 x 與 y 的蛛絲馬跡。 我們要的乃是一個建構式

(9)

的證明 (constructive proof), 亦即在證明當中, 同時也能告訴我們怎麼樣去找 x 與 y。 在目 前的例子中, 其演算法實際上是隱藏於輾轉相除法中。

所以讓我們重頭再來一遍: 令 a = r0, b = r−1 。 輾轉相除之, 得到

rj−2 = qjrj−1+ rj, j = 1, 2, . . . , n + 1。 (1) 這意味著 rn+1 = 0 且 rn = gcd(a, b)。 若從第 n 個除式開始逆推回去, 不難看出最後的餘數 可用前面兩個餘數的一個線性組合來表示; 如此這般一直往前推, 到末了就得到我們所要的結 果 (試著將完整的證明寫下來)。 然而不同的是, 這一次我們實實在在的算出了 x 與 y。

再看一次上面的例題 03: gcd(482, 1180) = 2, 我們會用到那兒計算時的一些數。 透過其 中的那些餘數 216, 50, 16, 2 逆流而回到原先的兩個數 1180 與 482, 而最後得到最大公因數 2 為 1180 與 482 的一個組合。 由第四行開始, 我們有

2 = 50 − 3 · 16,

所以我們可以把 2 表示成前兩個餘數的組合。 往上移動一行, 我們可將餘數 16 寫成 216 與 50 的組合, 然後代入上式得

16 = 216 − 4 · 50 =⇒ 2 = 50 − 3 · 16 = 50 − 3 · (216 − 4 · 50) = 13 · 50 − 3 · 216。

現在我們已經用過 gcd 演算過程中後面兩個非零餘數。 將上一個未用到過的餘數 50 表示成 482 與 216 的組合, 然後代入上式得

2 = 13 · (482 − 2 · 216) − 3 · 216 = 13 · 482 − 29 · 216。

最後將 216 代換成 1180 − 2 · 482 得到

2 = 13 · 482 − 29 · (1180 − 2 · 482) = 71 · 482 − 29 · 1180。

此即最大公因數 2 表示成 1180 與 482 之組合的式子。 只要輾轉相除時的計算式不太多的話, 那麼即使是用手算也不是太費工夫。 但一般而言, 此法不太適用於搭配電腦來使用。 算的時候似 乎有點費工夫, 因為沒有遞迴法則可言。

怎麼樣才能找到那一個更美、 更好且更適合電腦來使用的方法呢? 我們知道每一個 r 都 是前兩個 r 的組合, 因此可得到如同 rn 一樣的結論; 也就是說我們有

每一個 r 都是 a 與 b 的線性組合。

這句話孕育著呼之欲出的 x 與 y 之遞迴公式。 怎麼說呢? 且看: 令

rj = xja + yjb, j = 1, 2, . . . , n。 (2)

(10)

比較 (1) 式及(2) 式, 得到 j = 1 時我們有

x1a + y1b = r1 = −q1a + b ⇒ x1 = −q1, y1 = 1。

而 j = 2 時, 我們卻有

x2a + y2b = r2 = −q2(x1a + y1b) + a ⇒ x2 = −q2x1 + 1, y2 = −q2y1。 當 j ≥ 3 時我們終於有

xja + yjb = rj = −qj(xj−1a + yj−1b) + (xj−2a + yj−2b)

= (−qjxj−1+ xj−2)a + (−qjyj−1+ yj−2)b, 因而得到 j = 3, 4, . . . , n 時的遞迴公式就是:

xj = −qjxj−1+ xj−2, yj = −qjyj−1+ yj−2。 雖然這遞迴公式在 j = 1, 2 時沒有意義, 但很容易可以看出只要我們定義

x−1= 0, x0 = 1, y−1 = 1, y0 = 0, 則所有的問題就煙消雲散。 因而此二數列 {xj} 與 {yj} 可定義如下:

x−1 = 0, x0 = 1, xj = −qjxj−1+ xj−2, j = 3, 4, . . . , n; (3) y−1 = 1, y0 = 0, yj = −qjyj−1+ yj−2, j = 3, 4, . . . , n。 (4) 由 (3) 及(4) 式, 很快就可以算出 xn 與 yn 因此得到 a 與 b 的最大公因數為

gcd(a, b) = xna + ynb。 (5) 我們再一次看上面的例題 03: gcd(482, 1180) = 2, 這次用到公式 (5)。 在例題03當中, 其商依 序為 q1 = 2, q2 = 2, q3 = 4, q4 = 3, q5 = 8 。 我們可以很快算出 xj 及 yj 如下:

j −1 0 1 2 3 4 5

qj 2 2 4 3 8

xj 0 1 −2 5 −22 71 yj 1 0 1 −2 9 −29 所以我們得到

gcd(a, b) = 71 · 482 − 29 · 1180。

注意: 上述的方法通常稱之為延伸 (extended) 輾轉相除法, 在下面解某些同餘式時會用 到。

在數學運算大師 Mathematica 中與此有關的指令如下:

(11)

− ExtendedGCD[ a, b ] 算出 gcd(a, b) 且將其表成 a 與 b 的組合。

例題07: 試求 gcd(482, 1180) 並表示成此二數的一個線性組合。

解: 我們用上面的指令得到 gcd(482, 1180) = 2 且 2 = 71 · 482 − 29 · 1180。

In[7]:= ExtendedGCD[482, 1180]

Out[7]= {2,{71,-29}}

例題08: 試求方程式 123456789x + 987654321y = 9 的整數解。

解: 我們用上面的指令得到 x = −8 與 y = 1。

In[8]:= ExtendedGCD[123456789, 987654321]

Out[8]= {9,{-8,1}}

4. 模算術

今有物不知其數, 三三數之剩二, 五五數之 剩三, 七七數之剩二, 問物幾何?7 —孫子算經 [21]

在數論當中, 最基本又最有用的觀念之一就是模算術或同餘的觀念。 我們就從孫子算經8 說起。 首先 「三三數之剩二」 是什麼意思呢? 那不過說某一個數 x 被 3 除剩餘 2; 換句話說, x − 2 被 3 整除。 我們用下式表示 「三三數之剩二」

x ≡ 2 (mod 3)。

一般而言, 令 n 為一正整數。 對任意二整數 a 與 b, 若 n | a − b 則我們稱之為在模 n 之下, a 同餘 b, 用符號

a ≡ b (mod n)

表示之。 反之, a 6≡ b (mod n) 表示 a, b 在模 n 之下不同餘。 例如: 52 ≡ 27 (mod 5),

−19 ≡ 37 (mod 7), 11 6≡ 91 (mod 13)。 在理論性的論證當中, a ≡ b (mod n) 通常改寫

7孫子算經下卷第 26,就是這個孫子問題[4] (58)。 俗稱韓信點兵,也叫秦王暗點兵、 鬼谷算、 隔 牆算、 剪管術、 神奇妙算、 大衍求一術等等。

8約成書於第四世紀, 作者生平和編寫年代都不清楚。 現今傳本共有三卷。 卷上敘述記數的縱橫相間制度 和乘除法則,卷中舉例說明分數算法和開平方法。 卷下第31,可以看作後世雞兔同籠題的始祖, 後來傳到 日本,變成鶴龜算。 請參考下面網頁http://www.edp.ust.hk/math/history/6/

(12)

為 b = a + nk (k 為一整數) 較為方便。 你可以將同餘式看成好像是等式一樣, 在式子的兩邊 執行你所要的四則運算 (試證明之!) , 唯一需要小心的當然是除的時候。 且看下面幾個例子, 即 可明白是怎麼一回事。

例題09: 試求同餘方程式 x + 11 ≡ 7 (mod 17) 的解。

解: x ≡ 7 − 11 ≡ −4 ≡ 13 (mod 17) 。 答案若寫成負的並沒什麼錯誤。 但當我們在 模 n 之下工作時, 通常將最後的答案表示為介於 0 與 n − 1 之間的整數。

除法原理: 在模 n 下, 只要除數與 n 互質, 你就可以將兩數相除。

例題10: 試求同餘方程式 4x + 11 ≡ 7 (mod 17) 的解。

解: 4x ≡ 7 − 11 ≡ −4 (mod 17), 所以 x ≡ −1 ≡ 16 (mod 17)。 被 4 除沒問題, 因為 gcd(4, 17) = 1。

例題11: 試求同餘方程式 5x + 7 ≡ 11 (mod 17) 的解。

解: 5x ≡ 4 (mod 17)。 現在怎麼辦呢? 兩邊同時除以 5 就好了嗎, 但 4/5 在模 17 之下是什麼意思呢? 我們知道 4 ≡ 21 ≡ 38 ≡ 55 ≡ · · · (mod 17), 所以 5x ≡ 4 (mod 17) 與 5x ≡ 55 (mod 17) 是一樣的。 現在我們可除以 5 得到 x ≡ 11 (mod 17) 為其答案。 注意 4 ≡ 11 · 5 (mod 17), 所以在模 17 之下 11 就如同是 4/5 一樣。

另解: 我們也可從另一角度來解此同餘方程式。 因為 5 · 7 ≡ 1 (mod 17), 我們看出 在模 17 之下 7 是 5 的乘法反元素。 因此, 除以 5 可由乘以 7 來完成, 如下: 5x ≡ 4 (mod 17) =⇒ x ≡ 35x ≡ 28 ≡ 11 (mod 17)。

除法原理證明: 從上一節我們知道, 若 gcd(a, n) = 1 則存在有整數 x 與 y 使得 ax + ny = 1, 亦即 ax ≡ 1 (mod n)。 因此在模 n 之下, x 是 a 的乘法反元素, 故得證。

注意: 用上一節的延伸輾轉相除法即(3) 式來計算 x 是相當省時的。y 則不需要算, 因為 在模 n 之下, 不管是多少都會被磨掉。

例題12: 試求同餘方程式 1111111x ≡ 4 (mod 1234567) 的解。

解: 從例題04 得到 q1 = 1, q2 = 9, q3 = 17636, q4 = 1, q5 = 1, q6 = 31。 因 此可得 x−1 = 0, x0 = 1, x1 = −1, x2 = 10, x3 = −176361, x4 = 176371, x5 =

−352732, 這告訴我們 1111111 · (−352732) + 1234567 · y5 = 1, 由此得知 1111111 · (−352732) ≡ 1 (mod 1234567)。 將原先的同餘式兩邊同時乘上 −352732 得到 x ≡

−1410928 ≡ 1058206 (mod 1234567)。 在實作上, 這意味著如果我們在模 1234567 之 下工作而且碰到分數 4/1111111, 那麼就以 1058206 取代之。 這似乎是有點奇怪, 但不妨想

(13)

一想 4/1111111 指的是什麼呢? 這只不過是一個符號代表乘以 1111111 之後會得到 4 的那 個數。 當我們在模 1234567 之下時, 1058206 也具有這個性質, 因 1111111 × 1058206 ≡ 4 (mod 1234567)。

在數學運算大師 Mathematica 中與此有關的指令如下:

− Mod[ k, n ] 將 k 被 n 除所得的餘數, 亦即 k (mod n)。

例題13: 試計算 123 · 456 (mod 789)。

解: 使用上面的指令, 得到答案為 69 (mod 789)。

In[9]:= Mod[123*456,789]

Out[9]= 69

總結上述討論過的一些東西, 摘要如下:

• 在模 n 之下求乘法反元素 a−1 (mod n)

1. 使用延伸輾轉相除法9, 求出整數 s 與 t 使得 as + nt = 1。

2. a−1 ≡ s (mod n)。

• 當 gcd(a, n) = 1 時, 解同餘方程式 ax ≡ c (mod n) (⇔ 當 gcd(a, n) = 1 時, 在模 n 之下, 計算分數 c/a 之值)

1. 使用延伸輾轉相除法10, 求出整數 s 與 t 使得 as + nt = 1。

2. 答案為 x ≡ cs (mod n)(⇔ 將分數 c/a 取代為 cs (mod n))。

• 當 gcd(a, n) = d > 1 時, 解同餘方程式 ax ≡ b (mod n) 1. 若 d 6 | b, 則此同餘方程式無解。

2. 若 d | b。 考慮新的同餘方程式 a dx ≡ b

d (mod n d)。

a

d, bd, nd 都是整數且 gcd(ad, nd) = 1。 按上述步驟得一解 x0。 3. 原同餘方程式 ax ≡ b (mod n) 之解為

x0, x0+n

d, x0+ 2 n

d, . . . , x0+ (d − 1)n

d (mod n)。

9僅求s即可,不需要算t, 理由已經在上面的注意提過。

10同上。

(14)

例題14: 試求同餘方程式 12x ≡ 21 (mod 39) 的解。

解: 因為 gcd(12, 39) = 3, 此最大公因數可以整除 21 。 除以 3 得到一新的同餘方程式 4x ≡ 7 (mod 13) 。 試幾個值, 或透過延伸輾轉相除法可得一解 x0 = 5 。 所以原同餘方程 式 12x ≡ 21 (mod 39) 之解為

x ≡ 5, 18, 31 (mod 39)。

5. 模次冪與連續平方法

在序曲 [19]中, 我們知道解密的過程裡需要執行如 848187 (mod 1189) 之計算。 如果我 們先算出 848的187次方, 然後簡化至模1189之下; 那麼我們就得跟非常大的數打交道。 將848 自乘 187次, 這是一個很大的數。 表面上你得執行186次的乘法, 這相當花時間。 所以在那邊, 我 們提出了連續平方法來解決 848187 (mod 1189) 的計算問題。 如此一來, 原先需執行 186 次 乘法的工作, 現在只要 12次就了結; 而且在整個計算過程當中絕對不會碰到一個比 11892 還大 的數。

輕而易舉的, 我們可將此一算法推廣用來計算 ab (mod n), 其中執行模 n 下的乘法次 數頂多是 2 log2(b), 而在整個計算過程當中絕對不會碰到一個比 n2 還大的數。 這意味著次冪 的運算可很快完成, 而且不需要用到太多的記憶體。

當 a, b, n 都是 100 位數時這個方法是非常有用的。 如果我們算出 ab, 然後簡化至模 n 之 下, 那麼電腦的記憶體就有可能會溢位 (overflow): 想想看 ab 有多大呢? 其位數超過 10100, 而此數又比宇宙中所有粒子的總數還要多。 然而, 計算 ab (mod n) 依目前的演算法來估計 不會超過 700 個步驟即可完成, 而且在整個計算過程當中絕對不會碰到一個超過 200 位的數。

令 b1b2b3· · · bw 為整數次冪 b 的二進位表示法 (如 b = 1011 表示 b1 = 1, b2 = 0, b3 = 1, b4 = 1)。 上述之演算法步驟如下: (注意 rw ≡ ab (mod n))

1. 從 k = 1 開始, 且令 s1 = 1。

2. 若 bk = 1, 令 rk≡ ska (mod n); 否則令 rk = sk (mod n)。

3. 令 sk+1 ≡ r2k (mod n)。

4. 若 k = w, 停止; 若 k < w, 則將 k 增加 1 並回到步驟 2。

在數學運算大師 Mathematica 中與此有關的指令如下:

− PowerMod[ a, b, n ] 將 ab 被 n 除所得的餘數, 亦即 ab (mod n)。

(15)

− PolynomialMod[ p, n ] 將多項式 p 的係數化簡至 (mod n) 下。

例題15: 試計算 234567876543 (mod 565656565)。

解: 使用上面的指令, 得到答案為 473011223 (mod 565656565)。

In[10]:= PowerMod[234567,876543,565656565]

Out[10]= 473011223

例題16: 試計算 87878787 在模 9191919191 之下的乘法反元素。

解: 取 −1 次方即乘法反元素, 故得 7079995354 (mod 9191919191)。

In[11]:= PowerMod[87878787,-1,9191919191]

Out[11]= 7079995354

例題17: 試求同餘方程式 7654x ≡ 2389 (mod 65537) 的解。

解: 兩種解法如下:

In[12]:= Solve[{7654*x==2389,Modulus==65537},x,Mode->Modular]

Out[12]= {{Modulus->65537,x->43626}}

In[13]:= Mod[PowerMod[7654,-1,65537]*2389,65537]

Out[13]= 43626

6. 孫子定理 (

又名

中國剩餘定理 )

現在回到孫子算經中 「問物幾何?」 的問題。 「物不知其數, 三三數之剩二, 五五數之剩三, 七七數之剩二」 可用同餘式表示如下:





x ≡ 2 (mod 3) x ≡ 3 (mod 5) x ≡ 2 (mod 7)

「韓信點兵問題」 就是求一組同餘式的公解。 孫子算經不僅僅是提供了答案並給出了解決的方 法。 德國數學家高斯於 1801 年出版算術探究中明確寫出下述定理。 1852 年英國基督教士 Alexander Wylie (1815-1887) 將孫子算經對此一問題的解法傳到歐洲,1874 年 L. Math- iesen 指出來孫子算經之解法符合高斯的定理, 從而在西方的數學史裏將這一個定理稱為中國 剩餘定理 (Chinese remainder theorem)。 我們先敘述最簡單的版本, 然後再作一般的推廣。

(16)

孫子定理: 若 m, n 為互質的兩個正整數, 則對任意給予的正整數 a, b 必存在唯一的正整 數 x (mod mn) 滿足聯立同餘方程組:

(x ≡ a (mod m) x ≡ b (mod n) 例題18: 試求下列聯立同餘方程組的解:

(x ≡ 3 (mod 7) x ≡ 5 (mod 15)

解: x ≡ 80 (mod 105) (注意: 105 = 7 · 15)。 因為 80 ≡ 3 (mod 7) 且 80 ≡ 5 (mod 15), 所以 80 是一個解。 中國餘數定理保證存在有解, 而且說到在模 mn = 105 之下, 此解是唯一的。

怎麼找到這個答案的呢 ?

對小數 m 與 n 而言, 方法之一是按大小列出 在模 n 之下與 b 同餘的數, 直到你挑選到 其中一個被 m 除餘 a 的數為止。 例如, 在模 15 之下與 5 同餘的數為

5, 20, 35, 50, 65, 80, 95, · · ·

模 7 之後, 變為 5, 6, 0, 1, 2, 3, 4, · · ·。 因為我們要的是 3 (mod 7), 所以選取 80。 對大數 m 與 n 而言, 列表比對的話有可能效率非常低。 然而, 同樣的想法還是行得通的。 在模 n 之下與 b 同餘的數為 b + nk (k為一整數), 所以我們必須解同餘式 b + nk ≡ a (mod m), 亦即

nk ≡ a − b (mod m)。

因為我們假設 gcd(m, n) = 1, 所以在模 m 之下 n 有乘法反元素 n−1 (mod m)。 兩邊同 乘此乘法反元素可得

k ≡ n−1(a − b) (mod m)。

代回 x = b + nk, 然後簡化至模 mn 之下, 即得其解。

例題19: 解下列聯立同餘方程組:

(x ≡ 7 (mod 1234567) x ≡ 11 (mod 1111111) 解: 首先, 例題09 的演算告訴我們

1111111−1 (mod 1234567) ≡ −352732。

(17)

因此可得

k ≡ 1111111−1(7 − 11) ≡ −352732 · −4 ≡ 176361 (mod 1234567)。

所以其解為

x ≡ 11 + 1111111 · 176361 ≡ 195956647082 (mod 1371740973937)。

如何使用孫子定理 ?

如果你所面對的同餘方程式是在一合成數模 n =Qp|npa 之下, 則解題的關鍵想法是, 按 n 的分解式將方程式拆開成幾個在模 pa 之下的同餘方程式。 解決完這些同餘方程式後, 再透過 孫子定理重組得到在模 n 之下的答案。 優點是化繁為簡, 通常分析在質數模或質數次冪模之下 的同餘式遠比直接去面對合成數模之下的同餘式容易。

假設你要解同餘方程式 x2 ≡ 1 (mod 35)。 因為 35 = 5 · 7, 所以拆開而成一對同餘方 程式

(x2 ≡ 1 (mod 5) x2 ≡ 1 (mod 7)

現在觀察得知 x2 ≡ 1 (mod 5) 有兩個解: x ≡ ±1 (mod 5), 而 x2 ≡ 1 (mod 7) 也有 兩個解:x ≡ ±1 (mod 7) 。 所以有四種不同的組合方式分別得到解如下:

x ≡ 1 (mod 5), x ≡ 1 (mod 7) =⇒ x ≡ 1 (mod 35), x ≡ 1 (mod 5), x ≡ −1 (mod 7) =⇒ x ≡ 6 (mod 35), x ≡ −1 (mod 5), x ≡ 1 (mod 7) =⇒ x ≡ 29 (mod 35), x ≡ −1 (mod 5), x ≡ −1 (mod 7) =⇒ x ≡ 34 (mod 35).

所以我們得知, 同餘方程式 x2 ≡ 1 (mod 35) 的解為 x ≡ 1, 6, 29, 34 (mod 35)。

注意: 一般而言, 若 n = p1p2· · · pr 為 r 個相異奇質數的乘積, 則同餘方程式 x2 ≡ 1 (mod n) 有 2r 個解。 此乃下述更一般形式化之孫子定理所結出來的果實。

孫子定理(一般形式): 若 m1, m2, . . . , mk 為兩兩互質的 k 個正整數, 則對任意給予的 k 個整數 a1, a2, . . . , ak 必存在唯一的整數 x (mod m), 此處 m = m1m2· · · mk 滿足聯立 同餘方程組:













x ≡ a1 (mod m1) x ≡ a2 (mod m2)

... ...

x ≡ ak (mod mk)

(18)

例如, 此定理保證韓信點兵問題的聯立同餘方程組:





x ≡ 2 (mod 3) x ≡ 3 (mod 5) x ≡ 2 (mod 7)

恰有一個解 x (mod 105) 。 其實, 孫子給出答案為 「答曰: 二十三。」 事實上, 這是最小的正 整數解。 他又說出其演算技巧為 「術曰: 三三數之剩二, 置一百四十; 五五數之剩三, 置六十三;

七七之數剩二, 置三十。 并之得二百三十三。 以二百一十減之, 即得。 凡三三數之剩一, 則置七 十; 五五數之剩一, 則置二十一; 七七數之剩一, 則置十五。 一百六以上, 以一百五減之, 即得。」

這段話寫成數學式子就是:

x = 2 × 70 + 3 × 21 + 2 × 15 − 2 × 105

= 140 + 63 + 30 − 210

= 23

如何找到這個解的呢? 其演算法如下 (其實這就是孫子定理的一個證明):

1. 算出 m = m1m2· · · mk

2. 對 j = 1, 2, . . . , k, 算出 zj = m/mj

3. 對 i = 1, 2, . . . , k, 利用延伸輾轉相除法算出 yi = z−1j (mod mj)。

4. 令 x = a1y1z1+· · ·+ akykzk (mod m), 則 x ≡ aj (mod mj) ∀j。

在數學運算大師 Mathematica 中與此有關的指令如下:

− ChineseRemainderTheorem[ {a1, ..., ak}, {m1, ..., mk} ]11 滿足下列聯立同餘方程組的唯一解 x (mod m1m2· · · mk) :













x ≡ a1 (mod m1) x ≡ a2 (mod m2)

... ...

x ≡ ak (mod mk)

11注意: 在下達這個指令之前, 得先載入 「Number Theory」 的套裝軟體,指令如下:

<<NumberTheory‘NumberTheoryFunctions‘

(19)

例題20: 試解韓信點兵問題:





x ≡ 2 (mod 3) x ≡ 3 (mod 5) x ≡ 2 (mod 7) 解:使用上面的指令得到答案為 23。

例題21: 試解聯立同餘方程組:





x ≡ 2 (mod 78) x ≡ 5 (mod 97) x ≡ 1 (mod 119) 解: 使用上面的指令得到答案為 647480。

In[14]:= <<NumberTheory‘NumberTheoryFunctions‘

In[15]:= {ChineseRemainderTheorem[{2, 3, 2}, {3, 5, 7}], ChineseRemainderTheorem[{2, 5, 1}, {78, 97, 119}]}

Out[15]= {23, 647480}

驗算如下:

In[16]:= Mod[{23, 647480}, {{3, 5, 7}, {78, 97, 119}}]

Out[16]= {{2, 3, 2}, {2, 5, 1}}

7. 費馬小定理 (Fermat Little Theorem)

在序曲中, 我們用到了費馬小定理。 此定理看似艱深, 其實只需用到大家耳熟能詳的數學 歸納法及二項式定理, 而所得到的結果還更一般化。 說明如下: 令 p 為一質數。 對所有的正整 數 k, 二項式定理告訴我們

(k + 1)p ?≡ k1 p+ 1 (mod p)。

藉著數學歸納法馬上得證 kp ≡ k (mod p)。 另一方面, 若 a 為一負整數則 a = −k, 此 k 為一正整數。 所以我們有 (請在下標問號處提供理由!)

ap = (−k)p ?≡ −k2 p ?≡ −k = a3 (mod p)。

然而, a = 0 此同餘式顯而易見, 故得證下述之定理。

(20)

定理: 若 p 為一質數, 則對所有的整數 a 我們恆有 ap−1 ≡ 1 (mod p)。

換句話說, p | (ap− a) = a(ap−1− 1)。 如果 p 6 | a, 那麼我們馬上得證 (?4) 下述之費馬 小定理。

費馬小定理: 若 p 為一質數且 p 6 | a, 則

ap−1 ≡ 1 (mod p)。

例如 210= 1024 ≡ 1 (mod 11)。 由此可算出 253 (mod 11) 如下:

253 = (210)523 ≡ 1523 ≡ 8 (mod 11)。

費馬小定理另一證明: 考慮集合 F = {1, 2, b, . . . , p − 1} 並考慮將 a 乘上 F 中每一個 元素之後所形成的集合

aF = {a, 2a, 3a, . . . , (p − 1)a}。

不難看出, 在模 p 之下集合 aF 中每一個元素會跟集合 F 中的一個而且是唯一的一個元素同 餘 (?5)。 所以得到

(p − 1)!ap−1 = a(2a)(3a) · · · (p − 1)a ≡ (p − 1)!, 故得證 (?6)。

注意: 當我們在模11 之下工作時。 對次冪而言, 本質上我們是在模 10 而非模 11 之下工 作。 換句話說, 從 53 ≡ 3 (mod 10) 我們可推論而得到 253≡ 23 (mod 11)。

費馬小定理逆敘述成立嗎 ?

一般而言, 如果 2n−1 ≡ 1 (mod n), 那麼 n 就是質數。 然而, 有例外: 561 = 3·11·17 為 一合成數, 但 2560 ≡ 1 (mod 561)。 怎麼知道的呢? 且看下面的分析: 因 560 ≡ 0 (mod 2), 故 2560 ≡ 20 ≡ 1 (mod 3)。 同樣地, 因 560 ≡ 0 (mod 10) 且 560 ≡ 0 (mod 16), 所以 2560≡ 1 (mod 11) 且 2560 ≡ 1 (mod 17)。 將此三同餘式合併可得 (為什麼?)

2560 ≡ 1 (mod 561)。

另一個例外是 1105 = 5 · 13 · 17。 滿足 an ≡ a (mod n)∀a 的合成數 n 稱之為 Carmichael 數。 這種數極其稀少, 但卻有無限多個 [2]。 雖然如此, 這些例外在實作上是相當 罕見的。 因此, 如果 2n−1≡ 1 (mod n) 那麼非常有可能 n 是一個質數。

(21)

前面十個 Carmichael 數為

561, 1105, 1729, 2465, 2821, 6601, 8911, 10585, 15841, 29341, · · · 。 將這十個 Carmichael 數分解後如下:

In[17]:=FactorInteger[{561, 1105, 1729, 2465, 2821, 6601, 8911, 10585, 15841, 29341}]

Out[17]={{{3,1},{11,1},{17,1}},{{ 5,1},{13,1},{17,1}}, {{7,1},{13,1},{19,1}},{{ 5,1},{17,1},{29,1}}, {{7,1},{13,1},{31,1}},{{ 7,1},{23,1},{41,1}}, {{7,1},{19,1},{67,1}},{{ 5,1},{29,1},{73,1}}, {{7,1},{31,1},{73,1}},{{13,1},{37,1},{61,1}}}

觀察得到所有這十個 Carmichael 數都是三個相異質數的乘積, 但不要誤以為這是 Carmi- chael 數的特性, 因為

62745 = 3 × 5 × 47 × 89

是一個具有四個質因子的 Carmichael 數。 然而不難證明所有的 Carmichael 數至少有下列兩 個特性:

• 每一個 Carmichael 數都是奇數。

• 每一個 Carmichael 數都是相異質數的乘積。

費馬小定理反逆敘述

當然, 如果 2n−1 6≡ 1 (mod n), 則 n 不可能是質數。 因為計算 2n−1 (mod n) 的速 度奇快無比 (見第 9 節) , 這提供了我們一個尋找質數的方法。 即, 選取一起始點 n0 並連續測 試每一個大於 n0 的奇數 n, 看看是否 2n−1 ≡ 1 (mod n) ? 若 n 無法通過此測試, 那麼就 丟掉此數並進行下一個 n。 當一個 n 通過此測試時, 再使用更細膩的技巧來測試 n 的不可分解 性。 此法之優點在於其整個演算過程遠比去分解每個 n 要快許多, 尤其是能很快的將許多的 n 刪除。 當然, 還有辦法可用來加速整個尋找的過程, 譬如說可先將包含有小質數因子的 n 刪除, 然後再進行上述的方法。

(22)

8. 歐拉定理 (Euler’s Theorem)

對合成數n我們亦需要類似費馬小定理的結果。 令φ(n) 為比n小且與n互質之正整數的個 數。 例如,n = 10 則有四個這種整數, 即 1, 3, 7, 9。 因此,φ(10) = 4。 若 p 為一質數而 n = pr, 則除了 p 的倍數 (也就是 p, 2p, 3p, · · · pr−1· p) 之外, 其餘的數皆與 n 互質。 因此,

φ(pr) = pr− pr−1 = 1 −1 p

!

pn。 特別而言,

φ(p) = p − 1。

更一般地, 可由孫子定理推論得知(試證明之!) 對任何正整數 n, φ(n) = nY

p|n

1 − 1 p

!

,

此處的乘積個數乃整除 n 之相異質數的個數。 當 n = pq 為兩相異質數的乘積時, 則 φ(pq) = (p − 1)(q − 1)。

在數學運算大師 Mathematica中與此有關的指令如下:

− EulerPhi[ n ] 比 n 小且與 n 互質之正整數的個數, 亦即 φ(n)。

In[18]:= EulerPhi[1000]

Out[18]= 400

根據定義我們知道, 總共有 φ(n) 個比 n 小且與 n 互質的正整數, 說是 Φ = {b1, b2, b3, . . ., bφ(n)} 好了。 假設 a 是任意與 n 互質的一個整數並考慮將 a 乘上 Φ 中每一個元素之後所形 成的集合

aΦ = {ab1, ab2, ab3, . . . , abφ(n)}。

不難看出, 在模 n 之下集合 aΦ 中每一個元素會跟集合 Φ 中的一個而且是唯一的一個元素同 餘 (試說明原因!)。 所以得到

aφ(n)(b1b2b3· · · bφ(n)) = (ab1)(ab2)(ab3) · · · (abφ(n)) ≡ b1b2b3· · · bφ(n), 因此得證 (試說明原因!) 歐拉定理如下:

歐拉定理: 若 gcd(a, n) = 1, 則 aφ(n) ≡ 1 (mod n)。

注意: 當 n = p 為一質數, 則歐拉定理 = 費馬小定理。

(23)

例題22: 試問 7803 的最後三位數為何?

解: 所要求的乃是被 1000 除的餘數, 因此我們必須在模 1000 之下工作。 因為 φ(1000) = 10001 −12 1 − 15= 400, 所以

7803 = (7400)2· 73 ≡ 12· 343 = 343 (mod 1000)。

因此 7803 的最後三位數為 343。

注意: 在此我們可將次冪由 803 改為 3, 因 803 ≡ 3 (mod φ(1000))。

基本原理: 在模 n 下工作時, 次冪的地方必須在模 φ(n) 之下運作。

這個極其重要的原理我們會一再的使用。 所以要好好的思考上面的那些例子, 直到你自己 確信在次冪的地方一定要模 400 = φ(1000) 才算完成正確 (也就是說, 不要去當那許許多多的 大傻瓜, 錯誤地試著將次冪放在模 1000 之下來運作)。

9. 原根 (Primitive Roots)

先觀察一下, 在模 11 之下 7的次冪:

j 1 2 3 4 5 6 7 8 9 10 7j 7 5 2 3 10 4 6 9 8 1

一眼即可看出, 在模 11 之下所有非零元素都是 7 的次冪。 此種元素 7 稱之為模 11 的一個原 根 (primitive root)12。 同樣地, 每一個模 23 的非零元素都是 5 的次冪, 所以 5 是模 23 的一 個原根。 然而, 211 ≡ 1 (mod 23), 所以只有 1, 2, 4, 8, 16, 9, 18, 13, 3, 6, 12 是 2 的次 冪。 因此 2 不是模 23 的一個原根。 模 23 的原根有 5, 7, 10, 11, 14, 15, 17, 19, 20, 21。

一般而言, 當 p 為一質數, 模 p 的一個原根就是其中一個非零元素 g 使得每一個模 p 的 非零元素都是 g 的一個次冪。 每一個質數 p 都有 φ(p − 1) 個原根。 特別而言, 至少有一個原 根。 在實作上, 如果知道 p − 1 的分解式, 那麼要找到一個原根並不難。 見一般習題 8。

在數學運算大師 Mathematica 中與此有關的指令如下:

− PrimitiveRoot[p]13 給予質數模 p 之下的最小原根。 ( p 也可能是一奇質數的次冪或 是一奇質數次冪的兩倍)

12「乘法生成元素 (multiplicative generator)」 可能更傳神,但不普遍為人採用。

13下達這個指令前, 需先載入 「Number Theory」 的套裝軟體如前面In[14]所示。

(24)

In[19]:= PrimitiveRoot[{65537,11,23}]

Out[19]= {3,2,5}

我們將密碼學當中所要用到原根方面的主要結果摘要在此。

定理: 令 g 為質數 p 的一個原根。

• 若 n 為一整數, 則 gn≡ 1 (mod p) ⇐⇒ n ≡ 0 (mod p − 1)。

• 若 j 與 k 為二整數, 則 gj ≡ gk (mod p) ⇐⇒ j ≡ k (mod p − 1)。

證明: 若 n ≡ 0 (mod p − 1), 則存在一整數 m 使得 n = (p − 1)m。

因此透過費馬小定理, 我們有

gn ≡ (gm)p−1 ≡ 1 (mod p)。

相反地, 假設 gn ≡ 1 (mod p)。 我們要證明 p − 1 整除 n。 很自然地, 我們將 n 除以 p − 1 得到 n = (p − 1)q + r, 其中 0 ≤ r < p − 1。 我們有

1 ≡ gn≡ (gq)p−1gr ≡ 1 · gr ≡ gr (mod p)。

假設 r > 0。 考慮所有 g (mod p) 的次冪即可察覺, 我們頂多就只有 r 個元素。 但 r < p−1, 因此並非所有模 p 之下的非零元素都是 g 的一個次冪。 這與 g 是原根的假設矛盾。 剩下來唯 一的可能性是 r = 0。 所以 n = (p − 1)q, 也就是 p − 1 整除 n。 這證明了第一部份。

對第二部份, 假設 j ≥ k (否則將 j 與 k 對調)。 我們有

gj ≡ gk ⇐⇒ gj−k≡ 1 ⇐⇒ j − k ≡ 0 ⇐⇒ j ≡ k (mod p − 1)。

10. 模 n 之下的逆方陣

根據模 n 之下的除法原理, 我們知道求模 n 之下的逆方陣可用一般求逆方陣的方法來完 成。 所需要的基本事實如下:

基本事實: 在模 n 之下, 方陣 M 是可逆的 ⇐⇒ gcd(det(M), n) = 1。

在此我們僅處理小方陣 (2 或 3 階) , 此乃因為在我們所要介紹的密碼學當中這已綽綽有 餘。 在這種情況之下, 求模 n 之下的逆方陣最容易的方式就是使用有理數, 然後再轉換回模 n 之中的數。 眾所週知, 一個佈於整數的方陣其逆方陣可寫成另一佈於整數的方陣除以其行列式

(25)

值。 因為我們假設其行列式值與 n 互質, 所以可求出此行列式值的乘法反元素。 例如在 2 × 2 的情況中, 一般的公式為

a b c d

!−1

= 1 ad − bc

d −b

−c a

!

, 所以我們需要求出 ad − bc在模 n之下的乘法反元素。

例題23: 試求 1 2 3 4

!

(mod 11) 的逆方陣。

解: 因為 ad − bc = −2 在模 11 之下的乘法反元素為 5 , 所以我們可將 −12 用 5 來代 換得到

1 2 3 4

!−1

≡ −1 2

4 −2

−3 1

!

≡ 5 4 −2

−3 1

!

≡ 9 1 7 5

!

(mod 11)。

驗算如下, 得知無誤:

1 2 3 4

! 9 1 7 5

!

≡ 23 11 55 23

!

≡ 1 0 0 1

!

(mod 11)。

例題24: 試求 M =

1 1 1 1 2 3 1 4 9

 (mod 11) 的逆方陣。

解: 因為 det(M) = 2 在模 11 之下的乘法反元素為 6, 所以我們可將 12 用 6 來代換得 到

M−1≡1 2

6 −5 1

−6 8 −2 2 −3 1

≡ 6

6 −5 1

−6 8 −2 2 −3 1

≡

3 3 6 8 4 10 1 4 6

(mod 11)。

為何我們需要行列式值與 n 互質呢?

假設 MN ≡ I (mod n), 此處 I 為單位方陣。 則

det(M) det(N) ≡ det(MN) ≡ det(I) = 1 (mod n)。

因此 det(M) 在模 n 中有乘法反元素, 亦即 det(M) 與 n 必須互質。

例題25: 試求 M =

13 12 35 41 53 62 71 68 10

 (mod 999) 的逆方陣。

解: 若使用 Mod在 Inverse 上, 得不到真正的答案:

(26)

In[20]:=Mod[Inverse[{{13,12,35},{41,53,62}, {71,68,10}}],999]

Out[20]={{3686/34139, 34102601/34139, 1111/34139}, {34100869/34139, 2355/34139, 34104232/34139}, {975/34139, 32/34139, 34104664/34139}}

所以改用 PolynomialMod 在 Inverse 上, 則得到答案如下:

In[21]:= PolynomialMod[Inverse[{{13,12,35},{41,53,62}, {71,68,10}}] ,999]

Out[21]= {{772,472,965},{641,516,851},{150,133,149}}

參考文獻

1. Abell, Martha L./Braselton, James P.: Mathematica by Example, Second Edition, Academic Press, San Diego, 1997.

2. Alford, W. R./Granville, A./Pomerance, C.: There are Infinitely Many Carmichael Numbers, Ann. Math. 139, 703-722, 1994. 全文見網頁

http://www.dms.umontreal.ca/~andrew/agpapers.html

3. Agrawal, Manindra/Kayal, Neeraj/Saxena, Nitin: PRIMES is in P.見網頁 http://www.cse.iitk.ac.in/news/primality.html

4. Andrews, George E.: Number Theory, W. B. Saunders Co., Philadelphia, PA, 1971, Reissued, Dover, New York, 1995.

5. Apostol, Tom M.: Introduction to Analytic Number Theory, Undergraduate Texts of Mathe- matics, Springer-Verlag, New York, First Edition, 1976, Corr. Fifth Printing, 1998.

6. Bressoud, D. M.: Factorization and Primality Testing, Undergraduate Texts of Mathematics, Springer-Verlag, New York, 1989.

7. Buchmann, Johannes A.: Introduction to Cryptography, Springer-Verlag, Second Edition, 2004.

8. CAS網頁http://www.rbjones.com/rbjpub/cs/ai031.htm#introduction 9. Clock算術網頁http://en.wikipedia.org/wiki/Modular arithmetic

http://www.math.csusb.edu/faculty/susan/modular/modular.html

10. Cohen, Henri: A Course in Computational Algebraic Number Theory, Volume 138 of Graduate Texts in Mathematics, Springer-Verlag, New York, First Edition, 1993, Fourth Printing, 2000.

11. Gaylord, Richard J./Kamin, Samuel N./Wellin, Paul R.: Introduction to Programming with Mathematica, Springer-Verlag, New York, Second Edition, 1996.

12. Hardy, G.H.: A Mathematician’s Apology, Cambridge University Press, London, 1940. 摘要見 網頁 http://en.wikipedia.org/wiki/A_Mathematician% 27s_Apology

13. 洪維恩, 數學運算大師Mathematica 4,碁峰資訊,20015月。

14. 華羅庚, 數論導引, 北京科學出版社,1957年。

15. Ireland, Kenneth F./Rosen, Michael I.: A Classical Introduction to Modern Number Theory, Volume 84 of Graduate Texts in Mathematics, Springer-Verlag, New York, Second Edition, 1990, Corr. Fifth Printing, 1998.

16. 莫宗堅, 韓信點兵, 科學月刊第一卷第一期,19701月。 全文見網頁 http://episte.math.ntu.edu.tw/articles/sm/sm_01_01_2/

17. Rosen, Kenneth H.: Elementary Number Theory and Its Applications, Addison-Wesley, Fifth Edition, 2005.

(27)

18. Schroeder, M.R.: Number Theory in Science and Communication, Springer-Verlag, Third Edi- tion, 1997, Corr. Second Pprinting, 1999.

19. 沈淵源, 近代密碼學序曲,數學傳播第二十七卷第一期 (105), 923,68–74頁。 全文見網頁 http://www.math.sinica.edu.tw/math_media/vol.phtml?voln=271

20. Silverman, Joseph H.: A Friendly Introduction to Number Theory, Prentice Hall, Third Edition, 2006.

21. Sun-Tsu(孫子): 孫子算經, 收入 《宋刻算經六種》, 上海文物出版社,1980年。

22. Wolfram介紹網頁http://www.wolfram.com/products/mathematica/introduction.html 23. Wolfram, Stephen: The Mathematica Book, Fifth Edition, Version 5, Wolfram Media, 2003.

24. 余家銘, Mathematica 程式設計風格與應用, 文魁資訊,20027月。

—本文作者任教於私立東海大學數學系

參考文獻

相關文件

West, Introduction to Graph Theory, Second Edition, Prentice Hall, Upper Saddle River, NJ,

Christopher Clapham, A Concise Oxford Dictionary of Mathematics, Oxford University Press, Oxford/New York, 1990.. Nelson, The Penguin Dictionary of Mathematics, Penguin Books

2.17 Information provided to new board m embers should include the organisation’s aims and objectives, control environment, organisational risks and risk management

generalization of Weyl’s gauge invariance, to a possible new theory of interactions

introduction to continuum and matrix model formulation of non-critical string theory.. They typically describe strings in 1+0 or 1+1 dimensions with a

104 As shown in Figure 5, spin-restricted TAO- B3LYP and TAO-B3LYP-D3 (with a θ between 50 and 70 mhartree), TAO-PBE0 (with a θ between 60 and 80 mhartree), and TAO-BHHLYP (with a

Introduction Boson Operators in Schr/NRCFT Fermion Operators in Schr/NRCFT B-F theory formalism of RG critical points Conclusion Superfluids from Schr BH.

(A) South Korea sends the second largest number of students to America.. (B) India has the largest number of international students in