我的學習羣裏全是真大佬 第92章

作者:胖胖的小橘

李東打開電腦。

他果斷拋棄了之前那個效率低下的Python腳本,打開了C++的集成開發環境(IDE)。

要跑黎曼Zeta函數的非平凡零點驗證,必須上底層語言,同時要用GMP和MPFR庫來保證計算精度。

0.3的基礎屬性直接拉滿,配上【代碼直覺(基礎版)】

他覺得自己現在強的可怕……

“噼裏啪啦……噼裏啪啦……”

戴着降噪耳機的秦飛被身旁李東的動作給吸引了。

他微微偏過頭,瞥了一眼。

“ThinkBook?”

秦飛在心裏暗暗搖了搖頭。

“買個主打輕薄商務的輕薄本用來敲代碼?這散熱壓得住嗎?這同學怕是被割韭菜了吧……”

帶着一絲懂行人的優越感,秦飛又看向了李東的電腦屏幕,然後就愣了一下。

void RiemannSiegelZ (...)

mpfr_t theta_t;

“嗯?”

秦飛眉頭微挑。

“用C++寫黎曼-西格爾公式?這小子在跑黎曼Zeta函數的非平凡零點驗證?”

秦飛心裏多少有些意外,在高鐵上居然遇到了同專業的學生?

不過他還是帶着上位者的心態在看李東的代碼。

因爲在他們北理工的高性能計算實驗室裏,這種項目實在是太常見了。

計算機算力發展到今天,用經典的數學難題,比如計算圓周率百億位呀、大素數篩法這些來作爲Benchmark(基準測試),去檢驗一套底層算法的優化程度,是他們這幫HPC方向學生的家常便飯。

而且,秦飛前段時間爲了準備考研複試和畢業設計的開題,自己也手搓過一套驗證黎曼零點的程序。

“想法倒是不錯,用這個來練手。”

秦飛搖了搖頭,看着那臺筆記本電腦,在心裏暗暗吐槽。

“不過,就憑這臺被割韭菜的輕薄本,你這算法能跑到什麼級別?”

“十萬級?還是百萬級?”

“估計跑到一百萬個零點,這內存分配的碎片和CPU的溫度,就能把這臺機子直接幹藍屏吧。”

秦飛心中篤定。

因爲他自己當時做這個項目的時候,可是動用了學校實驗室的高性能服務器集羣。

通過極其嚴苛的多線程併發控制和CPU三級緩存的命中率優化,他硬生生將零點計算推到了上億級的恐怖規模!

他甚至覺得,如果當時自己再把內存指針的回收機制打磨一下,摸到十億級的門檻也不是不可能。

“還是太業餘了呀……”

秦飛有些好爲人師的搖了搖頭,索性也不看風景了,就這麼饒有興致的盯着李東的屏幕,權當是在旅途中找點樂子了。

此時,李東也沒注意旁邊有個高手在,他只優化自己的算法。

秦飛看着,先是暗自點頭。

“嗯,不錯。”

“知道拋棄原始的歐拉乘積公式,直接上Riemann-Siegel formula。”

“主和項的循環寫得很規範,餘項展開的泰勒截斷也算合理。”

“時間複雜度標準的 O (t^(1/2)),對於一個普通學生來說,這代碼底子算得上紮實了。”

秦飛在心裏給出了一個“中規中矩”的評價。

然而,就在秦飛以爲李東接下來會順理成章的去寫多線程加速代碼時。

李東卻突然停了下來。

然後就按下了退格鍵,竟然把剛剛寫好的,那段堪稱教科書般標準的黎曼-西格爾主和項循環計算代碼……

刪掉了一大半!

秦飛愣了一下。

“他幹嘛?寫錯撤回了?”

但接下來李東敲出的代碼,卻讓秦飛徹底看迷糊了。

李東沒有去糾結如何加快單次計算的速度。

他有【代碼直覺】還有《黎曼絕筆》裏的那種降維數學思維,他現在已經可以初步找到通往現代計算機底層邏輯的完美橋樑了。

他在代碼頂部,重新引入了一個名爲< fftw3.h >的頭文件。

這是著名的快速傅里葉變換(FFT)開源庫。

然後又在代碼中定義一個密集的評估網格。

void MultiPointEvaluation_Grid (...)

他將需要逐個點代入t值去硬算的黎曼Zeta函數,通過構建局部多項式,強行轉化爲了在網格點上的泰勒級數展開。

緊接着,李東調用了FFT算法,讓這些多項式在頻域內進行高速相乘。

秦飛已經把降噪耳取了下來,眼睛看着李東的電腦屏幕,呼吸都變得有些急促了。

“等等……這特麼是在幹什麼?”

秦飛想用自己學過的知識去去解析這套代碼背後的邏輯。

“算黎曼Zeta函數,你引個快速傅里葉變換(FFT)進來幹嘛?這兩者八竿子打不着啊!”

