《科學月刊》2025 年 2 月號刊登了筆者的〈對數本事〉(請看它的網頁)。 礙於《科學月刊》篇幅限制,以及科普內容的設定,我無法展開布里格 (Briggs) 製作常用對數的方法,只用以下幾句話帶過:布里格教授發明了另一種算法,那是非常接近現代數值分析思想的算法, 也可以說是「微分」思想的前兆;雖然還是很苦,但至少比納皮爾的算法輕鬆一點。 布里格把之前算出的 \(\log2\) 和 \(\log7\) 當作正確答案, 用來確認自己的新算法有效。布里格的算法已經公開在他自己的書裡 [1], 雖然書裡寫著拉丁文,但閱讀數字還算清楚,例如下文 \(x_0\)、\(p_0\) 和 \(L_0\) 的數值取自那本書第 11 頁。 一位熱心的澳洲人 Ian Bruce 提供布里格這本書籍的英文翻譯 [2], 事實上 Bruce 公佈了很多 17、18 世紀拉丁文數學典籍的英文翻譯。 在臺灣,至少也有蘇俊鴻 [3] 和蘇惠玉 [4] 兩位老師的科普與解釋。 老實說筆者是先讀 [4] 獲得基本概念,然後才去翻閱原著 [1 and 2]。既然該知道的都已經有人寫過了,為什麼我還想要作此文? 讀者能從此文獲得什麼新的知識或理解?
本文意圖詮釋:比對布里格算法和納皮爾算法(看《科月》文章), 可以感覺到「兩代人」的差異:納皮爾是老一代,他的方法仍是「算術」思維, 布里格則是新一代,如今知道當時微積分的想法已經開始蔓延, 他的方法萌現了「分析」思維。
布里格等人發現的性質是: \[\text{當}\; a\gt1\; \text{則}\;a\gt a^{1/2}\gt a^{1/4}\gt a^{1/8}\gt\cdots\gt 1\; \text{且}\;\lim_{n\to\infty}a^{\frac1{2^n}}=1\] 我們稱(當 \(a\gt1\))數列 \(\langle a^{1/2^n}\rangle\) 嚴格遞減收斂到 \(1\)。 而這個性質,如今只是以下定理的特例: \[\text{若}\;a\gt0\;\text{則}\;\lim_{p\to0}a^p=1\]
如今我們知道前述現象的原因是 \[a^p=1+\ln a\cdot p +\frac{(\ln a)^2}2p^2+\cdots\] 以 \(a=10\) 為例, \[10^p\approx 1+2.3p+\text{Err}\] 其中誤差 \(\text{Err}\) 不超過 \(6p^2\),所以當 \(p\lt10^{-3}\), 誤差不影響小數點下前五位。若捨去誤差不計,則 \(10^p\approx1+2.3p\) 可見 \(\delta\approx2.3p\) 成正比,或者反之 \(p\approx0.4348\,\delta\)。
|
但布里格製作對數表的工作,非常在乎「近似」的程度。 因為布里格和納皮爾預定提供 14 位正確有效數字的對數表, 所以他在製造常用對數的計算過程中,通常保持至少 15 位準確的有效數字。 為了溝通的效率,本文引進符號 \(\def\xeq#1{\;\overset{\raise1ex\hbox{$\scriptscriptstyle#1$}}{\smash{=}}\;}\) \(\xeq{n}\) 表達「在至少 \(n\) 個最高位有效數字範圍內相等」,例如 \(\pi\xeq{3}3.14\)、\(\pi\xeq{4}3.1416\); 高中數學經常寫 \(\log2=0.3010\),其實它是 \(\log2\xeq{4}0.3010\) 的意思。
經過勤奮的計算,布里格發現:當 \(p\lt0.5\times10^{-15}\),就會 \[10^p=1+\delta\;\text{且}\;0\lt\delta\lt10^{-15}\] 而且 \(p\) 和 \(\delta\) 在至少十五位有效數字的範圍內成正比,意思是:若 \(p\)、\(p_0\lt0.5\times10^{-15}\) 而且 \(10^p=1+\delta\)、\(10^{p_0}=1+\delta_0\),則 \[p:p_0\xeq{15}\delta:\delta_0\]
布里格的比例常數相當於發現了以下極限的存在: \[L=\lim_{x\to0}{\log(1+x)\over x}\] 如今我們知道:若 \(|x|\lt1\),則 \[\log(1+x)=\frac1{\ln10}\bigl(x-\frac{x^2}2+\frac{x^3}3-\cdots\bigr)\] 可見,當 \(\delta<10^{-15}\) 而且 \(\delta_0\) 本身的正確數字夠多, 確實可以 \(\log(1+\delta)\xeq{15}L\,\delta\) 其中比例常數 \(\displaystyle L=\frac1{\ln10}=\log e\)。 當然,布里格當年就連 \(\log\) 都還沒有,哪裡來的 \(\ln\)?
布里格在實務上追求 14 位正確的對數,因此他以 \(p=2^{-n}\) 的形式, 取 \(10^p=1+\delta\) 而在 \(10^{-16}\lt\delta\lt10^{-15}\) 範圍內找到發生最小 \(\delta\) 的 \(p\)。 布里格對 \(10\) 連續開方 54 次,得到他需要的很靠近 \(1\) 的數 \(1+\delta\): \[\sqrt[2^{54}]{10}=1.00000\,00000\,00000\,12781\,91493\,20032\,34416\,5\cdots\] 於是取特定的 \(\delta_0=1.2781\cdots\times10^{-16}\),這時候的 \(p\) 是特定的 \[\log(1+\delta_0)=\frac1{2^{54}} =0.05551\,11512\,31257\,82702\,11815\cdots\times10^{-15}\] 我們將此特定的 \(p\) 記作 \(p_0\)。因此他獲得了 \[L=\lim_{x\to0}{\log(1+x)\over x}\xeq{15}\frac{p_0}{x_0} \xeq{15}0.43429\,44819\,03251\,804\] 我們將準到 15 位小數的 \(L\) 記作 \(L_0\); 比對現在所知的 \(\displaystyle\log e\) 數值: \[L=\frac1{\ln10}=0.43429\,44819\,03251\,82765\cdots\] 我們看到其實布里格的 \(L_0\) 算對了 16 位有效數字。
布里格已經用納皮爾算法(第一種算法)獲得 14 位小數的 \(\log2\) 和 \(\log7\),他用這兩個對數確認新算法的有效性。 但是布里格並沒有在書裡示範新算法製造 \(\log7\) 的細節, 他反而示範了 \(\log6\)。
布里格為了製作 \(\log6\) 所採用的技巧是取 \(a=6^9\div1000\,0000=1.0077696\), 對 \(a\) 連續開方 46 次就足夠靠近 \(1\): \[\sqrt[46]{1.0077696}=1+\delta\] 其中 \[\delta=1.09985\,93458\,81557\,1866\cdots\times10^{-16}\] 此時的 \(2^{46}L_0\,\delta\) 是 \(0.00336\,12534\,52792\,69\cdots\), 加上 \(7\) 再除以 \(9\) 即為 \(\log6\); 將它減去 \(\log2\) 則為 \(\log3\)。
我想,在已知 \(\log2\) 的前提下, 何不使用 \(a=3^4\div80=1.025\) 來計算 \(\log3\) 呢? 此處 \(1.025\) 跟前面算過的 \(1.024\) 非常接近, 應該會提供一點便利。
如我寫在《科學月刊》文章裡的:
〔新算法〕雖然還是很苦,但至少比納皮爾的算法輕鬆一點。本文完整說明了布里格的「新算法」,讀者也該明白它「還是很苦」。 布里格當時因為不甚掌握「誤差」的擴散性質, 因此不甚確定他所需的「最小有效位數」; 為了保險起見,他經常做到十七、八位甚至二十位的有效位數。 因為這樣,他多吃了一些不必要的苦。 可是,我們想想,他一個人吃的苦 — 還有後續幾個人的再接再厲 — 造出一本對數表,在歐洲和美國足足用了 300 年,甚至傳播到中國和世界各地。 想像有多少人在這 300 年中使用這冊數表, 因此而提升了多少工程的效率?賦能了多少科學的探究?節省了多少人的歲月? 如此想像,我們就該可以體會:布里格做了一件多麼偉大的事! 而數學創作,可以為文明做出多麼偉大的貢獻!