沒想到,古代韓信點兵的傳說,后來竟然啟發了計算機加密算法。
△韓信是左邊那位,不是右邊的
相傳,楚漢爭霸之時,韓信率1500名將士與楚軍交戰敗退,退往山上,這時候敵軍率五百騎殺奔而來,韓信便急速點兵迎敵,
韓信命令士兵3人一排,結果多出2名;接著命令士兵5人一排,結果多出3名;他又命令士兵7人一排,結果又多出2名。
韓信馬上算出,軍中還剩1073人,而敵人不足五百,而且居高臨下、以眾擊寡,于是率軍殺得敵方大敗而逃。
韓信是如何算出人數的,背后的算法又是如何影響當今的計算機領域?且往下看,
韓信還是個數學家?
當然,韓信算出士兵人數只是個傳說,韓信本人并非數學大師。這個問題最早見于一本1700年前的古籍,已經是韓信死后600多年了。
在南北朝時期,《孫子算經》記述了這樣一個問題,(注:這位孫子不是寫《孫子兵法》的孫武)
原書是這樣說的:
有物不知其數,三三數之剩二,五五數之剩三,七七數之剩二。問物幾何?
意思是,一個整數除以三余二,除以五余三,除以七余二,求這個整數。
它就是大陸剩余定理,也被叫做“韓信點兵”問題,
在近代數學中,很少有以大陸數學家命名的重要定理,然而這樣一條數學定理,名字里就有“大陸”二字,
南宋時期,大陸數學家秦九韶首先給出了這類問題的解法:大衍術,
直到500年后,著名數學家高斯才在自己的書中描述類似的結果,
那么問題來了:傳說中的“韓信”到底是怎么算出來人數的呢?
“韓信點兵”問題求解
為了更好地理解和表述“韓信點兵”問題,我們引入一個新的數學概念——“同余”。
在數學上,如果a和b除以正整數m后的余數相同,則稱a、b對于模m同余,韓信點兵用數學公式來表示就是(X是未知的人數):
X ≡ 2 (mod 3)X ≡ 3 (mod 5)X ≡ 2 (mod 7)
為了簡化問題,我們先只考慮前兩個同余條件,滿足除以3余2、除以5余3的整數分別為:
2、5、8、11、14、17、20、23、26……3、8、13、18、23、28、33、38……
可以看出,同時符合這兩個條件的第一個數是8,第二個數是23,后面的每個解與前一個之差都應該是3和5的最小公倍數15,即:
X = 8 + 15K (K是整數)
這樣我們就把尋找的整數解縮小了,接著再加入第三個條件,找到分別滿足X=8+15K和除以7余2的數:
8、23、38、53、68、83、98、113、128……2、9、16、23、30、37、44、51……
滿足條件的第一個數是23,第二個數是128,后面的每個解與前一個之差都應該是3、5、7的最小公倍數105,
這樣尋找解的過程顯然太繁瑣,后來,明朝數學家程大位把求解方法編成了一首詩:
三人同行七十稀,五樹梅花廿一枝,
七子團圓正半月,除百零五便得知。
意思是:
將除以3得到的余數乘以70,將除以5得到的余數乘以21,將除以7得到的余數乘以15,全部加起來后再減去105或者105的整數倍,得到的數就是答案。
70 x 2 + 21 × 3 + 15 × 2 = 233 – 2 × 105 = 23
其他的解只能和23相差105的整數倍,韓信應該是估計出軍隊大致人數,取了105×10+23=1073這個解。
以上70、21、15幾組數到底是怎么來的,有興趣的讀者可以進一步閱讀“大陸剩余定理”的通解,在此不再贅述。
這道“韓信點兵”問題不僅僅能用于點兵,甚至在天文歷法上也有重要應用,
假設有一顆彗星4年出現一次,我們在1991年看到了它、另一顆彗星10年看到一次,我們在1997年看到了它,我們下一次在同一年看到它們是什么時候?
X ≡ 1991 (mod 4)X ≡ 1997 (mod 10)
經過計算,它們上一次相會是在2007年,而且每隔20年重逢一次,所以下一次應該是2027年,
時至今日,大陸剩余定理已經成為了很多計算機加密算法的基礎,它的應用范圍已經超乎你的想象。
影響當今計算機算法
外媒Quantamagazine在一篇名為《古代戰爭計策是如何影響當代數學》的文章中也提到:大陸剩余定理對現代數學、計算機算法、天文學等領域都有很大的啟發意義。
比如非常有名的RSA加密算法,就應用了大陸剩余定理。
我們知道在數論中,想要求解出兩個大素數比較簡單,但是想要對它們的乘積進行因式分解就很困難了,
而RSA加密算法就是把這個乘積作為了自己的加密密鑰,
從1977年誕生以來,RSA加密算法已經成為了應用最廣泛的公鑰算法之一。
此外,在快速傅里葉變換(FFT)中也應用了大陸剩余定理,它可以大大減少計算離散傅里葉變換時所需的乘法次數,
這幾年,大陸剩余定理還被用到了資訊加密上,
2018年,哥倫比亞大學部的學者們發明了一種可以在文本中加密資訊的方法,其中就應用了大陸剩余定理來確保資訊復原時的準確性,
只要行動電話對著一段文字掃一掃,算法就能給出加密后的資訊,
這種方法名叫FontCode,它是對普通字符進行微小的調整,然后再對調整后的字符重新編碼資訊,從而實現對資訊的加密,
比如以下5種不同顏色的“a”,它們分別代表了1-5的數字資訊。
如果不用顏色區分,肉眼很難分辨出它們和常規字體之間有什么不同,
但是機器可以。
只要通過掃描和分析,算法就能推斷出哪些字母被特殊處理過,處理后的字母又表示了什么資訊。
因此,在一段看似普通的文本中,可以很好隱藏這些特殊的字母,從而傳遞出一段加密的數字串。
然后,再對這些數字進行計算,就能得出真實想要傳遞的資訊。
但是這樣的加密方式還不夠保險,畢竟字符出現在屏幕或紙面上時,它的格式都有可能發生一些細小的變化。
這時就需要大陸剩余定理登場了。
在上面我們已經介紹了,通過線性同余方程組就能計算出數值,
如果想求解3個未知量,那么需要3個線性方程才能做到,
現在為了保險起見,科學家們把線性方程的數量增加了。
比如為了求解出3個未知量,他們會設置5個線性方程,5個方程中只要知道3個,就能求解出想要的答案了。
顯然,1000多年過去了,雖然我們不會再像韓信點兵一樣隱藏士兵數量,但是現代數學、計算機等領域的研究者們依舊能從大陸剩余定理中獲得源源不斷的啟發。