Current task: —

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

#1198 assistant 2026-08-22 15:47:37.324 UTC · 472→3728 tok open ⤢
thinking (8808 chars)
Now ii′-4c: zeroMult(−2) = 1. The plan: ```lean /-- **Trivial-zero simplicity** (deferred from ii′-1b(iii), D-066 §6): zeroMult (−2) = 1. Route: ζ(s) = (s+2)·G(s) near −2 with G(s) = Λ(s)/H(s), H(s) = 4·π^{−s/2}·Γ(s/2+2)/s (= (s+2)·ΓR(s) off {−2,0}), H(−2) = −2π ≠ 0, Λ(−2) = Λ(3) = ΓR(3)·ζ(3) ≠ 0. -/ ``` Steps in Lean: 1. Hfun s := 4 * (π:ℂ)^(-s/2) * Complex.Gamma (s/2 + 2) / s - AnalyticAt at −2: components: a. s ↦ (π:ℂ)^(-s/2): analytic. Write as exp: (π:ℂ)^w = exp (w * log π) for w... `Complex.cpow_eq_exp_mul_log`? The def: x ^ y = exp (log x * y) for x ≠ 0 (`Complex.cpow_def_of_ne_zero`). So (fun s => (π:ℂ)^(-s/2)) = (fun s => Complex.exp (Complex.log π * (-s/2))) eventually? Everywhere: cpow_def_of_ne_zero needs base ≠ 0 ✓ (π:ℂ) ≠ 0. So the function equals s ↦ exp (log π * (−s/2)) pointwise — analytic via exp∘(linear). AnalyticAt: `Complex.analyticAt_exp`? Mathlib: `analyticAt_exp`? There's `Complex.analyticAt_exp (z : ℂ) : AnalyticAt ℂ exp z`? Probably `Complex.analyticAt_exp`. Then comp with linear (analytic: polynomial/linear: `AnalyticAt.mul`, `analyticAt_const`, `analyticAt_id`...). Simpler: `DifferentiableAt` then AnalyticAt via... hmm — for exp∘linear use AnalyticAt.comp: (analyticAt_exp _).comp (linear analytic). Linear: fun s => log π * (−s/2): = (log π)·(−1/2)·s: `AnalyticAt ℂ (fun s => c * s) z` via analyticAt_const.mul analyticAt_id ✓. Alternatively — Mathlib might have `Complex.analyticAt_cpow_const`? There is `analyticAt_cpow_const`? Not sure. The exp route is safe. Hmm wait — actually even simpler: I recall there IS `Complex.analyticAt_cpow_const (z) (hx : x ≠ 0) : AnalyticAt ℂ (fun s => x ^ s) z`? Hmm. Not sure. Let me check quickly... I'll grep. b. s ↦ Gamma (s/2 + 2) analytic at −2: DifferentiableOn ball(−2, 1) → analyticOnNhd → analyticAt. Need: ∀ s ∈ ball(−2,1), ∀ m : ℕ, s/2+2 ≠ −m: s/2+2 ∈ ball(1, 1/2): if s/2+2 = −m then −m ∈ ball(1,1/2): |−m − 1| < 1/2: m+1 < 1/2 as real — impossible (m ≥ 0 ⟹ m+1 ≥ 1). Formalize: dist (−m) 1 = |−m−1| = m+1 ≥ 1 > 1/2 ✓. differentiableAt_Gamma (s/2+2) (hs : ∀ m, s/2+2 ≠ −m) gives DifferentiableAt; then composition: DifferentiableAt (Gamma ∘ (s/2+2)) via .comp. Then DifferentiableOn on the ball, IsOpen ball, then `DifferentiableOn.analyticOnNhd`? Hmm — exact name: I believe `DifferentiableOn.analyticOnNhd (h : DifferentiableOn ℂ f s) (hs : IsOpen s) : AnalyticOnNhd ℂ f s`? Let me check — used in ii′-1b? zetaA_analyticOnNhd_univ proof — let me look at what lemma it used. I'll grep LiSides for the pattern. c. s ↦ 4/s... wait H = 4·π^{−s/2}·Γ(s/2+2)/s: the division by s: analytic at −2 (s ≠ 0): AnalyticAt.div with s ↦ s analytic, s ≠ 0 at −2 ✓ — AnalyticAt.div needs AnalyticAt of numerator/denominator + denom ≠ 0: `(h1.div h2 hne)`. Numerator: product of the two above times const 4. - H(−2) = −2π: compute: (−(−2)/2) = 1: π^{1} = π: cpow_one ✓ (exponent −(−2)/2 = (1:ℂ): norm_num). Gamma((−2)/2 + 2) = Gamma 1 = 1: `Complex.Gamma_one`? exists? There's `Complex.Gamma_one : Gamma 1 = 1` ✓ (from Gamma_one_half etc.; grep earlier showed `Gammaℝ_one` using Complex.Gamma_one_half_eq; Complex.Gamma_one should exist). H(−2) = 4·π·1/(−2) = −2π: field_simp/norm_num with pi_ne_zero. 2. The punctured identity: for s ≠ −2, s ≠ 0 (in a punctured neighborhood): (s+2)·Gammaℝ s = Hfun s: Gammaℝ s = π^{−s/2}·Γ(s/2) [Gammaℝ_def] Γ(s/2) = Γ(s/2+2)/((s/2)(s/2+1)): Gamma_add_one twice: Complex.Gamma_add_one {s : ℂ} (hs : s ≠ 0) : Gamma (s + 1) = s * Gamma s — check exact form (grep earlier: Deriv.lean used Gamma_add_one _ hs in Beta.lean: `Gamma_add_one _ hs`). Hmm the Beta.lean usage: `rw [Gammaℝ_def, Gammaℝ_def, Gamma_add_one _ hs, ...]` hmm wait that was Gammaℂ_add_one's proof: `rw [Gammaℂ_def, Gammaℂ_def, Gamma_add_one _ hs, neg_add, ...]` — so `Complex.Gamma_add_one (s : ℂ) (hs : s ≠ 0) : Gamma (s + 1) = s * Gamma s`? Let me confirm the statement form later. So: Gamma (s/2) : set z = s/2: Gamma (z+1) = z·Gamma z ⟹ Gamma z = Gamma(z+1)/z for z ≠ 0. And Gamma(z+1) = Gamma(z+2)/(z+1) for z+1 ≠ 0. So Gamma z = Gamma(z+2)/(z(z+1)). At z = s/2: Gamma(s/2) = Gamma(s/2+2)/((s/2)(s/2+1)). Then (s+2)·Gammaℝ s = π^{−s/2}·(s+2)·Γ(s/2) = π^{−s/2}·(s+2)·4Γ(s/2+2)/(s(s+2)) = 4π^{−s/2}Γ(s/2+2)/s ✓ (since (s/2)(s/2+1) = s(s+2)/4). 3. Λ(s) = Gammaℝ s · ζ(s) near −2 (s ≠ −2): `completedRiemannZeta_eq_Gammaℝ_mul (hs : s ≠ 0) (hG : Gammaℝ s ≠ 0)` (Zeta23) — needs Gammaℝ s ≠ 0: `Gammaℝ_eq_zero_iff : Gammaℝ s = 0 ↔ ∃ n : ℕ, s = -(2*n)`. For s in punctured ball around −2 of radius 1: s ≠ 0, −2, −4...: s = −(2n) with n ≥ 1 ⟹ |s − (−2)| = |2n − 2| ≥ 2 (n=0: s = 0, |0+2| = 2 ≥ 1 ✓ excluded by radius 1... |s−(−2)| < 1: s = −(2n): |−2n+2| = |2n−2| < 1 ⟹ 2n−2 = 0 ⟹ n = 1 ⟹ s = −2 — excluded by puncture ✓. So on punctured ball: Gammaℝ s ≠ 0 ✓ and s ≠ 0 ✓. So on the punctured ball: ζ(s) = Λ(s)/Gammaℝ s = Λ(s)·(s+2)/Hfun s = (s+2)·G(s) with G := Λ/Hfun (Hfun ≠ 0 on punctured ball: Hfun(−2) ≠ 0 + continuity ⟹ Hfun ≠ 0 on some ball; intersect). Hmm — getting the punctured identity: ∀ᶠ s in 𝓝[≠] (−2), riemannZeta s = (s − (−2))^1 • G s... then upgrade to 𝓝(−2) via continuity at −2 (both sides): ζ continuous at −2 (differentiableAt: Mathlib `differentiableAt_riemannZeta`? there IS `differentiableAt_riemannZeta {s : ℂ} (hs : s ≠ 1) : DifferentiableAt ℂ riemannZeta s`? I believe yes — `differentiableAt_riemannZeta`). RHS continuous at −2 (analytic). So equality at −2 from punctured: both sides 0 anyway: ζ(−2) = 0 (riemannZeta_neg_two_mul_nat_add_one 0) and (−2+2)·G(−2) = 0 ✓ — direct point check, no continuity glue needed! ∀ s in ball: if s = −2 ✓ by values; else the punctured identity. Even simpler: state ∀ s ∈ Metric.ball (−2) r, riemannZeta s = (s+2) * G s, proved by cases s = −2 or not. Then eventuallyEq from ball ∈ 𝓝(−2). For analyticOrderAt_eq_natCast: need `riemannZeta =ᶠ[𝓝 (−2)] fun s => (s − (−2))^1 • G s`: (s−(−2))^1 • G s = (s+2)·G s ✓ (pow_one, smul = mul for ℂ: `smul_eq_mul`). 4. G analytic at −2: AnalyticAt.div: Λ analytic at −2 (−2 ≠ 0, −2 ≠ 1: differentiableAt_completedZeta → AnalyticAt via neighborhood-differentiability: differentiableAt_completedZeta holds on the open set {s | s ≠ 0 ∧ s ≠ 1}... simpler: on ball(−2, 1): every point ≠ 0, 1 ✓ DifferentiableOn ⟹ AnalyticOnNhd ⟹ AnalyticAt. Which lemma converts DifferentiableOn+IsOpen to AnalyticOnNhd? Let me check what zetaA_analyticOnNhd_univ used in LiSides — grep. Hfun analytic at −2 ✓ (step 1), Hfun(−2) ≠ 0 ✓. G(−2) = Λ(−2)/Hfun(−2) ≠ 0: Λ(−2) = Λ(3) [completedRiemannZeta_one_sub]; Λ(3) = Gammaℝ 3 · ζ(3) [completedRiemannZeta_eq_Gammaℝ_mul (3≠0) (Gammaℝ 3 ≠ 0)]; Gammaℝ 3 ≠ 0: Gammaℝ_eq_zero_iff: 3 = −(2n) impossible (re: 3 = −2n as reals: −2n ≤ 0 < 3 ✓ — need to discharge ¬∃ n : ℕ, (3:ℂ) = −(2·n): intro ⟨n, hn⟩: take re: 3 = −(2·↑n) ≤ 0 contradiction: norm_num/positivity: (-(2*(n:ℂ))).re = −2n ≤ 0 ✓); ζ(3) ≠ 0: riemannZeta_ne_zero_of_one_lt_re (re 3 = 3 > 1 ✓). So Λ(−2) ≠ 0, Hfun(−2) ≠ 0 ⟹ G(−2) ≠ 0 ✓ div_ne_zero. 5. Then: ```lean theorem zeroMult_neg_two : zeroMult (-2) = 1 := by have han : AnalyticAt ℂ riemannZeta (-2) := -- from the eventuallyEq factorization (RHS analytic) AnalyticAt.congr' ... hmm ``` Actually the order characterization `AnalyticAt.analyticOrderAt_eq_natCast (hf : AnalyticAt 𝕜 f z₀) : analyticOrderAt f z₀ = ↑n ↔ ∃ g : 𝕜 → 𝕜, AnalyticAt 𝕜 g z₀ ∧ g z₀ ≠ 0 ∧ f =ᶠ[𝓝 z₀] fun z => (z - z₀) ^ n • g z` — let me check the exact statement (Order.lean:86). I'll read it. To get AnalyticAt ζ at −2: ζ =ᶠ[𝓝 (−2)] (s+2)·G(s) and RHS analytic ⟹ `AnalyticAt.congr'`? The lemma: `AnalyticAt.congr' (hg : AnalyticAt 𝕜 g z) (h : f =ᶠ[𝓝 z] g) : AnalyticAt 𝕜 f z`? or `hg.congr' h`? There's `AnalyticAt.congr'`? Might be `AnalyticAt.congr (hg) (h : f =ᶠ[𝓝 z] g)`? I'll check. Alternatively Mathlib might HAVE analyticAt_riemannZeta directly? Hmm — `differentiableAt_riemannZeta` exists I'm fairly sure; analyticAt version maybe not. Use the congr route. Then analyticOrderAt riemannZeta (−2) = 1 (as ℕ∞), then zeroMult (−2) = (analyticOrderAt riemannZeta (−2)).toNat = 1: `WithTop.toNat`? analyticOrderAt returns ℕ∞? and `.toNat` — for ℕ∞ = PartENat? In current Mathlib ℕ∞ = WithTop ℕ∞?? no: ℕ∞ := WithTop ℕ? Hmm — actually current Mathlib has `ℕ∞ := WithTop ℕ`? No — ℕ∞ is `PartENat`?? Recent Mathlib: `ℕ∞` notation for `WithTop ℕ` and `ENat`... There was a refactor: ℕ∞ = WithTop ℕ (ENat deprecated in favor of ℕ∞?). Zeta23 def: `(analyticOrderAt riemannZeta ρ).toNat` — WithTop.toNat? There's `WithTop.toNat (x : ℕ∞) : ℕ`? or ENat.toNat. With analyticOrderAt = ((1 : ℕ) : ℕ∞): toNat = 1 via simp: `ENat.toNat_one`? or `WithTop.toNat_one`? I'll simp [zeroMult, h1] and see. Let me check the exact analyticOrderAt_eq_natCast statement and AnalyticAt.congr:
Now **ii′-4c** — the analytically deepest piece: `zeroMult (−2) = 1`. Checking exact API statements first.
tool: Bash
input
{
  "command": "cd D:/Python/Quantum/zeta-23-lean/.lake/packages/mathlib && sed -n '80,100p' Mathlib/Analysis/Analytic/Order.lean && grep -rn \"theorem congr'\\|lemma congr'\\|theorem congr \\|lemma congr \" Mathlib/Analysis/Analytic/Basic.lean | grep -i analytic | head -5; grep -rn \"theorem differentiableAt_riemannZeta\\|theorem differentiable_Gamma\\|Gamma_one \\|theorem Gamma_add_one\" Mathlib/NumberTheory/LSeries/*.lean Mathlib/Analysis/SpecialFunctions/Gamma/*.lean 2>/dev/null | head -8",
  "description": "Read analyticOrderAt_eq_natCast and find congr/Gamma lemmas"
}
raw content_json (database row)
[{"type":"thinking","thinking":"Now ii′-4c: zeroMult(−2) = 1. The plan:\n\n```lean\n/-- **Trivial-zero simplicity** (deferred from ii′-1b(iii), D-066 §6):\nzeroMult (−2) = 1. Route: ζ(s) = (s+2)·G(s) near −2 with\nG(s) = Λ(s)/H(s), H(s) = 4·π^{−s/2}·Γ(s/2+2)/s (= (s+2)·ΓR(s) off {−2,0}),\nH(−2) = −2π ≠ 0, Λ(−2) = Λ(3) = ΓR(3)·ζ(3) ≠ 0. -/\n```\n\nSteps in Lean:\n\n1. Hfun s := 4 * (π:ℂ)^(-s/2) * Complex.Gamma (s/2 + 2) / s\n   - AnalyticAt at −2: components:\n     a. s ↦ (π:ℂ)^(-s/2): analytic. Write as exp: (π:ℂ)^w = exp (w * log π) for w... `Complex.cpow_eq_exp_mul_log`? The def: x ^ y = exp (log x * y) for x ≠ 0 (`Complex.cpow_def_of_ne_zero`). So (fun s => (π:ℂ)^(-s/2)) = (fun s => Complex.exp (Complex.log π * (-s/2))) eventually? Everywhere: cpow_def_of_ne_zero needs base ≠ 0 ✓ (π:ℂ) ≠ 0. So the function equals s ↦ exp (log π * (−s/2)) pointwise — analytic via exp∘(linear). \n     AnalyticAt: `Complex.analyticAt_exp`? Mathlib: `analyticAt_exp`? There's `Complex.analyticAt_exp (z : ℂ) : AnalyticAt ℂ exp z`? Probably `Complex.analyticAt_exp`. Then comp with linear (analytic: polynomial/linear: `AnalyticAt.mul`, `analyticAt_const`, `analyticAt_id`...). Simpler: `DifferentiableAt` then AnalyticAt via... hmm — for exp∘linear use AnalyticAt.comp: (analyticAt_exp _).comp (linear analytic). Linear: fun s => log π * (−s/2): = (log π)·(−1/2)·s: `AnalyticAt ℂ (fun s => c * s) z` via analyticAt_const.mul analyticAt_id ✓.\n     \n     Alternatively — Mathlib might have `Complex.analyticAt_cpow_const`? There is `analyticAt_cpow_const`? Not sure. The exp route is safe.\n     \n     Hmm wait — actually even simpler: I recall there IS `Complex.analyticAt_cpow_const (z) (hx : x ≠ 0) : AnalyticAt ℂ (fun s => x ^ s) z`? Hmm. Not sure. Let me check quickly... I'll grep.\n     \n     b. s ↦ Gamma (s/2 + 2) analytic at −2: DifferentiableOn ball(−2, 1) → analyticOnNhd → analyticAt. Need: ∀ s ∈ ball(−2,1), ∀ m : ℕ, s/2+2 ≠ −m: s/2+2 ∈ ball(1, 1/2): if s/2+2 = −m then −m ∈ ball(1,1/2): |−m − 1| < 1/2: m+1 < 1/2 as real — impossible (m ≥ 0 ⟹ m+1 ≥ 1). Formalize: dist (−m) 1 = |−m−1| = m+1 ≥ 1 > 1/2 ✓.\n     differentiableAt_Gamma (s/2+2) (hs : ∀ m, s/2+2 ≠ −m) gives DifferentiableAt; then composition: DifferentiableAt (Gamma ∘ (s/2+2)) via .comp. Then DifferentiableOn on the ball, IsOpen ball, then `DifferentiableOn.analyticOnNhd`? Hmm — exact name: I believe `DifferentiableOn.analyticOnNhd (h : DifferentiableOn ℂ f s) (hs : IsOpen s) : AnalyticOnNhd ℂ f s`? Let me check — used in ii′-1b? zetaA_analyticOnNhd_univ proof — let me look at what lemma it used. I'll grep LiSides for the pattern.\n     c. s ↦ 4/s... wait H = 4·π^{−s/2}·Γ(s/2+2)/s: the division by s: analytic at −2 (s ≠ 0): AnalyticAt.div with s ↦ s analytic, s ≠ 0 at −2 ✓ — AnalyticAt.div needs AnalyticAt of numerator/denominator + denom ≠ 0: `(h1.div h2 hne)`. Numerator: product of the two above times const 4.\n   \n   - H(−2) = −2π: compute: (−(−2)/2) = 1: π^{1} = π: cpow_one ✓ (exponent −(−2)/2 = (1:ℂ): norm_num). Gamma((−2)/2 + 2) = Gamma 1 = 1: `Complex.Gamma_one`? exists? There's `Complex.Gamma_one : Gamma 1 = 1` ✓ (from Gamma_one_half etc.; grep earlier showed `Gammaℝ_one` using Complex.Gamma_one_half_eq; Complex.Gamma_one should exist).\n     H(−2) = 4·π·1/(−2) = −2π: field_simp/norm_num with pi_ne_zero.\n   \n2. The punctured identity: for s ≠ −2, s ≠ 0 (in a punctured neighborhood): (s+2)·Gammaℝ s = Hfun s:\n   Gammaℝ s = π^{−s/2}·Γ(s/2) [Gammaℝ_def]\n   Γ(s/2) = Γ(s/2+2)/((s/2)(s/2+1)): Gamma_add_one twice:\n     Complex.Gamma_add_one {s : ℂ} (hs : s ≠ 0) : Gamma (s + 1) = s * Gamma s — check exact form (grep earlier: Deriv.lean used Gamma_add_one _ hs in Beta.lean: `Gamma_add_one _ hs`). Hmm the Beta.lean usage: `rw [Gammaℝ_def, Gammaℝ_def, Gamma_add_one _ hs, ...]` hmm wait that was Gammaℂ_add_one's proof: `rw [Gammaℂ_def, Gammaℂ_def, Gamma_add_one _ hs, neg_add, ...]` — so `Complex.Gamma_add_one (s : ℂ) (hs : s ≠ 0) : Gamma (s + 1) = s * Gamma s`? Let me confirm the statement form later.\n     So: Gamma (s/2) : set z = s/2: Gamma (z+1) = z·Gamma z ⟹ Gamma z = Gamma(z+1)/z for z ≠ 0. And Gamma(z+1) = Gamma(z+2)/(z+1) for z+1 ≠ 0. So Gamma z = Gamma(z+2)/(z(z+1)).\n     At z = s/2: Gamma(s/2) = Gamma(s/2+2)/((s/2)(s/2+1)).\n   Then (s+2)·Gammaℝ s = π^{−s/2}·(s+2)·Γ(s/2) = π^{−s/2}·(s+2)·4Γ(s/2+2)/(s(s+2)) = 4π^{−s/2}Γ(s/2+2)/s ✓ (since (s/2)(s/2+1) = s(s+2)/4).\n   \n3. Λ(s) = Gammaℝ s · ζ(s) near −2 (s ≠ −2): `completedRiemannZeta_eq_Gammaℝ_mul (hs : s ≠ 0) (hG : Gammaℝ s ≠ 0)` (Zeta23) — needs Gammaℝ s ≠ 0: `Gammaℝ_eq_zero_iff : Gammaℝ s = 0 ↔ ∃ n : ℕ, s = -(2*n)`. For s in punctured ball around −2 of radius 1: s ≠ 0, −2, −4...: s = −(2n) with n ≥ 1 ⟹ |s − (−2)| = |2n − 2| ≥ 2 (n=0: s = 0, |0+2| = 2 ≥ 1 ✓ excluded by radius 1... |s−(−2)| < 1: s = −(2n): |−2n+2| = |2n−2| < 1 ⟹ 2n−2 = 0 ⟹ n = 1 ⟹ s = −2 — excluded by puncture ✓. So on punctured ball: Gammaℝ s ≠ 0 ✓ and s ≠ 0 ✓.\n   \n   So on the punctured ball: ζ(s) = Λ(s)/Gammaℝ s = Λ(s)·(s+2)/Hfun s = (s+2)·G(s) with G := Λ/Hfun (Hfun ≠ 0 on punctured ball: Hfun(−2) ≠ 0 + continuity ⟹ Hfun ≠ 0 on some ball; intersect).\n   \n   Hmm — getting the punctured identity: ∀ᶠ s in 𝓝[≠] (−2), riemannZeta s = (s − (−2))^1 • G s... then upgrade to 𝓝(−2) via continuity at −2 (both sides): ζ continuous at −2 (differentiableAt: Mathlib `differentiableAt_riemannZeta`? there IS `differentiableAt_riemannZeta {s : ℂ} (hs : s ≠ 1) : DifferentiableAt ℂ riemannZeta s`? I believe yes — `differentiableAt_riemannZeta`). RHS continuous at −2 (analytic). So equality at −2 from punctured: both sides 0 anyway: ζ(−2) = 0 (riemannZeta_neg_two_mul_nat_add_one 0) and (−2+2)·G(−2) = 0 ✓ — direct point check, no continuity glue needed! ∀ s in ball: if s = −2 ✓ by values; else the punctured identity. Even simpler: state ∀ s ∈ Metric.ball (−2) r, riemannZeta s = (s+2) * G s, proved by cases s = −2 or not. Then eventuallyEq from ball ∈ 𝓝(−2).\n\n   For analyticOrderAt_eq_natCast: need `riemannZeta =ᶠ[𝓝 (−2)] fun s => (s − (−2))^1 • G s`: (s−(−2))^1 • G s = (s+2)·G s ✓ (pow_one, smul = mul for ℂ: `smul_eq_mul`).\n\n4. G analytic at −2: AnalyticAt.div: Λ analytic at −2 (−2 ≠ 0, −2 ≠ 1: differentiableAt_completedZeta → AnalyticAt via neighborhood-differentiability: differentiableAt_completedZeta holds on the open set {s | s ≠ 0 ∧ s ≠ 1}... simpler: on ball(−2, 1): every point ≠ 0, 1 ✓ DifferentiableOn ⟹ AnalyticOnNhd ⟹ AnalyticAt. Which lemma converts DifferentiableOn+IsOpen to AnalyticOnNhd? Let me check what zetaA_analyticOnNhd_univ used in LiSides — grep.\n   \n   Hfun analytic at −2 ✓ (step 1), Hfun(−2) ≠ 0 ✓.\n   G(−2) = Λ(−2)/Hfun(−2) ≠ 0: Λ(−2) = Λ(3) [completedRiemannZeta_one_sub]; Λ(3) = Gammaℝ 3 · ζ(3) [completedRiemannZeta_eq_Gammaℝ_mul (3≠0) (Gammaℝ 3 ≠ 0)]; Gammaℝ 3 ≠ 0: Gammaℝ_eq_zero_iff: 3 = −(2n) impossible (re: 3 = −2n as reals: −2n ≤ 0 < 3 ✓ — need to discharge ¬∃ n : ℕ, (3:ℂ) = −(2·n): intro ⟨n, hn⟩: take re: 3 = −(2·↑n) ≤ 0 contradiction: norm_num/positivity: (-(2*(n:ℂ))).re = −2n ≤ 0 ✓); ζ(3) ≠ 0: riemannZeta_ne_zero_of_one_lt_re (re 3 = 3 > 1 ✓).\n   So Λ(−2) ≠ 0, Hfun(−2) ≠ 0 ⟹ G(−2) ≠ 0 ✓ div_ne_zero.\n\n5. Then:\n```lean\ntheorem zeroMult_neg_two : zeroMult (-2) = 1 := by\n  have han : AnalyticAt ℂ riemannZeta (-2) := -- from the eventuallyEq factorization (RHS analytic)\n    AnalyticAt.congr' ... hmm\n```\nActually the order characterization `AnalyticAt.analyticOrderAt_eq_natCast (hf : AnalyticAt 𝕜 f z₀) : analyticOrderAt f z₀ = ↑n ↔ ∃ g : 𝕜 → 𝕜, AnalyticAt 𝕜 g z₀ ∧ g z₀ ≠ 0 ∧ f =ᶠ[𝓝 z₀] fun z => (z - z₀) ^ n • g z` — let me check the exact statement (Order.lean:86). I'll read it.\n\nTo get AnalyticAt ζ at −2: ζ =ᶠ[𝓝 (−2)] (s+2)·G(s) and RHS analytic ⟹ `AnalyticAt.congr'`? The lemma: `AnalyticAt.congr' (hg : AnalyticAt 𝕜 g z) (h : f =ᶠ[𝓝 z] g) : AnalyticAt 𝕜 f z`? or `hg.congr' h`? There's `AnalyticAt.congr'`? Might be `AnalyticAt.congr (hg) (h : f =ᶠ[𝓝 z] g)`? I'll check. Alternatively Mathlib might HAVE analyticAt_riemannZeta directly? Hmm — `differentiableAt_riemannZeta` exists I'm fairly sure; analyticAt version maybe not. Use the congr route.\n\nThen analyticOrderAt riemannZeta (−2) = 1 (as ℕ∞), then zeroMult (−2) = (analyticOrderAt riemannZeta (−2)).toNat = 1: `WithTop.toNat`? analyticOrderAt returns ℕ∞? and `.toNat` — for ℕ∞ = PartENat? In current Mathlib ℕ∞ = WithTop ℕ∞?? no: ℕ∞ := WithTop ℕ? Hmm — actually current Mathlib has `ℕ∞ := WithTop ℕ`? No — ℕ∞ is `PartENat`?? Recent Mathlib: `ℕ∞` notation for `WithTop ℕ` and `ENat`... There was a refactor: ℕ∞ = WithTop ℕ (ENat deprecated in favor of ℕ∞?). Zeta23 def: `(analyticOrderAt riemannZeta ρ).toNat` — WithTop.toNat? There's `WithTop.toNat (x : ℕ∞) : ℕ`? or ENat.toNat. With analyticOrderAt = ((1 : ℕ) : ℕ∞): toNat = 1 via simp: `ENat.toNat_one`? or `WithTop.toNat_one`? I'll simp [zeroMult, h1] and see.\n\nLet me check the exact analyticOrderAt_eq_natCast statement and AnalyticAt.congr:","signature":""},{"type":"text","text":"Now **ii′-4c** — the analytically deepest piece: `zeroMult (−2) = 1`. Checking exact API statements first."},{"type":"tool_use","id":"Bash_102","name":"Bash","input":{"command":"cd D:/Python/Quantum/zeta-23-lean/.lake/packages/mathlib && sed -n '80,100p' Mathlib/Analysis/Analytic/Order.lean && grep -rn \"theorem congr'\\|lemma congr'\\|theorem congr \\|lemma congr \" Mathlib/Analysis/Analytic/Basic.lean | grep -i analytic | head -5; grep -rn \"theorem differentiableAt_riemannZeta\\|theorem differentiable_Gamma\\|Gamma_one \\|theorem Gamma_add_one\" Mathlib/NumberTheory/LSeries/*.lean Mathlib/Analysis/SpecialFunctions/Gamma/*.lean 2>/dev/null | head -8","description":"Read analyticOrderAt_eq_natCast and find congr/Gamma lemmas"},"extra_content":null}]