我的学习群里全是真大佬 第92章

  因为他自己当时做这个项目的时候,可是动用了学校实验室的高性能服务器集群。

  通过极其严苛的多线程并发控制和CPU三级缓存的命中率优化,他硬生生将零点计算推到了上亿级的恐怖规模!

  他甚至觉得,如果当时自己再把内存指针的回收机制打磨一下,摸到十亿级的门槛也不是不可能。

  “还是太业余了呀……”

  秦飞有些好为人师的摇了摇头,索性也不看风景了,就这么饶有兴致的盯著李东的屏幕,权当是在旅途中找点乐子了。

  此时,李东也没注意旁边有个高手在,他只优化自己的算法。

  秦飞看著,先是暗自点头。

  “嗯,不错。”

  “知道抛弃原始的欧拉乘积公式,直接上Riemann-Siegelformula。”

  “主和项的循环写得很规范,余项展开的泰勒截断也算合理。”

  “时间复杂度标准的O(t^(1/2)),对于一个普通学生来说,这代码底子算得上扎实了。”

  秦飞在心里给出了一个“中规中矩”的评价。

  然而,就在秦飞以为李东接下来会顺理成章的去写多线程加速代码时。

  李东却突然停了下来。

  然后就按下了退格键,竟然把刚刚写好的,那段堪称教科书般标准的黎曼-西格尔主和项循环计算代码……

  删掉了一大半!

  秦飞愣了一下。

  “他干嘛?写错撤

  回了?”

  但接下来李东敲出的代码,却让秦飞彻底看迷糊了。

  李东没有去纠结如何加快单次计算的速度。

  他有【代码直觉】还有《黎曼绝笔》里的那种降维数学思维,他现在已经可以初步找到通往现代计算机底层逻辑的完美桥梁了。

  这是著名的快速傅里叶变换(FFT)开源库。

  然后又在代码中定义一个密集的评估网格。

  voidMultiPointEvaluation_Grid(...)

  他将需要逐个点代入t值去硬算的黎曼Zeta函数,通过构建局部多项式,强行转化为了在网格点上的泰勒级数展开。

  紧接著,李东调用了FFT算法,让这些多项式在频域内进行高速相乘。

  秦飞已经把降噪耳取了下来,眼睛看著李东的电脑屏幕,呼吸都变得有些急促了。

  “等等……这特么是在干什么?”

  秦飞想用自己学过的知识去去解析这套代码背后的逻辑。

  “算黎曼Zeta函数,你引个快速傅里叶变换(FFT)进来干嘛?这两者八竿子打不著啊!”

  “还有这个多点求值矩阵?他把泰勒展开放在网格上……”

  突然,他好像想到了什么

  “他……他不是在算单点!他是在利用FFT的高效卷积特性,把一个大区间内的所有零点求值,强行打包成了一个并行的多项式运算?”

  “用多点求值去分摊黎曼-西格尔公式主和项那恐怖的计算开销?”

  这其实就是黎曼写在手稿里,没未被后世学界发现的零点计算的思路。

  比后来公开的Odlyzko–Schonhage算法早了近一个半世纪,甚至在数学底层上,把后者的时间复杂度又往下压了整整一个维度。

  但秦飞不可能知道啊!

  在他的认知里,黎曼-西格尔公式带来的O(t^(1/2))复杂度,就是单零点计算的理论下限。

  哪怕是学界最快的OS算法,也只是工程化的极限优化,根本不可能跳出这个数学框架。

  而现在,眼前这个家伙,他到底在干什么?是想要推翻整个计算架构吗?

  “这怎么可能?!”

  秦飞感觉他疯了。

  “把主和项展开成矩阵运算,理论上虽然能降低平均复杂度,但误差怎么控制?你这么搞,浮点数的截断误差绝对会呈指数级爆炸的!”

  然而,还没等秦飞在心里反驳完。

  李东继续在多点求值的网格间,穿插了几段带限函数的插值滤波代码,完美的将积分路径的截断误差死死的锁在了一个极小的数学边界内!

  每一行指针的游走,每一次内存的复用,都用的很优雅。

  “不对……就算是OS算法,也不可能用这么少的代码、这么低的内存开销实现!”

  “他这个插值逻辑,根本不是现代数值分析的思路……这到底是哪来的算法?!”

  秦飞彻底看呆了。

  虽然他认识那些C++的语法,但组合在一起的算法逻辑,他已经完全跟不上了。

  “他不会是在瞎写吧?”

  “这样写……真的可以跑通吗?”

  秦飞陷入了深深的自我怀疑中。

