陆沉完成了全部代码和文档。林枫的测试用例也准备好了。
“提交吗?”林枫问。
“等一下。”陆沉说,“我再优化一个地方。”
他重新打开代码文件,定位到预条件子的构造部分。
其实现在提交,成绩已经足够好了。
不完整的cholesky分解比雅可比预条件快至少一个数量级,中国队在这个模块上的优势是碾压级的。
但陆沉忽然想试试另一个思路。
如果不完整的cholesky分解是1980年的解法,那么—
他能不能把时间线再往前推一点?
比如,1990年代才成熟的多重网格预条件?
不。时间不够。四十分钟写不完一个完整的多重网格框架。
但有一个折中的思路。
他可以在不完整分解的基础上,加入一个简单的块对角预处理,针对这道题矩阵的特殊分块结构。
这个改进不大,但能进一步压缩15%的运行时间。
而且,可以在现有代码的基础上用十分钟改完。
他动手了。
十一点五十五分。
陆沉按下保存键。
“提交。”
林枫长长地呼出一口气,像是终於卸下了什么重担。
评测过程是公开的。
各队的程序被依次送入besm—6主机,在统一的测试集上运行,运行时间和结果实时显示在赛场前方的大屏幕上。
第一队,保加利亚。运行结果:部分正確。运行时间:47.3秒。
第二队,捷克斯洛伐克。运行结果:正確。运行时间:42.1秒。
第三队,东德。运行结果:正確。运行时间:38.7秒。
隨著结果一个个公布,赛场里的气氛渐渐紧张起来。正確完成这道题的队伍並不多,大多数要么结果错误,要么运行超时。
第六队,匈牙利。运行结果:正確。运行时间:35.2秒。
匈牙利队的区域里发出一阵压低声音的欢呼。戴眼镜的男生朝陆沉这边看了一眼,比了个大拇指。
第七队,苏联。运行结果:正確。运行时间:
屏幕上跳动了一下。
31.4秒。
苏联队的区域里,队员们终於露出了笑容。金髮队长靠在椅背上,神色明显放鬆下来0
31.4秒。目前全场最快。
第八队,波兰。运行结果:正確。运行时间:33.8秒。
第九队,罗马尼亚。运行结果:部分正確。运行时间:超时。
第十队,中国。
陆沉感觉到林枫的身体绷紧了。
屏幕上的数字开始跳动。
加载程序。
初始化数据。
开始计算。
计时器的数字飞速增长。
0.5秒。1.0秒。1.5秒。
林枫死死盯著屏幕。
陆沉倒是很平静。
他已经知道了结果。
2.1秒。
计时停止。
运行结果:正確。
.
——
运行时间:2.1秒。
赛场安静了一瞬。
然后“什么?”
声音是从苏联队的区域传出来的。
金髮队长站了起来,盯著屏幕上的数字,脸上的表情从困惑变成难以置信。
2.1秒。
比第二名快了將近十五倍。
这不是“更快”。
这是不在同一个维度。
主考官也愣住了。他低头检查评测系统的日誌,確认没有出错。
没有出错。
日誌显示,中国队的程序確实在2.1秒內完成了全部计算任务。
而且,內存占用只有標准解法的三分之一。
主考官抬起头,看向中国队的方向。
“你们————”他用俄语说,然后切换成英语,“你们的预条件子,用的是什么方法?
”
翻译还没开口,陆沉已经用俄语回答了。
“不完整的cholesky分解,结合块对角预处理。”
主考官的眼神变了。
“不完整的cholesky分解?”他重复了一遍,“你是指————对係数矩阵做不完全的三角分解,捨弃填充元?”
“是的。”
“这个方法的收敛性””
“有保证。”陆沉说,“对於m矩阵,不完整分解的存在性和稳定性都可以证明。具体来说,如果係数矩阵是m矩阵,则任意捨弃填充元的不完整cholesky分解都存在,且预条件后的矩阵特徵值均为正实数。这道题的矩阵正好满足m矩阵条件。”
主考官沉默了好一会儿。
“你————证明过吗?”
“推导过。”陆沉说,“证明过程在我的文档附录里。”
主考官快步走向评测终端,调出中国队提交的文档。
屏幕上的內容一页页翻过。
算法描述。复杂度分析。数值实验。
然后,他看到了附录。
那里有一段简洁而严谨的证明,从m矩阵的定义出发,逐步推导出不完整cholesky分解的存在性和稳定性条件。
推导过程乾净得像一场外科手术。
主考官看了很久。
然后他转过身,用一种很奇怪的语气说:“中国队。算法设计模块。满分。”
他顿了顿,又补充了一句:“附加分。10分。”
附加分。
这是本届比赛第一次出现附加分。
林枫猛地转过头看陆沉,眼睛瞪得像铜铃。
陆沉只是平静地收拾著桌上的纸笔。
但他的手指,微微收紧了。
不是因为紧张。
是因为他知道,这件事不会就这么结束。
一个十岁的中国孩子,在莫斯科的赛场上,拿出了一套比世界最前沿还要超前的数值算法。
这不是数学竞赛。
这是某种信號。
他抬头看了一眼赛场后方的观察席。
那里坐著几个没有佩戴参赛证件的人。
其中一个,是索科洛夫。
索科洛夫正低头在笔记本上写著什么,似乎感觉到陆沉的目光,抬起头来。
隔著整个赛场的距离,两人再次对视。
索科洛夫合上了笔记本。
他的表情,看不出任何情绪。
但他的眼神,像是在看一件他找了很久的东西。