← Session 24 — ii′-2…4: swaps, (4.10) design, contour + website roadmap fixes
thinking (4764 chars)
`zeroMult ρ = (analyticOrderAt riemannZeta ρ).toNat` — it's defined via `analyticOrderAt` (which returns `ℕ∞` / `PartENat`? — `analyticOrderAt` in Mathlib returns `ℕ⊤` (WithTop ℕ)) then `.toNat`.
For zeroMult(−2) = 1: need (analyticOrderAt riemannZeta (−2)).toNat = 1, i.e. analyticOrderAt riemannZeta (−2) = 1 (as WithTop ℕ).
Mathlib API for analyticOrderAt: `AnalyticAt.analyticOrderAt_eq_natCast`? There are lemmas:
- `AnalyticAt.analyticOrderAt_eq_zero : analyticOrderAt f z = 0 ↔ f z ≠ 0` (something like that)
- `AnalyticAt.analyticOrderAt_eq_natCast_iff`? I recall `analyticOrderAt_eq_iff` for WithTop... Let me check Mathlib's AnalyticOrderAt file. In Mathlib: `Mathlib/Analysis/Analytic/Order.lean`? There's:
- `AnalyticAt.analyticOrderAt_eq_natCast : analyticOrderAt f z₀ = ↑n ↔ ∃ g, AnalyticAt ℂ g z₀ ∧ g z₀ ≠ 0 ∧ ∀ᶠ z in 𝓝 z₀, f z = (z - z₀)^n • g z` — something close.
- `AnalyticAt.mul_analyticOrderAt`? or `analyticOrderAt_mul : analyticOrderAt (f * g) z = analyticOrderAt f z + analyticOrderAt g z`.
So the route: ζ(s) = (s+2)·G(s) with G analytic at −2, G(−2) ≠ 0 ⟹ analyticOrderAt ζ (−2) = analyticOrderAt (s ↦ s+2) (−2) + analyticOrderAt G (−2) = 1 + 0 = 1.
Where G(s) = Λ(s)/H(s) with H(s) = (s+2)·Gammaℝ s. Components:
1. Λ = completedRiemannZeta analytic everywhere (Mathlib: `differentiable_completedRiemannZeta`? or AnalyticAt — likely `Complex.differentiable_completedRiemannZeta : Differentiable ℂ completedRiemannZeta` — differentiable ⟹ analytic on ℂ for ℂ-functions: `Differentiable.analyticAt`? Mathlib has `Differentiable.analyticAt`? there's `AnalyticOnNhd` from DifferentiableOn for ℂ: `DifferentiableOn.analyticOnNhd`? In ℂ, differentiable_on ⟹ analytic_on (`isOpen... analyticOnNhd_of_differentiableOn`?). We used something similar in LiSides (zetaA_analyticOnNhd_univ). Fine.
2. Λ(−2) ≠ 0: via FE `completedRiemannZeta_one_sub : completedRiemannZeta (1 − s) = completedRiemannZeta s` ⟹ Λ(−2) = Λ(3) = Gammaℝ 3 · ζ(3). Gammaℝ 3 ≠ 0 (Gammaℝ_ne_zero_of_re_pos, re 3 > 0 ✓ if that's the actual name). ζ(3) ≠ 0: Mathlib `riemannZeta_ne_zero_of_one_lt_re`? I believe Mathlib has `Complex.riemannZeta_ne_zero_of_one_lt_re : 1 < s.re → riemannZeta s ≠ 0`. Yes I'm fairly confident (Euler product).
3. H(s) = (s+2)·Gammaℝ s analytic at −2, H(−2) ≠ 0: Gammaℝ s = π^{−s/2}·Γ(s/2) — Mathlib `Complex.Gammaℝ_def`? Gammaℝ s = π^{-s/2} * Gamma (s/2)? Something like `Gammaℝ_def : Gammaℝ s = (π : ℂ)^(-s/2) * Gamma (s/2)`. Hmm, or Real.pi based with Complex pow. Then (s+2)·Gammaℝ s = π^{−s/2}·(s+2)·Γ(s/2). Γ(s/2) = Γ(s/2+2)/((s/2)(s/2+1)) via Gamma_add_one twice: Γ(z) = Γ(z+1)/z (Mathlib: `Complex.Gamma_add_one : Gamma (z+1) = z * Gamma z` ⟹ Gamma z = Gamma (z+1)/z for z ≠ 0). So Γ(s/2) = Γ(s/2+1)/(s/2) = Γ(s/2+2)/((s/2+1)(s/2)). Thus (s+2)Γ(s/2) = (s+2)·2·Γ(s/2+2)/((s+2)·s)... (s/2+1) = (s+2)/2, so Γ(s/2) = Γ(s/2+2)/((s+2)/2·s/2) = 4Γ(s/2+2)/(s(s+2)). Hence (s+2)Γ(s/2) = 4Γ(s/2+2)/s. At s = −2: 4Γ(1)/(−2) = −2 (Gamma_one = 1). So H(−2) = π¹·(−2) = −2π ≠ 0. Analyticity at −2: s ↦ Γ(s/2+2) analytic at −2 (s/2+2 ↦ 1, Γ analytic at 1: Mathlib `Complex.differentiableAt_Gamma` (for non-nonpositive-integer) or analyticity `analyticAt_Gamma`?); s ↦ π^{−s/2} analytic everywhere (exp); s ↦ 4/s analytic at −2 (s ≠ 0). Product ⟹ analytic. Value: compute directly.
Alternatively avoid the explicit value: just need H(−2) ≠ 0 and analyticity — but computing H(−2) requires evaluating the limit anyway; direct closed form 4π^{−s/2}Γ(s/2+2)/s is analytic at −2 AND we can define H by that formula... but then the identity (s+2)ΓR(s) = H(s) holds only punctured (s ≠ 0, −2, s/2+... ) — for the order argument we need the identity near −2 (punctured neighborhood is fine for `∀ᶠ z in 𝓝[≠] ...` variants? analyticOrderAt uses 𝓝 eventually — need the factorization f = (z−z₀)ⁿ•g in a full neighborhood or just on a punctured one? The standard characterization needs eventually in 𝓝 z₀ (full). But both sides analytic near −2 (ζ analytic at −2 ✓, (s+2)G(s) analytic at −2 ✓) and agreeing on a punctured neighborhood ⟹ agree on full neighborhood by continuity at the point. There's `AnalyticAt.eventually_eq_of...` or just continuous both sides + eventuallyEq punctured ⟹ eq at point.
OK — the zeroMult(−2) = 1 proof is buildable but will be a few hundred lines with real-pow manipulation (π^{−s/2} complex pow — cpow! π^{−s/2} with Real.pi cast... Gammaℝ def might use `Real.pi` with complex rpow... fiddly).
Let me now check Mathlib names actually exist (grep the vendored mathlib):
- Gammaℝ def + Gammaℝ_ne_zero_of_re_pos
- completedRiemannZeta def + completedRiemannZeta_one_sub
- riemannZeta_ne_zero_of_one_lt_re
- analyticOrderAt API: mul, eq_natCast
- Gamma_add_one, differentiableAt_Gamma
Then plan the file. Let me grep mathlib.
`zeroMult ρ = (analyticOrderAt riemannZeta ρ).toNat` (Zeta23 Statement.lean:43). Now let me verify the Mathlib API names for the trivial-zero simplicity route.
tool: Bash
input
{
"command": "cd D:/Python/Quantum/zeta-23-lean/.lake/packages/mathlib && grep -rn \"theorem Gamma\u211d_ne_zero_of_re_pos\\|def Gamma\u211d\\b\\|Gamma\u211d_def\\|theorem completedRiemannZeta_one_sub\\|def completedRiemannZeta\\b\" Mathlib/Analysis/SpecialFunctions/Gamma/ Mathlib/NumberTheory/LSeries/ 2>/dev/null | head -12",
"description": "Find Gamma\u211d and completedRiemannZeta definitions in Mathlib"
}
tool: Bash
input
{
"command": "cd D:/Python/Quantum/zeta-23-lean/.lake/packages/mathlib && grep -rn \"analyticOrderAt_mul\\|analyticOrderAt_eq_natCast\\|theorem.*analyticOrderAt.*mul\\|mul.*analyticOrderAt\" Mathlib/Analysis/Analytic/Order.lean | head -12 && grep -rn \"riemannZeta_ne_zero_of_one_lt_re\\|riemannZeta_neg_two_mul_nat\\|riemannZeta_neg_nat\" Mathlib/NumberTheory/ -r | head -8",
"description": "Find analyticOrderAt product rule and zeta nonvanishing lemmas"
}
raw content_json (database row)
[{"type":"thinking","thinking":"`zeroMult ρ = (analyticOrderAt riemannZeta ρ).toNat` — it's defined via `analyticOrderAt` (which returns `ℕ∞` / `PartENat`? — `analyticOrderAt` in Mathlib returns `ℕ⊤` (WithTop ℕ)) then `.toNat`.\n\nFor zeroMult(−2) = 1: need (analyticOrderAt riemannZeta (−2)).toNat = 1, i.e. analyticOrderAt riemannZeta (−2) = 1 (as WithTop ℕ).\n\nMathlib API for analyticOrderAt: `AnalyticAt.analyticOrderAt_eq_natCast`? There are lemmas:\n- `AnalyticAt.analyticOrderAt_eq_zero : analyticOrderAt f z = 0 ↔ f z ≠ 0` (something like that)\n- `AnalyticAt.analyticOrderAt_eq_natCast_iff`? I recall `analyticOrderAt_eq_iff` for WithTop... Let me check Mathlib's AnalyticOrderAt file. In Mathlib: `Mathlib/Analysis/Analytic/Order.lean`? There's:\n - `AnalyticAt.analyticOrderAt_eq_natCast : analyticOrderAt f z₀ = ↑n ↔ ∃ g, AnalyticAt ℂ g z₀ ∧ g z₀ ≠ 0 ∧ ∀ᶠ z in 𝓝 z₀, f z = (z - z₀)^n • g z` — something close.\n - `AnalyticAt.mul_analyticOrderAt`? or `analyticOrderAt_mul : analyticOrderAt (f * g) z = analyticOrderAt f z + analyticOrderAt g z`.\n\nSo the route: ζ(s) = (s+2)·G(s) with G analytic at −2, G(−2) ≠ 0 ⟹ analyticOrderAt ζ (−2) = analyticOrderAt (s ↦ s+2) (−2) + analyticOrderAt G (−2) = 1 + 0 = 1.\n\nWhere G(s) = Λ(s)/H(s) with H(s) = (s+2)·Gammaℝ s. Components:\n1. Λ = completedRiemannZeta analytic everywhere (Mathlib: `differentiable_completedRiemannZeta`? or AnalyticAt — likely `Complex.differentiable_completedRiemannZeta : Differentiable ℂ completedRiemannZeta` — differentiable ⟹ analytic on ℂ for ℂ-functions: `Differentiable.analyticAt`? Mathlib has `Differentiable.analyticAt`? there's `AnalyticOnNhd` from DifferentiableOn for ℂ: `DifferentiableOn.analyticOnNhd`? In ℂ, differentiable_on ⟹ analytic_on (`isOpen... analyticOnNhd_of_differentiableOn`?). We used something similar in LiSides (zetaA_analyticOnNhd_univ). Fine.\n2. Λ(−2) ≠ 0: via FE `completedRiemannZeta_one_sub : completedRiemannZeta (1 − s) = completedRiemannZeta s` ⟹ Λ(−2) = Λ(3) = Gammaℝ 3 · ζ(3). Gammaℝ 3 ≠ 0 (Gammaℝ_ne_zero_of_re_pos, re 3 > 0 ✓ if that's the actual name). ζ(3) ≠ 0: Mathlib `riemannZeta_ne_zero_of_one_lt_re`? I believe Mathlib has `Complex.riemannZeta_ne_zero_of_one_lt_re : 1 < s.re → riemannZeta s ≠ 0`. Yes I'm fairly confident (Euler product).\n3. H(s) = (s+2)·Gammaℝ s analytic at −2, H(−2) ≠ 0: Gammaℝ s = π^{−s/2}·Γ(s/2) — Mathlib `Complex.Gammaℝ_def`? Gammaℝ s = π^{-s/2} * Gamma (s/2)? Something like `Gammaℝ_def : Gammaℝ s = (π : ℂ)^(-s/2) * Gamma (s/2)`. Hmm, or Real.pi based with Complex pow. Then (s+2)·Gammaℝ s = π^{−s/2}·(s+2)·Γ(s/2). Γ(s/2) = Γ(s/2+2)/((s/2)(s/2+1)) via Gamma_add_one twice: Γ(z) = Γ(z+1)/z (Mathlib: `Complex.Gamma_add_one : Gamma (z+1) = z * Gamma z` ⟹ Gamma z = Gamma (z+1)/z for z ≠ 0). So Γ(s/2) = Γ(s/2+1)/(s/2) = Γ(s/2+2)/((s/2+1)(s/2)). Thus (s+2)Γ(s/2) = (s+2)·2·Γ(s/2+2)/((s+2)·s)... (s/2+1) = (s+2)/2, so Γ(s/2) = Γ(s/2+2)/((s+2)/2·s/2) = 4Γ(s/2+2)/(s(s+2)). Hence (s+2)Γ(s/2) = 4Γ(s/2+2)/s. At s = −2: 4Γ(1)/(−2) = −2 (Gamma_one = 1). So H(−2) = π¹·(−2) = −2π ≠ 0. Analyticity at −2: s ↦ Γ(s/2+2) analytic at −2 (s/2+2 ↦ 1, Γ analytic at 1: Mathlib `Complex.differentiableAt_Gamma` (for non-nonpositive-integer) or analyticity `analyticAt_Gamma`?); s ↦ π^{−s/2} analytic everywhere (exp); s ↦ 4/s analytic at −2 (s ≠ 0). Product ⟹ analytic. Value: compute directly.\n\nAlternatively avoid the explicit value: just need H(−2) ≠ 0 and analyticity — but computing H(−2) requires evaluating the limit anyway; direct closed form 4π^{−s/2}Γ(s/2+2)/s is analytic at −2 AND we can define H by that formula... but then the identity (s+2)ΓR(s) = H(s) holds only punctured (s ≠ 0, −2, s/2+... ) — for the order argument we need the identity near −2 (punctured neighborhood is fine for `∀ᶠ z in 𝓝[≠] ...` variants? analyticOrderAt uses 𝓝 eventually — need the factorization f = (z−z₀)ⁿ•g in a full neighborhood or just on a punctured one? The standard characterization needs eventually in 𝓝 z₀ (full). But both sides analytic near −2 (ζ analytic at −2 ✓, (s+2)G(s) analytic at −2 ✓) and agreeing on a punctured neighborhood ⟹ agree on full neighborhood by continuity at the point. There's `AnalyticAt.eventually_eq_of...` or just continuous both sides + eventuallyEq punctured ⟹ eq at point.\n\nOK — the zeroMult(−2) = 1 proof is buildable but will be a few hundred lines with real-pow manipulation (π^{−s/2} complex pow — cpow! π^{−s/2} with Real.pi cast... Gammaℝ def might use `Real.pi` with complex rpow... fiddly).\n\nLet me now check Mathlib names actually exist (grep the vendored mathlib):\n- Gammaℝ def + Gammaℝ_ne_zero_of_re_pos\n- completedRiemannZeta def + completedRiemannZeta_one_sub\n- riemannZeta_ne_zero_of_one_lt_re\n- analyticOrderAt API: mul, eq_natCast\n- Gamma_add_one, differentiableAt_Gamma\n\nThen plan the file. Let me grep mathlib.","signature":""},{"type":"text","text":"`zeroMult ρ = (analyticOrderAt riemannZeta ρ).toNat` (Zeta23 Statement.lean:43). Now let me verify the Mathlib API names for the trivial-zero simplicity route."},{"type":"tool_use","id":"Bash_52","name":"Bash","input":{"command":"cd D:/Python/Quantum/zeta-23-lean/.lake/packages/mathlib && grep -rn \"theorem Gammaℝ_ne_zero_of_re_pos\\|def Gammaℝ\\b\\|Gammaℝ_def\\|theorem completedRiemannZeta_one_sub\\|def completedRiemannZeta\\b\" Mathlib/Analysis/SpecialFunctions/Gamma/ Mathlib/NumberTheory/LSeries/ 2>/dev/null | head -12","description":"Find Gammaℝ and completedRiemannZeta definitions in Mathlib"},"extra_content":null},{"type":"tool_use","id":"Bash_53","name":"Bash","input":{"command":"cd D:/Python/Quantum/zeta-23-lean/.lake/packages/mathlib && grep -rn \"analyticOrderAt_mul\\|analyticOrderAt_eq_natCast\\|theorem.*analyticOrderAt.*mul\\|mul.*analyticOrderAt\" Mathlib/Analysis/Analytic/Order.lean | head -12 && grep -rn \"riemannZeta_ne_zero_of_one_lt_re\\|riemannZeta_neg_two_mul_nat\\|riemannZeta_neg_nat\" Mathlib/NumberTheory/ -r | head -8","description":"Find analyticOrderAt product rule and zeta nonvanishing lemmas"},"extra_content":null}]