“還有這個多點求值矩陣?他把泰勒展開放在網格上……”

突然,他好像想到了什麼

“他……他不是在算單點!他是在利用FFT的高效卷積特性,把一個大區間內的所有零點求值,強行打包成了一個並行的多項式咚悖俊�

“用多點求值去分攤黎曼-西格爾公式主和項那恐怖的計算開銷?”

這其實就是黎曼寫在手稿裏,沒未被後世學界發現的零點計算的思路。

比後來公開的Odlyzko–Schonhage算法早了近一個半世紀,甚至在數學底層上,把後者的時間複雜度又往下壓了整整一個維度。

但秦飛不可能知道啊!

在他的認知裏,黎曼-西格爾公式帶來的 O (t^(1/2))複雜度,就是單零點計算的理論下限。

哪怕是學界最快的OS算法,也只是工程化的極限優化,根本不可能跳出這個數學框架。

而現在,眼前這個傢伙,他到底在幹什麼?是想要推翻整個計算架構嗎?

“這怎麼可能?!”

秦飛感覺他瘋了。

“把主和項展開成矩陣咚悖碚撋想m然能降低平均複雜度,但誤差怎麼控制?你這麼搞,浮點數的截斷誤差絕對會呈指數級爆炸的!”

然而,還沒等秦飛在心裏反駁完。

李東繼續在多點求值的網格間,穿插了幾段帶限函數的插值濾波代碼,完美的將積分路徑的截斷誤差死死的鎖在了一個極小的數學邊界內!

每一行指針的遊走,每一次內存的複用,都用的很優雅。

“不對……就算是 OS算法,也不可能用這麼少的代碼、這麼低的內存開銷實現!”

“他這個插值邏輯,根本不是現代數值分析的思路……這到底是哪來的算法?!”

秦飛徹底看呆了。

雖然他認識那些 C++的語法,但組合在一起的算法邏輯,他已經完全跟不上了。

“他不會是在瞎寫吧?”

“這樣寫……真的可以跑通嗎?”

秦飛陷入了深深的自我懷疑中。

第97章 我自己想的

李東從上車沒多久就開始敲代碼,現在已經硬生生敲了四個多小時了。

對於一個“初學者”來說,要把黎曼的降維算法完美的嵌套進C++的底層內存管理中,還要調用FFT庫進行多點求值,確實非常的消耗腦力。

“啪!”

李東敲下了最後一行代碼的回車鍵,然後伸了一個懶腰。

他又從頭到尾仔細檢查了一遍內存指針的釋放和邊界條件的設定。

“沒問題,完美。”

然後深吸了一口氣,輕輕的點了下“Run”鍵。

屏幕上的黑色控制檯窗口瞬間彈出。

首行赫然顯示着初始搜索參數:【Target Interval: t∈[10^20, 10^20 + 1.5×10^6]】

緊接着,一行行綠色的數字傾瀉而下。

10,000...

100,000...

1,000,000...

每跳一次計數,都代表着成百上千個黎曼Zeta函數的非平凡零點被捕捉驗證,累計數量飛速攀升。

李東看着屏幕也不由的有些激動。

“跑得通!真的跑得通!”

而且因爲算法的時間複雜度從黎曼-西格爾公式的O(t^(1/2)),直接降到了比Odlyzko–Schonhage算法的O(t^(1/3+ε))還要低的量級,再加上優雅的內存複用機制,這臺輕薄本根本沒有出現之前那種卡死藍屏的情況。

“我的思路是對的!黎曼的算法真的可以代入……”

就在李東看着屏幕的時候,他並沒有注意到,被他扔在小桌板一角的手機屏幕,突然亮了一下。

微信“青龍學習小組”的界面後臺。

在李東頭像旁邊的那個【羣主(實習)】的頭銜裏。

“(實習)”這兩個字,正在一點一點的變淡。

羣裏……

【約翰?馮?諾依曼】:快了。

【阿爾伯特?愛因斯坦】:高三閣下那位愚蠢的侄子,看來也沒蠢到家。

【尼爾斯?玻爾】:阿爾伯特,別轉移話題,你我之間,總得有一個是對的,有一個是錯的。

【德米特里?伊萬諾維奇?門捷列夫】[戴墨鏡喫瓜]。

【艾薩克?牛頓】:你們到底在說什麼?

然而,這幾條消息僅僅在屏幕上停留了不到三秒鐘。

就消失不見了。

而這一切,李東毫無察覺。

高鐵在華北平原上行駛着,三個小時過去了。

令人稱奇的是,這臺主打商務辦公的ThinkBook輕薄本,在長達三個小時的高強度極限咚阆拢I盤表面有些發燙,但完全沒有要宕機的跡象。

李東寫的這套算法,太乾淨了!它沒有產生任何多餘的內存碎片,內存複用機制極其高效,幾乎沒有浪費內存帶寬,也沒有給CPU帶來額外的調度負擔。