slime/research/FEASIBILITY_REVIEW.md

94 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 全世界联合搜索的可行性复查
后续已完成 CUDA、随机坐标批处理、坐标类复用及严格拒绝补扫实验,结论见
[全流程实验报告](experiments/full_search_feasibility/REPORT.md)。下文保留最初 CPU 探索记录;后续实测已替代其中尚待验证的 GPU 性能和覆盖结论。
日期:2026-10-11。此轮增加隔离的 CPU 实验,没有替换现有搜索入口。GPU 在当前环境中无法访问,以下新测量全部是 CPU 单线程,不能直接作为 CUDA 加速比。
## 1. 已验证:高 13 位改为逐格区间求交
固定 lower35 后,令 `t = A * upper13 mod 8192`。每格输出为
`q = r + 2^18 * ((b+t) mod 8192)`,其中 `r = q(0) mod 2^18`、`b = q(0) >> 18`。
若 r 为奇数则无首次输出候选;否则该格允许:
- `0 <= t < 8192-b`,`t mod 5 = (r-b) mod 5`;
- `8192-b <= t < 8192`,`t mod 5 = (r-b+2) mod 5`。
首格给出两个不同余数的区间。后续每格对每个现存余数最多允许其中一侧,所以求交后仍然最多两个区间,不需要排序 25 个事件,也不需要分裂出更多区间。任何时刻两个区间都没有整数解,就可以停止检查该 lower35。
锚点 `(51069,419124)`,84 个低 18 位根,完整检查 11,010,048 个 lower35,交替运行三轮:
| 单线程完整候选扫描 | 中位数 |
| --- | ---: |
| 现有排序事件求解器 | 5.34717 秒 |
| 两个区间逐格求交 | 0.239393 秒 |
| 同口径速度比 | 22.34 倍 |
两者每轮完整种子列表一致,均为 24 个。新方法平均每个 lower35 处理 2.58882 格。这是计算区间耗时,不包含低 18 位根生成及进程启动;两个版本采用相同计时范围。新版本还包含统计格子访问量的计数开销。
另外通过 20 个坐标、40,000 个 lower35 的旧/新结果列表对照,以及 128 个 lower35 平面的全部 8192 个高位直接枚举对照(含已知命中平面)。这支持算法替换的可行性,但尚未验证 CUDA 寄存器占用和实际吞吐。
## 2. 已验证:固定坐标可用逆推补齐拒绝重抽分支
Java 首次输出的拒绝区间为 `[2^31-8, 2^31)`。每个输出对应 `2^17` 个完整 LCG 状态,因此每格只有 `8 * 2^17 = 2^20` 个首次拒绝状态。
对每个这种推进后状态 `v`,逆推:
```
u = A_inverse * (v - 11) mod 2^48
world_seed = ((u xor C) - coordinate_term) mod 2^48
```
其中 `A_inverse=0xDFE05BCB1365`、`C=0x5E434E432`。再用完整 Java Random 语义检查全部 25 格。
**覆盖理由:** 任意真实解要么 25 格的首次输出都被接受,此时必在首次输出求解器的候选空间内;要么至少一格首次拒绝,此时必被该格的逆推枚举覆盖。即使后面继续拒绝,也由完整验证处理。因此两个集合取并集、去重,可构成固定坐标的严格完整搜索。
样例补扫 `25 * 2^20 = 26,214,400` 个候选,耗时 0.0968122 秒,未发现额外命中。约 0.239+0.097=0.336 秒是两个计算阶段之和,不是另行测得的端到端时间。现有正式入口尚未接入这个补扫。
## 3. 坐标分布:原来的已知命中点不代表平均坐标
确定性 PRNG 在世界区块范围 `[-1875000,1874999]` 内均匀抽取 4096 对坐标,实心 5×5:
- 3968 对(96.875%)没有首次输出低 18 位根;
- 根数平均 0.535645,中位数和 P95 均为 0,最大 156;
- 全部样本低位筛选耗时 4.17809 秒。
这里是随机抽样,不是对全世界比例的证明;首次输出无根也不排除拒绝重抽产生的解。用已知有 84 根的命中点乘上全世界坐标数,会明显高估该样本分布对应的平均候选工作量。不能把抽样均值或 22.34 倍局部加速直接宣布为全世界搜索总耗时。
## 4. 可用的全局预处理:归一化低位坐标类
令 `s=world_seed+T(x,z) mod 2^48`,把锚点坐标项吸收到有效种子。相对项的低 18 位为
```
Delta(i,j) = A_x*(2*x*i+i*i) + B_x*i
+ A_z*(2*z*j+j*j) + B_z*j (mod 2^18)
```
Java int 回绕及符号扩展不改变这条低 18 位等式。由于 `2*A_x` 含两个因子 2、`2*A_z` 含一个因子 2:
- x 的相对项低位周期为 `2^16`;
- z 的相对项低位周期为 `2^17`。
所以最多 `2^33 = 8,589,934,592` 类,每类可以共享有效种子的低位根表;世界范围平均每类约 1637 个锚点。另用 250,000 个格子的多项式计算核对了周期。
这只能减少低位根生成的重复,不能将该复用倍数乘到完整求解器上。更高位坐标项、Java 回绕产生的差异及世界种子标签仍须处理。也不能用首次输出无根表跳过拒绝重抽补扫。
## 5. 尚未解决的关键问题与下一步
目前有证据支持的落地顺序是:
1. 将两区间求交移植到 CUDA,并在随机坐标批次与已知命中坐标上比较完整结果、总时间。
2. 固定坐标入口接入拒绝尾部逆推补扫,建立严格完整的参考求解器。
3. 全局搜索先测低位坐标类批处理的建表成本、根分布和存储量,避免每坐标重启及重复根生成。
4. 研究在坐标类展开和中间位枚举之前应用多个内部格子的联合约束;必须测包含建表、候选生成、展开和验证的总成本。
第 4 项仍缺少已经验证的算法。之前独立筛轴过早生成大量 X/Z 配对的失败没有被以上局部优化消除。当前可以承诺验证、落地局部改进,不能承诺全世界全部种子目录可在几天或几周内完成。
## 复现
```
g++ -O3 -std=c++17 -march=native -Wall -Wextra research/upper_interval_probe.cpp -o /tmp/upper_interval_probe
/tmp/upper_interval_probe
```
代码:[upper_interval_probe.cpp](upper_interval_probe.cpp)。原始输出:[UPPER_INTERVAL_PROBE_RESULTS.txt](UPPER_INTERVAL_PROBE_RESULTS.txt)。