← Session 28 — ii′-5e: partial-fraction identity (zero series + F entire)
thinking (5477 chars)
Good. Infrastructure is clear:
- Subtype: `{ρ : ℂ // IsNontrivialZero ρ}`, `IsNontrivialZero ρ := riemannZeta ρ = 0 ∧ 0 < ρ.re ∧ ρ.re < 1`.
- `zeroMult ρ := (analyticOrderAt riemannZeta ρ).toNat`, and `zetaSeam.one_le_mult : 1 ≤ zeroMult ρ` for nontrivial zeros.
- `WeilEF.zero_sum_inv_sq zetaSeam : Summable (fun ρ : (zetaZeros zetaSeam).carrier => ...)`. Note: `(zetaZeros zetaSeam).carrier` is a Set whose coercion gives a subtype; and `zetaZeros_carrier : (zetaZeros hs).carrier = {ρ | IsNontrivialZero ρ}`. In LiSwaps/LiSkeleton they applied `(WeilEF.zero_sum_inv_sq zetaSeam).mul_left ...` directly to functions on `{ρ : ℂ // IsNontrivialZero ρ}` — the carrier subtype is defeq to the IsNontrivialZero subtype.
Now for 5e-iii I need to create LiSeries.lean with:
1. `seriesTerm (s : ℂ) (ρ : {ρ // IsNontrivialZero ρ}) : ℂ := (zeroMult ρ : ℂ) * (1 / (s - ρ) + 1 / ρ)`
2. `seriesFun s := ∑' ρ, seriesTerm s ρ`
3. Summability at each s: bound for ‖ρ‖ large: ‖1/(s−ρ) + 1/ρ‖ = ‖s/(ρ(s−ρ))‖ ≤ 2‖s‖/‖ρ‖² when ‖ρ‖ ≥ 2‖s‖+... Actually the condition: ‖ρ‖ ≥ 2‖s‖ ⟹ ‖s−ρ‖ ≥ ‖ρ‖−‖s‖ ≥ ‖ρ‖/2, so ‖1/(s−ρ)+1/ρ‖ = ‖s‖/(‖ρ‖‖s−ρ‖) ≤ 2‖s‖/‖ρ‖². Then compare with the dominator (9/2)-style: mult/‖ρ‖² ≤ mult·C/(1+‖γ‖²)? From `normSq_gammaOf_le_mul_norm_sq`-style: for re ∈ (0,1), 1+‖γ‖² ≤ (some const)·‖ρ‖² when ‖ρ‖ ≥ 1 say. Actually in LiSkeleton they proved `normSq_gammaOf_le_mul_norm_sq` for 2n ≤ ‖z‖ with n ≥ 1: 1 + ‖γ‖² ≤ (9/4)‖ρ‖². For the series I need the reverse comparison: 1/‖ρ‖² ≤ C/(1+‖γ‖²). Since ‖γ‖² = (re−1/2)²+ im²... wait gammaOf ρ = (ρ − 1/2)/I so γ.re = im, γ.im = 1/2 − re... Actually normSq (gammaOf z) = z.im² + (1/2 − z.re)². And ‖ρ‖² = re² + im². With re ∈ (0,1): ‖ρ‖² ≤ 1 + im² and 1+‖γ‖² = 1 + im² + (1/2−re)² ≥ ... For comparison: 1 + ‖γ‖² vs ‖ρ‖²: ‖ρ‖² = re² + im² ≤ 1 + im² ≤ 1 + ‖γ‖² + ... hmm ‖γ‖² = im² + (1/2−re)² ≥ im². So ‖ρ‖² ≤ re² + ‖γ‖² ≤ 1 + ‖γ‖². So 1/‖ρ‖² ≥ 1/(1+‖γ‖²) — wrong direction. I need 1/‖ρ‖² ≤ C/(1+‖γ‖²), i.e. 1+‖γ‖² ≤ C‖ρ‖². 1 + im² + (1/2−re)² ≤ 1 + im² + 1/4. And ‖ρ‖² = re² + im². For ‖ρ‖ ≥ 2: im² ≥ ‖ρ‖² − 1 ≥ ‖ρ‖²/2·... Let's do: ‖ρ‖ ≥ 2 ⟹ im² = ‖ρ‖² − re² ≥ ‖ρ‖² − 1 ≥ ‖ρ‖²/2 (since ‖ρ‖² ≥ 2 ⟹ ‖ρ‖²/2 ≥ 1... wait ‖ρ‖ ≥ 2 ⟹ ‖ρ‖² ≥ 4, so ‖ρ‖² − 1 ≥ (3/4)‖ρ‖²). Then 1 + ‖γ‖² ≤ 5/4 + im² ≤ 5/4·(something)... simpler: 1 + ‖γ‖² ≤ 1 + im² + 1/4 ≤ (5/4) + im². And im² ≥ (3/4)‖ρ‖² when ‖ρ‖ ≥ 2. Hmm 5/4 ≤ (5/4)·‖ρ‖²/4·... For ‖ρ‖ ≥ 2: 1 + ‖γ‖² = 1 + im² + (1/2−re)² ≤ 1 + im² + 1 ≤ im² + 2. With im² ≥ 3 (since ‖ρ‖² ≥ 4 ⟹ im² ≥ 3): 1+‖γ‖² ≤ im² + 2 ≤ im² + (2/3)im² = (5/3)im² ≤ (5/3)‖ρ‖². So 1/‖ρ‖² ≤ (5/3)/(1+‖γ‖²) for ‖ρ‖ ≥ 2. Fine — explicit constant.
Then: ‖seriesTerm s ρ‖ = mult·‖1/(s−ρ)+1/ρ‖ ≤ mult·2‖s‖/‖ρ‖² ≤ mult·2‖s‖·(5/3)/(1+‖γ‖²) for ‖ρ‖ ≥ max 2 (2‖s‖). The dominator: (10/3)‖s‖·mult/(1+‖γ‖²) — summable by zero_sum_inv_sq.mul_left. The finite head: {ρ : ‖ρ‖ < max 2 (2‖s‖)} finite via the IsCompact.inter pattern (exactly as liSummable). Then `Summable.of_norm_bounded` with the D-if pattern — actually simpler to copy the liSummable skeleton verbatim: define D with if, show finite support difference, etc. Actually there's an easier standard approach: `Summable.of_norm_bounded` needs a dominating summable on ALL ρ, so use the D-function trick exactly like liSummable. I'll clone that.
2'. Actually also need to handle s possibly equal to a zero? Summability statement: at each s (any s!), the terms 1/(s−ρ) are fine pointwise as long as s ≠ ρ... if s = ρ₀ a zero, that term is 1/0 = 0 in Lean's junk convention, and the rest of the series still converges. So actually summability holds for ALL s unconditionally (junk term harmless). But cleaner: state summability for all s, no hypothesis needed. For the eventual F-entirety argument the series-minus-term matters, fine.
3. Analytic on ℂ ∖ zeros: approach — for each s₀ ∉ zeros, take a ball B(s₀, δ) disjoint from zeros (zeros closed: the zero set `riemannZetaZeros` is closed? It's defined as ζ⁻¹'({0}) minus...? Let me check `riemannZetaZeros` def. In Mathlib: `riemannZetaZeros : Set ℂ := {s | riemannZeta s = 0} \ {s | ∃ n : ℕ, s = -2 * (n + 1)}`? Something like that. Mathlib has `riemannZetaZeros` and `isClosed_riemannZetaZeros`? Hmm. Actually `IsCompact.inter_riemannZetaZeros_finite` exists (used above). Let me check its statement — it's in Mathlib presumably as `IsCompact.inter_riemannZetaZeros_finite`? It was used unqualified in LiSkeleton — likely from Mathlib (riemann zeta file) — yes, Mathlib has `riemannZetaZeros` and finiteness in compact sets (used for the argument principle). Let me check whether Mathlib has closedness.
For analyticity: standard route in this codebase (journal-020/021-banked): partial sums are analytic; locally uniform limit on the open set; then `DifferentiableOn` of the limit via TendstoLocallyUniformlyOn → then analyticOnNhd via `DifferentiableOn.analyticAt`? In Mathlib: `DifferentiableOn.analyticOnNhd`? Hmm, there is `DifferentiableOn.analyticOn` / for ℂ: `DifferentiableOn.analyticOnNhd (hd : DifferentiableOn ℂ f s) (hs : IsOpen s) : AnalyticOnNhd ℂ f s` — I believe Mathlib has `DifferentiableOn.analyticOnNhd`. And locally-uniform limit of differentiable functions: Mathlib has `TendstoLocallyUniformlyOn.differentiableOn`? Hmm — there's `TendstoLocallyUniformlyOn.deriv`... In LiDigamma.lean (session 020) they built the digamma series and proved analyticity — let me look at the exact machinery used there to copy it.
Let me grep LiDigamma.lean / LiArchimedean.lean for TendstoLocallyUniformlyOn.
Now let me study the locally-uniform-limit machinery banked in session 020 (LiDigamma/LiArchimedean) — that's the pattern for the analyticity part.
tool: Grep
input
{
"pattern": "TendstoLocallyUniformly|DifferentiableOn.analytic|analyticOnNhd|AnalyticOn",
"path": "D:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1\\LiDigamma.lean",
"output_mode": "content",
"-n": true,
"head_limit": 40
}
raw content_json (database row)
[{"type":"thinking","thinking":"Good. Infrastructure is clear:\n- Subtype: `{ρ : ℂ // IsNontrivialZero ρ}`, `IsNontrivialZero ρ := riemannZeta ρ = 0 ∧ 0 < ρ.re ∧ ρ.re < 1`.\n- `zeroMult ρ := (analyticOrderAt riemannZeta ρ).toNat`, and `zetaSeam.one_le_mult : 1 ≤ zeroMult ρ` for nontrivial zeros.\n- `WeilEF.zero_sum_inv_sq zetaSeam : Summable (fun ρ : (zetaZeros zetaSeam).carrier => ...)`. Note: `(zetaZeros zetaSeam).carrier` is a Set whose coercion gives a subtype; and `zetaZeros_carrier : (zetaZeros hs).carrier = {ρ | IsNontrivialZero ρ}`. In LiSwaps/LiSkeleton they applied `(WeilEF.zero_sum_inv_sq zetaSeam).mul_left ...` directly to functions on `{ρ : ℂ // IsNontrivialZero ρ}` — the carrier subtype is defeq to the IsNontrivialZero subtype.\n\nNow for 5e-iii I need to create LiSeries.lean with:\n\n1. `seriesTerm (s : ℂ) (ρ : {ρ // IsNontrivialZero ρ}) : ℂ := (zeroMult ρ : ℂ) * (1 / (s - ρ) + 1 / ρ)`\n2. `seriesFun s := ∑' ρ, seriesTerm s ρ`\n3. Summability at each s: bound for ‖ρ‖ large: ‖1/(s−ρ) + 1/ρ‖ = ‖s/(ρ(s−ρ))‖ ≤ 2‖s‖/‖ρ‖² when ‖ρ‖ ≥ 2‖s‖+... Actually the condition: ‖ρ‖ ≥ 2‖s‖ ⟹ ‖s−ρ‖ ≥ ‖ρ‖−‖s‖ ≥ ‖ρ‖/2, so ‖1/(s−ρ)+1/ρ‖ = ‖s‖/(‖ρ‖‖s−ρ‖) ≤ 2‖s‖/‖ρ‖². Then compare with the dominator (9/2)-style: mult/‖ρ‖² ≤ mult·C/(1+‖γ‖²)? From `normSq_gammaOf_le_mul_norm_sq`-style: for re ∈ (0,1), 1+‖γ‖² ≤ (some const)·‖ρ‖² when ‖ρ‖ ≥ 1 say. Actually in LiSkeleton they proved `normSq_gammaOf_le_mul_norm_sq` for 2n ≤ ‖z‖ with n ≥ 1: 1 + ‖γ‖² ≤ (9/4)‖ρ‖². For the series I need the reverse comparison: 1/‖ρ‖² ≤ C/(1+‖γ‖²). Since ‖γ‖² = (re−1/2)²+ im²... wait gammaOf ρ = (ρ − 1/2)/I so γ.re = im, γ.im = 1/2 − re... Actually normSq (gammaOf z) = z.im² + (1/2 − z.re)². And ‖ρ‖² = re² + im². With re ∈ (0,1): ‖ρ‖² ≤ 1 + im² and 1+‖γ‖² = 1 + im² + (1/2−re)² ≥ ... For comparison: 1 + ‖γ‖² vs ‖ρ‖²: ‖ρ‖² = re² + im² ≤ 1 + im² ≤ 1 + ‖γ‖² + ... hmm ‖γ‖² = im² + (1/2−re)² ≥ im². So ‖ρ‖² ≤ re² + ‖γ‖² ≤ 1 + ‖γ‖². So 1/‖ρ‖² ≥ 1/(1+‖γ‖²) — wrong direction. I need 1/‖ρ‖² ≤ C/(1+‖γ‖²), i.e. 1+‖γ‖² ≤ C‖ρ‖². 1 + im² + (1/2−re)² ≤ 1 + im² + 1/4. And ‖ρ‖² = re² + im². For ‖ρ‖ ≥ 2: im² ≥ ‖ρ‖² − 1 ≥ ‖ρ‖²/2·... Let's do: ‖ρ‖ ≥ 2 ⟹ im² = ‖ρ‖² − re² ≥ ‖ρ‖² − 1 ≥ ‖ρ‖²/2 (since ‖ρ‖² ≥ 2 ⟹ ‖ρ‖²/2 ≥ 1... wait ‖ρ‖ ≥ 2 ⟹ ‖ρ‖² ≥ 4, so ‖ρ‖² − 1 ≥ (3/4)‖ρ‖²). Then 1 + ‖γ‖² ≤ 5/4 + im² ≤ 5/4·(something)... simpler: 1 + ‖γ‖² ≤ 1 + im² + 1/4 ≤ (5/4) + im². And im² ≥ (3/4)‖ρ‖² when ‖ρ‖ ≥ 2. Hmm 5/4 ≤ (5/4)·‖ρ‖²/4·... For ‖ρ‖ ≥ 2: 1 + ‖γ‖² = 1 + im² + (1/2−re)² ≤ 1 + im² + 1 ≤ im² + 2. With im² ≥ 3 (since ‖ρ‖² ≥ 4 ⟹ im² ≥ 3): 1+‖γ‖² ≤ im² + 2 ≤ im² + (2/3)im² = (5/3)im² ≤ (5/3)‖ρ‖². So 1/‖ρ‖² ≤ (5/3)/(1+‖γ‖²) for ‖ρ‖ ≥ 2. Fine — explicit constant.\n\n Then: ‖seriesTerm s ρ‖ = mult·‖1/(s−ρ)+1/ρ‖ ≤ mult·2‖s‖/‖ρ‖² ≤ mult·2‖s‖·(5/3)/(1+‖γ‖²) for ‖ρ‖ ≥ max 2 (2‖s‖). The dominator: (10/3)‖s‖·mult/(1+‖γ‖²) — summable by zero_sum_inv_sq.mul_left. The finite head: {ρ : ‖ρ‖ < max 2 (2‖s‖)} finite via the IsCompact.inter pattern (exactly as liSummable). Then `Summable.of_norm_bounded` with the D-if pattern — actually simpler to copy the liSummable skeleton verbatim: define D with if, show finite support difference, etc. Actually there's an easier standard approach: `Summable.of_norm_bounded` needs a dominating summable on ALL ρ, so use the D-function trick exactly like liSummable. I'll clone that.\n\n2'. Actually also need to handle s possibly equal to a zero? Summability statement: at each s (any s!), the terms 1/(s−ρ) are fine pointwise as long as s ≠ ρ... if s = ρ₀ a zero, that term is 1/0 = 0 in Lean's junk convention, and the rest of the series still converges. So actually summability holds for ALL s unconditionally (junk term harmless). But cleaner: state summability for all s, no hypothesis needed. For the eventual F-entirety argument the series-minus-term matters, fine.\n\n3. Analytic on ℂ ∖ zeros: approach — for each s₀ ∉ zeros, take a ball B(s₀, δ) disjoint from zeros (zeros closed: the zero set `riemannZetaZeros` is closed? It's defined as ζ⁻¹'({0}) minus...? Let me check `riemannZetaZeros` def. In Mathlib: `riemannZetaZeros : Set ℂ := {s | riemannZeta s = 0} \\ {s | ∃ n : ℕ, s = -2 * (n + 1)}`? Something like that. Mathlib has `riemannZetaZeros` and `isClosed_riemannZetaZeros`? Hmm. Actually `IsCompact.inter_riemannZetaZeros_finite` exists (used above). Let me check its statement — it's in Mathlib presumably as `IsCompact.inter_riemannZetaZeros_finite`? It was used unqualified in LiSkeleton — likely from Mathlib (riemann zeta file) — yes, Mathlib has `riemannZetaZeros` and finiteness in compact sets (used for the argument principle). Let me check whether Mathlib has closedness.\n\nFor analyticity: standard route in this codebase (journal-020/021-banked): partial sums are analytic; locally uniform limit on the open set; then `DifferentiableOn` of the limit via TendstoLocallyUniformlyOn → then analyticOnNhd via `DifferentiableOn.analyticAt`? In Mathlib: `DifferentiableOn.analyticOnNhd`? Hmm, there is `DifferentiableOn.analyticOn` / for ℂ: `DifferentiableOn.analyticOnNhd (hd : DifferentiableOn ℂ f s) (hs : IsOpen s) : AnalyticOnNhd ℂ f s` — I believe Mathlib has `DifferentiableOn.analyticOnNhd`. And locally-uniform limit of differentiable functions: Mathlib has `TendstoLocallyUniformlyOn.differentiableOn`? Hmm — there's `TendstoLocallyUniformlyOn.deriv`... In LiDigamma.lean (session 020) they built the digamma series and proved analyticity — let me look at the exact machinery used there to copy it.\n\nLet me grep LiDigamma.lean / LiArchimedean.lean for TendstoLocallyUniformlyOn.","signature":""},{"type":"text","text":"Now let me study the locally-uniform-limit machinery banked in session 020 (LiDigamma/LiArchimedean) — that's the pattern for the analyticity part."},{"type":"tool_use","id":"Grep_16","name":"Grep","input":{"pattern":"TendstoLocallyUniformly|DifferentiableOn.analytic|analyticOnNhd|AnalyticOn","path":"D:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1\\LiDigamma.lean","output_mode":"content","-n":true,"head_limit":40},"extra_content":null}]