Current task: —

← Session 24 — ii′-2…4: swaps, (4.10) design, contour + website roadmap fixes

#1288 assistant 2026-08-22 19:38:28.161 UTC · 6193→2518 tok open ⤢
thinking (6892 chars)
`ZeroFactorization` gives the per-zero factorization: f =ᶠ[𝓝 ρ] fun z => (z−ρ)^order · h_ρ with h_ρ analytic and nonvanishing at ρ. And `Cf` is the Blaschke-style cofactor (f/∏). These are for the unit disc (R < 1) — I'll apply to a scaled function. Actually — for my purposes, maybe simpler to build g directly: g(s) := ζ(s) / ∏ₖ(s−ρₖ)^{mₖ} and prove analytic + nonvanishing at each point of the closed disc: - Off the zeros: quotient of analytics with nonzero denominator ✓. - At ρₖ (a collected zero): ζ = (s−ρₖ)^{mₖ}·hₖ near ρₖ (ZeroFactorization-style, or directly from analyticOrderAt machinery: `AnalyticAt.analyticOrderAt_ne_top`... the choose_spec gives the factorization ✓ as seen in ZeroFactorization's proof: `(AnalyticAt_ρ.analyticOrderAt_ne_top.mp finiteOrder).choose_spec` — so from `AnalyticAt ℂ f ρ` + `analyticOrderAt f ρ ≠ ⊤`: ∃ h_ρ analytic at ρ, h_ρ ρ ≠ 0, f =ᶠ[𝓝 ρ] (z−ρ)^n • h_ρ. So g(s) = ζ(s)/∏ = hₖ(s)·∏_{j≠k}(s−ρⱼ)^{−mⱼ} near ρₖ — analytic at ρₖ (each (s−ρⱼ)^{−mⱼ} analytic since ρⱼ ≠ ρₖ) and g(ρₖ) = hₖ(ρₖ)·∏_{j≠k}(ρₖ−ρⱼ)^{−mⱼ} ≠ 0 ✓. The formalization via eventuallyEq + AnalyticAt.congr: near ρₖ, g = (fun s => hₖ s / ∏_{j≠k}(s−ρⱼ)^{mⱼ}) — analytic at ρₖ ✓ and ζ/∏ =ᶠ[𝓝[≠] ρₖ] that — need the punctured→full upgrade (AnalyticAt.congr needs full-nhds eventuallyEq — the values at ρₖ itself: g(ρₖ) = ζ(ρₖ)/∏ = 0/0 = 0 junk!! — the quotient function g AT ρₖ is 0/0 = 0 in Lean's convention — NOT the extended value! So g as defined by the bare quotient is WRONG at the zeros. To define g properly as the analytic continuation, define g piecewise or via the factorization: this is exactly why Zeta23 has the Cf contraption (if z ∈ zeros: ZeroFactor/... else f/∏). Simplest for my use: define g(s) := ζ(s) / ∏ₖ (s−ρₖ)^{mₖ} as the bare function, and note that the ANALYTIC version is the extension; the LogOfAnalyticFunction needs B analytic + nonvanishing on the closed ball — with the bare quotient B FAILS at the zeros (junk 0 → vanishing!). So I need the properly-extended g. Use the Cf-style piecewise or: define g(s) := if ζ(s) = 0 ∧ s ∈ collection then (extended value) else quotient — the extension value at ρₖ: (analyticOrderNatAt-factorization's hₖ)(ρₖ)/∏_{j≠k}(ρₖ−ρⱼ)^{mⱼ} — via classical choose. That's the Cf pattern — copy it. Honestly — the cleanest is to mirror Zeta23's Cf: define my own gFun with the same if-then-else structure and prove analytic via their CfAnalytic pattern (they have CfAnalytic proved for the unit disc!). Their lemmas are for functions on the UNIT ball with f analytic on closedBall 0 1, f(0) ≠ 0, R < 1. So I should TRANSFER my ζ to the unit-disc setting: define F(w) := ζ(s₀ + R·w)?? — with R = 5/2 — then F on the unit ball corresponds to ζ on B(s₀, 2.5). Hmm — but their lemmas have fixed radius-1 structure: SetOfZeros 1 f etc. The rescaling: F(w) = ζ(s₀ + R₀·w) with R₀ = 2.5: F's zeros in unit ball ⟺ ζ's zeros in B(s₀, 2.5). Then Cf/BlaschkeB machinery applies directly. The R < 1 hypotheses: their DiskBound needs R < 1 for the OUTER radius — with the scaling, R_outer = 1, r = r_c/R₀ — hmm their lemmas want r < R < 1 strict — so scale with R₀ slightly bigger: use R₀ = 3: then B(s₀, 3) ⊇ ... hmm wait the |ζ| bound I proved is on B(2+it, 5/2) — scaling to a bigger disc needs the |ζ| bound on the bigger disc — my norm_riemannZeta_le_disc is specifically for 5/2. Meh — the rescaling dance adds friction. ALTERNATIVE: don't use their Cf machinery; build g directly with my own piecewise and prove the properties by hand (the analyticAt quotient + removable-singularity at each zero). The pieces needed: 1. g_def: g(s) := if s ∈ Zc then extValue s else ζ(s)/∏(s−ρₖ)^{mₖ} where Zc = the zero finset. 2. g analytic on the ball: at non-collected points: quotient analytic ✓ (denominator nonzero: s not a zero of... wait — s off the collection could still be a ζ-zero OUTSIDE the collection — hmm — within the DISC B(s₀, 5/2), the ζ-zeros are all collected (collection = all zeros in the disc... my collection was |ρ−s₀| ≤ 2.3 — the annulus (2.3, 2.5] zeros are NOT collected — and at such a point ζ = 0 with denominator ≠ 0 ⟹ g = 0 there — g VANISHES there — BAD for LogOfAnalyticFunction (needs nonvanishing on the full closed ball of radius R). So the collection must be ALL zeros in closedBall(s₀, R). And the circle clearance needs R away from all zero-distances — the gap-pigeonhole: with the collection = zeros in closedBall(s₀, R), the circle |s−s₀| = R must avoid zeros: choose R ∈ [2.4, 2.5] such that no zero has |ρ−s₀| = R — i.e. R avoids the finite distance-value set. THEN on the circle: no zeros ON it ✓ and |s−ρₖ| ≥ |R − dₖ| ≥ δ ✓. So the plan: - Z_all(R) := {ρ ∈ closedBall s₀ R | ζ ρ = 0} — finite (compactness, avoids 1). - Distance-value set D := image of Z_all under ‖·−s₀‖ — finite. - Choose R ∈ [2.4, 2.5] avoiding D by ≥ δ = 1/(2(N+1)) via exists_avoiding_midpoint (ii′-4!) — N = card of D ≤ card Z_all ≤ mult-count... - Collection := Z_all(R) (all zeros in the closed ball); on the circle |s−s₀| = R: no zeros (R ∉ D) ✓ clearance ≥ δ from each collected zero ✓ and no un-collected zeros inside ✓ (Z_all(R) is all of them). Hmm wait — but the |ζ| disc bound I proved is on B(2+it, 5/2) — R ∈ [2.4, 2.5] ⊆ ✓ fine. - g := ζ/∏_{ρ ∈ Z_all(R)}(s−ρ)^{mₚ} with the piecewise extension at collected zeros. Nonvanishing on closedBall(s₀, R): at collected: extension value ≠ 0 ✓; at others: ζ ≠ 0 there (all disc-zeros collected) ✓. This is honest work but standard. The LogOfAnalyticFunction/BorelCaratheodoryDeriv are 0-centered: apply to B(w) := g(s₀ + w). OK — this is a big build (~1+ session). Let me start writing §1 of the ii′-5c part of LiRBound.lean: the collection, R-gap selection, g, analyticity/nonvanishing. I'll keep the constants explicit but loose. Actually — wait. Let me reconsider the scale of what's needed for the LOOSE bound one more time, because the loose bound's only job is the growth input for the identity. The growth argument needs: |ζ′/ζ(s)| ≤ C·(log R)² on the gap circles (right part). Via the disc: |ζ′/ζ − Σ_near m/(s−ρ)| ≤ 100M. Hmm — hold on, do I even need the tight (log t)² form? For the growth argument, ANY explicit bound polynomial in log R works. Hmm, also — one simplification: for the growth argument, maybe skip the center-lower-bound finesse: the BC application needs Re J_g ≤ M on the ball — Re J_g = log|g| − log|g(s₀)| — the −log|g(s₀)| term: |g(s₀)| = |ζ(s₀)|/∏|s₀−ρₖ|^{mₖ} — the center lower bound via 1/ζ = Σμ. If the μ-series is unavailable, alternative: |ζ(2+it)| ≥ c via... the Euler product: log|ζ(2+it)| ≥ −Σ_p log(1+p^{−2})·... = −log(ζ(2)/ζ(4))·... via ∏(1−p^{−s})⁻¹... Mathlib Euler product for ζ: there IS `riemannZeta_eulerProduct`? hmm. Let me just check both at build: (a) 1/ζ = Σ μ(n)/n^s (LSeries moebius); (b) the Euler product. Pick whichever exists. Let me check those two quickly, then start writing the 5c file content.
`ZeroFactorization` provides the per-zero normal form. Now checking the two options for the center lower bound (μ-series or Euler product).
tool: Bash ok
input
{
  "command": "cd D:/Python/Quantum/zeta-23-lean/.lake/packages/mathlib && grep -rn \"LSeries_moebius\\|moebius.*LSeries\\|riemannZeta_inv\\|one_div.*riemannZeta\\|eulerProduct\\|euler_product\" Mathlib/NumberTheory/LSeries/ -r --include=*.lean | grep -i \"theorem\\|lemma\" | head -10",
  "description": "Find moebius LSeries / Euler product lemmas"
}
result 2026-08-22 19:38:28Z → 2026-08-26 07:22:20Z
n=1000: identity resid=5.0e-5 (tol 0.00039) | V_left 8.006/107.6 | H_high 1.106/5.94 | V_right 2.32e-14/2.5e-11 | H_low 7.185/116.0
n=10000: identity resid=4.5e-5 (tol 0.00035) | V_left 16.98/333.0 | H_high 1.094/5.94 | V_right 1.29e-43/3.71e-37 | H_low 16.7/341.4
n=100000: identity resid=2.1e-5 (tol 0.00022) | V_left 26.0/1046.0 | H_high 1.01/5.94 | V_right 2.93e-136/6.89e-120 | H_low 26.23/1054.0
V1 True V2 True V3 True V4 True V5 True V6 True VA 5.0e-10
wrote D:\Python\Quantum\research\numerics\data\E-034-dogleg-validation.csv + D:\Python\Quantum\research\numerics\data\E-034-dogleg-validation.json
"all_checks_pass": true
V6_margin_value,80000.0,margin_DL,13160.089,0,,324912.99,True
V6_margin_value,100000.0,margin_DL,88910.825,0,,344838.45,True
V6_margin_value,1.0e+8,margin_DL,7.7265868e+8,0,,6481350.5,True
V6_margin_value,1.0e+12,margin_DL,1.2395747e+13,0,,8.2359505e+8,True
V6_margin_value,9.0e+24,margin_DL,2.4579624e+26,0,,4.4538916e+15,True
V6_margin_min_on_grid,grid,min margin,13160.1,0,,0.3986,True
raw content_json (database row)
[{"type":"thinking","thinking":"`ZeroFactorization` gives the per-zero factorization: f =ᶠ[𝓝 ρ] fun z => (z−ρ)^order · h_ρ with h_ρ analytic and nonvanishing at ρ. And `Cf` is the Blaschke-style cofactor (f/∏). These are for the unit disc (R < 1) — I'll apply to a scaled function.\n\nActually — for my purposes, maybe simpler to build g directly: g(s) := ζ(s) / ∏ₖ(s−ρₖ)^{mₖ} and prove analytic + nonvanishing at each point of the closed disc:\n- Off the zeros: quotient of analytics with nonzero denominator ✓.\n- At ρₖ (a collected zero): ζ = (s−ρₖ)^{mₖ}·hₖ near ρₖ (ZeroFactorization-style, or directly from analyticOrderAt machinery: `AnalyticAt.analyticOrderAt_ne_top`... the choose_spec gives the factorization ✓ as seen in ZeroFactorization's proof: `(AnalyticAt_ρ.analyticOrderAt_ne_top.mp finiteOrder).choose_spec` — so from `AnalyticAt ℂ f ρ` + `analyticOrderAt f ρ ≠ ⊤`: ∃ h_ρ analytic at ρ, h_ρ ρ ≠ 0, f =ᶠ[𝓝 ρ] (z−ρ)^n • h_ρ. So g(s) = ζ(s)/∏ = hₖ(s)·∏_{j≠k}(s−ρⱼ)^{−mⱼ} near ρₖ — analytic at ρₖ (each (s−ρⱼ)^{−mⱼ} analytic since ρⱼ ≠ ρₖ) and g(ρₖ) = hₖ(ρₖ)·∏_{j≠k}(ρₖ−ρⱼ)^{−mⱼ} ≠ 0 ✓.\n\nThe formalization via eventuallyEq + AnalyticAt.congr: near ρₖ, g = (fun s => hₖ s / ∏_{j≠k}(s−ρⱼ)^{mⱼ}) — analytic at ρₖ ✓ and ζ/∏ =ᶠ[𝓝[≠] ρₖ] that — need the punctured→full upgrade (AnalyticAt.congr needs full-nhds eventuallyEq — the values at ρₖ itself: g(ρₖ) = ζ(ρₖ)/∏ = 0/0 = 0 junk!! — the quotient function g AT ρₖ is 0/0 = 0 in Lean's convention — NOT the extended value! So g as defined by the bare quotient is WRONG at the zeros. To define g properly as the analytic continuation, define g piecewise or via the factorization: this is exactly why Zeta23 has the Cf contraption (if z ∈ zeros: ZeroFactor/... else f/∏).\n\nSimplest for my use: define g(s) := ζ(s) / ∏ₖ (s−ρₖ)^{mₖ} as the bare function, and note that the ANALYTIC version is the extension; the LogOfAnalyticFunction needs B analytic + nonvanishing on the closed ball — with the bare quotient B FAILS at the zeros (junk 0 → vanishing!). So I need the properly-extended g. Use the Cf-style piecewise or: define g(s) := if ζ(s) = 0 ∧ s ∈ collection then (extended value) else quotient — the extension value at ρₖ: (analyticOrderNatAt-factorization's hₖ)(ρₖ)/∏_{j≠k}(ρₖ−ρⱼ)^{mⱼ} — via classical choose. That's the Cf pattern — copy it.\n\nHonestly — the cleanest is to mirror Zeta23's Cf: define my own gFun with the same if-then-else structure and prove analytic via their CfAnalytic pattern (they have CfAnalytic proved for the unit disc!). Their lemmas are for functions on the UNIT ball with f analytic on closedBall 0 1, f(0) ≠ 0, R < 1. So I should TRANSFER my ζ to the unit-disc setting: define F(w) := ζ(s₀ + R·w)?? — with R = 5/2 — then F on the unit ball corresponds to ζ on B(s₀, 2.5). Hmm — but their lemmas have fixed radius-1 structure: SetOfZeros 1 f etc. The rescaling: F(w) = ζ(s₀ + R₀·w) with R₀ = 2.5: F's zeros in unit ball ⟺ ζ's zeros in B(s₀, 2.5). Then Cf/BlaschkeB machinery applies directly. The R < 1 hypotheses: their DiskBound needs R < 1 for the OUTER radius — with the scaling, R_outer = 1, r = r_c/R₀ — hmm their lemmas want r < R < 1 strict — so scale with R₀ slightly bigger: use R₀ = 3: then B(s₀, 3) ⊇ ... hmm wait the |ζ| bound I proved is on B(2+it, 5/2) — scaling to a bigger disc needs the |ζ| bound on the bigger disc — my norm_riemannZeta_le_disc is specifically for 5/2. Meh — the rescaling dance adds friction. \n\nALTERNATIVE: don't use their Cf machinery; build g directly with my own piecewise and prove the properties by hand (the analyticAt quotient + removable-singularity at each zero). The pieces needed:\n1. g_def: g(s) := if s ∈ Zc then extValue s else ζ(s)/∏(s−ρₖ)^{mₖ} where Zc = the zero finset.\n2. g analytic on the ball: at non-collected points: quotient analytic ✓ (denominator nonzero: s not a zero of... wait — s off the collection could still be a ζ-zero OUTSIDE the collection — hmm — within the DISC B(s₀, 5/2), the ζ-zeros are all collected (collection = all zeros in the disc... my collection was |ρ−s₀| ≤ 2.3 — the annulus (2.3, 2.5] zeros are NOT collected — and at such a point ζ = 0 with denominator ≠ 0 ⟹ g = 0 there — g VANISHES there — BAD for LogOfAnalyticFunction (needs nonvanishing on the full closed ball of radius R). So the collection must be ALL zeros in closedBall(s₀, R). And the circle clearance needs R away from all zero-distances — the gap-pigeonhole: with the collection = zeros in closedBall(s₀, R), the circle |s−s₀| = R must avoid zeros: choose R ∈ [2.4, 2.5] such that no zero has |ρ−s₀| = R — i.e. R avoids the finite distance-value set. THEN on the circle: no zeros ON it ✓ and |s−ρₖ| ≥ |R − dₖ| ≥ δ ✓.\n\nSo the plan:\n- Z_all(R) := {ρ ∈ closedBall s₀ R | ζ ρ = 0} — finite (compactness, avoids 1).\n- Distance-value set D := image of Z_all under ‖·−s₀‖ — finite.\n- Choose R ∈ [2.4, 2.5] avoiding D by ≥ δ = 1/(2(N+1)) via exists_avoiding_midpoint (ii′-4!) — N = card of D ≤ card Z_all ≤ mult-count...\n- Collection := Z_all(R) (all zeros in the closed ball); on the circle |s−s₀| = R: no zeros (R ∉ D) ✓ clearance ≥ δ from each collected zero ✓ and no un-collected zeros inside ✓ (Z_all(R) is all of them).\n\nHmm wait — but the |ζ| disc bound I proved is on B(2+it, 5/2) — R ∈ [2.4, 2.5] ⊆ ✓ fine.\n\n- g := ζ/∏_{ρ ∈ Z_all(R)}(s−ρ)^{mₚ} with the piecewise extension at collected zeros. Nonvanishing on closedBall(s₀, R): at collected: extension value ≠ 0 ✓; at others: ζ ≠ 0 there (all disc-zeros collected) ✓.\n\nThis is honest work but standard. The LogOfAnalyticFunction/BorelCaratheodoryDeriv are 0-centered: apply to B(w) := g(s₀ + w).\n\nOK — this is a big build (~1+ session). Let me start writing §1 of the ii′-5c part of LiRBound.lean: the collection, R-gap selection, g, analyticity/nonvanishing. I'll keep the constants explicit but loose.\n\nActually — wait. Let me reconsider the scale of what's needed for the LOOSE bound one more time, because the loose bound's only job is the growth input for the identity. The growth argument needs: |ζ′/ζ(s)| ≤ C·(log R)² on the gap circles (right part). Via the disc: |ζ′/ζ − Σ_near m/(s−ρ)| ≤ 100M. Hmm — hold on, do I even need the tight (log t)² form? For the growth argument, ANY explicit bound polynomial in log R works. \n\nHmm, also — one simplification: for the growth argument, maybe skip the center-lower-bound finesse: the BC application needs Re J_g ≤ M on the ball — Re J_g = log|g| − log|g(s₀)| — the −log|g(s₀)| term: |g(s₀)| = |ζ(s₀)|/∏|s₀−ρₖ|^{mₖ} — the center lower bound via 1/ζ = Σμ. If the μ-series is unavailable, alternative: |ζ(2+it)| ≥ c via... the Euler product: log|ζ(2+it)| ≥ −Σ_p log(1+p^{−2})·... = −log(ζ(2)/ζ(4))·... via ∏(1−p^{−s})⁻¹... Mathlib Euler product for ζ: there IS `riemannZeta_eulerProduct`? hmm. Let me just check both at build: (a) 1/ζ = Σ μ(n)/n^s (LSeries moebius); (b) the Euler product. Pick whichever exists.\n\nLet me check those two quickly, then start writing the 5c file content.","signature":""},{"type":"text","text":"`ZeroFactorization` provides the per-zero normal form. Now checking the two options for the center lower bound (μ-series or Euler product)."},{"type":"tool_use","id":"Bash_333","name":"Bash","input":{"command":"cd D:/Python/Quantum/zeta-23-lean/.lake/packages/mathlib && grep -rn \"LSeries_moebius\\|moebius.*LSeries\\|riemannZeta_inv\\|one_div.*riemannZeta\\|eulerProduct\\|euler_product\" Mathlib/NumberTheory/LSeries/ -r --include=*.lean | grep -i \"theorem\\|lemma\" | head -10","description":"Find moebius LSeries / Euler product lemmas"},"extra_content":null}]