← Session 27 — ii′-5c/5d: Davenport disc + FE-reflection bounds
thinking (22078 chars)
The user says "yes" — start session 026 with the first item: `zeroMult(−2n) = 1` for all n.
Per the session start protocol: I've read STATE.md (this session's continuation — I wrote it). The task: generalize `zeroMult_neg_two` (LiContour.lean, ~100 lines) to all trivial zeros.
Plan:
1. Read the Hfun machinery in LiContour.lean (lines ~400–470) to see the full structure (Hfun def, Hfun_analyticAt_neg_two, Hfun_neg_two_ne_zero, Hfun_eq).
2. Design the general version:
- For n ≥ 1: near s = −2n, ΓR(s) = π^{−s/2}Γ(s/2). Γ(s/2) has a simple pole at s = −2n.
- Product-form recurrence: Γ(z) = Γ(z + n + 1) / ∏_{j=0}^{n} (z + j) for z ∉ {0, −1, ..., −n} — induction on Gamma_add_one.
- At z = s/2 near −n: Γ(s/2) = Γ(s/2 + n + 1)/P_n(s) with P_n(s) = ∏_{j=0}^{n}(s/2 + j).
- P_n(s) = (s/2 + n)·Q_n(s), Q_n(s) = ∏_{j=0}^{n-1}(s/2 + j), Q_n(−2n) = ∏_{j=0}^{n-1}(−n+j) = ∏_{j=0}^{n-1}(j−n) = (−1)^n n! ≠ 0.
- So ΓR(s) = π^{−s/2}Γ(s/2+n+1)/[(s/2+n)Q_n(s)] = 2π^{−s/2}Γ(s/2+n+1)/[(s+2n)Q_n(s)].
- Hence ζ(s) = Λ(s)/ΓR(s) = (s+2n)·G_n(s) with G_n(s) = Λ(s)·Q_n(s)/(2π^{−s/2}Γ(s/2+n+1)) = Λ(s)·Q_n(s)·π^{s/2}/(2Γ(s/2+n+1)).
- G_n analytic at −2n: Λ analytic (completed zeta analytic away from 0,1 — −2n ≠ 0,1 for n ≥ 1... wait n ≥ 1: −2n ≤ −2 ✓); Q_n analytic (polynomial); π^{s/2} = exp((s/2) log π) analytic nonzero; Γ(s/2+n+1) analytic at −2n (s/2+n+1 = 1 at s=−2n; Γ analytic at 1 ✓) and nonzero (Γ(1) = 1).
- G_n(−2n) = Λ(−2n)·Q_n(−2n)·π^{−n}/(2·1) — Λ(−2n) = Λ(1+2n) (FE) = ΓR(1+2n)ζ(1+2n) ≠ 0 (ζ ≠ 0 for re > 1 via riemannZeta_ne_zero_of_one_lt_re: 1+2n ≥ 3 > 1 ✓; ΓR(1+2n) ≠ 0 via Gammaℝ_ne_zero_of_re_pos (re > 0) ✓). Q_n(−2n) = (−1)^n n! ≠ 0 ✓. π^{−n} ≠ 0 ✓.
- Then analyticOrderAt ζ (−2n) = 1 via analyticOrderAt_eq_natCast (the same pattern as zeroMult_neg_two: need the EventuallyEq ζ =ᶠ (s − (−2n))^1 • G_n on 𝓝(−2n) — from ζ = Λ/ΓR pointwise in a punctured neighborhood plus at −2n itself ζ(−2n) = 0 (riemannZeta_neg_two_mul_nat_add_one (n−1)?: ζ(−2·(n−1+1))... the Mathlib lemma: riemannZeta_neg_two_mul_nat_add_one (n : ℕ) : riemannZeta (−2*(n+1)) = 0? Let me check its exact form — from the n=−2 proof: `riemannZeta_neg_two_mul_nat_add_one 0` with norm_num gave ζ(−2) = 0. So the lemma: riemannZeta_neg_two_mul_nat_add_one (n : ℕ) : riemannZeta (-2 * (n + 1)) = 0? or (−2*(n+1))? For general n: ζ(−2n) = 0 for n ≥ 1: apply with n−1 (needs n ≥ 1) or maybe the lemma is `riemannZeta_neg_two_mul_nat_add_one (n : ℕ) : riemannZeta (-2 * (n+1)) = 0` — so ζ(−2n) for n ≥ 1 via n := n−1: −2·((n−1)+1) = −2n ✓.
- The EventuallyEq: near −2n (punctured), ζ s = Λ s / ΓR s needs s ≠ 0 and ΓR s ≠ 0: in a small ball around −2n avoiding {−2m : m ≠ n} ∪ {0}: ΓR s = 0 ⟺ s ∈ {−2m}: distance from −2n to nearest other even negative is 2 — take ball radius 1 ✓. Then ΓR s = 2π^{−s/2}Γ(s/2+n+1)/((s+2n)Q_n(s)) — need the product identity at s/2 ∉ {0,−1,...,−n} — in the punctured ball: s/2 near −n, s/2 ∉ {0,...,−n} — could s/2 = −m for m < n within the ball? s = −2m with |s − (−2n)| < 1 — only m = n. So in the punctured ball (s ≠ −2n), s/2 ∉ {0,−1,...,−n} ✓ (also s/2 + j ≠ 0 for j ≤ n ✓).
- Then ζ s = Λ s / ΓR s = Λ s · (s+2n) Q_n(s) / (2π^{−s/2}Γ(s/2+n+1)) = (s+2n) · G_n(s) ✓ pointwise in the punctured ball; at s = −2n both sides zero (LHS ζ(−2n) = 0, RHS 0·G = 0) — so the EventuallyEq holds on all of the ball (filter_upwards ball; case s = −2n separately) — mirrors zeroMult_neg_two's structure exactly.
3. Analyticity of G_n at −2n: G_n = Λ · Q_n · π^{s/2} / (2Γ(s/2+n+1))... wait let me re-derive cleanly: G_n(s) = Λ(s) · Q_n(s) / (2 · π^{−s/2} · Γ(s/2+n+1))? From ΓR(s) = π^{−s/2}·Γ(s/2+n+1)/((s/2)(s/2+1)⋯(s/2+n)) — the full product ∏_{j=0}^{n}(s/2+j) = (s/2+n)·Q_n(s). So 1/ΓR(s) = (s/2+n)Q_n(s)/(π^{−s/2}Γ(s/2+n+1)) = (s+2n)Q_n(s)/(2π^{−s/2}Γ(s/2+n+1)). Thus:
ζ(s) = Λ(s)·(s+2n)·Q_n(s)/(2π^{−s/2}Γ(s/2+n+1))
G_n(s) := Λ(s)·Q_n(s)/(2·π^{−s/2}·Γ(s/2+n+1)) — analytic at −2n as a quotient of analytics with nonzero denominator: 2 ≠ 0; π^{−s/2} = exp(−(s/2)log π) ≠ 0 (exp); Γ(s/2+n+1) analytic at −2n + value Γ(1) = 1 ≠ 0.
Hmm — 1/π^{−s/2} = π^{s/2}: better write G_n(s) = Λ(s) · Q_n(s) · π^{s/2} / (2 · Γ(s/2+n+1)). The cpow (π:ℂ)^{s/2} with real-positive base: analytic in s ✓ (DifferentiableAt.const_cpow as in the ΓR differentiability proof). Nonzero: cpow of nonzero base ≠ 0 (cpow_eq_zero_iff: base = 0 ∧ ... — (π:ℂ)^w ≠ 0 always for π ≠ 0: `Complex.cpow_ne_zero`? there's cpow_ne_zero_iff or just: x^y = exp(y log x) ≠ 0 when x ≠ 0 via exp_ne_zero — for the ≠ 0 proof use cpow_eq_zero_iff). For the DIVISION form: keep G_n = Λ · Q_n / (2 · π^{−s/2} · Γ(s/2+n+1)) and prove the denominator nonzero at −2n: π^{−(−2n)/2} = π^n ≠ 0 ✓, Γ(1) = 1 ≠ 0 ✓. AnalyticAt.div needs the denominator AnalyticAt + nonzero: 2·π^{−s/2}·Γ(s/2+n+1): analytic: const · cpow · Γ-comp ✓.
Hmm — actually simpler to mirror ii′-4c's structure exactly: they defined Hfun (a def) with Hfun_eq (the identity (s+2)·ΓR s = Hfun s), Hfun_analyticAt_neg_two, Hfun_neg_two_ne_zero. Then ζ = Λ/ΓR and (s+2)ΓR s = Hfun s ⟹ ζ = (s+2)·Λ/Hfun. The general version: Hfun_n with (s+2n)·ΓR s = Hfun_n s where Hfun_n s = 2·π^{−s/2}·Γ(s/2+n+1)/Q_n(s)·... wait: (s+2n)·ΓR s = (s+2n)·π^{−s/2}Γ(s/2+n+1)/((s/2+n)Q_n s) = 2π^{−s/2}Γ(s/2+n+1)/Q_n(s) (since (s+2n) = 2(s/2+n)). So Hfun_n s := 2·π^{−s/2}·Γ(s/2+n+1)/Q_n(s) — analytic at −2n: Q_n(−2n) ≠ 0 ✓ so the quotient is analytic near −2n ✓ and nonzero at −2n ✓ (all three factors nonzero). Then ζ s = Λ s/ΓR s = (s+2n)·Λ s/Hfun_n s — same algebra as before.
The KEY new build: the product recurrence:
`Complex.Gamma (z) = Complex.Gamma (z + n + 1) / ∏ j ∈ Finset.range (n+1), (z + j)` for z ∉ {0,−1,...,−n} — more precisely for (∀ m : ℕ, m ≤ n → z ≠ −m) or the cleaner (∀ m : ℕ, z ≠ −m)... At our points only finitely many exclusions needed. Induction: n = 0: Γ(z) = Γ(z+1)/z = Γ(z+1)/∏_{j∈range 1}(z+j) = Γ(z+1)/z ✓ (Gamma_add_one: Γ(z+1) = z Γ(z), z ≠ 0). Step: Γ(z+n+2) = (z+n+1)Γ(z+n+1) ⟹ Γ(z+n+1) = Γ(z+n+2)/(z+n+1) for z+n+1 ≠ 0; substitute in IH: Γ(z) = Γ(z+n+1)/∏_{j≤n}(z+j) = Γ(z+n+2)/[(z+n+1)·∏_{j≤n}(z+j)] = Γ(z+n+2)/∏_{j≤n+1}(z+j) [prod_range_succ] ✓.
Hypotheses for the induction: at step k: need z + k ≠ 0 (for Gamma_add_one (z+k) — wait Gamma_add_one (s) (hs : s ≠ 0) : Gamma (s+1) = s * Gamma s — I need the REVERSE: Γ(w) = Γ(w+1)/w — from Gamma_add_one: Γ(z+k+1) = (z+k)Γ(z+k) with z+k ≠ 0 ⟹ Γ(z+k) = Γ(z+k+1)/(z+k) ✓ div). So the induction needs z + k ≠ 0 for k = 0..n. In my application: z = s/2 with s in the punctured ball around −2n: s/2 + k ≠ 0 for k ≤ n ✓ (shown via ball geometry: s/2 + k = 0 ⟺ s = −2k; |−2k − (−2n)| = 2|n−k| ≥ 2 > 1 for k ≠ n; k = n excluded by puncture).
Actually — even simpler formulation for the proof: state the recurrence as
`Gamma_div_prod : ∀ n : ℕ, (∀ k : ℕ, k ≤ n → z ≠ -(k:ℂ)) → Complex.Gamma z * ∏ j ∈ Finset.range (n+1), (z + j) = Complex.Gamma (z + n + 1)` — the MULTIPLIED form avoids division-side-conditions: induction: n=0: Γ(z)·z = Γ(z+1) ✓ Gamma_add_one (needs z ≠ 0: from the hypothesis k=0: z ≠ −0 = 0 ✓). Step: Γ(z)·∏_{j≤n+1}(z+j) = Γ(z)·∏_{j≤n}(z+j)·(z+n+1) = Γ(z+n+1)·(z+n+1) [IH, needs hypotheses ≤ n ⊂ ≤ n+1] = Γ(z+n+2) [Gamma_add_one (z+n+1) (z+n+1 ≠ 0 from hypothesis k = n+1: z ≠ −(n+1) ⟺ z + (n+1) ≠ 0)] ✓ — wait Gamma_add_one (s) hs : Gamma (s+1) = s*Gamma s: Γ(z+n+1)·(z+n+1) = Γ((z+n+1)+1) = Γ(z+n+2) ✓ (z+n+1)+1 = z+n+2 by ring — push_cast/ring bridge for (z + ↑(n+1)) + 1 = z + ↑(n+2)... careful with Nat casts: z + (n : ℂ) + 1 vs z + ((n+1 : ℕ):ℂ): push_cast ring ✓.
The multiplied form is cleaner (only needs the ≠ 0 for the Gamma_add_one applications, no division well-definedness). Then derive the division form where needed with the product-nonzero fact.
Let me now read the LiContour.lean Hfun section (lines ~400–470) to see the exact helper structure, then write the general version. Where should the new code live? LiContour.lean is where zeroMult_neg_two is — the generalization fits there (it's ii′-4c's continuation; but the freeze protocol says "no edits to existing Lean proofs except the liCoeff correctness fix" — hmm! Freeze: "no edits to existing Lean proofs except the liCoeff correctness fix (ii′-1a)". Does ADDING a new theorem to LiContour.lean count as editing existing proofs? The pattern so far: new content goes in NEW files (LiDisc, LiReflect were new files). zeroMult_neg_two stays untouched; the new generalization `zeroMult_neg_two_mul` goes in a new file — could go in LiReflect.lean (already mine this session-cycle... but it imports LiDisc which is heavy — fine, it's built). Hmm — actually cleaner: new file LiTrivialZeros.lean? Or add to LiReflect? The generalization is 5e-prep and logically belongs with the ii′-4/zero-mult family. New file `NguyenRH1/LiTrivialZeros.lean` importing LiContour (for zeroMult_neg_two's pattern... actually it doesn't need zeroMult_neg_two itself — the general version at n ≥ 1 SUBSUMES −2 (n=1). But keep both (zeroMult_neg_two is used in LiSides? it was deferred from ii′-1b — used anywhere? The trivial-zero split is ii′-4/5e territory. Fine — new file importing LiContour (for the Hfun... no, Hfun is specific to −2). The new file needs: LiSkeleton (zeroMult? no — zeroMult is Zeta23.Statement's, available via any Zeta23 import), Mathlib, Zeta23.RvM.CountByIntegral (completedRiemannZeta_eq_Gammaℝ_mul), and the riemannZeta_neg_two_mul_nat_add_one (Mathlib). Import NguyenRH1.LiContour to sit in the same environment (and it brings LiSides/LiSkeleton chains) — or lighter: import Mathlib + Zeta23.RvM.CountByIntegral + Zeta23.Statement. Let me check what LiContour imports: Mathlib, Zeta23.Statement, Zeta23.RvM.CountByIntegral, NguyenRH1.LiSides, NguyenRH1.LiSkeleton. For my new file: import Mathlib, Zeta23.Statement (zeroMult, IsNontrivialZero), Zeta23.RvM.CountByIntegral (the RvM seams). Lighter is better for compile time. But it also sits fine to import LiContour for consistency... LiContour is already built; importing it adds nothing to build time materially. I'll import LiContour (gets everything transitively) — no wait, lighter: just Mathlib + the two Zeta23 modules. Hmm — but root NguyenRH1.lean imports all files; adding LiTrivialZeros to the root after LiReflect. The import chain: LiTrivialZeros needs only Mathlib + Zeta23.Statement + Zeta23.RvM.CountByIntegral. Fine.
Plan the file:
```
NguyenRH1/LiTrivialZeros.lean — ii′-5e prep: zeroMult(−2n) = 1 for ALL n ≥ 1
(generalization of ii′-4c's zeroMult_neg_two).
§1 the product-form Γ recurrence:
Gamma_mul_prod (z : ℂ) (n : ℕ) (hz : ∀ k : ℕ, k ≤ n → z ≠ -(k:ℂ)) :
Complex.Gamma z * ∏ j ∈ Finset.range (n+1), (z + j) = Complex.Gamma (z + n + 1)
(induction; Gamma_add_one)
§2 the cofactor:
Q (n : ℕ) (s : ℂ) : ℂ := ∏ j ∈ Finset.range n, (s/2 + j)
Q_ne_zero_at / Q analytic
HfunT (n : ℕ) (s : ℂ) : ℂ := 2 * (Real.pi:ℂ)^(-s/2) * Complex.Gamma (s/2 + n + 1) / Q n s
— wait: (s+2n)·ΓR s = 2π^{−s/2}Γ(s/2+n+1)/Q_n(s): from ΓR s = π^{−s/2}Γ(s/2) and Γ(s/2)·∏_{j≤n}(s/2+j) = Γ(s/2+n+1): Γ(s/2) = Γ(s/2+n+1)/((s/2+n)·Q_n(s)) — as a function identity where Q_n ≠ 0... The pointwise identity (s+2n)·ΓR(s) = HfunT n s holds when Q_n(s) ≠ 0 and the recurrence side-conditions hold (s/2 ≠ −k for k ≤ n — the k = n one: s/2 + n ≠ 0 ⟺ s ≠ −2n; k < n: Q_n(s) ≠ 0 gives them). Hmm — the recurrence Γ(z)·∏_{j≤n}(z+j) = Γ(z+n+1) needs z ≠ −k for ALL k ≤ n INCLUDING k = n (the last Gamma_add_one step). At s = −2n exactly the identity (s+2n)ΓR s = HfunT n s: LHS = 0·ΓR(−2n) = 0 (ΓR(−2n) = 0 by Gammaℝ_eq_zero_iff ⟨n⟩); RHS = 2π^n·Γ(1)/Q_n(−2n) ≠ 0!! So the pointwise identity FAILS at s = −2n — as it must (ΓR has a zero, HfunT a finite nonzero value — the identity (s+2n)ΓR(s) = HfunT(s) can only hold where both sides defined & the recurrence valid: s ≠ −2n). That's fine — the EventuallyEq for ζ needs the identity only in the PUNCTURED ball (plus the s = −2n point handled by ζ(−2n) = 0 = (s+2n)·G at s=−2n). Same as ii′-4c (their Hfun_eq needed s ≠ −2 etc. — they had hypotheses (hs : s ≠ -2?) let me check Hfun_eq's signature: `Hfun_eq s hs hs0` with hs : s ≠ −2 presumably and hs0 : s ≠ 0 — from line 557: `Hfun_eq s hs hs0` where hs : s ≠ −2 (from the by_cases) and hs0 : s ≠ 0. So their identity (s+2)·ΓR s = Hfun s holds for s ≠ −2, s ≠ 0. Mine: (s+2n)·ΓR s = HfunT n s for s ∉ {−2k : k ≤ n} ∪ {0}? Let me see: the recurrence needs s/2 ≠ −k for k ≤ n, i.e., s ≠ −2k for k ≤ n. And k = 0 case: s ≠ 0. So hypotheses: ∀ k ≤ n, s ≠ −2k. In the punctured ball of radius 1 about −2n: s ≠ −2k for k ≠ n (distance ≥ 2) and s ≠ −2n (puncture) ✓ also s ≠ 0 ✓ (n ≥ 1, ball within re < −1).
§3 the main theorem:
zeroMult_neg_two_mul (n : ℕ) (hn : 1 ≤ n) : zeroMult (-2 * (n:ℂ)) = 1
Structure (mirroring zeroMult_neg_two):
- Λ analytic at −2n (ball radius 1 avoids 0, 1) ✓
- HfunT n analytic at −2n: 2·π^{−s/2}·Γ(s/2+n+1)/Q_n: numerator analytic: const_mul (cpow analytic: DifferentiableAt.const_cpow ... (Or.inl π≠0) — as in differentiableAt_Gammaℝ_of_im_ne_zero'; Γ(s/2+n+1): differentiableAt_Gamma (∀ m, s/2+n+1 ≠ −m: at s near −2n: s/2+n+1 near 1: re > 0 in the ball — show via re bounds: re(s/2+n+1) = re s/2 + n + 1 ∈ (−n−1/2+n+1, ...) = (1/2, 3/2) > 0 ✓ so ≠ −m (real ≤ 0) ✓); Q_n analytic (polynomial: Finset.prod of linear factors: AnalyticAt (fun s => ∏ j, (s/2+j)) — via AnalyticAt.fun_prod? `AnalyticAt.prod`? exists: AnalyticAt.fun_prod or Finset.prod version — `AnalyticAt.prod (hs : ∀ i ∈ s, AnalyticAt ℂ (f i) x) : AnalyticAt ℂ (∏ i ∈ s, f i ·) x`? there's `AnalyticAt.prod`... I'll find it); denominator Q_n(−2n) ≠ 0 (each factor −n+j ≠ 0 for j < n: Finset.prod_ne_zero_iff) ⟹ quotient analytic (AnalyticAt.div).
- HfunT n (−2n) ≠ 0: factors: 2 ≠ 0; π^n ≠ 0 (cpow_ne_zero or via exp); Γ(1) = 1 ≠ 0 (Complex.Gamma_one : Gamma 1 = 1? `Complex.Gamma_one : Complex.Gamma 1 = 1`? or Gamma_one — check); Q_n(−2n) ≠ 0 ⟹ div_ne_zero.
- Λ(−2n) ≠ 0: Λ(−2n) = Λ(1+2n) (completedRiemannZeta_one_sub: Λ(1−(−2n)) = Λ(1+2n) = Λ(−2n) — wait completedRiemannZeta_one_sub s : Λ(1−s) = Λ(s): at s = −2n: Λ(1+2n) = Λ(−2n) ✓) = ΓR(1+2n)·ζ(1+2n) (needs 1+2n ≠ 0 ✓ and ΓR(1+2n) ≠ 0 via re > 0 ✓) — ζ(1+2n) ≠ 0: riemannZeta_ne_zero_of_one_lt_re (re(1+2n) = 1+2n > 1 ✓ since n ≥ 1).
- G := Λ/HfunT n: analytic at −2n, nonzero.
- EventuallyEq: ζ =ᶠ[𝓝 (−2n)] fun s => (s − (−2n))^1 • (Λ s/HfunT n s):
filter_upwards [ball radius 1, HfunT ≠ 0 near (ContinuousAt.eventually_ne), Q_n ≠ 0 near?] — for the pointwise identity at s (s ≠ −2n case): need (s+2n)ΓR s = HfunT n s: via the recurrence at z = s/2: needs ∀ k ≤ n, s/2 ≠ −(k:ℂ): s/2 = −k ⟺ s = −2k: in ball(−2n, 1): |s − (−2n)| < 1 with s = −2k: |2n − 2k| = 2|n−k| < 1 ⟹ k = n; and s ≠ −2n by the by_cases. So: by_cases s = −2n (then both sides 0: ζ(−2n) = 0 via riemannZeta_neg_two_mul_nat_add_one (n−1) — hmm need n ≥ 1: n = (n−1)+1: `riemannZeta_neg_two_mul_nat_add_one (n - 1)` : ζ(−2·((n−1)+1)) = 0: ((n−1)+1) = n by Nat.sub_add_cancel hn: so ζ(−2·↑n) = 0 — cast juggling: −2 * (↑(n−1)+1) = −2*↑n: push_cast with Nat.sub_add_cancel hn... `riemannZeta_neg_two_mul_nat_add_one` exact statement — check; in ii′-4c they used `riemannZeta_neg_two_mul_nat_add_one 0` then norm_num ⟹ ζ(−2) = 0: so the lemma's argument gives ζ(−2·(0+1)) = ζ(−2)... the exact form: probably `riemannZeta_neg_two_mul_nat_add_one (n : ℕ) : riemannZeta (-2 * (n + 1)) = 0`? hmm with casts. I'll check.
For s ≠ −2n: the identity chain as in ii′-4c: ζ s = Λ s/ΓR s [s ≠ 0, ΓR s ≠ 0 — the latter: ΓR s = 0 ⟺ s ∈ {−2m}: s = −2m in the ball ⟹ m = n ⟹ s = −2n contradiction ✓]; then Λ s/ΓR s = (s+2n)·Λ s/HfunT n s: from (s+2n)·ΓR s = HfunT n s: Λ/ΓR = (s+2n)Λ/((s+2n)ΓR) = (s+2n)Λ/HfunT [mul_div_cancel_left₀ with (s+2n) ≠ 0 (s ≠ −2n)] ✓.
- analyticOrderAt_eq_natCast + toNat: zeroMult(−2n) = 1 ✓.
```
Wait — one important check: `analyticOrderAt_eq_natCast` usage in ii′-4c: `(hzeta_an.analyticOrderAt_eq_natCast).mpr ⟨fun s => completedRiemannZeta s / Hfun s, hG_an, hG_ne, hEv⟩` — so AnalyticAt.analyticOrderAt_eq_natCast : analyticOrderAt f x = n ↔ ∃ g, AnalyticAt g x ∧ g x ≠ 0 ∧ f =ᶠ[𝓝 x] fun z => (z − x)^n • g z — presumably. ✓ mirror.
And hzeta_an : AnalyticAt ℂ riemannZeta (−2n) := hRHS_an.congr (EventuallyEq.symm hEv) ✓ same pattern.
Also Q_n needs care: Q_n(s) = ∏ j ∈ range n, (s/2 + ↑j). At s = −2n: s/2 + j = −n + j for j ∈ range n (j < n): −n+j ≠ 0 ⟺ j ≠ n ✓ (j ≤ n−1). Finset.prod_ne_zero_iff : ∏ ≠ 0 ↔ ∀ i ∈ s, f i ≠ 0 ✓.
Also the recurrence application at z = s/2: ∀ k ≤ n, s/2 ≠ −(k:ℂ): s/2 = −k ⟹ s = −2k: mul: s = 2·(s/2) = −2k: then |−2k − (−2n)| < 1: ‖−2k+2n‖ = 2|n−k| < 1: for naturals |n−k| ≥ 1 when k ≠ n ⟹ 2 ≤ ... contradiction; k = n ⟹ s = −2n, excluded. In Lean: from h : s/2 = −(k:ℂ): s = −2k: have := congrArg (· * (2:ℂ)) h: s/2*2 = −k*2: div_mul_cancel... (s/2)*2 = s (div_mul_cancel₀ s two_ne_zero) — wait (s/2)*2: div_mul_cancel₀ : a/b * b = a ✓. So s = −2·↑k = −2↑k. Then s − (−2n) = 2(n−k)... the ball membership: ‖s − (−2n)‖ < 1: s + 2n = −2k + 2n = 2(n−k) as complex: norm = 2|((n:ℤ)−k)|... In Lean: s − (−2*↑n) = −2↑k + 2↑n = ↑(2n − 2k)-ish: push_cast: (−2k + 2n : ℂ) = ((−2k + 2n : ℝ):ℂ)? with n k naturals: (−2:ℝ)·k + 2·n: = 2·(n − k) if k ≤ n or 2·(k−n)·(−1)... Since k ≤ n (hypothesis of the recurrence): n − k ≥ 0: s − (−2↑n) = ((2·(n−k) : ℝ) : ℂ) — push_cast with Nat.sub: 2↑n − 2↑k = ↑(2(n−k))? needs k ≤ n for Nat.cast_sub: `Nat.cast_sub (h : k ≤ n) : (↑(n−k):α) = ↑n − ↑k` ✓. So ‖s−(−2n)‖ = 2·(n−k) : ℝ ≥ ... if k < n: n−k ≥ 1: ‖·‖ = 2(n−k) ≥ 2 > 1 contradicts ball < 1 ✓. If k = n: s = −2n excluded by the by_cases ✓.
Hmm wait — the recurrence's side conditions need k ≤ n; the ball argument: for k ≤ n with k ≠ n: 2(n−k) ≥ 2 ✓. Good.
Also — in ii′-4c they handled the ball-geometry with explicit norm_num/nlinarith on ((2:ℝ) − 2m : ℝ)-style expressions. For the general case it's 2(n−k) — manageable with exact_mod_cast + nlinarith.
One more consideration: HfunT's analyticity at −2n — the numerator 2·π^{−s/2}·Γ(s/2+n+1):
- π^{−s/2} = (π:ℂ)^(−s/2): DifferentiableAt: DifferentiableAt.const_cpow (differentiable...) (Or.inl (π:ℂ) ≠ 0) — from the differentiableAt_Gammaℝ_of_im_ne_zero' proof: `DifferentiableAt.const_cpow ?_ (Or.inl ...)` with ?_ : DifferentiableAt ℂ (fun z => −z/2) s = (differentiableAt_id.neg).div_const 2 ✓. Then .analyticAt.
- Γ(s/2+n+1): Complex.differentiableAt_Gamma (s/2+n+1) (∀ m, s/2+n+1 ≠ −m): need at s = −2n SPECIFICALLY (analyticAt needs a NEIGHBORHOOD of differentiability: `Complex.analyticAt_iff_eventually_differentiableAt` — the pattern from analyticAt_Gammaℝ_of_im_ne_zero: filter_upwards [isOpen...mem_nhds] with z hz => differentiableAt... For Γ(s/2+n+1) I need differentiability in a NEIGHBORHOOD of −2n: take the ball radius 1/2: s/2+n+1 has re ∈ (1/2−1/4, ...) hmm: |s − (−2n)| < 1/2 ⟹ re s ∈ (−2n−1/2, −2n+1/2) ⟹ re(s/2+n+1) ∈ (1/2−1/4·...) let me compute: re(s/2+n+1) = re s /2 + n + 1 ∈ (−n−1/4 + n+1, −n+1/4+n+1) = (3/4, 5/4) — always > 0, so s/2+n+1 ≠ −m for any m (real −m ≤ 0 < 3/4) ✓. So on the ball B(−2n, 1/2): differentiableAt_Gamma everywhere ⟹ analyticAt at −2n via analyticAt_iff_eventually_differentiableAt ✓.
- Q_n: analytic everywhere (polynomial): `AnalyticAt.prod`? For a Finset product of analytic functions: `AnalyticAt.fun_prod`? Let me recall: `AnalyticAt.fun_prod (hf : ∀ i ∈ s, AnalyticAt ℂ (f i) x) : AnalyticAt ℂ (fun x => ∏ i ∈ s, f i x) x`? I believe `AnalyticAt.fun_prod` exists (or `.prod`). Each factor fun s => s/2 + ↑j: (analyticAt_id.div_const? or (analyticAt_id... `analyticAt_id : AnalyticAt ℂ id x`? hmm — AnalyticAt.id? there's `analyticAt_id : AnalyticAt ℂ (id) x`? For fun s => s/2 + j: (analyticAt_id...). I'll find the right names (analyticAt_id exists I think; .div_const? AnalyticAt has .div_const? Maybe not — use (analyticAt_id.mul_const? ...). Simplest: each factor is differentiable (differentiableAt_id.div_const 2 |>.add_const) ⟹ analyticAt via differentiableAt.analyticAt ✓ (`DifferentiableAt.analyticAt : DifferentiableAt ℂ f x → AnalyticAt ℂ f x` ✓ exists). And the product: differentiable ⟹ analytic for each, then AnalyticAt product — is there `AnalyticAt.prod`? In Mathlib: `AnalyticAt.fun_prod : (∀ i ∈ s, AnalyticAt ℂ (f i) x) → AnalyticAt ℂ (fun x => ∏ i ∈ s, f i x) x`? Hmm — there IS `AnalyticAt.fun_prod` I believe (and `.prod` for pairs). If not: induction via AnalyticAt.mul. Fine at build.
- The quotient: AnalyticAt.div (numerator analytic) (Q_n analytic) (Q_n(−2n) ≠ 0) ✓ `AnalyticAt.div (hf : AnalyticAt f x) (hg : AnalyticAt g x) (h : g x ≠ 0) : AnalyticAt (f/g) x` ✓.
- The constant 2·: AnalyticAt.const_mul? or include in numerator: (2 · (π^{−s/2} · Γ(..))) — AnalyticAt.mul chains ✓ or just build numerator := fun s => 2 * π^(−s/2) * Γ(s/2+n+1) via .const_mul/.mul. Or fold the 2 into Q_n's denominator side... Actually simplest: HfunT n s := (2 * (Real.pi:ℂ)^(-s/2) * Complex.Gamma (s/2 + n + 1)) / Q n s. numerator analytic: (analyticAt_const.mul (...)).mul? fine.
Wait — actually, is the identity right? (s+2n)·ΓR(s) = (s+2n)·π^{−s/2}·Γ(s/2). And Γ(s/2) = Γ(s/2+n+1)/∏_{j≤n}(s/2+j) — the division form needs ∏ ≠ 0. So (s+2n)·ΓR(s) = (s+2n)·π^{−s/2}·Γ(s/2+n+1)/[(s/2+n)·Q_n(s)] and (s+2n)/(s/2+n) = 2 (when s/2+n ≠ 0). So = 2π^{−s/2}Γ(s/2+n+1)/Q_n(s) = HfunT n s ✓ (when Q_n(s) ≠ 0 ∧ s/2+n ≠ 0, plus the recurrence side-conditions ∀ k ≤ n, s/2 ≠ −k — note Q_n(s) ≠ 0 gives k < n conditions; k = n is s/2+n ≠ 0 separate).
For the recurrence in multiplied form: Gamma z * ∏ j ∈ range (n+1), (z + j) = Gamma (z + n + 1) — hypotheses ∀ k ≤ n, z ≠ −k. Then at z = s/2: Γ(s/2)·[(s/2+n)·Q_n(s)] = Γ(s/2+n+1) (since ∏_{j∈range(n+1)}(z+j) = ∏_{j<n}(z+j)·(z+n) = Q_n·(z+n): Finset.prod_range_succ : ∏ j ∈ range (n+1), f j = (∏ j ∈ range n, f j) * f n ✓). So Γ(s/2) = Γ(s/2+n+1)/[(s/2+n)·Q_n(s)] when (s/2+n)·Q_n(s) ≠ 0: eq_div_iff / div_eq_iff machinery ✓.
OK. Also for the base-length: the whole thing ~250–350 lines estimated. Let me also handle: n = 0 excluded (hn : 1 ≤ n) — zeroMult at 0 would be different (ζ(0) = −1/2 ≠ 0). Fine.
One thing to check: `riemannZeta_neg_two_mul_nat_add_one` exact statement. And `Complex.Gamma_one`. Let me grep.
Starting session 026, first item: `zeroMult(−2n) = 1` for all n. Let me survey the remaining API details and the Hfun helper block in LiContour.
tool: TodoWrite ok
input
{
"todos": [
{
"content": "Survey: Hfun block in LiContour, riemannZeta_neg_two_mul_nat_add_one, Gamma_one, AnalyticAt.prod",
"status": "in_progress",
"activeForm": "Surveying APIs for the generalization"
},
{
"content": "Build product-form \u0393 recurrence (Gamma_mul_prod) by induction",
"status": "pending",
"activeForm": "Building product-form \u0393 recurrence"
},
{
"content": "Build HfunT cofactor: analytic + nonzero at \u22122n",
"status": "pending",
"activeForm": "Building HfunT cofactor"
},
{
"content": "Prove zeroMult_neg_two_mul : zeroMult(\u22122n) = 1 for n \u2265 1",
"status": "pending",
"activeForm": "Proving zeroMult(\u22122n) = 1"
},
{
"content": "Build green + root import + axiom audit",
"status": "pending",
"activeForm": "Building and auditing"
},
{
"content": "Then ii\u2032-5e design (identity assembly plan) if time; session closure",
"status": "pending",
"activeForm": "5e design + closure"
}
]
}
result 2026-08-23 07:11:07Z → 2026-08-23 07:11:07Z
{
"oldTodos": [],
"newTodos": [
"content='Survey: Hfun block in LiContour, riemannZeta_neg_two_mul_nat_add_one, Gamma_one, AnalyticAt.prod' status='in_progress' active_form='Surveying APIs for the generalization'",
"content='Build product-form \u0393 recurrence (Gamma_mul_prod) by induction' status='pending' active_form='Building product-form \u0393 recurrence'",
"content='Build HfunT cofactor: analytic + nonzero at \u22122n' status='pending' active_form='Building HfunT cofactor'",
"content='Prove zeroMult_neg_two_mul : zeroMult(\u22122n) = 1 for n \u2265 1' status='pending' active_form='Proving zeroMult(\u22122n) = 1'",
"content='Build green + root import + axiom audit' status='pending' active_form='Building and auditing'",
"content='Then ii\u2032-5e design (identity assembly plan) if time; session closure' status='pending' active_form='5e design + closure'"
],
"cleared": false
}
raw content_json (database row)
[{"type":"thinking","thinking":"The user says \"yes\" — start session 026 with the first item: `zeroMult(−2n) = 1` for all n.\n\nPer the session start protocol: I've read STATE.md (this session's continuation — I wrote it). The task: generalize `zeroMult_neg_two` (LiContour.lean, ~100 lines) to all trivial zeros.\n\nPlan:\n1. Read the Hfun machinery in LiContour.lean (lines ~400–470) to see the full structure (Hfun def, Hfun_analyticAt_neg_two, Hfun_neg_two_ne_zero, Hfun_eq).\n2. Design the general version:\n - For n ≥ 1: near s = −2n, ΓR(s) = π^{−s/2}Γ(s/2). Γ(s/2) has a simple pole at s = −2n.\n - Product-form recurrence: Γ(z) = Γ(z + n + 1) / ∏_{j=0}^{n} (z + j) for z ∉ {0, −1, ..., −n} — induction on Gamma_add_one.\n - At z = s/2 near −n: Γ(s/2) = Γ(s/2 + n + 1)/P_n(s) with P_n(s) = ∏_{j=0}^{n}(s/2 + j).\n - P_n(s) = (s/2 + n)·Q_n(s), Q_n(s) = ∏_{j=0}^{n-1}(s/2 + j), Q_n(−2n) = ∏_{j=0}^{n-1}(−n+j) = ∏_{j=0}^{n-1}(j−n) = (−1)^n n! ≠ 0.\n - So ΓR(s) = π^{−s/2}Γ(s/2+n+1)/[(s/2+n)Q_n(s)] = 2π^{−s/2}Γ(s/2+n+1)/[(s+2n)Q_n(s)].\n - Hence ζ(s) = Λ(s)/ΓR(s) = (s+2n)·G_n(s) with G_n(s) = Λ(s)·Q_n(s)/(2π^{−s/2}Γ(s/2+n+1)) = Λ(s)·Q_n(s)·π^{s/2}/(2Γ(s/2+n+1)).\n - G_n analytic at −2n: Λ analytic (completed zeta analytic away from 0,1 — −2n ≠ 0,1 for n ≥ 1... wait n ≥ 1: −2n ≤ −2 ✓); Q_n analytic (polynomial); π^{s/2} = exp((s/2) log π) analytic nonzero; Γ(s/2+n+1) analytic at −2n (s/2+n+1 = 1 at s=−2n; Γ analytic at 1 ✓) and nonzero (Γ(1) = 1).\n - G_n(−2n) = Λ(−2n)·Q_n(−2n)·π^{−n}/(2·1) — Λ(−2n) = Λ(1+2n) (FE) = ΓR(1+2n)ζ(1+2n) ≠ 0 (ζ ≠ 0 for re > 1 via riemannZeta_ne_zero_of_one_lt_re: 1+2n ≥ 3 > 1 ✓; ΓR(1+2n) ≠ 0 via Gammaℝ_ne_zero_of_re_pos (re > 0) ✓). Q_n(−2n) = (−1)^n n! ≠ 0 ✓. π^{−n} ≠ 0 ✓.\n - Then analyticOrderAt ζ (−2n) = 1 via analyticOrderAt_eq_natCast (the same pattern as zeroMult_neg_two: need the EventuallyEq ζ =ᶠ (s − (−2n))^1 • G_n on 𝓝(−2n) — from ζ = Λ/ΓR pointwise in a punctured neighborhood plus at −2n itself ζ(−2n) = 0 (riemannZeta_neg_two_mul_nat_add_one (n−1)?: ζ(−2·(n−1+1))... the Mathlib lemma: riemannZeta_neg_two_mul_nat_add_one (n : ℕ) : riemannZeta (−2*(n+1)) = 0? Let me check its exact form — from the n=−2 proof: `riemannZeta_neg_two_mul_nat_add_one 0` with norm_num gave ζ(−2) = 0. So the lemma: riemannZeta_neg_two_mul_nat_add_one (n : ℕ) : riemannZeta (-2 * (n + 1)) = 0? or (−2*(n+1))? For general n: ζ(−2n) = 0 for n ≥ 1: apply with n−1 (needs n ≥ 1) or maybe the lemma is `riemannZeta_neg_two_mul_nat_add_one (n : ℕ) : riemannZeta (-2 * (n+1)) = 0` — so ζ(−2n) for n ≥ 1 via n := n−1: −2·((n−1)+1) = −2n ✓.\n - The EventuallyEq: near −2n (punctured), ζ s = Λ s / ΓR s needs s ≠ 0 and ΓR s ≠ 0: in a small ball around −2n avoiding {−2m : m ≠ n} ∪ {0}: ΓR s = 0 ⟺ s ∈ {−2m}: distance from −2n to nearest other even negative is 2 — take ball radius 1 ✓. Then ΓR s = 2π^{−s/2}Γ(s/2+n+1)/((s+2n)Q_n(s)) — need the product identity at s/2 ∉ {0,−1,...,−n} — in the punctured ball: s/2 near −n, s/2 ∉ {0,...,−n} — could s/2 = −m for m < n within the ball? s = −2m with |s − (−2n)| < 1 — only m = n. So in the punctured ball (s ≠ −2n), s/2 ∉ {0,−1,...,−n} ✓ (also s/2 + j ≠ 0 for j ≤ n ✓).\n - Then ζ s = Λ s / ΓR s = Λ s · (s+2n) Q_n(s) / (2π^{−s/2}Γ(s/2+n+1)) = (s+2n) · G_n(s) ✓ pointwise in the punctured ball; at s = −2n both sides zero (LHS ζ(−2n) = 0, RHS 0·G = 0) — so the EventuallyEq holds on all of the ball (filter_upwards ball; case s = −2n separately) — mirrors zeroMult_neg_two's structure exactly.\n\n3. Analyticity of G_n at −2n: G_n = Λ · Q_n · π^{s/2} / (2Γ(s/2+n+1))... wait let me re-derive cleanly: G_n(s) = Λ(s) · Q_n(s) / (2 · π^{−s/2} · Γ(s/2+n+1))? From ΓR(s) = π^{−s/2}·Γ(s/2+n+1)/((s/2)(s/2+1)⋯(s/2+n)) — the full product ∏_{j=0}^{n}(s/2+j) = (s/2+n)·Q_n(s). So 1/ΓR(s) = (s/2+n)Q_n(s)/(π^{−s/2}Γ(s/2+n+1)) = (s+2n)Q_n(s)/(2π^{−s/2}Γ(s/2+n+1)). Thus:\n ζ(s) = Λ(s)·(s+2n)·Q_n(s)/(2π^{−s/2}Γ(s/2+n+1))\n G_n(s) := Λ(s)·Q_n(s)/(2·π^{−s/2}·Γ(s/2+n+1)) — analytic at −2n as a quotient of analytics with nonzero denominator: 2 ≠ 0; π^{−s/2} = exp(−(s/2)log π) ≠ 0 (exp); Γ(s/2+n+1) analytic at −2n + value Γ(1) = 1 ≠ 0.\n \n Hmm — 1/π^{−s/2} = π^{s/2}: better write G_n(s) = Λ(s) · Q_n(s) · π^{s/2} / (2 · Γ(s/2+n+1)). The cpow (π:ℂ)^{s/2} with real-positive base: analytic in s ✓ (DifferentiableAt.const_cpow as in the ΓR differentiability proof). Nonzero: cpow of nonzero base ≠ 0 (cpow_eq_zero_iff: base = 0 ∧ ... — (π:ℂ)^w ≠ 0 always for π ≠ 0: `Complex.cpow_ne_zero`? there's cpow_ne_zero_iff or just: x^y = exp(y log x) ≠ 0 when x ≠ 0 via exp_ne_zero — for the ≠ 0 proof use cpow_eq_zero_iff). For the DIVISION form: keep G_n = Λ · Q_n / (2 · π^{−s/2} · Γ(s/2+n+1)) and prove the denominator nonzero at −2n: π^{−(−2n)/2} = π^n ≠ 0 ✓, Γ(1) = 1 ≠ 0 ✓. AnalyticAt.div needs the denominator AnalyticAt + nonzero: 2·π^{−s/2}·Γ(s/2+n+1): analytic: const · cpow · Γ-comp ✓.\n\n Hmm — actually simpler to mirror ii′-4c's structure exactly: they defined Hfun (a def) with Hfun_eq (the identity (s+2)·ΓR s = Hfun s), Hfun_analyticAt_neg_two, Hfun_neg_two_ne_zero. Then ζ = Λ/ΓR and (s+2)ΓR s = Hfun s ⟹ ζ = (s+2)·Λ/Hfun. The general version: Hfun_n with (s+2n)·ΓR s = Hfun_n s where Hfun_n s = 2·π^{−s/2}·Γ(s/2+n+1)/Q_n(s)·... wait: (s+2n)·ΓR s = (s+2n)·π^{−s/2}Γ(s/2+n+1)/((s/2+n)Q_n s) = 2π^{−s/2}Γ(s/2+n+1)/Q_n(s) (since (s+2n) = 2(s/2+n)). So Hfun_n s := 2·π^{−s/2}·Γ(s/2+n+1)/Q_n(s) — analytic at −2n: Q_n(−2n) ≠ 0 ✓ so the quotient is analytic near −2n ✓ and nonzero at −2n ✓ (all three factors nonzero). Then ζ s = Λ s/ΓR s = (s+2n)·Λ s/Hfun_n s — same algebra as before.\n\n The KEY new build: the product recurrence:\n `Complex.Gamma (z) = Complex.Gamma (z + n + 1) / ∏ j ∈ Finset.range (n+1), (z + j)` for z ∉ {0,−1,...,−n} — more precisely for (∀ m : ℕ, m ≤ n → z ≠ −m) or the cleaner (∀ m : ℕ, z ≠ −m)... At our points only finitely many exclusions needed. Induction: n = 0: Γ(z) = Γ(z+1)/z = Γ(z+1)/∏_{j∈range 1}(z+j) = Γ(z+1)/z ✓ (Gamma_add_one: Γ(z+1) = z Γ(z), z ≠ 0). Step: Γ(z+n+2) = (z+n+1)Γ(z+n+1) ⟹ Γ(z+n+1) = Γ(z+n+2)/(z+n+1) for z+n+1 ≠ 0; substitute in IH: Γ(z) = Γ(z+n+1)/∏_{j≤n}(z+j) = Γ(z+n+2)/[(z+n+1)·∏_{j≤n}(z+j)] = Γ(z+n+2)/∏_{j≤n+1}(z+j) [prod_range_succ] ✓.\n\n Hypotheses for the induction: at step k: need z + k ≠ 0 (for Gamma_add_one (z+k) — wait Gamma_add_one (s) (hs : s ≠ 0) : Gamma (s+1) = s * Gamma s — I need the REVERSE: Γ(w) = Γ(w+1)/w — from Gamma_add_one: Γ(z+k+1) = (z+k)Γ(z+k) with z+k ≠ 0 ⟹ Γ(z+k) = Γ(z+k+1)/(z+k) ✓ div). So the induction needs z + k ≠ 0 for k = 0..n. In my application: z = s/2 with s in the punctured ball around −2n: s/2 + k ≠ 0 for k ≤ n ✓ (shown via ball geometry: s/2 + k = 0 ⟺ s = −2k; |−2k − (−2n)| = 2|n−k| ≥ 2 > 1 for k ≠ n; k = n excluded by puncture).\n\n Actually — even simpler formulation for the proof: state the recurrence as\n `Gamma_div_prod : ∀ n : ℕ, (∀ k : ℕ, k ≤ n → z ≠ -(k:ℂ)) → Complex.Gamma z * ∏ j ∈ Finset.range (n+1), (z + j) = Complex.Gamma (z + n + 1)` — the MULTIPLIED form avoids division-side-conditions: induction: n=0: Γ(z)·z = Γ(z+1) ✓ Gamma_add_one (needs z ≠ 0: from the hypothesis k=0: z ≠ −0 = 0 ✓). Step: Γ(z)·∏_{j≤n+1}(z+j) = Γ(z)·∏_{j≤n}(z+j)·(z+n+1) = Γ(z+n+1)·(z+n+1) [IH, needs hypotheses ≤ n ⊂ ≤ n+1] = Γ(z+n+2) [Gamma_add_one (z+n+1) (z+n+1 ≠ 0 from hypothesis k = n+1: z ≠ −(n+1) ⟺ z + (n+1) ≠ 0)] ✓ — wait Gamma_add_one (s) hs : Gamma (s+1) = s*Gamma s: Γ(z+n+1)·(z+n+1) = Γ((z+n+1)+1) = Γ(z+n+2) ✓ (z+n+1)+1 = z+n+2 by ring — push_cast/ring bridge for (z + ↑(n+1)) + 1 = z + ↑(n+2)... careful with Nat casts: z + (n : ℂ) + 1 vs z + ((n+1 : ℕ):ℂ): push_cast ring ✓.\n\n The multiplied form is cleaner (only needs the ≠ 0 for the Gamma_add_one applications, no division well-definedness). Then derive the division form where needed with the product-nonzero fact.\n\nLet me now read the LiContour.lean Hfun section (lines ~400–470) to see the exact helper structure, then write the general version. Where should the new code live? LiContour.lean is where zeroMult_neg_two is — the generalization fits there (it's ii′-4c's continuation; but the freeze protocol says \"no edits to existing Lean proofs except the liCoeff correctness fix\" — hmm! Freeze: \"no edits to existing Lean proofs except the liCoeff correctness fix (ii′-1a)\". Does ADDING a new theorem to LiContour.lean count as editing existing proofs? The pattern so far: new content goes in NEW files (LiDisc, LiReflect were new files). zeroMult_neg_two stays untouched; the new generalization `zeroMult_neg_two_mul` goes in a new file — could go in LiReflect.lean (already mine this session-cycle... but it imports LiDisc which is heavy — fine, it's built). Hmm — actually cleaner: new file LiTrivialZeros.lean? Or add to LiReflect? The generalization is 5e-prep and logically belongs with the ii′-4/zero-mult family. New file `NguyenRH1/LiTrivialZeros.lean` importing LiContour (for zeroMult_neg_two's pattern... actually it doesn't need zeroMult_neg_two itself — the general version at n ≥ 1 SUBSUMES −2 (n=1). But keep both (zeroMult_neg_two is used in LiSides? it was deferred from ii′-1b — used anywhere? The trivial-zero split is ii′-4/5e territory. Fine — new file importing LiContour (for the Hfun... no, Hfun is specific to −2). The new file needs: LiSkeleton (zeroMult? no — zeroMult is Zeta23.Statement's, available via any Zeta23 import), Mathlib, Zeta23.RvM.CountByIntegral (completedRiemannZeta_eq_Gammaℝ_mul), and the riemannZeta_neg_two_mul_nat_add_one (Mathlib). Import NguyenRH1.LiContour to sit in the same environment (and it brings LiSides/LiSkeleton chains) — or lighter: import Mathlib + Zeta23.RvM.CountByIntegral + Zeta23.Statement. Let me check what LiContour imports: Mathlib, Zeta23.Statement, Zeta23.RvM.CountByIntegral, NguyenRH1.LiSides, NguyenRH1.LiSkeleton. For my new file: import Mathlib, Zeta23.Statement (zeroMult, IsNontrivialZero), Zeta23.RvM.CountByIntegral (the RvM seams). Lighter is better for compile time. But it also sits fine to import LiContour for consistency... LiContour is already built; importing it adds nothing to build time materially. I'll import LiContour (gets everything transitively) — no wait, lighter: just Mathlib + the two Zeta23 modules. Hmm — but root NguyenRH1.lean imports all files; adding LiTrivialZeros to the root after LiReflect. The import chain: LiTrivialZeros needs only Mathlib + Zeta23.Statement + Zeta23.RvM.CountByIntegral. Fine.\n\nPlan the file:\n\n```\nNguyenRH1/LiTrivialZeros.lean — ii′-5e prep: zeroMult(−2n) = 1 for ALL n ≥ 1\n(generalization of ii′-4c's zeroMult_neg_two).\n\n§1 the product-form Γ recurrence:\n Gamma_mul_prod (z : ℂ) (n : ℕ) (hz : ∀ k : ℕ, k ≤ n → z ≠ -(k:ℂ)) :\n Complex.Gamma z * ∏ j ∈ Finset.range (n+1), (z + j) = Complex.Gamma (z + n + 1)\n (induction; Gamma_add_one)\n\n§2 the cofactor:\n Q (n : ℕ) (s : ℂ) : ℂ := ∏ j ∈ Finset.range n, (s/2 + j)\n Q_ne_zero_at / Q analytic\n HfunT (n : ℕ) (s : ℂ) : ℂ := 2 * (Real.pi:ℂ)^(-s/2) * Complex.Gamma (s/2 + n + 1) / Q n s\n — wait: (s+2n)·ΓR s = 2π^{−s/2}Γ(s/2+n+1)/Q_n(s): from ΓR s = π^{−s/2}Γ(s/2) and Γ(s/2)·∏_{j≤n}(s/2+j) = Γ(s/2+n+1): Γ(s/2) = Γ(s/2+n+1)/((s/2+n)·Q_n(s)) — as a function identity where Q_n ≠ 0... The pointwise identity (s+2n)·ΓR(s) = HfunT n s holds when Q_n(s) ≠ 0 and the recurrence side-conditions hold (s/2 ≠ −k for k ≤ n — the k = n one: s/2 + n ≠ 0 ⟺ s ≠ −2n; k < n: Q_n(s) ≠ 0 gives them). Hmm — the recurrence Γ(z)·∏_{j≤n}(z+j) = Γ(z+n+1) needs z ≠ −k for ALL k ≤ n INCLUDING k = n (the last Gamma_add_one step). At s = −2n exactly the identity (s+2n)ΓR s = HfunT n s: LHS = 0·ΓR(−2n) = 0 (ΓR(−2n) = 0 by Gammaℝ_eq_zero_iff ⟨n⟩); RHS = 2π^n·Γ(1)/Q_n(−2n) ≠ 0!! So the pointwise identity FAILS at s = −2n — as it must (ΓR has a zero, HfunT a finite nonzero value — the identity (s+2n)ΓR(s) = HfunT(s) can only hold where both sides defined & the recurrence valid: s ≠ −2n). That's fine — the EventuallyEq for ζ needs the identity only in the PUNCTURED ball (plus the s = −2n point handled by ζ(−2n) = 0 = (s+2n)·G at s=−2n). Same as ii′-4c (their Hfun_eq needed s ≠ −2 etc. — they had hypotheses (hs : s ≠ -2?) let me check Hfun_eq's signature: `Hfun_eq s hs hs0` with hs : s ≠ −2 presumably and hs0 : s ≠ 0 — from line 557: `Hfun_eq s hs hs0` where hs : s ≠ −2 (from the by_cases) and hs0 : s ≠ 0. So their identity (s+2)·ΓR s = Hfun s holds for s ≠ −2, s ≠ 0. Mine: (s+2n)·ΓR s = HfunT n s for s ∉ {−2k : k ≤ n} ∪ {0}? Let me see: the recurrence needs s/2 ≠ −k for k ≤ n, i.e., s ≠ −2k for k ≤ n. And k = 0 case: s ≠ 0. So hypotheses: ∀ k ≤ n, s ≠ −2k. In the punctured ball of radius 1 about −2n: s ≠ −2k for k ≠ n (distance ≥ 2) and s ≠ −2n (puncture) ✓ also s ≠ 0 ✓ (n ≥ 1, ball within re < −1).\n\n§3 the main theorem:\n zeroMult_neg_two_mul (n : ℕ) (hn : 1 ≤ n) : zeroMult (-2 * (n:ℂ)) = 1\n\n Structure (mirroring zeroMult_neg_two):\n - Λ analytic at −2n (ball radius 1 avoids 0, 1) ✓\n - HfunT n analytic at −2n: 2·π^{−s/2}·Γ(s/2+n+1)/Q_n: numerator analytic: const_mul (cpow analytic: DifferentiableAt.const_cpow ... (Or.inl π≠0) — as in differentiableAt_Gammaℝ_of_im_ne_zero'; Γ(s/2+n+1): differentiableAt_Gamma (∀ m, s/2+n+1 ≠ −m: at s near −2n: s/2+n+1 near 1: re > 0 in the ball — show via re bounds: re(s/2+n+1) = re s/2 + n + 1 ∈ (−n−1/2+n+1, ...) = (1/2, 3/2) > 0 ✓ so ≠ −m (real ≤ 0) ✓); Q_n analytic (polynomial: Finset.prod of linear factors: AnalyticAt (fun s => ∏ j, (s/2+j)) — via AnalyticAt.fun_prod? `AnalyticAt.prod`? exists: AnalyticAt.fun_prod or Finset.prod version — `AnalyticAt.prod (hs : ∀ i ∈ s, AnalyticAt ℂ (f i) x) : AnalyticAt ℂ (∏ i ∈ s, f i ·) x`? there's `AnalyticAt.prod`... I'll find it); denominator Q_n(−2n) ≠ 0 (each factor −n+j ≠ 0 for j < n: Finset.prod_ne_zero_iff) ⟹ quotient analytic (AnalyticAt.div).\n - HfunT n (−2n) ≠ 0: factors: 2 ≠ 0; π^n ≠ 0 (cpow_ne_zero or via exp); Γ(1) = 1 ≠ 0 (Complex.Gamma_one : Gamma 1 = 1? `Complex.Gamma_one : Complex.Gamma 1 = 1`? or Gamma_one — check); Q_n(−2n) ≠ 0 ⟹ div_ne_zero.\n - Λ(−2n) ≠ 0: Λ(−2n) = Λ(1+2n) (completedRiemannZeta_one_sub: Λ(1−(−2n)) = Λ(1+2n) = Λ(−2n) — wait completedRiemannZeta_one_sub s : Λ(1−s) = Λ(s): at s = −2n: Λ(1+2n) = Λ(−2n) ✓) = ΓR(1+2n)·ζ(1+2n) (needs 1+2n ≠ 0 ✓ and ΓR(1+2n) ≠ 0 via re > 0 ✓) — ζ(1+2n) ≠ 0: riemannZeta_ne_zero_of_one_lt_re (re(1+2n) = 1+2n > 1 ✓ since n ≥ 1).\n - G := Λ/HfunT n: analytic at −2n, nonzero.\n - EventuallyEq: ζ =ᶠ[𝓝 (−2n)] fun s => (s − (−2n))^1 • (Λ s/HfunT n s):\n filter_upwards [ball radius 1, HfunT ≠ 0 near (ContinuousAt.eventually_ne), Q_n ≠ 0 near?] — for the pointwise identity at s (s ≠ −2n case): need (s+2n)ΓR s = HfunT n s: via the recurrence at z = s/2: needs ∀ k ≤ n, s/2 ≠ −(k:ℂ): s/2 = −k ⟺ s = −2k: in ball(−2n, 1): |s − (−2n)| < 1 with s = −2k: |2n − 2k| = 2|n−k| < 1 ⟹ k = n; and s ≠ −2n by the by_cases. So: by_cases s = −2n (then both sides 0: ζ(−2n) = 0 via riemannZeta_neg_two_mul_nat_add_one (n−1) — hmm need n ≥ 1: n = (n−1)+1: `riemannZeta_neg_two_mul_nat_add_one (n - 1)` : ζ(−2·((n−1)+1)) = 0: ((n−1)+1) = n by Nat.sub_add_cancel hn: so ζ(−2·↑n) = 0 — cast juggling: −2 * (↑(n−1)+1) = −2*↑n: push_cast with Nat.sub_add_cancel hn... `riemannZeta_neg_two_mul_nat_add_one` exact statement — check; in ii′-4c they used `riemannZeta_neg_two_mul_nat_add_one 0` then norm_num ⟹ ζ(−2) = 0: so the lemma's argument gives ζ(−2·(0+1)) = ζ(−2)... the exact form: probably `riemannZeta_neg_two_mul_nat_add_one (n : ℕ) : riemannZeta (-2 * (n + 1)) = 0`? hmm with casts. I'll check.\n For s ≠ −2n: the identity chain as in ii′-4c: ζ s = Λ s/ΓR s [s ≠ 0, ΓR s ≠ 0 — the latter: ΓR s = 0 ⟺ s ∈ {−2m}: s = −2m in the ball ⟹ m = n ⟹ s = −2n contradiction ✓]; then Λ s/ΓR s = (s+2n)·Λ s/HfunT n s: from (s+2n)·ΓR s = HfunT n s: Λ/ΓR = (s+2n)Λ/((s+2n)ΓR) = (s+2n)Λ/HfunT [mul_div_cancel_left₀ with (s+2n) ≠ 0 (s ≠ −2n)] ✓.\n - analyticOrderAt_eq_natCast + toNat: zeroMult(−2n) = 1 ✓.\n```\n\nWait — one important check: `analyticOrderAt_eq_natCast` usage in ii′-4c: `(hzeta_an.analyticOrderAt_eq_natCast).mpr ⟨fun s => completedRiemannZeta s / Hfun s, hG_an, hG_ne, hEv⟩` — so AnalyticAt.analyticOrderAt_eq_natCast : analyticOrderAt f x = n ↔ ∃ g, AnalyticAt g x ∧ g x ≠ 0 ∧ f =ᶠ[𝓝 x] fun z => (z − x)^n • g z — presumably. ✓ mirror.\n\nAnd hzeta_an : AnalyticAt ℂ riemannZeta (−2n) := hRHS_an.congr (EventuallyEq.symm hEv) ✓ same pattern.\n\nAlso Q_n needs care: Q_n(s) = ∏ j ∈ range n, (s/2 + ↑j). At s = −2n: s/2 + j = −n + j for j ∈ range n (j < n): −n+j ≠ 0 ⟺ j ≠ n ✓ (j ≤ n−1). Finset.prod_ne_zero_iff : ∏ ≠ 0 ↔ ∀ i ∈ s, f i ≠ 0 ✓.\n\nAlso the recurrence application at z = s/2: ∀ k ≤ n, s/2 ≠ −(k:ℂ): s/2 = −k ⟹ s = −2k: mul: s = 2·(s/2) = −2k: then |−2k − (−2n)| < 1: ‖−2k+2n‖ = 2|n−k| < 1: for naturals |n−k| ≥ 1 when k ≠ n ⟹ 2 ≤ ... contradiction; k = n ⟹ s = −2n, excluded. In Lean: from h : s/2 = −(k:ℂ): s = −2k: have := congrArg (· * (2:ℂ)) h: s/2*2 = −k*2: div_mul_cancel... (s/2)*2 = s (div_mul_cancel₀ s two_ne_zero) — wait (s/2)*2: div_mul_cancel₀ : a/b * b = a ✓. So s = −2·↑k = −2↑k. Then s − (−2n) = 2(n−k)... the ball membership: ‖s − (−2n)‖ < 1: s + 2n = −2k + 2n = 2(n−k) as complex: norm = 2|((n:ℤ)−k)|... In Lean: s − (−2*↑n) = −2↑k + 2↑n = ↑(2n − 2k)-ish: push_cast: (−2k + 2n : ℂ) = ((−2k + 2n : ℝ):ℂ)? with n k naturals: (−2:ℝ)·k + 2·n: = 2·(n − k) if k ≤ n or 2·(k−n)·(−1)... Since k ≤ n (hypothesis of the recurrence): n − k ≥ 0: s − (−2↑n) = ((2·(n−k) : ℝ) : ℂ) — push_cast with Nat.sub: 2↑n − 2↑k = ↑(2(n−k))? needs k ≤ n for Nat.cast_sub: `Nat.cast_sub (h : k ≤ n) : (↑(n−k):α) = ↑n − ↑k` ✓. So ‖s−(−2n)‖ = 2·(n−k) : ℝ ≥ ... if k < n: n−k ≥ 1: ‖·‖ = 2(n−k) ≥ 2 > 1 contradicts ball < 1 ✓. If k = n: s = −2n excluded by the by_cases ✓. \n\nHmm wait — the recurrence's side conditions need k ≤ n; the ball argument: for k ≤ n with k ≠ n: 2(n−k) ≥ 2 ✓. Good.\n\nAlso — in ii′-4c they handled the ball-geometry with explicit norm_num/nlinarith on ((2:ℝ) − 2m : ℝ)-style expressions. For the general case it's 2(n−k) — manageable with exact_mod_cast + nlinarith.\n\nOne more consideration: HfunT's analyticity at −2n — the numerator 2·π^{−s/2}·Γ(s/2+n+1):\n- π^{−s/2} = (π:ℂ)^(−s/2): DifferentiableAt: DifferentiableAt.const_cpow (differentiable...) (Or.inl (π:ℂ) ≠ 0) — from the differentiableAt_Gammaℝ_of_im_ne_zero' proof: `DifferentiableAt.const_cpow ?_ (Or.inl ...)` with ?_ : DifferentiableAt ℂ (fun z => −z/2) s = (differentiableAt_id.neg).div_const 2 ✓. Then .analyticAt.\n- Γ(s/2+n+1): Complex.differentiableAt_Gamma (s/2+n+1) (∀ m, s/2+n+1 ≠ −m): need at s = −2n SPECIFICALLY (analyticAt needs a NEIGHBORHOOD of differentiability: `Complex.analyticAt_iff_eventually_differentiableAt` — the pattern from analyticAt_Gammaℝ_of_im_ne_zero: filter_upwards [isOpen...mem_nhds] with z hz => differentiableAt... For Γ(s/2+n+1) I need differentiability in a NEIGHBORHOOD of −2n: take the ball radius 1/2: s/2+n+1 has re ∈ (1/2−1/4, ...) hmm: |s − (−2n)| < 1/2 ⟹ re s ∈ (−2n−1/2, −2n+1/2) ⟹ re(s/2+n+1) ∈ (1/2−1/4·...) let me compute: re(s/2+n+1) = re s /2 + n + 1 ∈ (−n−1/4 + n+1, −n+1/4+n+1) = (3/4, 5/4) — always > 0, so s/2+n+1 ≠ −m for any m (real −m ≤ 0 < 3/4) ✓. So on the ball B(−2n, 1/2): differentiableAt_Gamma everywhere ⟹ analyticAt at −2n via analyticAt_iff_eventually_differentiableAt ✓.\n- Q_n: analytic everywhere (polynomial): `AnalyticAt.prod`? For a Finset product of analytic functions: `AnalyticAt.fun_prod`? Let me recall: `AnalyticAt.fun_prod (hf : ∀ i ∈ s, AnalyticAt ℂ (f i) x) : AnalyticAt ℂ (fun x => ∏ i ∈ s, f i x) x`? I believe `AnalyticAt.fun_prod` exists (or `.prod`). Each factor fun s => s/2 + ↑j: (analyticAt_id.div_const? or (analyticAt_id... `analyticAt_id : AnalyticAt ℂ id x`? hmm — AnalyticAt.id? there's `analyticAt_id : AnalyticAt ℂ (id) x`? For fun s => s/2 + j: (analyticAt_id...). I'll find the right names (analyticAt_id exists I think; .div_const? AnalyticAt has .div_const? Maybe not — use (analyticAt_id.mul_const? ...). Simplest: each factor is differentiable (differentiableAt_id.div_const 2 |>.add_const) ⟹ analyticAt via differentiableAt.analyticAt ✓ (`DifferentiableAt.analyticAt : DifferentiableAt ℂ f x → AnalyticAt ℂ f x` ✓ exists). And the product: differentiable ⟹ analytic for each, then AnalyticAt product — is there `AnalyticAt.prod`? In Mathlib: `AnalyticAt.fun_prod : (∀ i ∈ s, AnalyticAt ℂ (f i) x) → AnalyticAt ℂ (fun x => ∏ i ∈ s, f i x) x`? Hmm — there IS `AnalyticAt.fun_prod` I believe (and `.prod` for pairs). If not: induction via AnalyticAt.mul. Fine at build.\n- The quotient: AnalyticAt.div (numerator analytic) (Q_n analytic) (Q_n(−2n) ≠ 0) ✓ `AnalyticAt.div (hf : AnalyticAt f x) (hg : AnalyticAt g x) (h : g x ≠ 0) : AnalyticAt (f/g) x` ✓.\n- The constant 2·: AnalyticAt.const_mul? or include in numerator: (2 · (π^{−s/2} · Γ(..))) — AnalyticAt.mul chains ✓ or just build numerator := fun s => 2 * π^(−s/2) * Γ(s/2+n+1) via .const_mul/.mul. Or fold the 2 into Q_n's denominator side... Actually simplest: HfunT n s := (2 * (Real.pi:ℂ)^(-s/2) * Complex.Gamma (s/2 + n + 1)) / Q n s. numerator analytic: (analyticAt_const.mul (...)).mul? fine.\n\nWait — actually, is the identity right? (s+2n)·ΓR(s) = (s+2n)·π^{−s/2}·Γ(s/2). And Γ(s/2) = Γ(s/2+n+1)/∏_{j≤n}(s/2+j) — the division form needs ∏ ≠ 0. So (s+2n)·ΓR(s) = (s+2n)·π^{−s/2}·Γ(s/2+n+1)/[(s/2+n)·Q_n(s)] and (s+2n)/(s/2+n) = 2 (when s/2+n ≠ 0). So = 2π^{−s/2}Γ(s/2+n+1)/Q_n(s) = HfunT n s ✓ (when Q_n(s) ≠ 0 ∧ s/2+n ≠ 0, plus the recurrence side-conditions ∀ k ≤ n, s/2 ≠ −k — note Q_n(s) ≠ 0 gives k < n conditions; k = n is s/2+n ≠ 0 separate).\n\nFor the recurrence in multiplied form: Gamma z * ∏ j ∈ range (n+1), (z + j) = Gamma (z + n + 1) — hypotheses ∀ k ≤ n, z ≠ −k. Then at z = s/2: Γ(s/2)·[(s/2+n)·Q_n(s)] = Γ(s/2+n+1) (since ∏_{j∈range(n+1)}(z+j) = ∏_{j<n}(z+j)·(z+n) = Q_n·(z+n): Finset.prod_range_succ : ∏ j ∈ range (n+1), f j = (∏ j ∈ range n, f j) * f n ✓). So Γ(s/2) = Γ(s/2+n+1)/[(s/2+n)·Q_n(s)] when (s/2+n)·Q_n(s) ≠ 0: eq_div_iff / div_eq_iff machinery ✓.\n\nOK. Also for the base-length: the whole thing ~250–350 lines estimated. Let me also handle: n = 0 excluded (hn : 1 ≤ n) — zeroMult at 0 would be different (ζ(0) = −1/2 ≠ 0). Fine.\n\nOne thing to check: `riemannZeta_neg_two_mul_nat_add_one` exact statement. And `Complex.Gamma_one`. Let me grep.","signature":""},{"type":"text","text":"Starting session 026, first item: `zeroMult(−2n) = 1` for all n. Let me survey the remaining API details and the Hfun helper block in LiContour."},{"type":"tool_use","id":"TodoWrite_171","name":"TodoWrite","input":{"todos":[{"content":"Survey: Hfun block in LiContour, riemannZeta_neg_two_mul_nat_add_one, Gamma_one, AnalyticAt.prod","status":"in_progress","activeForm":"Surveying APIs for the generalization"},{"content":"Build product-form Γ recurrence (Gamma_mul_prod) by induction","status":"pending","activeForm":"Building product-form Γ recurrence"},{"content":"Build HfunT cofactor: analytic + nonzero at −2n","status":"pending","activeForm":"Building HfunT cofactor"},{"content":"Prove zeroMult_neg_two_mul : zeroMult(−2n) = 1 for n ≥ 1","status":"pending","activeForm":"Proving zeroMult(−2n) = 1"},{"content":"Build green + root import + axiom audit","status":"pending","activeForm":"Building and auditing"},{"content":"Then ii′-5e design (identity assembly plan) if time; session closure","status":"pending","activeForm":"5e design + closure"}]},"extra_content":null}]