程式設計師數學之數學魔術人人皆會變

紫鳳發表於2013-08-14

enter image description here

文 / 鄭暉

作者簡介:鄭暉,男,年方不惑。1986年入武漢大學數學系學習,1993年畢業後到高校教書三年。1996年赴美攻讀數學博士學位,1998年開始選修計算機課程。2000年獲計算機碩士學位,隨後到華爾街一家IT公司就職。2004年底回國,先在廣州一所IT外企工作,後出任一家軟體公司的技術總監。從2008年4月起,在網上發表連載博文《冒號課堂》(原名《冒號和他的學生們》)。

具體數學:電腦科學基礎(第2版)》譯自經典名著 《Concrete Mathematics: A Foundation for Computer Science》。 簡單地稱讚這是一本好書,雖毫無風險性,卻也毫無資訊量。 那麼《具體數學》(以下簡稱《具》)具體好在何處呢? 簡言之兩個詞:一曰充分,二曰實在。

充分

一本書的內容是否充分,通常體現在深度、廣度、高度、細度和角度上。

深度。在不過分為難目標讀者的前提下,足夠的深度是專業書籍的核心價值所在,否則“專業”二字只是枉談。本書是基於Donald Knuth(第二作者)在美國史丹佛大學的講義編寫而成,內容上即便是這所全球頂級大學的學生也倍感不易。雖然不少人推薦該書為《The Art of Computer Programming》的預備圖書,但若仔細比較二者就會發現,前者甚至在一些專題上的深入度比後者猶有過之。好在書中雖不乏抽象的數學理論,但均適可而止,且最終皆為實際問題服務。在降低難度的同時,增加了實用性和親和力。

本書的主線是從遞迴問題到求和問題,再到二項式係數,接著從特殊的數列到一般的生成函式,內容環環相扣並逐步加深。書中屢見不鮮的情形是:某一問題看似已挖掘至極限,但隨著更深刻的理論或更強大的工具的推出,原問題又有了更妙的解法或更強的結論。

廣度。坦率地說,這本書的廣度不如其深度突出。作為電腦科學基礎的數學教材,它未涵蓋的內容還有不少,比如圖論、自動機理論、博弈論、資訊理論、可計算性理論,也沒有更基礎的集合論或數學邏輯等。另外,數論與離散概率雖有涉及,但篇幅較少。

當然,這與作者明確的目的有關。正如書中前言所說,“具體”數學是針對“抽象”數學而設的名稱。純粹數學工作者大都有個通病:醉心於理論的抽象而不屑實際的應用。本書試圖證明,兼顧具體性與抽象性、實用性與通用性的數學,同樣可以很高階、很優美。因此,它並不打算覆蓋全部的離散數學,而是提供一套系統的、有關離散運算的工具和方法。僅就其所重視的主線而言,本書的廣度也是可觀的。

高度。具體數學另有一個“雙關”的解釋:連續與離散數學的混合(Continuous與Discrete混合成Concrete)。雖說電腦科學主要建立於離散數學之上,而本書又特別強調具體性和實用性,但仍不可避免地涉及到更具抽象性和理論性的連續數學。原因無他,後者的層次更高。人們都有這個體會:一個難解的觀點或問題往往在“更上一層樓”之後,立刻一目瞭然。

細度。在分析和講解問題時,本書可謂細緻入微。許多細膩的數學小技巧是其他書中鮮有提及的,比如如何從特殊情形入手,逐步過渡到一般情形;如何猜測答案,又不通過猜測而獲取答案;如何調整級數的下標以利於計算;如何通過變換逐步降低求和的難度等。不時還夾雜一些忠告,比如“計算效率不等於理解效率”(Efficiency of Computation is Not the Same as Efficiency of Understanding,譯本中將Efficiency譯為“有效性”似有不妥,易被誤認為“效果”),這對那些為微小效率改進而犧牲程式碼可讀性的程式設計師同樣有警示作用。

最能體現本書之細的是數學符號的選取和解釋。例如用“k”而非常見的“i”做數列下標,避免與虛數“i”混淆;解釋用“< >”代表尤拉數(Eulerian Number),用上、下橫槓分別代表上、下階乘冪的合理性,不吝用4個自然段來說明“O”記號中的等號等。或許有人會對本書如此講究符號不以為然,那他一定低估了簡潔直觀、自然優美的符號對於數學的重大意義。數學家兼哲學家Whitehead在《數學導論》中曾說:“良好的數學符號能解除大腦多餘的工作,使之集中於更高階的問題,從而有效提高心智的力量。”

角度。從不同的角度看待同一問題,通常會有不同的解釋方式和解決方式。一本時常切換角度的書,對讀者融會概念、貫通方法大有裨益。例如本書對平方項求和問題先後共計採用8種方法。在數學書中,一題多解並不少見,少見的是多處一題多解。作者常常在介紹一種新技巧後,並不急於解決新問題,而是用它更加漂亮地解決前面早已解決的老問題,不經意地展現數學的和諧與自洽。宛如一個魔術師,不停地用熟練的、令人眼花繚亂的手法,變換不同的視角,採用不同的形式展現同樣令人稱絕的效果。

