五月六日到五月十二日。

    江大数学学院不少师生发现,c楼二层那间标着c216的讨论室最近有些不对劲。

    平时,这里只是供研究生开读书班,教授们举行组会,或是小课题组进行头脑风暴的地方。

    它的常态是松散的充满咖啡味的,甚至是带着一点学术摸鱼的惬意。

    但最近,它的门经常关着。

    白板从原先零散的几个微积分公式,变成了密密麻麻的几何结构图。

    那台老旧的惠普网络打印机几乎陷入了狂暴状态,连续不断地吞吐着A4纸。

    陈彦,作为顾南舟教授手下最踏实的直博生,成了这台高速运转机器上的第一个承压轴承。

    他每天抱着一摞又一摞散发着热气和刺鼻墨香的材料,在导师办公室、大型服务器机房和c216讨论室之间来回奔波。

    第一天,他的神情是兴奋的。

    第二天,是凝重的。

    到了第四天,他脸上的表情已经退化为物理意义上的麻木。

    有时候,路过的同门研究生看着他眼底青黑头发凌乱的模样,会忍不住拉住他问:“陈师兄,你们组最近在搞什么大工程,怎么连轴转成这样?”

    陈彦一开始还会扯动一下僵硬的嘴角,按照顾老板的吩咐敷衍一句:“帮别的院系整理一点交叉学科的材料,跑点数据。”

    后来,当睡眠严重不足导致他的前额叶皮层开始罢工时,他连敷衍都懒得敷衍了。

    “擦地。”

    有一天,他抱着刚打出来的五百页日志文件,两眼发直地回答。

    对方愣住,看了看陈彦手里的文件,又看了看走廊光可鉴人的瓷砖:“什么,顾老板现在开始压榨博士生做保洁了?”

    陈彦面无表情地盯着地上的瓷砖拼接缝隙,声音幽幽得像个游魂:“数学意义上的擦地。”

    那人更加听不懂了。

    陈彦也没打算解释。

    因为他自己,也快被那张存在于高维逻辑空间里的地板给磨疯了。

    所谓tile J的计算机辅助核验包,在正式进入多节点并行复跑阶段后,陈彦才真正用身体和精神的双重崩溃,明白了那句这是体力活到底是什么意思。

    在此之前,陈彦负责打印和整理纸面证明。

    那些充斥着复杂的局部补丁定义、群作用分类和层级递推推导的手稿,虽然也不好懂,但至少保留着古典数学的浪漫。

    在阅读那些手稿时,陈彦还能感受到一种我在接近宇宙真理,我在凝视上帝的拼图的崇高错觉。

    有一种智力上的愉悦感。

    然而,核验包的运行,完全是另一回事。

    它不像证明那样闪耀着人类智慧的光芒,它更像是一个毫无感情的星际仓库盘点系统。

    在证明非周期单砖的过程中,局部强迫规则会产生海量的边界匹配情况。

    为了证明没有一种情况可以导致周期性平移,机器必须遍历所有的局部状态。

    一类状态生成,评估,切入下一类状态,再扩展到下一类状态的邻域。

    合并同构等价类,给每一种图谱赋予绝对唯一的哈希编号。

    发现闭环,标记为死路,记录拓扑矛盾原因。

    输出动辄几百几个Gb的JSoN文件,计算多项式哈希值,生成追溯日志。

    然后:报错,排查,修改脚本,重跑;再报错,再重跑。

    江临交上来的这个被称为S的核验包,代码风格并不花哨。

    没有那些大厂程序员喜欢搞的炫技般的图形界面,没有错综复杂,动辄需要安装半天环境的外部依赖库,也没有那种看起来运用了各种高级设计模式,实际换一台电脑就因为底层c++编译器版本不同而跑不起来的工程垃圾。

    整个文件夹的结构,带着一种极简主义的冷酷。

    陈彦第一次在江大数学学院的内网服务器上解压这个包的时候,心里其实是松了一口气的。

    作为经常帮导师跑各种祖传屎山代码的博士生,他见过太多惨不忍睹的脚本。

    眼前这个包,目录清晰,命名规范,看起来挺干净。

    然后,他敲下了 python3 generate_states.py,开始跑。

    第一轮,江大办公室那台配置顶配,装载了双路至强处理器和128G内存的Linux工作站,在轰鸣了四个小时,进度条走到57%的时候,突然在一声清脆的滴声后,无情地抛出了大段红色的报错。

    陈彦的心提到了嗓子眼。

    如果数学模型错了,那意味着过去几天的狂欢只是一场泡沫。

    他凑近屏幕,盯着报错信息看了十几秒,忽然有一种想笑,却又想砸键盘的冲动。

    不是证明错。

    不是逻辑错。

    不是内存溢出。

    是文件读写错误。

    而且原因荒诞到了极点。

    工作站之前被另一个院系的老师借用过,系统环境变量的一个临时路径里包含了一个全角的中文用户名。

    而江临的脚本在调用底层系统级的相对路径拼接时,没有考虑到非AScII字符的强制转码,导致写入临时日志时抛出了 UnicodeEncodeError。

    一个极有可能彻底解决困扰了人类数学界六十年单砖问题的世纪核验包,这锋利无比的第一刀,竟然砍在了中文路径的编码上。

    陈彦深吸了一口气,把这个问题截图,附上环境日志,发给了江临。

    仅仅十分钟后,江临就发回了更新后的代码补丁。

    他重写了路径处理的模块,加入了强制的UtF-8编码声明和异常捕获机制,干净利落。

    第二轮,重新启动。

    漫长的六个小时后,跑通了。

    屏幕上跳出 Verification plete. All local cases tched expected signatures. 的绿色字体。

    陈彦长长地舒了一口气,刚准备站起来去倒杯水庆祝一下。

    电脑右下角,邮件客户端弹出了提示音。

    是远在南大的林照野教授发来的邮件。

    南大数学院为了配合这次复核,特意腾出了一台专门做代数拓扑计算的高性能集群节点。

    但是,那台机器上的python版本是稍微陈旧一些的3.8版本,而底层调用的Nuy科学计算库版本也不同。

    在处理 tile J 的顶点坐标时,输出表格中的浮点数格式多出了一位极小的误差。

    结果本身在拓扑意义上完全一致,并不影响结论。

    但是,用于自动化比对的diff脚本却亮起了红灯。

    文本对不上。

    林照野在邮件里并没有因为这是个高中生就嘴下留情,字里行间透着老牌学者的严谨与苛刻,只写了一句极重的话:“复现说明不能假设全世界的同行都和你用同一台型号的机器、同一个版本的编译器,这是科学的普适性原则。”

    陈彦看着邮件,替江临捏了一把汗。

    这种吹毛求疵的指责,对一个刚刚做出巨大贡献的年轻人来说,很容易引发逆反心理。

    但江临的回信在两分钟后就到了。

    “收到。问题确认。已将所有底层的几何坐标比较模块,从浮点数近似比较彻底改为基于代数整数的精确编码,并使用有理数格式输出,新版本 v0.3 已上传。”

    第三轮,在北京的邵明棠研究所那边,开始跑用于生成论文附录图谱的关键样例。

    运行到第七个小时,又发现了一个致命的格式规范问题。

    在处理tile J的翻面读法时,两个本该归入同一等价类的测试样例,输出在日志里的名称不一致。

    一个是按照第一种遍历算法生成的,叫 rror_case_b3。

    另一个是按照逆向回溯生成的,叫 reflected_b3。

    作为研究者,人类的大脑在看到这两个词时,瞬间就能反应过来它们在数学上指的是同一个拓扑结构。

    但机器不知道。

    对于哈希算法来说,这是两串截然不同的字符。

    如果未来的审稿人,那些可能来自普林斯顿、剑桥或者高等研究院的、挑剔到极点的数学家,拿着放大镜来审查你的核验代码时,他们绝对不会大发慈悲地替你猜这其中的关联。

    他们只会冷冷地写下一句:“代码逻辑存在歧义,状态空间分类不严谨。”

    于是,江临再次修改。

    统一了全局的命名空间,引入了严格的规范化命名函数。

    接下来的这几天里,c216讨论室里说得最多的词,不是天才,不是突破,不是单砖。

    空气里漂浮的,全都是枯燥到了极点的工程指令。

    “重跑!江大节点二号机重新分配内存。”

    “日志呢?为什么第4470号状态的衍生日志断掉了?”

    “版本号没对齐!你现在跑的是v0.4还是v0.4.1?”

    “等一下,这个输出结果对应的是草稿里的哪张图?图索引文件更新了吗?”

    “R-44的终端输出和附录编号对不上,差了一个位移向量。”

    “别直接改原文件!开新版本分支,我们要保留完整的修改溯源链条。”

    “江临,你这个新的REAd写得像武林秘籍,只有你自己能看懂,你应该假设你的读者是一个只会敲回车键的白痴。”

    陈彦一开始觉得无比痛苦。

本章未完,请点击下一页继续阅读>>

章节目录