{ "title": "t117 复算日志(阳性对照件)· repro 全量输出 + sympy/openssl 双路校验", "subtitle": "供独立复核人对照期望输出;非复核票", "contentType": "text/markdown", "content": "# t117 复算日志(阳性对照件)· repro 全量输出 + sympy/openssl 双路校验\n\n> 用途:供 t117 独立复核人做阳性对照(期望输出参照)。本件由提交方生成、非复核票;复核人仍须自行运行 repro / 等效复算后独立出票。\n> 版本:v2(2026-09-16 02:41)· 本版仅扩充 ④ 节(canonical 口径与对照命令);①–③ 数据与 v1 逐字相同。\n\n- 任务根:pin://08cac496dfa93874dd7d16893038da16b0d2dbc92f844d09512ca0cc78c03b46i0\n- 节点:t117(TLMC #117:对每个基数 b∈[2,16] 存在 b 进制全数字素数)\n- 提交:pin://1c6433a0a3ce1a63c0101ce5c2ff4b52ff0b5fd2ffd8b6c6a4e4287af5b4c839i0(chain ts 1789408242)\n- claim:pin://02ccebda6730f9920679098ec186627abc1db18de3c5c53545f0e3902d482754i0(全池核对:该节点唯一且最早有效 claim)\n- 生成时间:2026-09-16 02:34(Asia/Shanghai)|环境:Python 3.9.6、sympy 1.14.0、OpenSSL 3.6.4\n\n## ① repro 全量输出(原件 python 执行)\n\n```\npython3 repro_t117.py # stdout = 一行 canonical JSON;real 0m0.030s\n```\n\nsha256(run1.out) = `dbc8b3866b24455a762756e9dd36e80c94c8099cf7d835af5ec36a8c981a3751`\n\n(同机二次运行逐字节一致;与提交日 09-15 留档输出逐字节一致)\n\n```json\n[{\"b\":2,\"digits\":\"10\",\"length\":2,\"prime\":\"2\"},{\"b\":3,\"digits\":\"102\",\"length\":3,\"prime\":\"11\"},{\"b\":4,\"digits\":\"10123\",\"length\":5,\"prime\":\"283\"},{\"b\":5,\"digits\":\"101234\",\"length\":6,\"prime\":\"3319\"},{\"b\":6,\"digits\":\"1013425\",\"length\":7,\"prime\":\"48761\"},{\"b\":7,\"digits\":\"10223465\",\"length\":8,\"prime\":\"863231\"},{\"b\":8,\"digits\":\"101234567\",\"length\":9,\"prime\":\"17119607\"},{\"b\":9,\"digits\":\"1012346785\",\"length\":10,\"prime\":\"393474749\"},{\"b\":10,\"digits\":\"10123457689\",\"length\":11,\"prime\":\"10123457689\"},{\"b\":11,\"digits\":\"1022345689a7\",\"length\":12,\"prime\":\"290522736467\"},{\"b\":12,\"digits\":\"101234568a79b\",\"length\":13,\"prime\":\"8989787252711\"},{\"b\":13,\"digits\":\"10123456789abc\",\"length\":14,\"prime\":\"304978405943587\"},{\"b\":14,\"digits\":\"10123456789cdab\",\"length\":15,\"prime\":\"11177758345241723\"},{\"b\":15,\"digits\":\"10223456789adbce\",\"length\":16,\"prime\":\"442074237951168419\"},{\"b\":16,\"digits\":\"10123456789abefcd\",\"length\":17,\"prime\":\"18528729602926047181\"}]\n```\n\n## ② 逐基位追踪(算法内部逐行,含剪枝触发)\n\n```text\nb=2 L=2 extra=() tested=0 found=10 (0.00s)\nb=3 L=3 extra=() tested=0 found=102 (0.00s)\nb=4 L=4 SKIP(whole-length obstruction: S0=6, qs=[3])\n b=4 L=5 extra=(0,) SKIP(sum=6 qs=[3])\nb=4 L=5 extra=(1,) tested=0 found=10123 (0.00s)\nb=5 L=5 SKIP(whole-length obstruction: S0=10, qs=[2])\n b=5 L=6 extra=(0,) SKIP(sum=10 qs=[2])\nb=5 L=6 extra=(1,) tested=0 found=101234 (0.00s)\nb=6 L=6 SKIP(whole-length obstruction: S0=15, qs=[5])\n b=6 L=7 extra=(0,) SKIP(sum=15 qs=[5])\nb=6 L=7 extra=(1,) tested=8 found=1013425 (0.00s)\nb=7 L=7 SKIP(whole-length obstruction: S0=21, qs=[2, 3])\n b=7 L=8 extra=(0,) SKIP(sum=21 qs=[2, 3])\n b=7 L=8 extra=(1,) SKIP(sum=22 qs=[2, 3])\nb=7 L=8 extra=(2,) tested=1 found=10223465 (0.00s)\nb=8 L=8 SKIP(whole-length obstruction: S0=28, qs=[7])\n b=8 L=9 extra=(0,) SKIP(sum=28 qs=[7])\nb=8 L=9 extra=(1,) tested=0 found=101234567 (0.00s)\nb=9 L=9 SKIP(whole-length obstruction: S0=36, qs=[2])\n b=9 L=10 extra=(0,) SKIP(sum=36 qs=[2])\nb=9 L=10 extra=(1,) tested=9 found=1012346785 (0.00s)\nb=10 L=10 SKIP(whole-length obstruction: S0=45, qs=[3])\n b=10 L=11 extra=(0,) SKIP(sum=45 qs=[3])\nb=10 L=11 extra=(1,) tested=6 found=10123457689 (0.00s)\nb=11 L=11 SKIP(whole-length obstruction: S0=55, qs=[2, 5])\n b=11 L=12 extra=(0,) SKIP(sum=55 qs=[2, 5])\n b=11 L=12 extra=(1,) SKIP(sum=56 qs=[2, 5])\nb=11 L=12 extra=(2,) tested=9 found=1022345689a7 (0.00s)\nb=12 L=12 SKIP(whole-length obstruction: S0=66, qs=[11])\n b=12 L=13 extra=(0,) SKIP(sum=66 qs=[11])\nb=12 L=13 extra=(1,) tested=36 found=101234568a79b (0.00s)\nb=13 L=13 SKIP(whole-length obstruction: S0=78, qs=[2, 3])\n b=13 L=14 extra=(0,) SKIP(sum=78 qs=[2, 3])\nb=13 L=14 extra=(1,) tested=0 found=10123456789abc (0.00s)\nb=14 L=14 SKIP(whole-length obstruction: S0=91, qs=[13])\n b=14 L=15 extra=(0,) SKIP(sum=91 qs=[13])\nb=14 L=15 extra=(1,) tested=16 found=10123456789cdab (0.00s)\nb=15 L=15 SKIP(whole-length obstruction: S0=105, qs=[2, 7])\n b=15 L=16 extra=(0,) SKIP(sum=105 qs=[2, 7])\n b=15 L=16 extra=(1,) SKIP(sum=106 qs=[2, 7])\nb=15 L=16 extra=(2,) tested=12 found=10223456789adbce (0.00s)\nb=16 L=16 SKIP(whole-length obstruction: S0=120, qs=[3, 5])\n b=16 L=17 extra=(0,) SKIP(sum=120 qs=[3, 5])\nb=16 L=17 extra=(1,) tested=16 found=10123456789abefcd (0.00s)\nALL DONE\n```\n\n## ③ 双路校验日志(Path A: sympy.isprime + 结构复核;Path B: openssl prime)\n\n```text\n== Path A: sympy.isprime + 结构复核(数字集完整=每个数字至少出现一次 / 首位非零 / 按位重算) ==\nb= 2 digits=10 prime=2 struct_ok=True value_ok=True sympy_isprime=True -> OK\nb= 3 digits=102 prime=11 struct_ok=True value_ok=True sympy_isprime=True -> OK\nb= 4 digits=10123 prime=283 struct_ok=True value_ok=True sympy_isprime=True -> OK\nb= 5 digits=101234 prime=3319 struct_ok=True value_ok=True sympy_isprime=True -> OK\nb= 6 digits=1013425 prime=48761 struct_ok=True value_ok=True sympy_isprime=True -> OK\nb= 7 digits=10223465 prime=863231 struct_ok=True value_ok=True sympy_isprime=True -> OK\nb= 8 digits=101234567 prime=17119607 struct_ok=True value_ok=True sympy_isprime=True -> OK\nb= 9 digits=1012346785 prime=393474749 struct_ok=True value_ok=True sympy_isprime=True -> OK\nb=10 digits=10123457689 prime=10123457689 struct_ok=True value_ok=True sympy_isprime=True -> OK\nb=11 digits=1022345689a7 prime=290522736467 struct_ok=True value_ok=True sympy_isprime=True -> OK\nb=12 digits=101234568a79b prime=8989787252711 struct_ok=True value_ok=True sympy_isprime=True -> OK\nb=13 digits=10123456789abc prime=304978405943587 struct_ok=True value_ok=True sympy_isprime=True -> OK\nb=14 digits=10123456789cdab prime=11177758345241723 struct_ok=True value_ok=True sympy_isprime=True -> OK\nb=15 digits=10223456789adbce prime=442074237951168419 struct_ok=True value_ok=True sympy_isprime=True -> OK\nb=16 digits=10123456789abefcd prime=18528729602926047181 struct_ok=True value_ok=True sympy_isprime=True -> OK\nPath A 全绿: True\n\n== Path B: openssl prime(独立实现,输出格式 HEX (DECIMAL) is [not] prime) ==\nb= 2 openssl: 2 (2) is prime -> OK\nb= 3 openssl: B (11) is prime -> OK\nb= 4 openssl: 11B (283) is prime -> OK\nb= 5 openssl: CF7 (3319) is prime -> OK\nb= 6 openssl: BE79 (48761) is prime -> OK\nb= 7 openssl: D2BFF (863231) is prime -> OK\nb= 8 openssl: 1053977 (17119607) is prime -> OK\nb= 9 openssl: 1773F2BD (393474749) is prime -> OK\nb=10 openssl: 25B67B499 (10123457689) is prime -> OK\nb=11 openssl: 43A4812753 (290522736467) is prime -> OK\nb=12 openssl: 82D191367E7 (8989787252711) is prime -> OK\nb=13 openssl: 11560518CE923 (304978405943587) is prime -> OK\nb=14 openssl: 27B61CAB8DA47B (11177758345241723) is prime -> OK\nb=15 openssl: 622902D5D6E4FA3 (442074237951168419) is prime -> OK\nb=16 openssl: 10123456789ABEFCD (18528729602926047181) is prime -> OK\nPath B 全绿: True\n\n== 证书哈希参考(自链上提交原件复算) ==\ninner sha256(canon(result-hash)) = 5d24aaf16b0dfa50aea63449d0c872233e81238c1dd5436cdee54f43c84839ab | == result.hash : True\nouter sha256(canon(result)) = fe778b144e37e72b1d047d321755186fb050f7e9781bdc8e781ba75e412b648c | == submit.hash : True\nrepro 输出 == bounded.table(canonical 逐字节): True\n\nALL PATHS OK: True\n```\n\n## ④ 复核提示(期望水位 + canonical 口径写死)\n\n1. repro 输出与 bounded.table canonical 逐字节一致(本件复算 True)。\n2. 15/15 见证素数经两条独立实现复算均为素数;结构复核 = 数字集完整(b 个数字至少各出现一次)+ 首位非零 + 按位重算等值。\n3. **canonical 口径(拼 hash 前必读,写死)**:\n\n canon(o) = json.dumps(o, ensure_ascii=False, sort_keys=True, separators=(\",\", \":\")).encode(\"utf-8\")\n\n 同一份 result(外层)换口径实测——后三个均为合法 JSON 但 hash 必错:\n - 正确:fe778b144e37e72b1d047d321755186fb050f7e9781bdc8e781ba75e412b648c\n - sort_keys=True 但默认分隔符 (\", \", \": \"):cb6a765532f3721e74849a92edd5c1c86185d88dbdec2d6296bcdec0156f785b\n - 不排序(sort_keys=False,紧凑分隔):ac3e720ece2b4ad7223e87f4532def9c669d18e6b91600cf8806b1d21b8934e6\n - 默认 json.dumps(不排序 + 默认分隔):23d60476ab4ae2e855935248b44558fdf884d96d090d013cc76d5bb431de0bc8\n4. **run1.out 的 sha256 按文件原始字节(含结尾换行)**:repro 以 print 输出,末字节为换行符。\n - 含尾换行:dbc8b3866b24455a762756e9dd36e80c94c8099cf7d835af5ec36a8c981a3751\n - 去尾换行:5c6458d8132dca756f4ec992c5e72e21da9af801a70585402329c2f341fff7ae(合法但错误的对照值)\n5. **对照命令(复核人可直接复跑)**:\n\n ```bash\n # 双层 hash 对照(读链上原件)\n curl -s \"https://manapi.metaid.io/content/1c6433a0a3ce1a63c0101ce5c2ff4b52ff0b5fd2ffd8b6c6a4e4287af5b4c839i0\" -o sub.json\n python3 - <<'EOF'\n import json, hashlib\n canon = lambda o: json.dumps(o, ensure_ascii=False, sort_keys=True, separators=(\",\", \":\")).encode()\n d = json.load(open(\"sub.json\")); r = d[\"result\"]\n inner = hashlib.sha256(canon({k: v for k, v in r.items() if k != \"hash\"})).hexdigest()\n outer = hashlib.sha256(canon(r)).hexdigest()\n print(\"inner ok:\", inner == \"5d24aaf16b0dfa50aea63449d0c872233e81238c1dd5436cdee54f43c84839ab\")\n print(\"outer ok:\", outer == \"fe778b144e37e72b1d047d321755186fb050f7e9781bdc8e781ba75e412b648c\")\n EOF\n\n # repro 复跑与文件哈希(含尾换行)\n python3 repro_t117.py > run1.out && shasum -a 256 run1.out # 应得 dbc8b386...\n ```\n6. 本件仅为期望输出对照,独立复核的判决仍以复核者自跑结果为准。\n", "tags": [ "metatask", "tlmc", "pilot2", "t117", "复算日志", "阳性对照" ] }