這個神秘的數,讓芯片巨頭因特爾賠了5億美金,還留下了慘痛的黑歷史
因特爾是世界上最大的芯片制造商之一,這個大家都知道,你的電腦用的很有可能就是因特爾的處理器。
因特爾處理器是性能優良的代名詞,但是,因特爾也有一段不堪的往事。這件事還和一個神秘的常數,以及一個困擾人類 2300 多年的神秘數學猜想有關。
1994 年,因特爾推出了奔騰處理器,這是當時市面上最先進的處理器之一。但是好死不死,這個世界上最堅硬的盾,遇到了最鋒利的矛——能逼瘋計算機的數學家。
出了 bug 的奔騰處理器。@wikipedia
這不難理解,因為數學家需要處理數學問題。尤其是當他們不知道怎么證明一個猜想的時候,他們就會用暴力窮舉的方法。
在這個過程中,計算機就會被逼到絕境。每次一有先進計算機出現,數學家們就會摩拳擦掌,餓虎撲食一般把先進計算機團團圍住。加拿大西蒙弗雷澤大學(Simon Fraser University)的數學家 Peter Borwein 曾經對《科學》表示,通過讓計算機不斷進行簡單重復的計算,計算機的計算能力“就會到達崩潰的邊緣”,開始出錯,類似于還有 1 分鐘就要交卷的學生仔。
這次,奔騰也沒有逃脫數學家的魔爪。把奔騰逼到崩潰 DAN 疼的,是一個叫做布朗常數(Brun’s constant)的神秘常數。
布朗常數和質數有關,而且表達式很簡單,小學生也能看懂——
可是布朗常數是干哈用的呢?這里面的數字又是啥呢?
這就要和把數學家們逼瘋的著名猜想——孿生素數猜想講起了。
歐幾里得在《幾何原本》里已經證明存在無窮多的質數。數學家們也知道,如果從 1 開始一直數下去的話,一開始質數出現的頻率比較高,后來就變得比較珍稀了。
比如,兩位數里有 23% 是質數,但是十位數里只有4% 是質數,而百位數里,質數只占1% 不到。
不過,質數還有一個奇特的現象,那就是雖然質數的分布變得越來越稀疏,但是兩個連續質數之間的距離卻似乎不會增長,比如 3 和 5 差2,41 和 43 也差2,101 和 103 也差2,10007 和 10009 也差2。
這樣相差 2 的一對連續質數就被叫做孿生素數,也叫孿生質數。
100 以內的質數(黃底)和孿生質數(紅色)
2300 年前,歐幾里得就開始大膽腦補了,會不會孿生質數有無窮多對呢?一定是這樣的嗯。然后大家為了紀念歐幾里得的腦洞,就把它叫做孿生素數猜想。
這個猜想也變成了一座讓數學家聞風喪膽的數學金杯。
比如,在 1912 年的國際數學家大會(ICM)上,德國數學家 Edmund Landau 就舉出了當時數學界覺得不可能解決的 4 個猜想,其中之一就是孿生素數猜想。這 4 個問題后來就被叫做蘭道問題。
100 多年后的今天,這 4 個蘭道問題還是猜想。
挪威數學家 Viggo Brun。@wikipedia
不過在 1919 年,毛發濃郁的挪威數學家 Viggo Brun 有了個大突破。Brun 證明,就算有無窮多對孿生質數,它們的倒數的和,也就是
會收斂于一個有限的值,就好像1/2 + 1/4 …最后等于 1 一樣。
這個常數,就被叫做布朗常數。
布朗常數收斂于一個有限值。@wikipedia
其實,布朗常數對于數學家們來說是一個精神打擊。因為如果 Brun 證明孿生素數的倒數和不收斂,是發散的,這就等于宣布,孿生素數有無窮多對,那么孿生素數猜想就得到了證明,歐幾里得挖的坑就可以填上了。
而存在布朗常數,等于說孿生素數問題還是沒有得到證明,只不過現在大家知道孿生素數的分布確實很稀疏,但我們還是不知道孿生素數是不是有無窮多對。
另外,雖然 Brun 能證明布朗常數存在,但并不能計算出它的每一位,就像我們還無法計算派的小數點后的每一位數字一樣。不過和派不一樣,我們直到現在也不知道布朗常數是不是無理數。如果能多算出幾位它小數點后的數字,我們或許就能了解它到底是什么品種的妖怪了,因此許許多多的數學家開始計算布朗常數。
隨著計算機的出現,數學家們想到了用暴力硬算的方法解決這個問題。
1974 年,為美國海軍干活的兩個數學家 Daniel Shanks 和 John Wrench Jr 報告了用計算機暴力算出來的布朗常數,他們讓悲催的計算機窮舉了 2 百萬個質數。
2 年后,澳大利亞國立大學的數學家 Richard Brent 更加暴力,他讓計算機窮舉了 224 376 048 對孿生質數,利用這些質數,他算到布朗常數的小數點后第 8 位,得到 1.90216054。
順說一句,2011 年谷歌競拍加拿大北電網路(Nortel Networks)的無線專利技術的時候,出的價就是1,902,160,540 美金。數學家們看到 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 億人民幣,58 個小目標)。
這個問題,史稱奔騰浮點除錯誤(Pentium FDIV bug),被寫入了維基詞條,是因特爾最想讓大家遺忘的黑歷史之一。
那么,為什么奔騰奔騰會算錯呢?問題出在它做除法的時候。
原來,因特爾做了一個查找表,也即是類似于三角函數表這樣的方便計算的表格,這樣不用每次都親自算一遍,查一下表格可能會更方便。但是這個查找表漏了 5 個數據,導致做除法的時候有一定的幾率犯錯。
瑞士洛桑聯邦理工學院加密算法實驗室的教授 Arjen Lenstra 還給因特爾補了一刀:“我們數學家早就知道數論對計算很有用啦。在賣處理器之前好好算一下數論的東西嘛真是的。”
對了,后來在 2002 年,不隸屬于任何已知大學或組織的法國浪人數學家 Pascal Sebah 又更新了布朗常數——1.902160583104。
而在 2013 年,孿生素數猜想也有了一個大突破——華人數學家張益唐在 58 歲時發表關于孿生素數猜想的重要論文,證明了相差小于 7000 萬的素數對有無窮多對。
張益唐