← Session 27 — ii′-5c/5d: Davenport disc + FE-reflection bounds
thinking (10582 chars)
`Complex.integerComplement := (Set.range ((↑) : ℤ → ℂ))ᶜ` — the complement of the INTEGER image (all integers, not just nonpositive). Membership: ¬∃ n : ℤ, ↑n = z. For w with re w ≥ 2: if ↑n = w then re w = n (int cast re) — n ≥ 2 fine — hmm wait: w with re w = 2.5 can never equal an integer cast ✓ but re w = 3 exactly with im w = 0 would BE an integer! My (B) scope: re w ≥ 2, |im w| ≤ 5 — includes w = 3 exactly (real integer) — integerComplement EXCLUDES it (3 = ↑(3:ℤ))! But ψ(3) is perfectly fine (Γ has poles only at non-positive integers). The Zeta23 digamma_series requires integerComplement (all integers excluded — because their series converges conditionally machinery?). Hmm — but ψ(w) at positive integers is smooth. The digamma_series at w = 3: the term n = 2: 1/(2+1) − 1/(3+2+1)?? the series at positive integers converges fine — the integerComplement condition is probably for the PRODUCT formula (1/Γ has zeros at nonpositive integers; the series derivation needs z off the poles AND the functional-equation manipulations at positive integers too?). Whatever — at w = 3 the series actually still converges to ψ(3) by continuity... but the Zeta23 theorem requires the complement membership. So my (B) statement would need w ∉ ℤ as a hypothesis OR handle integer w separately (ψ at positive integers: ψ(n+1) = H_n − γ — the classic identity; the bound ‖ψ(3)‖ = |H_2 − γ| ≤ ... fine but separate).
Cleaner: in (B), handle w ∈ ℤ vs ∉ ℤ: for w ∈ ℤ with re ≥ 2: w = ↑m, m ≥ 2: ψ(↑m) = −γ + H_{m−1} (the standard `Complex.digamma_natCast`? is there such a lemma? `Complex.digamma_natCast (n : ℕ) : digamma (n+1) = ...`? hmm — from digamma_one_half and the recurrence: digamma (↑m) with m ≥ 2: ψ(m) = −γ + H_{m−1}: via digamma_apply_add_one induction from ψ(1) = −γ (is there `Complex.digamma_one : digamma 1 = −γ`? probably ✓). Then ‖ψ(↑m)‖ ≤ γ + H_{m−1} ≤ 1 + (1 + log(m−1)) ≤ 2 + log m ≤ C log(2+m)-fold ✓. So the integer case via the harmonic identity. Need `Complex.digamma_one`. Check at build.
Hmm — this adds a case split. Alternatively state (B) with the hypothesis w ∉ Set.range ((·):ℤ→ℂ)... no wait — for 5e-v's use, s on the circle with |s| = R: s = 1−... the points are on a circle — measure-zero chance of hitting an integer but POSSIBLE (the circle passes through real points ±R: R ∈ [4k+2.5, 4k+3] non-integer ✓; and integer points with im ≠ 0 on the circle: s = m + it with m² + t² = R² — possible! e.g. m = 0, t = R — not integer... m = 3, t = √(R²−9) real — s = 3 + i·√(R²−9) is an INTEGER-CAST point only if t = 0. The integerComplement excludes only z = ↑n EXACTLY (im = 0 and re integer). On the circle with |im s| < 1: s = 1−s'... hmm the point w' = (1−s)/2 with s on the circle: w' = ↑m exactly ⟺ s = 1 − 2m real ⟺ t = 0 — the circle's real crossing at s = +R: w' = (1−R)/2 — R non-integer ⟹ (1−R)/2 could be an integer? 1 − R = 2m ⟺ R = 1−2m: R ∈ [4k+2.5, 4k+3]: 1−2m ∈ that range: 2m ∈ [−4k−2, −4k−1.5]: m = −2k−1: R = 1+4k+2 = 4k+3 — the ENDPOINT R = 4k+3 is possible!! Then s = R = 4k+3 (real), 1−s = −4k−2 = −2(2k+1), w' = −(2k+1) — a negative odd integer — ψ(−(2k+1)) is a POLE?!? NO WAIT — w' = (1−s)/2 at s = R = 4k+3: w' = (1−(4k+3))/2 = (−4k−2)/2 = −2k−1: a negative integer −(2k+1) — ψ has a POLE there!! And logDeriv ΓR(1−s) at 1−s = −4k−2 = −2(2k+1) — that's a TRIVIAL ZERO of ζ — ΓR has a pole... wait 1−s = −4k−2: ΓR(−4k−2): ΓR zeros at −2n: −4k−2 = −2(2k+1) IS of the form −2n!! ΓR(−2n) = 0 — so logDeriv ΓR(1−s) at 1−s = −2(2k+1): ΓR VANISHES — the logDeriv blows up — AND the FE application there: the FE identity logDeriv_zeta_fe required ΓR(1−s) ≠ 0 etc. At s = R (real, re > 1): the 5e-v argument at the right real point uses the DIRICHLET bound directly (re s = R ≥ 2) — NOT the FE. The FE is used at the LEFT real point s = −R: 1−s = 1+R ∈ [4k+3.5, 4k+4]: re > 1: Dirichlet ✓; logDeriv ΓR(1−s): 1−s = 1+R ∈ [4k+3.5, 4k+4] real — ΓR at a real in [4k+3.5, 4k+4]: not zero (zeros at even negatives) ✓ fine, and ψ((1−s)/2) = ψ((1+R)/2) with (1+R)/2 ∈ [2k+2.25, 2k+2.5] real positive ≥ 2 ✓ — the MILD case at a REAL point: re ≥ 2 ✓ |im| = 0 ≤ 5 ✓ — is (1+R)/2 an integer? (1+R)/2 = m ⟺ R = 2m−1: R ∈ [4k+2.5, 4k+3]: 2m−1 ∈ there: m = 2k+2: R = 4k+3 endpoint again! R = 4k+3 ⟹ (1+R)/2 = 2k+2 integer — w' = 2k+2 a POSITIVE integer: ψ(2k+2) = H_{2k+1} − γ — FINITE ✓ (not a pole). The integerComplement issue: at w' = 2k+2 (positive integer) the digamma_series theorem doesn't apply — but the value is fine. So (B) needs the positive-integer case handled. The harmonic identity route: ψ(m) = −γ + H_{m−1} for m ≥ 1: check Mathlib: `Complex.digamma_natCast_add_one`? or `digamma_natCast`? Let me grep. If it exists: at w = ↑m (m ≥ 2): ‖ψ(↑m)‖ = |−γ + H_{m−1}| ≤ γ + H_{m−1} ≤ 1 + (1 + log(m−1)) ≤ 2 + log m ≤ 2 + log ‖w‖ ≤ fold ✓.
OK let me now write the file. Structure (LiDigammaLeft.lean):
§1 telescope tsum (T).
§2 the right-half bound (B) — with the integer case split.
§3 the separated reciprocal sum (C).
§4 the near-axis bound (A).
§5 (G) the general logDeriv ΓR identity — moved to... hmm (G) belongs to the ΓR identity family (LiReflect) — put it here as §5 (it uses gamma_mul_prod from LiTrivialZeros + digamma_add_natCast from LiReflect).
Wait — actually let me reconsider (G)'s proof once more. Goal: for s with im s ≠ 0: logDeriv Gammaℝ s = −(log π)/2 + ½·digamma (s/2).
Route: m := ⌈max 0 (−(s.re/2))⌉₊ + 1 so re(s/2 + m) > 0... wait the shift target: I apply logDeriv_Gammaℝ (needs 0 < re) at s + 2m: re(s + 2m) = re s + 2m: with m = ⌈max 0 (−re s/2)⌉₊ + 1: re s + 2m ≥ re s + 2(−re s/2) + 2 = 2 hmm: ⌈max 0 (−re s/2)⌉₊ ≥ −re s/2 ⟹ 2m ≥ −re s + 2 ⟹ re(s+2m) ≥ 2 > 0 ✓.
The ΓR product recurrence: ΓR(s + 2m) = π^{−m}·ΓR(s)·∏_{j<m}(s/2+j)? Let me recompute: ΓR(s+2m) = π^{−(s+2m)/2}·Γ((s+2m)/2) = π^{−s/2}·π^{−m}·Γ(s/2 + m). And Γ(s/2 + m) = Γ(s/2)·∏_{j<m}(s/2+j) via gamma_mul_prod (z := s/2, n := m) — needs ∀ k < m, s/2 ≠ −↑k: s/2 = −k ⟹ s = −2k: im s = 0 contra ✓.
So ΓR(s+2m) = π^{−m}·ΓR(s)·∏_{j<m}(s/2+j) — as a POINTWISE identity. For logDeriv at s I need it as an EVENTUALLY-EQUAL (in a nbhd): on U := {z : im z ≠ 0} the identity holds pointwise (the side conditions from im ≠ 0 ✓ same argument) ⟹ EventuallyEq on 𝓝 s (U open ∋ s) ✓.
Then: logDeriv ΓR s = logDeriv (fun z => π^{−m}·ΓR(z+2m)·∏_{j<m}(z/2+j)) s [logDeriv_congr] = logDeriv ΓR(·+2m) s + Σ_j logDeriv (·/2+↑j) s [logDeriv_mul/prod chain: all factors nonzero at s: ΓR(s+2m) ≠ 0 (re > 0 ✓ Gammaℝ_ne_zero_of_re_pos); π^{−m} ≠ 0; (s/2+↑j) ≠ 0 (im ≠ 0) ✓; differentiability: ΓR(·+2m) at s from re(s+2m) > 0 (differentiableAt_Gammaℝ from Zeta23 WeilEF — re > 0 version ✓ no heavy import needed); the linear factors ✓] = logDeriv ΓR (s+2m) + Σ_{j<m} (1/2)/(s/2+↑j) [logDeriv of (z/2+j): deriv = 1/2: (1/2)/(s/2+j) ✓] — wait the logDeriv of a PRODUCT over a Finset: logDeriv of ∏_{j} f_j = Σ_j logDeriv f_j — is there `logDeriv_prod`? hmm — for finsets: maybe not in Mathlib. Use induction or: the product as (∏) then logDeriv via... Let me check for logDeriv_prod in Mathlib. If missing: induction on the finset or write the product as ∏ and prove logDeriv_prod_range by hand: logDeriv (∏ j ∈ range m, f j) s = Σ j ∈ range m, logDeriv (f j) s given each f j s ≠ 0 + differentiable: induction m: m=0: logDeriv (const 1) = 0 = empty sum ✓ (logDeriv_const); step: prod_range_succ + logDeriv_mul + IH ✓ ~20 lines.
Then: logDeriv ΓR (s+2m) = −(logπ)/2 + ½ψ((s+2m)/2) [logDeriv_Gammaℝ, re > 0 ✓] and (s+2m)/2 = s/2 + m. And Σ_j (1/2)/(s/2+↑j) = Σ_j (1/2)·(s/2+↑j)⁻¹. And ψ(s/2+m) = ψ(s/2) + Σ_j (s/2+↑j)⁻¹ [digamma_add_natCast — needs im(s/2) ≠ 0: im(s/2) = (im s)/2 ≠ 0 ✓]. Assemble:
logDeriv ΓR s = −(logπ)/2 + ½[ψ(s/2) + Σ_j (s/2+↑j)⁻¹] − Σ_j (1/2)·(s/2+↑j)⁻¹ = −(logπ)/2 + ½ψ(s/2) + ½Σ − ½Σ·... wait: Σ_j (1/2)/(s/2+↑j) = Σ_j (1/2)·(s/2+↑j)⁻¹ = ½·Σ (s/2+↑j)⁻¹: so the subtraction is exactly ½Σ: ½[ψ + Σ] − ½Σ = ½ψ ✓✓.
So (G): `logDeriv_Gammaℝ_eq {s : ℂ} (hs : s.im ≠ 0) : logDeriv Complex.Gammaℝ s = -(Real.log Real.pi : ℂ)/2 + (1/2)*Complex.digamma (s/2)`. ~100 lines with the prod-logDeriv induction.
Hmm — actually WAIT: is there a simpler path to (G)? Zeta23's logDeriv_Gammaℝ is stated for re > 0 only. But maybe their Fold.lean or other files have a general version? logDeriv_Gammaℝ_conj exists (Fold.lean) — conjugation not shift. Let me not re-survey; the m-fold shift is clean.
Also for (G): logDeriv_congr needs the EventuallyEq: Gammaℝ =ᶠ[𝓝 s] (fun z => ((π:ℂ)^(−m:ℂ)?...) — hmm the constant π^{−m}: as a complex cpow with the nat-cast exponent: (Real.pi:ℂ)^(−(m:ℂ)) — or write π^{−(z+2m)/2} = π^{−z/2}·π^{−m} via the exp-form as in 5d (gammaR_shift_four's hpi): cpow_def_of_ne_zero + exp_add + the real eval exp(−m log π) = (π^m)⁻¹... In (G)'s EventuallyEq I need: on U: ΓR(z+2m) = π^{−m}·ΓR(z)·∏(z/2+j) ⟹ ΓR(z) = π^m·ΓR(z+2m)/∏(z/2+j) (divide; the product ≠ 0 on U: each z/2+↑j ≠ 0 (im ≠ 0) ✓ Finset.prod_ne_zero_iff). So the eventually-equal function: fun z => (π:ℂ)^(m:ℂ) * ΓR(z+2m) / ∏ j ∈ range m, (z/2+↑j). Hmm the π^m as cpow nat-cast: cpow_natCast: (π:ℂ)^(↑m:ℂ) = (π:ℂ)^m? I used Complex.cpow_natCast in LiTrivialZeros ✓ worked.
The pointwise identity on U:
```
have hpt : ∀ z : ℂ, z.im ≠ 0 → Complex.Gammaℝ z = (Real.pi:ℂ)^(m:ℂ) * Complex.Gammaℝ (z + 2*(m:ℂ)) / ∏ j ∈ Finset.range m, (z/2 + (j:ℂ)) := by
intro z hz
-- recurrence at z/2
have hside : ∀ k : ℕ, k < m → z/2 ≠ -(k:ℂ) := by
intro k _ h
apply hz
-- z/2 = −k ⟹ z = −2k ⟹ im z = 0
have h2 : z = -2 * (k:ℂ) := by
have h3 := congrArg (· * (2:ℂ)) h
rw [div_mul_cancel₀ z (two_ne_zero : (2:ℂ) ≠ 0)] at h3
rw [h3]; ring
rw [h2]; simp
have hrec := gamma_mul_prod (z/2) m hside -- Γ(z/2)·∏_{j<m}(z/2+j) = Γ(z/2+↑m)
-- ΓR(z+2m) = π^{−(z+2m)/2} Γ((z+2m)/2) = π^{−z/2}π^{−m} Γ(z/2+m)
...
```
etc. OK.
This is all doable. Total file ~600 lines for (T),(B),(C),(A),(G). That's a lot for one session — I'll build incrementally and commit at green boundaries. Let me START with (T) + (B) which are self-contained (need only Mathlib + Zeta23.GammaFacts.StirlingVert... actually (B) needs digamma_series = Zeta23.GammaFacts.Series — imports: Mathlib + Zeta23.GammaFacts.StirlingVert (digamma_stirling for (A) later) + Zeta23.GammaFacts.Series? hmm — is Series.lean imported by StirlingVert? StirlingVert.digamma_stirling's proof used digamma_eq (its own) — probably imports Series. Import both explicitly + LiReflect (digamma_add_natCast) + LiTrivialZeros (gamma_mul_prod) for later sections. Since those are all built, imports are cheap.
Let me check `Finset.sum_range_sub'` and the harmonic def form quickly, then write §1+§2.
All inventory confirmed. Writing LiDigammaLeft.lean — §1 (telescope) + §2 (the right-half bound B) first.
tool: Bash
input
{
"command": "cd /d/Python/Quantum/zeta-23-lean/.lake/packages/mathlib && grep -rn \"theorem sum_range_sub'\" Mathlib/Algebra/BigOperators/Group/Finset/Basic.lean Mathlib/Algebra/BigOperators/ 2>/dev/null -r | head -2 && grep -rn \"def harmonic\" Mathlib/NumberTheory/Harmonic/Defs.lean 2>/dev/null | head -3 && grep -rn \"tendsto_one_div_add_atTop_nhds_zero_nat\\|tendsto_one_div_atTop_nhds_zero_nat\" Mathlib/Topology/ 2>/dev/null -r | head -3",
"description": "Check sum_range_sub', harmonic def, tendsto one_div names"
}
raw content_json (database row)
[{"type":"thinking","thinking":"`Complex.integerComplement := (Set.range ((↑) : ℤ → ℂ))ᶜ` — the complement of the INTEGER image (all integers, not just nonpositive). Membership: ¬∃ n : ℤ, ↑n = z. For w with re w ≥ 2: if ↑n = w then re w = n (int cast re) — n ≥ 2 fine — hmm wait: w with re w = 2.5 can never equal an integer cast ✓ but re w = 3 exactly with im w = 0 would BE an integer! My (B) scope: re w ≥ 2, |im w| ≤ 5 — includes w = 3 exactly (real integer) — integerComplement EXCLUDES it (3 = ↑(3:ℤ))! But ψ(3) is perfectly fine (Γ has poles only at non-positive integers). The Zeta23 digamma_series requires integerComplement (all integers excluded — because their series converges conditionally machinery?). Hmm — but ψ(w) at positive integers is smooth. The digamma_series at w = 3: the term n = 2: 1/(2+1) − 1/(3+2+1)?? the series at positive integers converges fine — the integerComplement condition is probably for the PRODUCT formula (1/Γ has zeros at nonpositive integers; the series derivation needs z off the poles AND the functional-equation manipulations at positive integers too?). Whatever — at w = 3 the series actually still converges to ψ(3) by continuity... but the Zeta23 theorem requires the complement membership. So my (B) statement would need w ∉ ℤ as a hypothesis OR handle integer w separately (ψ at positive integers: ψ(n+1) = H_n − γ — the classic identity; the bound ‖ψ(3)‖ = |H_2 − γ| ≤ ... fine but separate).\n\nCleaner: in (B), handle w ∈ ℤ vs ∉ ℤ: for w ∈ ℤ with re ≥ 2: w = ↑m, m ≥ 2: ψ(↑m) = −γ + H_{m−1} (the standard `Complex.digamma_natCast`? is there such a lemma? `Complex.digamma_natCast (n : ℕ) : digamma (n+1) = ...`? hmm — from digamma_one_half and the recurrence: digamma (↑m) with m ≥ 2: ψ(m) = −γ + H_{m−1}: via digamma_apply_add_one induction from ψ(1) = −γ (is there `Complex.digamma_one : digamma 1 = −γ`? probably ✓). Then ‖ψ(↑m)‖ ≤ γ + H_{m−1} ≤ 1 + (1 + log(m−1)) ≤ 2 + log m ≤ C log(2+m)-fold ✓. So the integer case via the harmonic identity. Need `Complex.digamma_one`. Check at build.\n\nHmm — this adds a case split. Alternatively state (B) with the hypothesis w ∉ Set.range ((·):ℤ→ℂ)... no wait — for 5e-v's use, s on the circle with |s| = R: s = 1−... the points are on a circle — measure-zero chance of hitting an integer but POSSIBLE (the circle passes through real points ±R: R ∈ [4k+2.5, 4k+3] non-integer ✓; and integer points with im ≠ 0 on the circle: s = m + it with m² + t² = R² — possible! e.g. m = 0, t = R — not integer... m = 3, t = √(R²−9) real — s = 3 + i·√(R²−9) is an INTEGER-CAST point only if t = 0. The integerComplement excludes only z = ↑n EXACTLY (im = 0 and re integer). On the circle with |im s| < 1: s = 1−s'... hmm the point w' = (1−s)/2 with s on the circle: w' = ↑m exactly ⟺ s = 1 − 2m real ⟺ t = 0 — the circle's real crossing at s = +R: w' = (1−R)/2 — R non-integer ⟹ (1−R)/2 could be an integer? 1 − R = 2m ⟺ R = 1−2m: R ∈ [4k+2.5, 4k+3]: 1−2m ∈ that range: 2m ∈ [−4k−2, −4k−1.5]: m = −2k−1: R = 1+4k+2 = 4k+3 — the ENDPOINT R = 4k+3 is possible!! Then s = R = 4k+3 (real), 1−s = −4k−2 = −2(2k+1), w' = −(2k+1) — a negative odd integer — ψ(−(2k+1)) is a POLE?!? NO WAIT — w' = (1−s)/2 at s = R = 4k+3: w' = (1−(4k+3))/2 = (−4k−2)/2 = −2k−1: a negative integer −(2k+1) — ψ has a POLE there!! And logDeriv ΓR(1−s) at 1−s = −4k−2 = −2(2k+1) — that's a TRIVIAL ZERO of ζ — ΓR has a pole... wait 1−s = −4k−2: ΓR(−4k−2): ΓR zeros at −2n: −4k−2 = −2(2k+1) IS of the form −2n!! ΓR(−2n) = 0 — so logDeriv ΓR(1−s) at 1−s = −2(2k+1): ΓR VANISHES — the logDeriv blows up — AND the FE application there: the FE identity logDeriv_zeta_fe required ΓR(1−s) ≠ 0 etc. At s = R (real, re > 1): the 5e-v argument at the right real point uses the DIRICHLET bound directly (re s = R ≥ 2) — NOT the FE. The FE is used at the LEFT real point s = −R: 1−s = 1+R ∈ [4k+3.5, 4k+4]: re > 1: Dirichlet ✓; logDeriv ΓR(1−s): 1−s = 1+R ∈ [4k+3.5, 4k+4] real — ΓR at a real in [4k+3.5, 4k+4]: not zero (zeros at even negatives) ✓ fine, and ψ((1−s)/2) = ψ((1+R)/2) with (1+R)/2 ∈ [2k+2.25, 2k+2.5] real positive ≥ 2 ✓ — the MILD case at a REAL point: re ≥ 2 ✓ |im| = 0 ≤ 5 ✓ — is (1+R)/2 an integer? (1+R)/2 = m ⟺ R = 2m−1: R ∈ [4k+2.5, 4k+3]: 2m−1 ∈ there: m = 2k+2: R = 4k+3 endpoint again! R = 4k+3 ⟹ (1+R)/2 = 2k+2 integer — w' = 2k+2 a POSITIVE integer: ψ(2k+2) = H_{2k+1} − γ — FINITE ✓ (not a pole). The integerComplement issue: at w' = 2k+2 (positive integer) the digamma_series theorem doesn't apply — but the value is fine. So (B) needs the positive-integer case handled. The harmonic identity route: ψ(m) = −γ + H_{m−1} for m ≥ 1: check Mathlib: `Complex.digamma_natCast_add_one`? or `digamma_natCast`? Let me grep. If it exists: at w = ↑m (m ≥ 2): ‖ψ(↑m)‖ = |−γ + H_{m−1}| ≤ γ + H_{m−1} ≤ 1 + (1 + log(m−1)) ≤ 2 + log m ≤ 2 + log ‖w‖ ≤ fold ✓.\n\nOK let me now write the file. Structure (LiDigammaLeft.lean):\n\n§1 telescope tsum (T).\n§2 the right-half bound (B) — with the integer case split.\n§3 the separated reciprocal sum (C).\n§4 the near-axis bound (A).\n§5 (G) the general logDeriv ΓR identity — moved to... hmm (G) belongs to the ΓR identity family (LiReflect) — put it here as §5 (it uses gamma_mul_prod from LiTrivialZeros + digamma_add_natCast from LiReflect).\n\nWait — actually let me reconsider (G)'s proof once more. Goal: for s with im s ≠ 0: logDeriv Gammaℝ s = −(log π)/2 + ½·digamma (s/2).\nRoute: m := ⌈max 0 (−(s.re/2))⌉₊ + 1 so re(s/2 + m) > 0... wait the shift target: I apply logDeriv_Gammaℝ (needs 0 < re) at s + 2m: re(s + 2m) = re s + 2m: with m = ⌈max 0 (−re s/2)⌉₊ + 1: re s + 2m ≥ re s + 2(−re s/2) + 2 = 2 hmm: ⌈max 0 (−re s/2)⌉₊ ≥ −re s/2 ⟹ 2m ≥ −re s + 2 ⟹ re(s+2m) ≥ 2 > 0 ✓.\nThe ΓR product recurrence: ΓR(s + 2m) = π^{−m}·ΓR(s)·∏_{j<m}(s/2+j)? Let me recompute: ΓR(s+2m) = π^{−(s+2m)/2}·Γ((s+2m)/2) = π^{−s/2}·π^{−m}·Γ(s/2 + m). And Γ(s/2 + m) = Γ(s/2)·∏_{j<m}(s/2+j) via gamma_mul_prod (z := s/2, n := m) — needs ∀ k < m, s/2 ≠ −↑k: s/2 = −k ⟹ s = −2k: im s = 0 contra ✓.\nSo ΓR(s+2m) = π^{−m}·ΓR(s)·∏_{j<m}(s/2+j) — as a POINTWISE identity. For logDeriv at s I need it as an EVENTUALLY-EQUAL (in a nbhd): on U := {z : im z ≠ 0} the identity holds pointwise (the side conditions from im ≠ 0 ✓ same argument) ⟹ EventuallyEq on 𝓝 s (U open ∋ s) ✓.\nThen: logDeriv ΓR s = logDeriv (fun z => π^{−m}·ΓR(z+2m)·∏_{j<m}(z/2+j)) s [logDeriv_congr] = logDeriv ΓR(·+2m) s + Σ_j logDeriv (·/2+↑j) s [logDeriv_mul/prod chain: all factors nonzero at s: ΓR(s+2m) ≠ 0 (re > 0 ✓ Gammaℝ_ne_zero_of_re_pos); π^{−m} ≠ 0; (s/2+↑j) ≠ 0 (im ≠ 0) ✓; differentiability: ΓR(·+2m) at s from re(s+2m) > 0 (differentiableAt_Gammaℝ from Zeta23 WeilEF — re > 0 version ✓ no heavy import needed); the linear factors ✓] = logDeriv ΓR (s+2m) + Σ_{j<m} (1/2)/(s/2+↑j) [logDeriv of (z/2+j): deriv = 1/2: (1/2)/(s/2+j) ✓] — wait the logDeriv of a PRODUCT over a Finset: logDeriv of ∏_{j} f_j = Σ_j logDeriv f_j — is there `logDeriv_prod`? hmm — for finsets: maybe not in Mathlib. Use induction or: the product as (∏) then logDeriv via... Let me check for logDeriv_prod in Mathlib. If missing: induction on the finset or write the product as ∏ and prove logDeriv_prod_range by hand: logDeriv (∏ j ∈ range m, f j) s = Σ j ∈ range m, logDeriv (f j) s given each f j s ≠ 0 + differentiable: induction m: m=0: logDeriv (const 1) = 0 = empty sum ✓ (logDeriv_const); step: prod_range_succ + logDeriv_mul + IH ✓ ~20 lines.\nThen: logDeriv ΓR (s+2m) = −(logπ)/2 + ½ψ((s+2m)/2) [logDeriv_Gammaℝ, re > 0 ✓] and (s+2m)/2 = s/2 + m. And Σ_j (1/2)/(s/2+↑j) = Σ_j (1/2)·(s/2+↑j)⁻¹. And ψ(s/2+m) = ψ(s/2) + Σ_j (s/2+↑j)⁻¹ [digamma_add_natCast — needs im(s/2) ≠ 0: im(s/2) = (im s)/2 ≠ 0 ✓]. Assemble:\nlogDeriv ΓR s = −(logπ)/2 + ½[ψ(s/2) + Σ_j (s/2+↑j)⁻¹] − Σ_j (1/2)·(s/2+↑j)⁻¹ = −(logπ)/2 + ½ψ(s/2) + ½Σ − ½Σ·... wait: Σ_j (1/2)/(s/2+↑j) = Σ_j (1/2)·(s/2+↑j)⁻¹ = ½·Σ (s/2+↑j)⁻¹: so the subtraction is exactly ½Σ: ½[ψ + Σ] − ½Σ = ½ψ ✓✓.\n\nSo (G): `logDeriv_Gammaℝ_eq {s : ℂ} (hs : s.im ≠ 0) : logDeriv Complex.Gammaℝ s = -(Real.log Real.pi : ℂ)/2 + (1/2)*Complex.digamma (s/2)`. ~100 lines with the prod-logDeriv induction. \n\nHmm — actually WAIT: is there a simpler path to (G)? Zeta23's logDeriv_Gammaℝ is stated for re > 0 only. But maybe their Fold.lean or other files have a general version? logDeriv_Gammaℝ_conj exists (Fold.lean) — conjugation not shift. Let me not re-survey; the m-fold shift is clean. \n\nAlso for (G): logDeriv_congr needs the EventuallyEq: Gammaℝ =ᶠ[𝓝 s] (fun z => ((π:ℂ)^(−m:ℂ)?...) — hmm the constant π^{−m}: as a complex cpow with the nat-cast exponent: (Real.pi:ℂ)^(−(m:ℂ)) — or write π^{−(z+2m)/2} = π^{−z/2}·π^{−m} via the exp-form as in 5d (gammaR_shift_four's hpi): cpow_def_of_ne_zero + exp_add + the real eval exp(−m log π) = (π^m)⁻¹... In (G)'s EventuallyEq I need: on U: ΓR(z+2m) = π^{−m}·ΓR(z)·∏(z/2+j) ⟹ ΓR(z) = π^m·ΓR(z+2m)/∏(z/2+j) (divide; the product ≠ 0 on U: each z/2+↑j ≠ 0 (im ≠ 0) ✓ Finset.prod_ne_zero_iff). So the eventually-equal function: fun z => (π:ℂ)^(m:ℂ) * ΓR(z+2m) / ∏ j ∈ range m, (z/2+↑j). Hmm the π^m as cpow nat-cast: cpow_natCast: (π:ℂ)^(↑m:ℂ) = (π:ℂ)^m? I used Complex.cpow_natCast in LiTrivialZeros ✓ worked.\n\nThe pointwise identity on U: \n```\nhave hpt : ∀ z : ℂ, z.im ≠ 0 → Complex.Gammaℝ z = (Real.pi:ℂ)^(m:ℂ) * Complex.Gammaℝ (z + 2*(m:ℂ)) / ∏ j ∈ Finset.range m, (z/2 + (j:ℂ)) := by\n intro z hz\n -- recurrence at z/2\n have hside : ∀ k : ℕ, k < m → z/2 ≠ -(k:ℂ) := by\n intro k _ h\n apply hz\n -- z/2 = −k ⟹ z = −2k ⟹ im z = 0\n have h2 : z = -2 * (k:ℂ) := by\n have h3 := congrArg (· * (2:ℂ)) h\n rw [div_mul_cancel₀ z (two_ne_zero : (2:ℂ) ≠ 0)] at h3\n rw [h3]; ring\n rw [h2]; simp\n have hrec := gamma_mul_prod (z/2) m hside -- Γ(z/2)·∏_{j<m}(z/2+j) = Γ(z/2+↑m)\n -- ΓR(z+2m) = π^{−(z+2m)/2} Γ((z+2m)/2) = π^{−z/2}π^{−m} Γ(z/2+m)\n ...\n```\netc. OK.\n\nThis is all doable. Total file ~600 lines for (T),(B),(C),(A),(G). That's a lot for one session — I'll build incrementally and commit at green boundaries. Let me START with (T) + (B) which are self-contained (need only Mathlib + Zeta23.GammaFacts.StirlingVert... actually (B) needs digamma_series = Zeta23.GammaFacts.Series — imports: Mathlib + Zeta23.GammaFacts.StirlingVert (digamma_stirling for (A) later) + Zeta23.GammaFacts.Series? hmm — is Series.lean imported by StirlingVert? StirlingVert.digamma_stirling's proof used digamma_eq (its own) — probably imports Series. Import both explicitly + LiReflect (digamma_add_natCast) + LiTrivialZeros (gamma_mul_prod) for later sections. Since those are all built, imports are cheap.\n\nLet me check `Finset.sum_range_sub'` and the harmonic def form quickly, then write §1+§2.","signature":""},{"type":"text","text":"All inventory confirmed. Writing LiDigammaLeft.lean — §1 (telescope) + §2 (the right-half bound B) first."},{"type":"tool_use","id":"Bash_255","name":"Bash","input":{"command":"cd /d/Python/Quantum/zeta-23-lean/.lake/packages/mathlib && grep -rn \"theorem sum_range_sub'\" Mathlib/Algebra/BigOperators/Group/Finset/Basic.lean Mathlib/Algebra/BigOperators/ 2>/dev/null -r | head -2 && grep -rn \"def harmonic\" Mathlib/NumberTheory/Harmonic/Defs.lean 2>/dev/null | head -3 && grep -rn \"tendsto_one_div_add_atTop_nhds_zero_nat\\|tendsto_one_div_atTop_nhds_zero_nat\" Mathlib/Topology/ 2>/dev/null -r | head -3","description":"Check sum_range_sub', harmonic def, tendsto one_div names"},"extra_content":null}]