01 如何不去考慮數 How Not to Think About Numbers
我們已經習慣看見寫下來的數,也習慣於從中提取出某種意義。然而,一個數字(比如6)同它所代表的那個數並不是同一個東西。就像在羅馬數字中,我們會把六[1]這個數寫作VI,但是我們意識到這與用現代記號寫下的6代表了同一個數,都代表對應6根算籌(IIIIII)的那一類集合。讓我們先花一點點時間考慮一下表示和思考數的不同方法吧。
有時候,我們會在無意識的情況下解決一些關於數的問題。例如,假設你正要組織一次會議,想要保證每個人都拿到一份議程。你可以將每份議程逐個標上與會者的名字首字母。隻要完成這一工作之前議程一直沒用完,你就知道份數是足夠的。這樣你就解決了問題,而沒有用到算術或者直接數數。這裏數依然在發揮作用,它們使我們得以將一個集合同另一個集合進行精確比較,即便這兩個集合的組成元素有著截然不同的性質。就像上述例子裏,一個集合包含了人,而另一個集合則由紙張組成。數讓我們可以比較兩個集合的大小。
在上例中,你不需要費神去數有多少人將要出席,因為沒有必要知道——你的問題是判斷議程的份數是否不少於出席人數,而具體的數目無關緊要。但如果你是要為15個人買午飯,你就需要真正數一數人數了。當然,要計算這頓飯總共的開銷時,就一定得有人使用算術,哪怕是用計算器求和來得出精確的數值。
現代數字係統讓我們能以一種有效且統一的方式來表示數,這方便我們將一個數和其他數做比較,以及在計數問題中進行所需要的算術操作。日常生活中,我們在所有的算術中使用十進製,換句話說,我們十個十個地數數。這麽做的原因是偶然的:我們恰好有十根手指。需要明確的是,讓數的係統如此有效的原因並非我們對底數(base)的選擇,而是我們在數的表示中使用了位值進位法(positional value),即一個數字的值取決於它在數字串中出現的位置。比如,1984是4份1加上8份10,再加上9份100,再加上1份1000的縮寫。
當我們把數寫成特定形式的時候,我們想表達什麽?理解這一點很重要。在這一章,我們將要考慮數代表了什麽,發現不同的計數方法,認識一類非常重要的數(素數),並且介紹一些找到它們的簡單技巧。
人們是如何學會數數的
這裏值得我們花上片刻來弄明白構造一個計數係統所需的兩個重要階段。讓我們以十進製為例:我們會給孩子們規定兩項基本任務,背誦字母表和學習數數。這兩個過程表麵上看是相似的,卻有著本質的不同。英語基於26個字母,簡而言之,每個字母對應一個發音,供我們念單詞用。總的來說,英語發展的結果是這門語言可以用26個符號來書寫。如果不給字母表一個順序,我們就沒法編纂字典。然而,字母表並沒有天生的排序。我們所采用並且都曾在學校吟誦過的a, b, c, d…看起來實在很隨意。誠然,更常用的字母一般出現在字母表的前半部分,但這也隻是粗略的準則,而非鐵律。比如,常用字母s和t就很晚才被點名。相比之下,用以計數的數(counting number),或者叫自然數[2](natural number):1, 2, 3…一旦出現便已經排好了序。例如,符號3用來表示跟在符號2後麵的那個數,因此必須列在2的下一位。在一定程度上,我們可以給每個數賦予一個新的符號。但為了處理永無止境的數,我們遲早得放棄不斷引入新名字,而隻能開始把它們按批次分組。按十個來分組代表了發展出一個堅實的數字係統的第一階段,這個方法在古今中外幾乎都是一樣的。
但是各個文明在細節上卻有很多不同。羅馬係統除了按十分組外,同樣也喜愛用五分組。他們使用特殊符號V和L,來分別代表五和五十。古希臘係統則直接使用了十進製。他們用某些字母來代表數,有時候加上上劃線來告訴讀者這個符號應被解讀為一個數,而不是平常的詞語中的一個字母。比如,π代表80,而γ代表3,於是他們可以寫下πγ來代表83。與我們的現代數學符號相比,它看起來好像同樣高效,也確實跟我們的相差不多,但它們是不一樣的。希臘人仍然沒能運用進位係統,因為他們每個符號的值都是固定不變的。具體說來,γπ還是隻能表示同樣的數——3+80。而如果我們將83裏麵數字的順序顛倒,會得到一個不同的數——38。
在印度-阿拉伯係統(Hindu-Arabic system)中數的第二個階段得以實現。其主要思想是讓一個符號的值依賴於它在字符串中出現的位置。這使我們可以隻使用一套固定的符號來表示任何數。我們最終選擇了由0, 1, 2,…, 9這十個數字組成的數字係統,這套常用的數字係統被稱為十進製(base ten)。當然,我們完全可以用一個更大或者更小的基本符號集來建立我們的數字係統。我們甚至可以使用兩個數字去建立數字係統,比如0和1。這被稱為二進製(binary system),在電腦運算中經常被用到。需要明確的是,具有革命性的不是對底數的選擇,而是這樣一種思想:使用位置來傳達額外的信息,從而確定數的值。
例如,當我們寫下一個數,比如1905,每個數字的值取決於其在數字串中的位置。這裏有5份1,9份100(即10×10),以及1份1000(即10×10×10)。符號零被用作一個占位符,這很重要。在1905這個例子中,十位並沒有貢獻,但我們不能忽略它而隻寫作195,因為那代表了一個完全不同的數。事實上,每個數字串都代表了一個不同的數,正因為如此,海量的數才可能用很短的字符串表示出來。比如,用不超過10位的字符串便可以給地球上每個人分配一個獨特的號碼,這樣,這個巨大集合中的每一個體都有了個人代號。
不同的古代社會在書寫數時使用了不同的底數,但這遠不能彌補一個事實,即幾乎所有文明都缺少一套真正的進位製係統,更談不上使用零來作為占位符。在古代世界的所有民族中,巴比倫文明的數字係統是最為接近位值進位法的係統,考慮到他們的古老程度,這實在讓人讚歎。然而,他們沒有徹底擁抱那個不那麽自然的數——零。比如,我們用零來區分830和83,而古巴比倫人刻意回避了在數字串末尾使用這樣一個表示空的符號。
意識到零確實是數,這需要跨越一個概念上的障礙。零確實並非一個正數,但它依然是一個數,如果不將它以一種完全自洽的方式吸納進來,我們的數字係統就是殘缺不全的。約公元6世紀,印度邁出了這關鍵的最後一步。現代的數字係統被稱為印度-阿拉伯係統,正因為它是從印度經由阿拉伯傳到了歐洲。
有或沒有小數的生活
為一個數字係統選底數有點像為一張地圖選比例尺,這並非基於對象內在的性質,而是類似於賦予它一個坐標係,作為控製用的工具。我們對底數的選擇本質上是任意的,麵對自然數集1,2, 3, 4,…的時候,排他性地使用底數十讓我們戴上了有色眼鏡。隻有掀起這層麵紗,我們才能麵對麵地看清數到底是什麽。當我們說起一個數,例如四十九,所有人的腦海中都浮現出兩個字符4和9。某種程度上,這對我們談論的那個數來說不太公平,因為我們毫不猶豫地將49轉換成了(4×10)+9。我們也可以同樣輕鬆地用另一種方式來詮釋這個數:49=(4×12)+1。實際上,在十二進製中,四十九正是被寫作41,這裏數字4代表4份十二。當然,49這個數最顯著的特征是它是7×7的積。這一特點在七進製中十分明顯,此時四十九這個數會被表示為100,這裏的1代表一份7×7。
我們一樣有權利為我們的數字係統選擇另一個底數,例如12。瑪雅人使用了12,而巴比倫人用了60。某種程度上,60是一個計數基底的好選擇,因為60有很多因數,它是可以被1到6之間所有數整除的最小的數。不過,選擇一個60這樣相對大的數作為底數也有缺點,就是需要引入60個不同的符號來表示從零到五十九的所有數。
如果一個數是另一個數的整數倍,則稱第二個數是第一個的因數[4](factor)。比如,6是42=6×7的一個因數;但8不是28的一個因數,這是因為28含有三個8還餘4。數字係統的底數擁有眾多因數會是一個很方便的性質。這就是為什麽相對於我們的數字係統來說,底數選擇十二也許比十更好,因為12的因數是1, 2, 3, 4, 6和12,而10隻能被1, 2, 5和10整除。
數字係統的有效性,加上我們對它高度熟悉,給了我們一種虛假的信心,同時也帶來了一定的局限。我們會更願意使用單個的數,而非一個算術表達式。例如,大多數人情願談論5969,而不是47×127,即使這兩種表示方式代表了同一個東西。僅在“求出最終答案”5969之後,我們才覺得我們“有”了這個數,從而可以正視它。然而,這裏麵卻包含著一絲虛妄的成分,因為我們隻是將這個數寫成了多個十的幾次冪的和。若是將這個數分解為一係列因數的乘積,從這個等價形式中,我們反而可以更好地推斷它一般意義上的構造和其他的性質。確切地說,5969這個標準形式能讓我們將它和其他以同樣方法表示的數直接比較大小,但並不能展現出這個數的全部特性。分解為因數的形式可能有用得多。在第4章中,你會發現其中的一個原因,即一個數的十進製表示可能掩蓋了關鍵的因數。
古人比我們多擁有的一項優勢是,他們並未被十進製的思路所束縛。談到數的規律時,他們會自然地想到一個數可能擁有或缺乏某些特殊的幾何性質。比如,10和15這樣的數是三角的(triangular)。這可以通過圖像展現在我們麵前,正如十瓶製保齡球中排成三角形的球瓶,以及斯諾克台球中15個紅球擺成的三角。但如果隻用十進製展示這些數,這樣的畫麵就不會出現在我們眼前。我們要放下十進製的思維定勢,告訴自己可以從很多不同角度來思考數,才能重新獲得古代人天然就擁有的自由。
這樣,把我們自己解放出來之後,我們可能會選擇重點關注一個數的因數分解(factorization)——把數寫成一些更小的數的積。因數分解揭示了一個數內部構造的相關信息。通常,我們僅將數看作科學和商業的仆人,如果能把這個習慣暫時丟在一邊,花一點點時間專門研究數本身,而不與任何其他事物做關聯,我們就能發現很多原來隱藏著的信息。單個數的性質可能會在自然界中以有序的模式展現出來,這比單純的三角形或方形來得更微妙,比如,向日葵螺旋形的頭狀花序代表的斐波那契數。我們將在第5章中介紹這種類型的數。
素數數列概覽
數的榮耀中有一項是如此顯而易見,以至於很容易被忽視——它們每一個都是獨一無二的。每個數有自己的結構——如果你喜歡的話,可以稱之為個性。單個數的個性非常重要,這是因為當一個特定的數出現時,它的特征會反映在它所描述的集合的結構中。當我們執行加法和乘法這些基本的數的運算時,數之間的關係也會顯現出來。顯然,任何比1大的自然數都可以表示成更小的數的和。但是,當我們開始將數相乘,我們很快注意到有些數從來都不會在我們得到的乘積裏出現。這些數就是素數[5](prime number)。它們代表了乘法的構成要素。
一個素數是一個像7,23或103這樣的數。它有且僅有兩個因數——1和它本身。我們並不把1看作一個素數,因為它隻有1個因數。那麽第一個素數便是2,這也是僅有的偶素數,接下來的3個素數3,5和7都是奇數。大於1而又不是素數的數稱為合數(composite),因為它們由一些更小的數複合而成。數4=2×2=2[6]是第一個合數;9是第一個奇合數,9=32也是一個平方數(square);6=2×3是我們第一個真正意義上複合的數,因為它由兩個不同的大於1的因數複合而成。而8=23是第一個立方數(cube),立方數是指等於某個數的3次冪的數2。
緊接著個位數的是我們選擇的底數10=2×5,它本身就是特殊的,而且還是三角的,因為10=1+2+3+4(回想一下十瓶製保齡球)。接下來我們有一對孿生素數(twin primes)11和13,它們是由12隔開的兩個相鄰的奇數,且同為素數。考慮到數值的大小,12顯得有很多因數。的確,12是第一個所謂的盈數[7](abundant number),因為它的真因數(proper factors)——嚴格小於它自身的因數——之和超過了這個數本身:1+2+3+4+6=16。數14=2×7可能看起來並沒有什麽特別的,但這實在是一條悖論,作為第一個不特別的數本身就是一件特別的事。到了15=3×5,我們又遇到了一個三角數,並且它是第一個等於兩個真因數之積的奇數。數16=24不僅是一個平方數,還是第一個四次冪數(在1以後),這使得它十分特別。17和19是另一對孿生素數。對於18和20,以及更多數的獨有性質,我就留給讀者朋友自己去觀察了。對每一個數,你都可以說它是特別的。
回到素數,它們中的前20個是:
2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71。
顯然,在數列的開始部分,素數是十分常見的,因為小的數沒有多大可能會有因數分解。在這之後,素數越來越稀少。比如,隻有一組連續3個奇素數:3,5,7。這三者的組合是獨一無二的,因為每3個奇數就會出現1個3的倍數,所以這種情況再也不會發生。此外,素數出現頻率減少的過程是十分鬆散的,還驚人地不規律。比如,30~40之間隻有兩個素數,即31和37,但剛過100就會有兩個“相繼的”孿生素數對,即101,103和107,109。
素數在數千年來一直深深吸引著人們[8],因為它們無窮無盡(我們在下一章會證明這個說法),在自然數中現身的方式又神出鬼沒。它們性質中神秘莫測的這一麵在現代密碼學(cryptography)中被加以運用,來保護互聯網上的機密信息。這將是第4章的話題。
素性檢驗:素數整除性測試
為了找出不大於某個數(比如100)的所有素數,最容易想到的方法是把所有數寫下來,再尋找並劃掉裏麵的合數。基於這一思想的標準方法叫作埃拉托斯特尼篩法[9](Sieve of Eratosthenes)。方法如下:首先圈出2並劃掉列表裏2的倍數(即其他偶數)。然後回到開始,圈出第一個尚未被劃掉的數(即3),劃掉剩下數表裏它的所有倍數。重複這一過程足夠多遍,剩下沒有被劃掉的就是素數。即便它們中一些被圈出來了,而另一些沒有。例如,圖1展示了對不大於60的數運用篩法的過程。
你怎麽知道什麽時候該停止篩選呢?重複這一過程,直至圈到一個數,大於整張表中最大數的平方根。比如,當你在不大於120的數中篩選素數時,需要篩掉2, 3, 5和7的倍數,接著當你圈出11,就可以停下了。因為112=121。此時,你已經圈到了第一個大於你的最大數(這裏是120)的平方根的數,剩下的素數雖未被觸及,但所有的合數都已經被劃掉,它們都是2, 3, 5或7的倍數。
檢測能否被2或5整除很容易,因為這兩個素數是我們的底數10的素因數。看出這一點,你隻需查看待檢數n的最後一位:當且僅當個位為偶(即0,2,4,6或8)時n可以被2整除,當且僅當n最後一位為0或5時它含有因數5。不管數n有多少位,判斷n是否為2或5的倍數,我們都隻需檢查最後一位。對於不能整除10的素因數,我們需要多做一點工作,盡管如此,仍然有一些整除性測試方法,比計算完整的除法更快捷。
一個數能被3整除,當且僅當其各位數字之和能被3整除。例如,數n= 145 373 270 099 876 790的各位數字之和是87,而87=3×29,因此n可被3整除。當然,我們還可以將這個測試應用於數87,然後繼續在每一階段都求出各位數字之和,直到結果顯而易見。對於給出的例子這樣做,可以得到以下數列:
145 373 270 099 876 790→87→15→6=2×3.
你會發現,這裏列出的所有整除性測試方法都如此快捷,你可以相對輕鬆地處理有幾十位的數,甚至比手持式計算器能處理的最大的數還要大上數十億倍。
下麵要給出不大於20的剩下所有素數的整除性測試方法,因為它們都屬於同一個類型。雖然它們成立的原因不那麽明顯,但是這些方法應用起來都很簡單。即便這裏沒有收錄論證,想證明它們的正確性並不是特別困難。
因此n可以被7整除。每執行一次指令循環,我們都至少能減少一位數,因此執行循環的次數大約與初始數的長度相同。
為了檢測n是否有因數11,將原數的最後一位移除,再從新數中減去原數的最後一位,依此重複。比如,我們的方法揭示了下麵這個數是11的倍數:
檢測能否被13整除,將原數最後一位移除,再用新數加上原數最後一位的4倍,接著類似於7和11的方法,不斷重複。比如,13是下麵這個數的一個素因數:
接下來是17和19。對於17我們將原數最後一位移除,再用新數減去原數最後一位的5倍,重複操作直到可判斷整除性;對於19我們將原數最後一位移除,再用新數加上原數最後一位的兩倍,重複操作直到可判斷整除性。例如,我們來檢測18 905是否能被17整除:
因而它不是17的倍數。但對於19,整除性測試給出了另一種結論:
擁有了這一組測試,你現在就可以檢查不大於500的所有數的素性,因為232=529超過了500,因此19是你需要考慮的最大的素因數。例如,為了確定247的性質,我們隻需要檢查它是否能被不大於13的素因數整除,因為下一個素數的平方,172=289,超過了247。運用對13的測試,我們發現247→(24+28)=52→13,這是一個13的倍數(247 = 19×13)。
素數相乘可以得到無平方因數(square-free)的數,要想構造關於這些數的整除性測試,可以疊加並行其素數因子的整除性測試。比如,對於42=2×3×7,一個數n能被42整除,當且僅當n可以通過2,3和7的三項整除性測試。但是,對於那些有平方數因數的數,像9=32,則不能由此得到。順便說一句,9是n的因數當且僅當9也是n的各位數字之和的因數。
你也許會問:數千年以來,那些聰明的數學家們難道還沒有想出更好、更精妙的檢測素性的方法?答案是有的。2002年,我們發現了一個相對快速的判斷一個給定的數是否為素數的方法。不過,如果給定的數恰好是一個合數,那麽這個所謂的“AKS素性測試”並不能給出該數的因數分解。雖然原則上說,找到一個給定數的素因數的問題可以通過試錯來解決,但實際操作中,這對於很大的整數依然難以實現。正因為此,它構成了很多互聯網加密方法的基礎。我們會在第4章回到這個話題。在那之前,我們會在接下來的兩章中更近距離地認識一下素數和因數分解。
[1] 這裏的中文數字“六”強調的是“六”這個數本身的概念。
[2] 我國的自然數包含零,而本書的自然數不包含零。
[3] 1碼等於3英尺等於36英寸。
[4] 或稱因子、約數,英文也可以寫作divisor。
[5] 英文也可以寫作prime。
[6] 這裏指的立方數從2的立方開始,因為1=13。
[7] 又稱豐數或過剩數。
[8] 最近的例子是孿生素數猜想,傳奇美籍華裔數學家張益唐在2013年取得重大進展,引起轟動。
[9] 又稱埃氏篩或素數篩,簡稱篩法。埃拉托斯特尼(公元前276—公元前194),古希臘數學家、地理學家。
[10] 當解釋有關任意數的性質的時候,數學家們會用符號為討論的對象賦予名稱。對於數,這些名字通常都是小寫字母,如m和n;兩個數的積m×n經常簡寫為mn。