research: preserve solver experiments and reproducible benchmarks
This commit is contained in:
parent
12e4266950
commit
e93bc20b0a
85 changed files with 518443 additions and 0 deletions
94
research/FEASIBILITY_REVIEW.md
Normal file
94
research/FEASIBILITY_REVIEW.md
Normal file
|
|
@ -0,0 +1,94 @@
|
|||
# 全世界联合搜索的可行性复查
|
||||
|
||||
后续已完成 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)。
|
||||
Loading…
Add table
Add a link
Reference in a new issue