這個神秘的數,讓芯片巨頭因特爾賠了5億美金
2019年11月10日09:00

  來源:把科學帶回家

  編譯 七君

  因特爾是世界上最大的芯片製造商之一,這個大家都知道,你的電腦用的很有可能就是因特爾的處理器。

  因特爾處理器是性能優良的代名詞,但是,因特爾也有一段不堪的往事。這件事還和一個神秘的常數,以及一個困擾人類2300多年的神秘數學猜想有關。

  1994年,因特爾推出了奔騰處理器,這是當時市面上最先進的處理器之一。但是這個世界上最堅硬的盾,遇到了最鋒利的矛——能逼瘋計算機的數學家。

出了bug的奔騰處理器@wikipedia
出了bug的奔騰處理器@wikipedia

  這不難理解,因為數學家需要處理數學問題。尤其是當他們不知道怎麼證明一個猜想的時候,他們就會用暴力窮舉的方法。

  在這個過程中,計算機就會被逼到絕境。每次一有先進計算機出現,數學家們就會摩拳擦掌,餓虎撲食一般把先進計算機團團圍住。加拿大西蒙弗雷澤大學(Simon Fraser University)的數學家 Peter Borwein 曾經對《科學》表示,通過讓計算機不斷進行簡單重複的計算,計算機的計算能力“就會到達崩潰的邊緣”,開始出錯。

  這次,奔騰也沒有逃脫數學家的魔爪。把奔騰逼到崩潰DAN疼的,是一個叫做布倫常數(Brun's constant)的神秘常數。

  布倫常數和質數有關,而且表達式很簡單——

  可是布倫常數是干哈用的?這裡面的數字又是什麼?

  這就要和把數學家們逼瘋的著名猜想——孿生素數猜想講起了。

  歐幾里得在《幾何原本》里已經證明存在無窮多的質數。數學家們也知道,如果從1開始一直數下去的話,一開始質數出現的頻率比較高,後來就變得比較珍稀了。

  比如,兩位數里有23%是質數,但是十位數里只有4%是質數,而百位數里,質數隻占1%不到。

  不過,質數還有一個奇特的現象,那就是雖然質數的分佈變得越來越稀疏,但是兩個連續質數之間的距離卻似乎不會增長,比如3和5差2,41和43也差2,101和103也差2,10007和10009也差2。

  這樣相差2的一對連續質數就被叫做孿生素數,或者叫孿生質數。

100以內的質數(黃底)和孿生質數(紅色)
100以內的質數(黃底)和孿生質數(紅色)

  2300年前,歐幾里得就開始大膽腦補了,會不會孿生質數有無窮多對呢?一定是這樣的。然後大家為了紀念歐幾里得的腦洞,就把它叫做孿生素數猜想。

  這個猜想也變成了一座讓數學家聞風喪膽的數學金盃。

  比如,在1912年的國際數學家大會(ICM)上,德國數學家 Edmund Landau 就舉出了當時數學界覺得不可能解決的4個猜想,其中之一就是孿生素數猜想。這4個問題後來就被叫做蘭道問題。

  100多年後的今天,這4個蘭道問題還是猜想。

挪威數學家 Viggo Brun@wikipedia
挪威數學家 Viggo Brun@wikipedia

  不過在1919年,挪威數學家 Viggo Brun 有了個大突破。Brun 證明,就算有無窮多對孿生質數,它們的倒數的和,會收斂於一個有限的值。

  這個常數,就被叫做布倫常數。

布倫常數收斂於一個有限值@wikipedia
布倫常數收斂於一個有限值@wikipedia

  其實,布倫常數對於數學家們來說是一個精神打擊。因為如果 Brun 證明孿生素數的倒數和不收斂,是發散的,這就等於宣佈,孿生素數有無窮多對,那麼孿生素數猜想就得到了證明,歐幾里得挖的坑就可以填上了。

  而存在布倫常數,等於說孿生素數問題還是沒有得到證明,只不過現在大家知道孿生素數的分佈確實很稀疏,但我們還是不知道孿生素數是不是有無窮多對。

  另外,雖然 Brun 能證明布倫常數存在,但並不能計算出它的每一位,就像我們還無法計算π的小數點後的每一位數字一樣。不過和π不一樣,我們直到現在也不知道布倫常數是不是無理數。如果能多算出幾位它小數點後的數字,我們或許就能瞭解它到底是什麼品種的妖怪了,因此許許多多的數學家開始計算布倫常數。

  隨著計算機的出現,數學家們想到了用暴力硬算的方法解決這個問題。

  1974年,為美國海軍幹活的兩個數學家 Daniel Shanks 和 John Wrench Jr 報告了用計算機暴力算出來的布倫常數,他們讓悲催的計算機窮舉了2百萬個質數。

  2年後,澳州國立大學的數學家 Richard Brent 更加暴力,他讓計算機窮舉了224 376 048對孿生質數,利用這些質數,他算到布倫常數的小數點後第8位,得到1.90216054。

  數學家們看到 Brent 這種勇士,好長一段時間都不說話了,因此布倫常數的故事就風平浪靜了一大會兒。接著到了90年代,因特爾就推出了最強處理器。

  美國維珍尼亞州的林奇堡學院(Lynchburg College)的數學家Thomas Nicely看到因特爾處理器很心動,他早就想算一把布倫常數了,畢竟當時也沒有礦幣可以挖。

  他打算磨死計算機,讓它算到萬億。

  因為知道數學家都是計算機殺手,為了確保計算機不會崩潰搞事情,他還用了雙保險——用2種方法計算。

  這倆方法的差異差不多等同於,算1/3+1/7的時候,用0.33+0.14=0.47這個方法,或者1/3 + 1/7 = 10/21 = 0.48這個方法。照理來說算出來的結果差距應該不大。

  但是呢,Nicely 用這兩個方法得到的結果一比之後,卻發現差距比歐幾里得的腦洞還大。

  用排除法一波debug以後,Nicely 發現問題的關鍵在於2個質數,那就是824 633 702 441和824 63 702 443,它們的倒數的小數點後的第10位被算錯了。

  但是,Nicely 不確定這個問題是計算機硬件的問題,還是軟件的問題,總之不是他的問題。於是他讓因特爾古早處理器486又算了一次,結果486倒是算對了。

  4個月後,Nicely 又用其他兩台裝有奔騰的計算機做了一次計算,這個問題又出現了。

  很明顯,這是因特爾奔騰的硬件有毛病。Nicely 估計,這個處理器大概會把10億個倒數里的1個算錯。因為要算布倫常數,計算機就要計算數十億的倒數,因此出錯在所難免。

  Nicely 很快聯繫了因特爾,要求一起寫數論作業看看是怎麼回事,不過因特爾並沒有接受他的請求。

  Nicely 覺得很無語,於是就在11月把這件事的前因後果寫了郵件,群發給了小夥伴們。

  這件事很快就被美國有線電視新聞網(CNN)等媒體報導。奔騰算倒數時會偶發智障的事件被公開後,因特爾就不得不召回舊的處理器並為用戶更換新的。

  後來因特爾承認,其實他們在生產奔騰的時候就知道這個問題了,但是計算了一波後他們發現,90億用戶里,只有1個會受到影響,因此一開始沒有召回。

  當時因特爾已經賣掉了一百多萬台裝有奔騰處理器的計算機,所以1995年1月17日,因特爾宣佈,因為這次召回事件,他們損失了4.75億美金(相當於現在的8.23億美金,58億人民幣)。

  這個問題,史稱奔騰浮點除錯誤(Pentium FDIV bug),被寫入了維基詞條,是因特爾最想讓大家遺忘的黑歷史之一。

  那麼,為什麼奔騰奔騰會算錯呢?問題出在它做除法的時候。

  原來,因特爾做了一個查找表,也即是類似於三角函數表這樣的方便計算的表格,這樣不用每次都親自算一遍,查一下表格可能會更方便。但是這個查找表漏了5個數據,導致做除法的時候有一定的幾率犯錯。

  瑞士洛桑聯邦理工學院加密算法實驗室的教授 Arjen Lenstra 還給因特爾補了一刀:“我們數學家早就知道數論對計算很有用啦。在賣處理器之前好好算一下數論的東西嘛真是的。”

  對了,後來在2002年,不隸屬於任何已知大學或組織的法國浪人數學家 Pascal Sebah 又更新了布倫常數——1.902160583104。

  而在2013年,孿生素數猜想也有了一個大突破——華人數學家張益唐在58歲時發表關於孿生素數猜想的重要論文,證明了相差小於7000萬的素數對有無窮多對。

張益唐
張益唐

更多新聞