實在

本書最可貴之處在於,它不僅顯示數學的當前形態,而且反映其產生和發展的歷史過程,以便讓讀者感知鮮活真實的知識,掌握切實可行的方法。

起源。數學的最終表現通常是高度抽象化和形式化的,但其最初往往起源於具體的實際問題。本書經常通過一些有趣而實用的問題讓數學接“地氣”,既減少了數學的神祕感,也真實反映了數學的起源。

過程。在提出問題後,本書一般並不直截了當地給出解法,而是針對不同問題採用不同策略:或通過有針對性的變換逐步化繁為簡;或從特殊情形入手,通過猜測和歸納來證明一般性結論;或通過類比從已知結論中獲得啟示;或通過引進強大的工具解決問題;或通過反覆迭代逐步優化結論(如9.4節中介紹的BootStrapping技巧)。

積累。本書尤其強調數學知識庫的積累和演進。書中一再從簡單情形開始,逐步得出越來越強的結論,並儘可能泛化推廣,再應用於特殊情形獲得新的結果,由此建立起越來越完備的定理倉庫和公式列表(類似軟體工程中的迭代增量式開發)。

試錯。在實際的數學發現中,單有直覺和洞察力是不夠的,更多時候還得靠硬性的計算和反覆的試錯排除。可惜絕大多數的教材都是“潔本”——抹去所有的失敗痕跡,不見試錯的過程或探索的途徑,總是每擊必中。本書則不然,諸如Wrong、Fail、Embarrassing、Impass、Lose、Loss、Mistake、Deflating等負面詞彙比比皆是,毫不諱言失敗,不僅真實再現了數學的探索過程,也告訴讀者,不必恥於失敗,也不必因屢次碰壁而懷疑自己。很多時候,失敗只是成功路上的一個必要的彎路。

系統性。本書宗旨是培養讀者的實際數學運算能力,因此,雖不乏令人眼花繚亂的“技巧”,但更著力的是傳授系統成套的“技術”(這從書中高頻出現“系統”二字便可看出)。例如生成函式法、超幾何級數法、Gosper演算法、Zeilberger演算法等。這些方法不復雜難懂、不倚重人的洞察力或靈光一現,不靠聰明、運氣或猜測。它們是系統的和有指導性的,甚至是機械的、演算法的,乃至可用計算機代勞的。

不定性。本書還原真實數學的另一表現是,讓讀者充分意識到數學發現的開放性和不定性。傳統的數學教材中往往證明題居多,而實際的數學研究會面對更多的不確定性。比如證明或否證一個結論比單純的證明更困難,因為需要考慮兩種不同的可能;化簡表示式也比證明一個等式更費勁,因為方向和目標均不確定。更為棘手的問題是,找出使某一斷言成立的充要條件。

最可怕也最接近真實數學研究的問題則是,給定一個集合,找出其元素所具有的“有趣”的性質。按本書3.2節的標準,這屬於最高階(第5級)的數學問題,因為其最開放、不定性最大。

練習。本書中精彩絕妙的數學技巧層出不窮,令人歎為觀止。但它顯然不滿足於讓讀者成為數學魔術的欣賞者,更希望他們成為數學魔術的表演者。因此,除了充滿知識性和啟發性的正文外,本書習題之豐富、解答之詳盡也是罕見的。從相對簡單的熱身題和基礎題,到困難的作業題和考試題,乃至超難的附加題和研究題。如同逐漸升溫的熔爐,為讀者淬鍊越來越鋒利的數學兵器。

結語

綜上所述,對數學或計算機理論感興趣的讀者閱讀本書,如入寶山而不至空返。絕大多數程式設計師在工作中並不涉及高深的數學知識,本書未必會對其程式設計有直接的幫助。然而,只考慮工作需求而無自我追求的程式設計師絕不是好程式設計師。研讀此書不僅能增長數學知識,更能提高數學修養。要知道,程式設計師最大的價值,不在於他對某些程式語言和工具的熟練運用,而在於擁有一個冷靜而清晰、 嚴謹而靈活、抽象而深刻的頭腦。

說到本書的翻譯,雖非盡善盡美,但總體還是比較忠實原文,甚少有生硬之處。尤為難得的是,譯者連原書中最難譯的(有些還是德語、法語、拉丁語等非英語文字)非技術性的幽默雙關都給出了恰當的翻譯和解釋,其認真程度可見一斑。故此,儘管提倡技術人員多看原版書籍,但至少讀此譯本是無傷大雅的。

一直以來,人們只看到數學枯燥無味、艱深晦澀的一面。本書則揭示了數學生動有趣的另一面,同時也表明,數學不是少數天才們的專屬遊戲,只要經過適當的訓練,數學魔術人人皆會變。

(此文發表於《程式設計師雜誌》2013年7月刊)豆瓣有作者未刪減版:數學魔術

程式設計師應讀的四本數學書:

enter image description here

相關文章