《整數分解》讀書筆記

黃志斌發表於2014-05-08

m7a-p0

《整數分解》簡介

整數分解》從大家所熟知的整數的整除性的概念開始,由淺入深、深入淺出地介紹質數的很多有趣而又深刻的性質,質因數分解的困難性(難解性)以及質因數分解的若干現代方法,最後匯出如今在網路與資訊保安中最有名氣、應用最廣泛的RSA密碼體制及其有關的破譯方法。

《整數分解》是一本為大學生和研究生而寫的通俗讀物,但由於它的起點較低,因此也適合於用作中小學生的課外讀物(略過有關數學公式);同時又由於它的終點較高且理論曲折深刻,涉及很多幾十年、幾百年乃至數千年懸而未決的數學難題,因而對廣大數學、電腦科學和密碼學等專家也是一本不可多得的讀物。

《整數分解》力求一線串珍珠,將數學、電腦科學和密碼學中的許多有趣的典故像串珍珠一樣將它們有機地串在一塊,並以講故事的形式向讀者一一介紹,相信讀者能從中見其優美、聞其清香、得其真諦、並將其應用於實際。

第 8 章的一段原文

該書第 8 章“數域篩法、獨佔鰲頭”第 108 至 110 頁:

m7a-p108

m7a-p109a

m7a-p109b

m7a-p110

這段文字中的 NFS 是 Number Field Sieve(數域篩法)的首字母縮寫,而 GNFS 是 General Number Field Sieve(一般數域篩法)的首字母縮寫。

這段文字中的錯誤

這段文字中說:

  • RSA-130 有 130 個十進位制位、431 個二進位制位。
  • RSA-140 有 140 個十進位制位、465 個二進位制位。

實際上:

  • RSA-130 有 130 個十進位制位、430 個二進位制位。
  • RSA-140 有 140 個十進位制位、463 個二進位制位。

維基百科上有這些數的進一步資訊:RSA numbers

使用 Haskell 互動環境來計算

讓我們使用 Haskell 互動環境來計算一下 RSA-130 和 RSA-140 各有多少個二進位制位吧:

~$ ghci
GHCi, version 7.8.2: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> import Data.Digits

首先在 Haskell 互動環境中引入 Data.Digits 模組,以便計算。

Prelude Data.Digits> let rsa130 = 39685999459597454290161126162883786067576449112810064832555157243 * 45534498646735972188403686897274408864356301263205069600999044599
Prelude Data.Digits> rsa130
1807082088687404805951656164405905566278102516769401349170127021450056662540244048387341127590812303371781887966563182013214880557

置 rsa130 為兩個質數的乘積,檢視計算結果,果如我們所料。

Prelude Data.Digits> length $ digits 10 rsa130
Loading package array-0.5.0.0 ... linking ... done.
Loading package deepseq-1.3.0.2 ... linking ... done.
Loading package old-locale-1.0.0.6 ... linking ... done.
Loading package time-1.4.2 ... linking ... done.
Loading package random-1.0.1.1 ... linking ... done.
Loading package pretty-1.1.1.1 ... linking ... done.
Loading package containers-0.5.5.1 ... linking ... done.
Loading package template-haskell ... linking ... done.
Loading package primitive-0.5.2.1 ... linking ... done.
Loading package tf-random-0.5 ... linking ... done.
Loading package QuickCheck-2.7.3 ... linking ... done.
Loading package digits-0.2 ... linking ... done.
130

計算 rsa130 有幾個十進位制數字,果真有 130 個。

Prelude Data.Digits> length $ digits 2 rsa130
430

計算 rsa130 有幾個二進位制數字,答案是 430 個。

Prelude Data.Digits> let rsa140 = 3398717423028438554530123627613875835633986495969597423490929302771479 * 6264200187401285096151654948264442219302037178623509019111660653946049
Prelude Data.Digits> rsa140
21290246318258757547497882016271517497806703963277216278233383215381949984056495911366573853021918316783107387995317230889569230873441936471

置 rsa140 為兩個質數的乘積,檢視計算結果,果如我們所料。

Prelude Data.Digits> length $ digits 10 rsa140
140

計算 rsa140 有幾個十進位制數字,果真有 140 個。

Prelude Data.Digits> length $ digits 2 rsa140
463

計算 rsa140 有幾個二進位制數字,答案是 463 個。

Prelude Data.Digits> :quit
Leaving GHCi.
~$ 

計算完畢,退出 Haskell 互動環境。

關於 Data.Digits

有些機器上可能沒有 Data.Digits 模組。這可以通過以下命令安裝:

$ cabal install digits

如果沒有 cabal 的話,在 Arch Linux 作業系統中,可以通過以下命令安裝:

$ sudo pacman -S cabal-install

或者,可以使用以下 Haskell 程式來提供 digits 函式:

import Data.List
digitsRev b = unfoldr (\x -> if x == 0 then Nothing else let (q,r) = divMod x b in Just(r,q))
digits b n = reverse $ digitsRev b n

安裝 Haskell 互動環境的方法請參閱:Haskell趣學指南

相關文章