第97章 我自己想的

  李东从上车没多久就开始敲代码,现在已经硬生生敲了四个多小时了。

  对于一个“初学者”来说,要把黎曼的降维算法完美的嵌套进C++的底层内存管理中,还要调用FFT库进行多点求值,确实非常的消耗脑力。

  “啪!”

  李东敲下了最后一行代码的回车键,然后伸了一个懒腰。

  他又从头到尾仔细检查了一遍内存指针的释放和边界条件的设定。

  “没问题,完美。”

  然后深吸了一口气,轻轻的点了下“Run”键。

  屏幕上的黑色控制台窗口瞬间弹出。

  首行赫然显示著初始搜索参数:【TargetInterval: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轻薄本,在长达三个小时的高强度极限运算下,键盘表面有些发烫,但完全没有要宕机的迹象。

  李东写的这套算法,太干净了!它没有产生任何多余的内存碎片,内存复用机制极其高效,几乎没有浪费内存带宽,也没有给CPU带来额外的调度负担。

  此时,电脑屏幕上的区间内零点计数,已经跳到了——10^7!

  10^20极高阶区间内的一千万个非平凡零点!

  而坐在旁边靠窗位置的秦飞,此刻已经完全傻掉了。

  他摘下降噪耳机,就这么傻傻的看著屏幕。

  “一千万?破千万了?”

  其实客观的来说并不算多,但是这才三个小时呀!

  “三个小时,你用一台破轻薄本,在10^20极高阶区间内跑出了一千万个黎曼Zeta函数的非平凡零点?”

  “你在开什么国际玩笑啊!!!”

  要知道,秦飞在北理工的计算实验室里,用那个造价几十万、带有双路32核CPU的小型服务器集群去跑Odlyzko-Schonhage算法,就算只算t≈10^15量级的一千万个零点,最少也要1.5个小时啊!更别说10^20这种极高阶区间了!

  表面上看,实验室的1.5个小时确实比轻薄本的3个小时快。

  但账绝对不是这么算的啊!

  那可是算力每秒数万亿次的小型服务器集群!

  而眼前这玩意儿,只是一台主打文档办公、连独立显卡都没有的轻薄本!它的硬件算力连实验室服务器单台的二十分之一都不到!

  用二十分之一的算力,仅仅只多花了一倍的时间,就跑完了更高阶的恐怖数据量?

  这在计算机科学的常识里,是绝对不可能发生的事情!没有任何现存的算法可以做到这种量级的跨越!除非对方用的算法,把现存所有的顶尖算法都按在地上降维打击了!

  “假的……这绝对是假的!”

  秦飞在心里不停的安慰自己。

  “他根本不是在跑程序!他是在放视频!对,这就是一段提前录制好的装逼视频!”

  其实秦飞作为HPC专业的大三尖子生,怎么可能分不清控制台实时编译运行和播放视频的区别?

  只是他身为一个科班学霸的学术尊严,让他本能的拒绝相信眼前这一幕!

  “没有任何教授教过我这种算法,也没有任何一篇顶会论文提到过这种操作!”

  秦飞深吸了一口气,身体朝著李东那边靠了靠。

  他准备仔细看看,这是不是一个恶搞程序。

  他刚把头凑过去……

  “啪!”

  电脑屏幕,毫无征兆的黑了!

  键盘背光熄灭,风扇的声音也消失了。

  这台联想笔记本直接罢工了…

  “操!”

  “操!”