上一篇講到最早的計算機是什麼樣的,有人可能會不服氣,我們們中國的算盤才應該是計算機的祖宗才是啊。算盤應該算得上是一種計算工具,可以類比到現代計算機的儲存,真正做運算的實際上還是人腦。最早的計算機實際上只能做一些簡單的加減乘除運算,只能叫計算器,跟現在的計算機(俗稱電腦)還差的很遠。但是,今天說到的差分機比前面講到的就更接近現代計算機了。
差分機的誕生
從17世紀到20世紀,計算器從手搖演變成了電動。但是整整三百年期間,計算器仍只能做最簡單的四則運算,需要人力不斷的記錄計算結果,然後做下一步的運算。這種繁瑣的人工操作能不能也交給機器來完成呢?第一個用實際行動驗證這一想法的,是來自英國的曠世奇才——查爾斯·巴貝奇(Charles Babbage)。
差分機的設想,最早由一位名為約翰·赫爾弗裡奇·馮·米勒(Johann Helfrich von Müller)的德國工程師在1784年提出,但他沒有得到資金支援。
18世紀末,法蘭西發起了一項巨集大的計算工程——人工編制《數學用表》,這在沒有先進計算工具的當時,是件極其艱鉅的工作。法國數學界調集大批數學家,組成了人工手算的流水線,算得天昏地暗,才完成了17卷大部頭書稿。即便如此,計算出的數學用表仍然存在大量錯誤。
巴貝奇在他的自傳《一個哲學家的生命歷程》裡,寫到了大約發生在1812年的一件事:
有一天晚上,我坐在劍橋大學的分析學會辦公室裡,神志恍惚地低頭看著面前開啟的一張對數表。一位會員走進屋來,瞧見我的樣子,忙喊道:"喂!你夢見什麼啦?" 我指著對數表回答說:"我正在考慮這些表也許能用機器來計算!"
巴貝奇耗費了整整十年光陰,於1822年完成了第一臺差分機,它可以處理3個不同的5位數,計算精度達到6位小數,當即就演算出好幾種函式表。第二臺由英國政府出資的運算精度為20位的大型差分機差分機一號(Difference Engine No.1)由於當時的製造工藝落後等問題最終未能完成。1849年巴貝奇提出支援31位、7次差分的差分機2號(Difference Engine No.2)方案,卻在有生之年只實現了很小一部分。
為什麼叫差分機
差分機這個名字,源自其所使用的演算法,是帕斯卡在1654年提出的差分思想:n次多項式的n次數值差分為同一常數。
我們來看一個一次多項式的例子,其中 Δƒ(x) = ƒ(x+1) - ƒ(x)
我們再來看一個二次多項式的例子,其中 Δ1ƒ(x) = ƒ(x+1) - ƒ(x),Δkƒ(x) = Δk-1ƒ(x+1) - Δk-1ƒ(x)
具體證明過程我也沒能找到,大學學的數學都還給老師了。。。有知道證明過程的可以在評論區告訴我。
利用差分的方法,可以輕易把複雜高階多項式的值通過重複進行加減法來計算。下面以一個二次多項式為例:
首先人工計算出 ƒ(1)、 Δ1ƒ(1)和 Δ2ƒ(1)的值,根據定義,有:
ƒ(2) = ƒ(1) + Δ1ƒ(1) , Δ1ƒ(2) = Δ1ƒ(1) + Δ2ƒ(1) , Δ2ƒ(2) = Δ1ƒ(2)
ƒ(3) = ƒ(2) + Δ1ƒ(2) , Δ1ƒ(3) = Δ1ƒ(2) + Δ2ƒ(2) , Δ2ƒ(3) = Δ1ƒ(2)
ƒ(4) = ƒ(3) + Δ1ƒ(3) , Δ1ƒ(4) = Δ1ƒ(3) + Δ2ƒ(3) , Δ2ƒ(4) = Δ1ƒ(3)
...
以此類推,可以不斷地計算出後面的ƒ(x)的值。同理,更高階的多項式也可以通過類似的方式求得:
差分機是怎麼工作的
要使用差分法來計算多項式,那麼機器必須能夠完成以下功能:
- 輸入並儲存ƒ(1)、Δ1ƒ(1)、Δ2ƒ(1)、Δ3ƒ(1) ...
- 計算 ƒ(k) + Δ1ƒ(k)、Δ1ƒ(k) + Δ2ƒ(k)、Δ2ƒ(k) + Δ3ƒ(k) 並儲存和輸出結果
- k = k+1 , 重複第二步
儲存單元
差分機通過一系列同軸齒輪來儲存數字,每個齒輪可以儲存10個數,最高可以儲存31位的十進位制數。
差分機最多可以儲存8個數,最高能計算7次方的多項式
計算
並行化演算法
跟早期的計算器類似,差分機也是通過齒輪的轉動進行加減法。巴貝奇先把序列的計算流程並行化。未優化的差分法每次運算只能計算一次加法,對於7階計算需要運算7步才能得到結果
對於機械設計而言,序列控制遠比並行控制成本更高,因為下一個運算必須要等待上一個運算結束,巴貝奇通過並行化將7步簡化成了2步:
首先,簡化後的步驟需要人工計算更多的數字,這對於提升的效能而言顯然是值得的,下面以7階計算為例:
第一步,將第1個數和第2個數、第3個數和第4個數、第5個數和第6個數、第7個數和第8個數相加:
第一步計算結束後更新第1、3、5、7個數:
第二步,將第2個數和第3個數、第4個數和第5個數、第6個數和第7個數相加:
第二步結束後,更新第2、4、6個數:
繼續上述兩個步驟,就可以源源不斷地計算出ƒ(x)的值。
整個流程看起來是這樣的,值得注意的是,現在這幾個儲存裡面的x值並不相同,但是這並不影響計算。
計算和進位
每個齒輪都有4組從0到9的數字,每個0跟9的交界處會有一個突起用來提醒進位
進位裝置
進位這裡不進行細述,有興趣的可以通過引用裡的連結瞭解更多。
兩個齒輪可以簡單完成加法操作,只需要先分開兩個齒輪,把第二個齒輪轉到到需要加的值,合攏兩個齒輪,順時針轉動第二個齒輪轉到0,第一個齒輪就會自動加上第二個齒輪的數字。
但是這個方法有個問題,轉動後第二個齒輪的數字就已經丟失了,所以巴貝奇在中間加了第三個扇形輪:
這個扇形輪有三種模式:咬合兩個齒輪、只咬合第二個齒輪和兩個齒輪都不咬合。在進行累加時,扇形輪與兩個齒輪咬合,在轉動第二個齒輪的時候會帶動第一個齒輪進行累加;完成運算後,扇形輪抬起只與第二個齒輪咬合,帶動第二個齒輪恢復到原來的數字。
因為篇幅有限,本文先講到這裡,感興趣的可以通過後面的連結來了解更多。最後,大家可以通過這個視訊來感受一下差分機的精妙:https://www.bilibili.com/video/BV1MW41177yh/?spm_id_from=autoNext。在下一篇,我們將會進入電氣時代,瞭解下真正的現代電子計算機。
引用:
https://xueqiu.com/3993902801/81799392
https://zhuanlan.zhihu.com/p/107462919
https://www.bilibili.com/video/BV1rt4y1S77M?spm_id_from=333.999.0.0
https://www.bilibili.com/video/BV1mt411C7gw?p=1
https://zh.wikipedia.org/wiki/%E5%B7%AE%E5%88%86%E6%A9%9F