← Session 8 — Regroup + R-004 finite-height Li theorem; resources atlas ingested
thinking (853 chars)
The recursion is STABLE — dps 293 gives η to 1e-295! So compute_eta's Stieltjes η (dps 293 in the n_max=300 smoke test) was accurate to 1e-295. So η_new[j] for j ≤ 23 is accurate. And j ≥ 24 validated to 1e-117. So η_new is accurate everywhere. But S_f(100)[η_new] = +2.0504 while S_f(100)[η_rec] = −0.6288, and η_new[j] ≡ η_rec[j] for all j ≤ 100?!?!
Hmm wait — did I actually verify η_new for j ≤ 23 against the reference? The earlier comparison only printed j = 20..60 (diffs 1e-25 at j=20-23, attributed to eta_true being dps-100). Let me directly compare η_new[j] (from compute_eta, smoke-test settings full_digits=193) vs ref[j] (dps-2000 recursion) for ALL j = 0..99.
Also possible: the S_f(100) = +2.0504 computation had a bug — it was the smoke test via ns["compute_Sf"](300, eta_str). Let me recompute S_f(100) with η_new parsed at high dps.
Recursion is rock stable (dps 293 → 1e-295). So η_new should be fine everywhere. Direct full-range comparison of compute_eta output vs the dps-2000 reference.
tool: Bash
input
{
"command": "cd /d/Python/Quantum && ./.venv/Scripts/python.exe - <<'EOF'\nsrc = open(\"research/numerics/scripts/E-021-sinf-sf-curve.py\").read()\nsrc = src.replace('if __name__ == \"__main__\":', 'if False:')\nns = {\"__file__\": \"research/numerics/scripts/E-021-sinf-sf-curve.py\"}\nexec(compile(src, \"e21\", \"exec\"), ns)\nzeta_str, fd = ns[\"get_zeta_strings\"](300)\neta_str = ns[\"compute_eta\"](zeta_str, fd)\nimport mpmath as mp, flint\nflint.ctx.prec = 7000\nmp.mp.dps = 2000\ngam = [mp.mpf(flint.acb.stieltjes(k).real.str(1900, radius=False)) for k in range(112)]\nN_=[mp.mpf(0)]*112; D_=[mp.mpf(0)]*112; N_[0]=D_[0]=1\nfor m in range(0,111): D_[m+1]=(-1)**m*gam[m]/mp.factorial(m)\nfor m in range(1,111): N_[m+1]=-(-1)**m*gam[m]/mp.factorial(m-1)\nE=[mp.mpf(0)]*112\nfor k in range(0,112):\n s=N_[k]\n for i in range(1,k+1): s-=D_[i]*E[k-i]\n E[k]=s\nref=[E[k+1] for k in range(111)]\nmp.mp.dps = 800\nprint(\"max |eta_new - ref| by range:\")\nfor lo,hi in ((0,24),(24,60),(60,111)):\n w = max(range(lo,hi), key=lambda j: abs(mp.mpf(eta_str[j])-ref[j]))\n print(f\" j {lo}-{hi-1}: worst j={w}, diff={mp.nstr(abs(mp.mpf(eta_str[w])-ref[w]),3)}\")\n# S_f(100) with eta_new at high dps\nmp.mp.dps = 500\neta = {j: mp.mpf(v) for j,v in eta_str.items()}\ns = mp.mpf(0); c = mp.mpf(1)\nfor j in range(1,101):\n c = c*(100-j+1)/j\n s += c*eta[j-1]\nprint(\"S_f(100) [eta_new] =\", mp.nstr(s,15))\ns = mp.mpf(0); c = mp.mpf(1)\nfor j in range(1,101):\n c = c*(100-j+1)/j\n s += c*ref[j-1]\nprint(\"S_f(100) [ref] =\", mp.nstr(s,15))\nEOF",
"description": "Full eta_new vs dps-2000 reference comparison",
"timeout": 600000
}
raw content_json (database row)
[{"type":"thinking","thinking":"The recursion is STABLE — dps 293 gives η to 1e-295! So compute_eta's Stieltjes η (dps 293 in the n_max=300 smoke test) was accurate to 1e-295. So η_new[j] for j ≤ 23 is accurate. And j ≥ 24 validated to 1e-117. So η_new is accurate everywhere. But S_f(100)[η_new] = +2.0504 while S_f(100)[η_rec] = −0.6288, and η_new[j] ≡ η_rec[j] for all j ≤ 100?!?!\n\nHmm wait — did I actually verify η_new for j ≤ 23 against the reference? The earlier comparison only printed j = 20..60 (diffs 1e-25 at j=20-23, attributed to eta_true being dps-100). Let me directly compare η_new[j] (from compute_eta, smoke-test settings full_digits=193) vs ref[j] (dps-2000 recursion) for ALL j = 0..99.\n\nAlso possible: the S_f(100) = +2.0504 computation had a bug — it was the smoke test via ns[\"compute_Sf\"](300, eta_str). Let me recompute S_f(100) with η_new parsed at high dps.","signature":""},{"type":"text","text":"Recursion is rock stable (dps 293 → 1e-295). So η_new should be fine everywhere. Direct full-range comparison of compute_eta output vs the dps-2000 reference."},{"type":"tool_use","id":"Bash_52","name":"Bash","input":{"command":"cd /d/Python/Quantum && ./.venv/Scripts/python.exe - <<'EOF'\nsrc = open(\"research/numerics/scripts/E-021-sinf-sf-curve.py\").read()\nsrc = src.replace('if __name__ == \"__main__\":', 'if False:')\nns = {\"__file__\": \"research/numerics/scripts/E-021-sinf-sf-curve.py\"}\nexec(compile(src, \"e21\", \"exec\"), ns)\nzeta_str, fd = ns[\"get_zeta_strings\"](300)\neta_str = ns[\"compute_eta\"](zeta_str, fd)\nimport mpmath as mp, flint\nflint.ctx.prec = 7000\nmp.mp.dps = 2000\ngam = [mp.mpf(flint.acb.stieltjes(k).real.str(1900, radius=False)) for k in range(112)]\nN_=[mp.mpf(0)]*112; D_=[mp.mpf(0)]*112; N_[0]=D_[0]=1\nfor m in range(0,111): D_[m+1]=(-1)**m*gam[m]/mp.factorial(m)\nfor m in range(1,111): N_[m+1]=-(-1)**m*gam[m]/mp.factorial(m-1)\nE=[mp.mpf(0)]*112\nfor k in range(0,112):\n s=N_[k]\n for i in range(1,k+1): s-=D_[i]*E[k-i]\n E[k]=s\nref=[E[k+1] for k in range(111)]\nmp.mp.dps = 800\nprint(\"max |eta_new - ref| by range:\")\nfor lo,hi in ((0,24),(24,60),(60,111)):\n w = max(range(lo,hi), key=lambda j: abs(mp.mpf(eta_str[j])-ref[j]))\n print(f\" j {lo}-{hi-1}: worst j={w}, diff={mp.nstr(abs(mp.mpf(eta_str[w])-ref[w]),3)}\")\n# S_f(100) with eta_new at high dps\nmp.mp.dps = 500\neta = {j: mp.mpf(v) for j,v in eta_str.items()}\ns = mp.mpf(0); c = mp.mpf(1)\nfor j in range(1,101):\n c = c*(100-j+1)/j\n s += c*eta[j-1]\nprint(\"S_f(100) [eta_new] =\", mp.nstr(s,15))\ns = mp.mpf(0); c = mp.mpf(1)\nfor j in range(1,101):\n c = c*(100-j+1)/j\n s += c*ref[j-1]\nprint(\"S_f(100) [ref] =\", mp.nstr(s,15))\nEOF","description":"Full eta_new vs dps-2000 reference comparison","timeout":600000},"extra_content":null}]