slime/research/FEASIBILITY_REVIEW.md

5.7 KiB
Raw Blame History

全世界联合搜索的可行性复查

后续已完成 CUDA、随机坐标批处理、坐标类复用及严格拒绝补扫实验,结论见 全流程实验报告。下文保留最初 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_RESULTS.txt。