本任务承接细粒度归约与在线接口路线。最终交付四部分:三层图的距离积、原图各次倍增及真实弧见证、逐轮在线更新/查询记录、包含预处理的精确指数预算。
标准库执行器与完整参考输出可离线运行。程序只向stdout输出JSON,不访问网络、不写工作文件;显式检查在优化模式也执行:
python algorithms-fine-grained-check.py > result.json
python -O algorithms-fine-grained-check.py > optimized.json
附件用朴素乘法、Floyd和BFS运行具体实例。其工作量按这些真实算法计算;快速oracle只出现在理论预算中。跑通有限样例不能证明或否定OMv猜想。
1. 把九个矩阵答案送进一张图
使用以下矩阵,JSON中的null代表+∞:
A = [[0,4,null], [-1,2,5], [null,0,3]]
B = [[3,null,1], [2,-2,null], [null,4,0]]
按三层图归约建立顶点0…8:左层0…2,中层3…5,右层6…8。Aᵢₖ的有限项产生i→3+k,Bₖⱼ产生3+k→6+j。完整弧表由输出的product.graph.arcs给出,弧ID与端点分开保存。
你的记录应包含:
- 9个点、13条弧;所有弧只由左到中或由中到右,因此没有负环
- 直接乘法的27次候选检查,以及Floyd结果中左到右的3×3子矩阵
- 第二行第三列为何选中间下标0,而不选下标2
正确乘积为:
[[3,2,1],
[2,0,0],
[2,-2,3]]
最小下标表为[[0,1,0],[0,1,0],[1,1,2]]。例如A₁₀+B₀₂=−1+1=0,对应图路线1→3→8;备选1→5→8费用5。一般快速求解器只承诺距离值时,这份argmin表并非免费附送。
2. 复算1、2、4、8步表
五点图使用独立弧ID:
| ID | 弧 | 权 |
|---|---|---|
| 10 | 0→1 | 4 |
| 11 | 0→1 | 7 |
| 20 | 1→2 | −2 |
| 30 | 0→2 | 8 |
| 40 | 2→3 | 3 |
| 50 | 1→3 | 6 |
| 60 | 3→1 | 0 |
点4孤立。初表的对角含零,0→1取较轻的ID10。按照D←D★D进行三次乘法,允许弧数由1升到2、4、8。每次乘法检查5³=125个候选,总375次;输入7条弧的规范化与各表读写另外收费。
完整四张表在closure.matrices。终表应为:
[[0,4,2,5,null],
[null,0,-2,1,null],
[null,3,0,3,null],
[null,0,-2,0,null],
[null,null,null,null,0]]
请将0→3的见证展开到原弧ID,不能只报顶点距离:[10,20,40],连续经过0→1→2→3,权和4−2+3=5。先前两步表只能得到10;四步表用对角等待容纳三边路线,已经得到真正最短值。
再加一条ID70、3→1、权−2的弧。它与原ID60平行,不能把原记录直接无说明地覆写。新1→2→3→1环权为−1;八步表D[1,1]=−2,输出的负闭合游走是[20,40,70,20,40,70],总费用−2。请解释为何任意负闭合游走必含负简单环,以及为何此时有限的八步表不是扩展实数最短距离。
迁移:无穷与大整数
令一个乘法输入为[[null,-10],[null,null]],另一个为[[-10,null],[null,0]]。用None标记与有限转换product_via_finite分别求积,二者应一致。直接用20当无穷且把小于20的结果当作可达,会从20+(−10)=10编造路线。
有限转换取U为本次两个矩阵中真实有限条目的绝对值上界,H=3U+1;乘完仅将≤2U的结果视为有限。随后把−10换成−(2²⁰⁰+1),同样逐整数精确复算。证明依然成立,但每次加法/比较已不能按普通O(log n)字宽常数成本计。
3. 每轮交付之后才读下一向量
使用矩阵
M = [[1,0,1,0],
[0,1,1,0],
[0,0,0,0],
[1,0,0,1]]
四轮输入依次为1010、0101、0000、1111,输出依次为1101、0101、0000、1101。OMv接口要求当前输出完成以后才揭示下一轮。
附件Protocol.pull()揭示一轮;未submit()完整正确答案便再次pull,会立即报错。你的执行记录应严格交错:reveal0、submit0、reveal1、submit1、reveal2、submit2、reveal3、submit3。实际算法只通过这两个接口前进;测试驱动知道待给数据,不表示求解过程获准预看未来。
直接版本有9个图顶点。s=0,四列是1…4,四行是5…8;矩阵的1形成固定列到行弧。每轮将源边改成当前向量的1,再作四次可达查询。
| 轮次 | 源边修改 | 输出 |
|---|---|---|
| 0 | 插列0、2 | 1101 |
| 1 | 删列0、2;插列1、3 | 0101 |
| 2 | 删列1、3 | 0000 |
| 3 | 插列0、1、2、3 | 1101 |
总12次更新、16次查询。附件actual_baseline_edge_scans统计真实BFS检查过的弧,不能拿理论假想的次线性查询时间替换这个数。
迁移:模型改变应留下反例
将M₂₁从0改成1,保持四轮向量不变。新第2行输出依次为0、1、0、1,而源边更新轨迹仍为12次;改变的是固定矩阵图。
另写一个错误版本,只插入新的源边而不删除。第二轮会残留全部四条源边,得到1101而不是0101。这个失败精确说明全动态接口为什么用到了删除。
最后核布尔语义:首轮第0行有两个共同的1,结果仍为1。若用模2点积,首位就错误变成0。也不能把M转置;源点连列、查询行是归约方向的一部分。
4. 将预处理也写进预算
把M按b=2切成四块,每块建立五点图。每轮的两个长度2向量片段分别送给相应列块,再按行块将两个部分结果取或。输出blocked.transcript保留每块的更新和部分向量。
四轮实际24次更新、32次查询和32次结果位合并;16个矩阵单元各进入一个块。对比直接版本时,不要因操作次数更多就认为归约失败:小块的渐近用途在于使昂贵的预处理发生在更小的实例上。
假设动态结构预处理为N^c、更新和查询均为N^(1−ε),其中c≥2、0<ε≤1为固定常数。令b=⌈n^α⌉,g=⌈n/b⌉,推导:
| 费用 | 未代入b时 | n的指数 |
|---|---|---|
| g²份预处理 | O(n²b^(c−2)) | 2+α(c−2) |
| n轮全部更新/查询 | O(n³b^(−ε)) | 3−αε |
| 合并每块输出 | O(n³/b) | 3−α |
取α=1/(2(c+1))。c=5、ε=1/3时,执行器budget(5,'1/3')返回α=1/12及三个指数9/4、107/36、35/12;保留余量1/72仍可支付O(log n)的独立重复费用。
你的最终说明须指出:每轮仍只使用当前向量;每份结构处理的轮数对b仍为固定多项式;预处理指数c不是随n增长的数;更新和查询两项都真的达到所假定的界。若P(N)=2^N,本项分块证明不适用。
5. 交付与判定标准
一份完整记录包含:
- 三层图与九个乘积值,说明负边为何不破坏该图的无负环承诺
- 四张允许步数表、一条原弧最短见证和负环迁移后的真实负闭合游走
- 八个严格交替的在线协议事件、逐轮源边变化、直接与分块两组真实操作数
- 有限哨兵、矩阵一位变化、错误只插入和模2点积四项结构迁移
- 三项指数费用及随机放大的余量,区分精确数值输出与额外路径输出
细粒度归约保证算法速度按指定预算传递;条件下界还必须另有准确标注的假设。APSP旧假设的研究状态已在等价页按2026-10-05预印本注明,不能从旧讲义抄成未变化的开放问题。普通OMv与带提示矩形任务的接口也须分别阅读。