← Session 24 — ii′-2…4: swaps, (4.10) design, contour + website roadmap fixes
thinking (23656 chars)
- `AnalyticAt.congr (hf : AnalyticAt 𝕜 f x) (hg : f =ᶠ[𝓝 x] g) : AnalyticAt 𝕜 g x` ✓ — note direction: hg : f =ᶠ g gives g analytic.
- zetaA pattern: `zetaA_apply {w} (hw : w ≠ 1) : zetaA w = (w−1)·ζ(w)`; `zetaA_analyticAt_of_ne (hw : w ≠ 1) : AnalyticAt ℂ zetaA w` ✓.
So AnalyticAt ζ at −2:
```lean
have hzeta_an : AnalyticAt ℂ riemannZeta (-2) := by
have hdiv : AnalyticAt ℂ (fun s => zetaA s / (s - 1)) (-2) :=
(zetaA_analyticAt_of_ne (by norm_num)).div
((analyticAt_id).sub analyticAt_const) (by norm_num)
apply hdiv.congr
filter_upwards [eventually_ne_nhds (show (-2:ℂ) ≠ 1 by norm_num)] with s hs
-- goal: zetaA s / (s−1) = riemannZeta s (direction: f =ᶠ g with f = the div fn, g = ζ)
rw [zetaA_apply hs]
field_simp [sub_ne_zero.mpr hs]
```
Careful with congr direction: hf : AnalyticAt f (−2) where f = fun s => zetaA s/(s−1); hg : f =ᶠ[𝓝(−2)] riemannZeta. So filter_upwards gives `zetaA s/(s−1) = riemannZeta s` ✓: rw [zetaA_apply hs]: (s−1)·ζ(s)/(s−1) = ζ(s): field_simp [sub_ne_zero.mpr hs] or `mul_div_cancel_right₀`: `mul_div_cancel_right₀ (a) (hb : b ≠ 0) : a * b / b = a` ✓. So: rw [zetaA_apply hs]; exact mul_div_cancel_right₀ _ (sub_ne_zero.mpr hs).
Hmm wait — `(s - 1) * riemannZeta s / (s - 1)` — mul_div_cancel_right₀ (h : b ≠ 0) : a * b / b = a ✓ exact.
Also `analyticAt_id` — name: `analyticAt_id : AnalyticAt 𝕜 id z`? there's `analyticAt_id`? In recent Mathlib `analyticAt_id (z) : AnalyticAt 𝕜 id z`? exists ✓ (maybe `analyticAt_id : AnalyticAt 𝕜 id x`). sub const: (analyticAt_id.sub analyticAt_const) ✓.
The division denominator: (fun s => s − 1) at −2: ≠ 0: `by norm_num` — (−2 : ℂ) − 1 ≠ 0: norm_num: −3 ≠ 0 ✓. (−2 : ℂ) ≠ 1 norm_num ✓.
Now the main theorem. Structure:
```lean
/-! ## 5. Trivial-zero simplicity: zeroMult (−2) = 1 -/
/-- The local factor of ΓR at −2: Hfun s = 4·π^{−s/2}·Γ(s/2+2)/s. Equals
(s+2)·ΓR(s) off {−2, 0} (Gamma_add_one twice); analytic at −2 with
Hfun(−2) = −2π ≠ 0. -/
private def Hfun (s : ℂ) : ℂ := 4 * (π : ℂ) ^ (-s / 2) * Complex.Gamma (s / 2 + 2) / s
```
Hmm — private? No: the theorem zeroMult_neg_two is the deliverable; Hfun can be private but nothing wrong with public. Keep private def? In this codebase style, defs are public. I'll make it a plain def `gammaRFactor` hmm — name it `HfunNegTwo`? Simple: `def Hfun (s : ℂ) : ℂ := 4 * (Real.pi : ℂ) ^ (-s / 2) * Complex.Gamma (s / 2 + 2) / s`.
Note about π: in Deligne.lean, `π ^ (-s / 2)` — what's π there? In Complex context, `π` is `Real.pi` coerced via `↑π`? The gotcha from journal-019/020: "bare π auto-binds (use Real.pi)". In the Complex namespace with open Complex, `π` refers to `Real.pi` (there's no Complex.pi) — coerced. Gammaℝ_def : Gammaℝ s = π ^ (-s / 2) * Gamma (s / 2) — with π : ℝ coerced to ℂ and ^ = cpow ✓. I'll write `((Real.pi : ℂ) : ℂ)`... just `(Real.pi : ℂ)` with explicit ascribe to avoid the auto-bind gotcha. Hmm — the gotcha: "bare π auto-binds" — in a definition `def Hfun (s : ℂ) : ℂ := 4 * π ^ (-s / 2) * ...` — π would elaborate as Real.pi coerced? Should be fine with open Complex... but the gotcha says bare π auto-BINDS (i.e., Lean parses `π` as a new bound variable?) in some positions. To be safe: write `(Real.pi : ℂ)` explicitly.
Components:
(a) cpow piece: `AnalyticAt ℂ (fun s => (Real.pi : ℂ) ^ (-s / 2)) (-2)`:
```lean
have hcpi : AnalyticAt ℂ (fun s => (Real.pi : ℂ) ^ (-s / 2)) (-2) := by
have heq : (fun s => (Real.pi : ℂ) ^ (-s / 2))
= fun s => Complex.exp (Complex.log (Real.pi : ℂ) * (-s / 2)) := by
funext s
rw [Complex.cpow_def_of_ne_zero (by norm_num : (Real.pi : ℂ) ≠ 0)] -- π^w = exp (log π * w)
-- cpow def: x ^ y = exp (log x * y)? check form: cpow_def_of_ne_zero : x ≠ 0 → x ^ y = exp (log x * y)
rw [heq]
exact (Complex.analyticAt_exp _).comp (... analytic linear)
```
- cpow_def_of_ne_zero : `Complex.cpow_def_of_ne_zero (hx : x ≠ 0) : x ^ y = Complex.exp (Complex.log x * y)`? I think: `cpow_def_of_ne_zero (hx : x ≠ 0) : x ^ y = exp (log x * y)` ✓ roughly.
- analyticAt_exp: `Complex.analyticAt_exp (z : ℂ) : AnalyticAt ℂ Complex.exp z`? name check: there's `Complex.analyticAt_exp`? or `analyticAt_exp`? grep needed. Then comp: `.comp (AnalyticAt ℂ (fun s => log π * (−s/2)) (−2))`: the linear map: log π * (−s/2) = (−log π / 2) * s: `analyticAt_const.mul analyticAt_id` with reshuffle via congr... AnalyticAt ℂ (fun s => c * s) z where c = log π * (−1/2): show function equals fun s => c * s via funext (ring), then analyticAt_const.mul analyticAt_id. Hmm — (fun s => Complex.log π * (−s/2)) = fun s => (Complex.log π * (−1/2)) * s: funext + ring ✓.
(b) Gamma piece analyticity:
```lean
have hGamma : AnalyticAt ℂ (fun s => Complex.Gamma (s / 2 + 2)) (-2) := by
have hd : DifferentiableOn ℂ (fun s => Complex.Gamma (s / 2 + 2)) (Metric.ball (-2) 1) := by
intro s hs
apply DifferentiableAt.comp ... -- differentiableAt_Gamma (s/2+2) (h : ∀ m, s/2+2 ≠ -m)
· exact differentiableAt_Gamma _ (fun m => ?_)
· differentiability of s ↦ s/2+2: (differentiableAt_id.div_const _ |>.add ...) / fun_prop
· continuity for DifferentiableAt.comp needs f differentiable at (g z): DifferentiableAt.comp (s) hf hg ✓
-- the ∀ m condition: s ∈ ball(−2,1) ⟹ s/2+2 ≠ −m
...
exact (hd.analyticOnNhd Metric.isOpen_ball).analyticAt (Metric.mem_ball_self zero_lt_one)
```
- `DifferentiableOn.analyticOnNhd` — exact name? For ℂ: I believe `DifferentiableOn.analyticOnNhd (hf : DifferentiableOn ℂ f s) (hs : IsOpen s) : AnalyticOnNhd ℂ f s` — hmm, might be `DifferentiableOn.analyticOn`? In current Mathlib: `DifferentiableOn.analyticOnNhd_of_isOpen`? Let me grep for the exact name. The Goursat theorem in Mathlib: `Mathlib/Analysis/Complex/CauchyIntegral.lean` has... `DifferentiableOn.contDiffOn`? and analyticity: `DifferentiableOn.analyticOnNhd`? I'll grep.
- The ∀ m condition: s ∈ ball(−2,1): dist s (−2) < 1. Suppose s/2+2 = −m (m : ℕ): then s = −2m − 4 = −2(m+2): dist = |s−(−2)| = |−2m−4+2| = |−2m−2| = 2m+2 ≥ 2 > 1 contradiction. Formalize: s/2+2 = −(m:ℂ) ⟹ s = −2·(m)−4: linear: s = 2·(−m)−4. dist s (−2) = ‖s+2‖ = ‖−2m−2‖ = 2m+2 ≥ 2. So:
```lean
intro m hm -- hm : s / 2 + 2 = -(m : ℂ)
have hs_eq : s = -2 * (m : ℂ) - 4 := by linear_combination 2 * hm -- from s/2+2 = −m: s/2 = −m−2: s = −2m−4
-- dist: |s − (−2)| = |−2m−2| = 2m+2 ≥ 2 but hs : dist < 1
rw [hs_eq] at hs
-- Metric.mem_ball: dist s (−2) < 1: dist = ‖s − (−2)‖ = ‖−2m−2‖
have : (2:ℝ) ≤ dist (-2 * (m : ℂ) - 4) (-2) := by
rw [dist_eq_norm]
have : (-2 * (m : ℂ) - 4) - (-2) = -((2 * m + 2 : ℝ) : ℂ) := by push_cast; ring
rw [this, Complex.norm_neg, Complex.norm_real] -- norm of real cast = |·|
rw [Real.norm_eq_abs, abs_of_nonneg (by positivity)]
have : (2:ℝ) ≤ 2 * m + 2 := by have : (0:ℝ) ≤ m := by positivity; linarith
linarith
linarith [hs, this] -- hs : dist < 1 ≤ 2 ≤ dist contradiction
```
Roughly. `dist_eq_norm : dist a b = ‖a − b‖` ✓.
(c) Hfun analytic:
```lean
theorem Hfun_analyticAt_neg_two : AnalyticAt ℂ Hfun (-2) := by
unfold Hfun
-- 4 * π^(−s/2) * Γ(s/2+2) / s: AnalyticAt.div (mul (mul)) (denominator s ≠ 0 at −2)
exact (((analyticAt_const.mul hcpi).mul hGamma).div analyticAt_id (by norm_num))
```
Wait — 4 * π^.. * Γ.. / s = ((4 * π^..) * Γ..) / s ✓. analyticAt_const : AnalyticAt ℂ (fun _ => c) z ✓ (name: `analyticAt_const` ✓ exists). analyticAt_id : AnalyticAt ℂ id? — the denominator function is `fun s => s` = id? Hfun's last part `/ s` — the function is fun s => (numerator s) / s = fun s => num s / (fun s => s) s. AnalyticAt.div hf hg hg0 ✓ with hg = analyticAt_id... is it `analyticAt_id`? There's `analyticAt_id : AnalyticAt 𝕜 id z`? But our function is fun s => s — id ✓ defeq. Might need `analyticAt_id'`? Fine, iterate.
(d) Hfun(−2) = −2π:
```lean
theorem Hfun_neg_two : Hfun (-2) = -2 * (Real.pi : ℂ) := by
unfold Hfun
rw [show (-(−2 : ℂ) / 2) = 1 by norm_num, Complex.cpow_one,
show ((-2 : ℂ) / 2 + 2) = 1 by norm_num, Complex.Gamma_one]
field_simp -- 4 * π * 1 / (−2) = −2π: field_simp? (−2 ≠ 0): 4π/(−2) = −2π
ring
```
Hmm: 4 * π * 1 / (−2) = −2π ⟺ 4π/(−2) = −2π: `norm_num [mul_comm]`? do: `rw [mul_one]; field_simp; ring`? 4*π/(−2): div by nonzero constant: norm_num should simplify 4/(−2) = −2: `norm_num` might close 4*π*1/(−2) = −2*π after evaluating the division... Actually safest:
```lean
rw [show (4 : ℂ) * (Real.pi : ℂ) ^ (1:ℂ) * Complex.Gamma 1 / (-2) = ... ]
```
Let me just: unfold, norm_num [Complex.cpow_one, Complex.Gamma_one]? The goal after unfold Hfun: 4 * π^(−(−2)/2) * Γ(−2/2+2)/−2 = −2π. Steps: −(−2)/2 = 1 — the exponent is `-(−2 : ℂ)/2`: norm_num can evaluate `-(−2 : ℂ)/2 = 1`? It's a ℂ arithmetic of numerals ✓ norm_num. Then cpow_one, Gamma_one: 4·π·1/(−2) = −2π: field_simp + ring or norm_num with pi as atom... `norm_num` treats π as atom: 4*π/(−2) = −2*π: needs 4/(−2) = −2: norm_num should do this (division of literals) ✓ maybe with mul_one first. I'll iterate in compiler.
(e) The punctured identity (s+2)·ΓR(s) = Hfun s for s ≠ −2, s ≠ 0:
```lean
theorem Hfun_eq (s : ℂ) (hs2 : s ≠ -2) (hs0 : s ≠ 0) :
(s + 2) * Complex.Gammaℝ s = Hfun s := by
rw [Complex.Gammaℝ_def]
-- Gamma (s/2) = Gamma (s/2+2) / ((s/2)(s/2+1))
have h1 : Complex.Gamma (s / 2 + 1) = (s / 2) * Complex.Gamma (s / 2) :=
Complex.Gamma_add_one _ (by ...)
have h2 : Complex.Gamma (s / 2 + 2) = (s / 2 + 1) * Complex.Gamma (s / 2 + 1) := by
rw [show s / 2 + 2 = (s / 2 + 1) + 1 by ring]
exact Complex.Gamma_add_one _ (by ...) -- s/2+1 ≠ 0 ⟸ s ≠ −2
-- solve for Gamma (s/2):
have hG : Complex.Gamma (s / 2) = 4 * Complex.Gamma (s / 2 + 2) / (s * (s + 2)) := by
-- from h1: Γ(s/2) = Γ(s/2+1)/(s/2) = Γ(s/2+2)/((s/2)(s/2+1))
field_simp [hs0, hs2] hmm — fractions with s/2: field_simp handles
...
```
Let me do it linearly: Γ(s/2) = Γ(s/2+1)/(s/2) [h1, s/2 ≠ 0 ⟸ hs0]; Γ(s/2+1) = Γ(s/2+2)/(s/2+1) [h2, s/2+1 ≠ 0 ⟸ hs2]. So Γ(s/2) = Γ(s/2+2)/((s/2+1)(s/2)) = Γ(s/2+2)·4/(s(s+2)) since (s/2)(s/2+1) = s(s+2)/4.
Then (s+2)·ΓR(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 ✓ (cancel s+2 ≠ 0 ⟸ hs2).
In Lean, this is field_simp + ring_nf with the three neqs (hs0, hs2, and s/2 ≠ 0, s/2+1 ≠ 0 derived). Plan:
```lean
have h2ne : s / 2 ≠ 0 := by positivity?no: div_ne_zero hs0 (two_ne_zero) ✓ `div_ne_zero hs0 two_ne_zero` — hmm (2:ℂ) ≠ 0: two_ne_zero' ℂ? `two_ne_zero` might be for monoids... `(two_ne_zero' ℂ)`? Simpler: `by norm_num : (2:ℂ) ≠ 0` then div_ne_zero hs0 this.
have h21ne : s / 2 + 1 ≠ 0 := by
intro h
apply hs2
-- s/2 + 1 = 0 ⟹ s = −2
have : s = -2 := by linear_combination 2 * h -- s/2 = −1 ⟹ s = −2: linear_combination works? h : s/2+1 = 0: 2*(s/2+1) = 0: s + 2 = 0... linear_combination (2 * h): goal s = −2: s − (−2) = 2*(s/2+1 − 0) ✓ ring-check: s+2 vs 2*(s/2+1) = s+2 ✓. But linear_combination expects equalities — h : s/2+1 = 0 ✓, goal s = −2 ✓: linear_combination 2 * h should work (checks (s − (−2)) − 2*(s/2+1 − 0) = 0 by ring ✓).
exact this
have h1 := Complex.Gamma_add_one (s / 2) h2ne -- Γ(s/2 + 1) = (s/2)·Γ(s/2)
have h2 := Complex.Gamma_add_one (s / 2 + 1) h21ne -- Γ(s/2+2) = (s/2+1)·Γ(s/2+1)??
```
wait — Gamma_add_one (s/2+1) : Gamma ((s/2+1) + 1) = (s/2+1)·Gamma (s/2+1). (s/2+1)+1 = s/2+2 ✓ (ring — the statement has (s/2+1)+1 syntactically; my Hfun has s/2+2 — need a `show` or rw to align: have h2' : Complex.Gamma (s/2 + 2) = (s/2+1) * Complex.Gamma (s/2+1) := by rw [show s/2+2 = (s/2+1)+1 by ring]; exact Complex.Gamma_add_one _ h21ne ✓.
Then:
```lean
-- Γ(s/2) = Γ(s/2+2) / ((s/2)(s/2+1)):
have hG : Complex.Gamma (s / 2) = Complex.Gamma (s / 2 + 2) / ((s / 2) * (s / 2 + 1)) := by
rw [h2'] at h1 -- h1 : Γ(s/2+2) = (s/2+1)·(s/2)·Γ(s/2)?? h1: Γ(s/2+1) = (s/2)Γ(s/2); h2': Γ(s/2+2) = (s/2+1)Γ(s/2+1) = (s/2+1)(s/2)Γ(s/2)
-- so Γ(s/2) = Γ(s/2+2)/((s/2)(s/2+1))
field_simp [h2ne, h21ne]
rw [h1] at h2' ...
```
Let me do: from h1: Γ(s/2+1) = (s/2)·Γ(s/2); from h2': Γ(s/2+2) = (s/2+1)·Γ(s/2+1) = (s/2+1)·(s/2)·Γ(s/2). So Γ(s/2) = Γ(s/2+2)/((s/2+1)(s/2)):
```lean
have hG : Complex.Gamma (s / 2) = Complex.Gamma (s / 2 + 2) / ((s / 2) * (s / 2 + 1)) := by
have h12 : Complex.Gamma (s / 2 + 2) = (s / 2 + 1) * (s / 2) * Complex.Gamma (s / 2) := by
rw [h2', h1]; ring
rw [h12]
field_simp [mul_ne_zero h2ne h21ne]
ring
```
Γ(s/2+2)/((s/2)(s/2+1)) with Γ(s/2+2) = (s/2+1)(s/2)Γ(s/2): the division cancels to Γ(s/2): goal: Γ(s/2) = ((s/2+1)(s/2)Γ(s/2))/((s/2)(s/2+1)): field_simp [denominator ≠ 0] then ring ✓.
Then assemble:
```lean
rw [Complex.Gammaℝ_def, hG] -- hmm Gammaℝ s = π^(−s/2) * Γ(s/2)
unfold Hfun
field_simp [hs0, hs2]
ring
```
Goal: (s+2)·(π^(−s/2)·(Γ(s/2+2)/((s/2)(s/2+1)))) = 4·π^(−s/2)·Γ(s/2+2)/s. field_simp clears: LHS·denoms vs RHS·denoms: ring identity: (s+2)·π·Γ·s = 4πΓ·(s/2)(s/2+1) ⟺ (s+2)s = 4(s/2)(s/2+1) = s(s+2) ✓ ring.
Hmm — field_simp with hs0 hs2 clears denominators ((s/2)(s/2+1) and s): the side conditions: s ≠ 0 ✓ and (s/2)(s/2+1) ≠ 0 — pass mul_ne_zero h2ne h21ne. OK.
(f) G := fun s => completedRiemannZeta s / Hfun s:
- Hfun_ne_zero near −2: Hfun continuous at −2 (analytic ⟹ continuous: hHfun_an.continuousAt) with Hfun(−2) ≠ 0 ⟹ ∀ᶠ s in 𝓝(−2), Hfun s ≠ 0: `ContinuousAt.eventually_ne hcont hne` ✓ exists (`ContinuousAt.eventually_ne : ContinuousAt f x → f x ≠ 0 → ∀ᶠ y in 𝓝 x, f y ≠ 0`).
- G analytic at −2: hΛan.div hHfun_an hHfun_ne0 (needs point ≠ 0 for AnalyticAt.div: `(hf.div hg (hg0 : g x ≠ 0))` ✓).
- Λ analytic at −2: from differentiableAt_completedZeta (s≠0)(s≠1) — DifferentiableAt NOT AnalyticAt; need neighborhood version: DifferentiableOn on ball(−2,1): ∀ s ∈ ball: differentiableAt_completedZeta (s ≠ 0) (s ≠ 1): |s−(−2)|<1 ⟹ s ≠ 0 (dist 0 (−2) = 2 > 1... formalize: if s = 0: dist 0 (−2) = 2 ≥ 1 contradiction ✓; s = 1: dist 1 (−2) = 3 ✓). Then DifferentiableOn.analyticOnNhd-ish lemma → AnalyticAt. Need the DifferentiableOn→AnalyticOnNhd lemma name. Let me grep for what converts differentiability to analyticity over ℂ.
(g) The eventuallyEq: ∀ᶠ s in 𝓝(−2), riemannZeta s = (s − (−2))^1 • G s:
Take ball(−2, r) small enough that: (i) ball ⊆ {s ≠ 0} (r < 2), (ii) Hfun ≠ 0 on ball (from (f): eventually_ne gives a nhds set; intersect with a ball — use Metric.eventually... take r from eventually: `Metric.eventually_nhds_iff_ball` gives ∃ b > 0, ∀ y ∈ ball x b, Hfun y ≠ 0. Choose r = min 1 b... simpler: work with the eventually statements directly:
```lean
have hEv : ∀ᶠ s in 𝓝 (-2 : ℂ), riemannZeta s = (s - (-2)) ^ 1 • G s := by
filter_upwards [Metric.ball_mem_nhds (-2) (zero_lt_one : (0:ℝ) < 1), hHfun_ev_ne] with s hs1 hs2
-- hs1 : s ∈ ball (−2) 1 ⟹ s ≠ 0 and (s ≠ −2 case split)
by_cases hs : s = -2
· subst hs; simp [hzeta_neg_two] -- ζ(−2) = 0 and RHS = 0^1 • G = 0
· -- s ≠ −2, s ≠ 0 (from ball), Hfun s ≠ 0:
have hs0 : s ≠ 0 := by ... (ball radius 1 excludes 0)
-- Λ(s) = ΓR(s)·ζ(s):
have hΛ := completedRiemannZeta_eq_Gammaℝ_mul hs0 (hΓR_ne_zero hs hs0...)
-- ΓR s ≠ 0: Gammaℝ_eq_zero_iff: ¬∃ n, s = −(2n): ball excludes −2n (n=1: −2 by hs; n=0: 0 by hs0; n≥2: |s+2| ≥ 2)
-- ζ(s) = Λ(s)/ΓR(s) = Λ(s)·(s+2)/((s+2)ΓR(s)) = Λ(s)(s+2)/Hfun(s) = (s+2)·G(s)
rw [pow_one, smul_eq_mul]
-- goal: ζ s = (s − −2) * (Λ s / Hfun s) i.e. (s+2)·Λ/Hfun
have hH : (s + 2) * Complex.Gammaℝ s = Hfun s := Hfun_eq s hs hs0
-- ζ = Λ/ΓR:
have hz : riemannZeta s = completedRiemannZeta s / Complex.Gammaℝ s := by
rw [hΛ]; field_simp [hΓR] -- Λ = ΓR·ζ ⟹ ζ = Λ/ΓR: ΓR ≠ 0
rw [hz]
-- Λ/ΓR = (s+2)·Λ/Hfun ⟺ Λ·Hfun = (s+2)·Λ·ΓR: Hfun = (s+2)ΓR ✓
rw [div_eq_div_iff? ...] -- field_simp [hΓR, hs2(Hfun ne)] then linear: Λ·Hfun s = (s+2)·Λ·ΓR ⟸ hH
field_simp [hΓR, hs2]
-- goal: Λ s * Hfun s = ... hmm direction
rw [← hH]; ring -- or linear_combination
```
The s − (−2) vs s + 2: sub_neg_eq_add: (s − −2) = s + 2 ✓ norm_num/simp.
At s = −2 case: goal ζ(−2) = (−2 − −2)^1 • G(−2): RHS = 0 • G = 0: simp [pow_one, smul_eq_mul, sub_self, zero_mul]; LHS: riemannZeta (−2) = 0: riemannZeta_neg_two_mul_nat_add_one 0 : ζ(−2·(0+1)) = 0 — −2·(0+1) = −2: `show riemannZeta (-2) = 0`; convert: `have := riemannZeta_neg_two_mul_nat_add_one 0; norm_num at this ⊢`? (−2·(0+1) : ℂ) = −2 ✓ norm_num at this. So: simp [this, pow_one, smul_eq_mul] or just rw both.
ζ(−2) = 0 needs casting care: riemannZeta_neg_two_mul_nat_add_one (n : ℕ) : riemannZeta (-2 * (n + 1)) = 0 — the argument is ℂ: −2 * (↑(0+1)) = −2·1 = −2 ✓.
(h) hΓR_ne_zero: for s ∈ ball(−2,1), s ≠ −2: Gammaℝ s ≠ 0:
```lean
have hΓR : Complex.Gammaℝ s ≠ 0 := by
rw [Complex.Gammaℝ_eq_zero_iff] -- wait Gammaℝ_eq_zero_iff is in Complex namespace? Deligne.lean — namespace Complex: `lemma Gammaℝ_eq_zero_iff {s : ℂ} : Gammaℝ s = 0 ↔ ∃ n : ℕ, s = -(2 * n)` ✓
push Not
rintro ⟨m, hm⟩ -- s = −(2·m)
-- |s − (−2)| = |2 − 2m| ≥ 2 for m ≠ 1; m = 1 gives s = −2 excluded
rcases Nat.eq_zero_or_pos m with hm0 | hmpos
· -- m = 0: s = 0, excluded by hs0
subst hm0; simp at hm; exact hs0 hm.symm? hm : s = -(2*↑0) = 0: simp at hm: hm : s = 0: exact hs0 hm
· -- m ≥ 1: m = 1 gives s = −2 ⟸ hs; m ≥ 2: distance ≥ 2
rcases eq_or_ne m 1 with hm1 | hm1
· subst hm1; norm_num at hm; exact hs hm -- hm : s = −2
· -- m ≥ 2
have hm2 : 2 ≤ m := by omega
-- dist s (−2) = |s+2| = |−2m+2| = 2m−2 ≥ 2
rw [hm] at hs1 -- hs1 : s ∈ ball (−2) 1
rw [Metric.mem_ball, dist_eq_norm] at hs1
have hnorm_eq : (-(2 * (m : ℂ)) - -2) = ((2 - 2 * m : ℝ) : ℂ) := by push_cast; ring
rw [show (-(2 * (m : ℂ))) - -2 = ((2 - 2 * m : ℝ) : ℂ) by push_cast; ring,
Complex.norm_real, Real.norm_eq_abs] at hs1
-- |2 − 2m| = 2m − 2 ≥ 2
rw [abs_of_nonpos (by ... 2 − 2m ≤ 0 ⟸ m ≥ 2)] at hs1
-- hs1 : -(2 − 2m) < 1 ⟹ 2m − 2 < 1 ⟹ m < 1.5 ⟹ m ≤ 1 contradiction
have : (m : ℝ) ≤ 1 := by nlinarith [hs1]...
-- 2m−2 < 1 ⟹ 2m < 3 ⟹ m ≤ 1: omega-ish with cast
have hmle : m ≤ 1 := by
have : (2:ℝ) * m < 3 := by nlinarith [hs1, hm2] -- careful casts
have : (m : ℝ) < 1.5 := by linarith
by_contra h
push Not at h -- 2 ≤ m
have : (2:ℝ) ≤ m := by exact_mod_cast h
linarith
omega -- hm2 : 2 ≤ m, hmle : m ≤ 1
```
Fiddly but standard.
(i) Assemble the order:
```lean
theorem zeroMult_neg_two : zeroMult (-2) = 1 := by
-- G and its properties
have hHfun_an : AnalyticAt ℂ Hfun (-2) := Hfun_analyticAt_neg_two
have hHfun_ne : Hfun (-2) ≠ 0 := by rw [Hfun_neg_two]; norm_num [pi_ne_zero] -- −2π ≠ 0
have hΛ_an : AnalyticAt ℂ completedRiemannZeta (-2) := ...
have hG_an : AnalyticAt ℂ (fun s => completedRiemannZeta s / Hfun s) (-2) := hΛ_an.div hHfun_an hHfun_ne
have hΛ_ne : completedRiemannZeta (-2) ≠ 0 := ...
have hG_ne : completedRiemannZeta (-2) / Hfun (-2) ≠ 0 := div_ne_zero hΛ_ne hHfun_ne
have hEv : ∀ᶠ s in 𝓝 (-2 : ℂ), riemannZeta s = (s - -2)^1 • (completedRiemannZeta s / Hfun s) := ...
have hzeta_an : AnalyticAt ℂ riemannZeta (-2) := hG_an.mul (analyticAt_id.sub analyticAt_const) ... -- (s+2)·G analytic; congr
```
Hmm — analyticOrderAt_eq_natCast needs AnalyticAt riemannZeta (−2) — get from the eventuallyEq + RHS analytic:
```lean
have hRHS_an : AnalyticAt ℂ (fun s => (s - -2)^1 • (completedRiemannZeta s / Hfun s)) (-2) := by
fun_prop? — ((analyticAt_id.sub analyticAt_const).pow 1).smul hG_an — smul of ℂ-valued: smul = mul: AnalyticAt.smul? for ℂ·ℂ: AnalyticAt.mul after converting smul to mul... simpler write RHS as (s - -2) * G s and note pow_one/smul_eq_mul make them match.
have hzeta_an : AnalyticAt ℂ riemannZeta (-2) := hRHS_an.congr hEv
have horder : analyticOrderAt riemannZeta (-2) = 1 :=
(hzeta_an.analyticOrderAt_eq_natCast).mpr ⟨_, hG_an, hG_ne, hEv⟩
-- zeroMult = (analyticOrderAt ...).toNat
rw [zeroMult, horder] -- ((1 : ℕ∞)).toNat = 1
rfl / simp
```
zeroMult ρ := (analyticOrderAt riemannZeta ρ).toNat — with horder : analyticOrderAt riemannZeta (−2) = ↑1: rw gives (↑(1:ℕ)).toNat — for ℕ∞ = WithTop ℕ: `WithTop.toNat`? hmm — in current Mathlib, ℕ∞ is `WithTop ℕ`? and `.toNat` — there's `ENat.toNat`? The def in Zeta23: `(analyticOrderAt riemannZeta ρ).toNat` — whatever toNat instance it uses. simp [zeroMult, horder] should evaluate: WithTop.toNat 1 = 1? There might be a simp lemma `ENat.toNat_one`/`WithTop.toNat_coe`. Try `simp [zeroMult, horder]`; fallback `rw [zeroMult, horder]; rfl`? (↑1 : ℕ∞).toNat — if toNat is defined via WithTop.untop... rfl should work.
Also horder's target form: analyticOrderAt riemannZeta (-2) = 1 — the RHS 1 : ℕ∞ ✓.
(j) hΛ_ne : completedRiemannZeta (−2) ≠ 0:
```lean
have hΛ3 : completedRiemannZeta 3 = Complex.Gammaℝ 3 * riemannZeta 3 :=
completedRiemannZeta_eq_Gammaℝ_mul (by norm_num) hΓR3
where hΓR3 : Gammaℝ 3 ≠ 0 := by
rw [Complex.Gammaℝ_eq_zero_iff] -- hmm is it Complex.Gammaℝ_eq_zero_iff? Deligne namespace Complex
push Not
rintro ⟨m, hm⟩ -- (3:ℂ) = −(2m)
have := congrArg Complex.re hm
simp at this -- 3 = −2m real: −2m ≤ 0
have : (0:ℝ) ≤ (m : ℝ) := by positivity
nlinarith [this]
have hζ3 : riemannZeta 3 ≠ 0 := riemannZeta_ne_zero_of_one_lt_re (by simp) -- (3:ℂ).re = 3 > 1
have hΛ3_ne : completedRiemannZeta 3 ≠ 0 := by rw [hΛ3]; exact mul_ne_zero hΓR3 hζ3
have hΛ_ne : completedRiemannZeta (-2) ≠ 0 := by
have hfe := completedRiemannZeta_one_sub (-2) -- Λ(1−(−2)) = Λ(−2)
norm_num at hfe -- 1−(−2) = 3: hfe : Λ 3 = Λ (−2)
rw [← hfe] -- hmm direction: goal Λ(−2) ≠ 0: rw ← hfe rewrites Λ(−2)?? hfe : Λ(1−−2) = Λ(−2)...
```
Careful: completedRiemannZeta_one_sub (s) : Λ(1−s) = Λ(s). At s = −2: Λ(1−(−2)) = Λ(−2) i.e. Λ(3) = Λ(−2). I want to rewrite goal Λ(−2) ≠ 0 into Λ(3) ≠ 0: `rw [← completedRiemannZeta_one_sub (-2)]`? ← direction rewrites Λ(−2) → Λ(1−(−2)): then 1−(−2) needs norm_num to 3: `rw [← completedRiemannZeta_one_sub (-2)]; norm_num`? The goal becomes completedRiemannZeta (1−−2) ≠ 0 — `show completedRiemannZeta 3 ≠ 0` (1−−2 = 3: norm_num1?) then exact hΛ3_ne. Use:
```lean
rw [← completedRiemannZeta_one_sub (-2 : ℂ)]
norm_num1 -- 1 - -2 = 3 — does norm_num1 rewrite in goal? goal is ≠ (Prop): norm_num1 might not simplify inside... use show:
-- alternatively:
have hfe : completedRiemannZeta (-2) = completedRiemannZeta 3 := by
have h := completedRiemannZeta_one_sub (-2 : ℂ)
norm_num at h -- h : Λ 3 = Λ (−2)?? norm_num simplifies 1 − −2 to 3 ✓
exact h.symm
rw [hfe]; exact hΛ3_ne
```
norm_num at h: h : completedRiemannZeta (1 − −2) = completedRiemannZeta (−2) — norm_num reduces 1−−2 → 3? It should (numeral arithmetic inside function arg — norm_num simplifies ✓).
riemannZeta_ne_zero_of_one_lt_re {s : ℂ} (hs : 1 < s.re) : riemannZeta s ≠ 0 — at 3: (3:ℂ).re = 3: `by simp` or `by norm_num`: 1 < (3:ℂ).re: simp [Complex.ofReal_re]? (3:ℂ) is OfNat — Complex.re of numeral: `by norm_num` ✓ (1 < 3 re).
hΓR3: congrArg Complex.re hm : ((3:ℂ)).re = (−(2*↑m)).re: simp [Complex.neg_re, Complex.mul_re...] — (−(2·↑m)).re = −(2·↑m.re)?? simp should reduce to 3 = −2·↑m: simp [Complex.neg_re, Complex.mul_re, Complex.ofReal_re...]. Hmm — −(2 * (m:ℂ)): re = −(2·m).re = −(2·m·...): (2·↑m).re = 2·↑m: via Complex.mul_re: (2*↑m).re = 2.re·↑m.re − 2.im·↑m.im = 2·↑m − 0 = 2↑m ✓ simp [Complex.mul_re, Complex.ofReal_re, Complex.neg_re]. Then linarith with 0 ≤ (m:ℝ).
(k) DifferentiableOn → AnalyticOnNhd name — let me grep Mathlib for "analyticOnNhd" from DifferentiableOn.
Also completedRiemannZeta analyticity at −2 — hmm, maybe simpler via differentiableAt_completedZeta → AnalyticAt: is there `DifferentiableAt.analyticAt` for ℂ?? I don't think so. The DifferentiableOn-ball route needs the converter name. Grep:
Two more API names to pin down: DifferentiableOn→AnalyticOnNhd converter and cpow analyticity.
tool: Bash
input
{
"command": "cd D:/Python/Quantum/zeta-23-lean/.lake/packages/mathlib && grep -rn \"DifferentiableOn.analyticOnNhd\\|analyticOnNhd_of_differentiableOn\\|differentiableOn.*analyticOnNhd\" Mathlib/Analysis/Complex/ -r --include=*.lean | grep -i \"theorem\\|lemma\" | head -4; grep -rn \"theorem analyticAt_exp\\|lemma analyticAt_exp\\|analyticAt_cpow\" Mathlib/Analysis/SpecialFunctions/ -r --include=*.lean | head -6; grep -rn \"theorem analyticAt_id\\b\\|lemma analyticAt_id\\b\\|theorem analyticAt_const\" Mathlib/Analysis/Analytic/ -r --include=*.lean | head -4",
"description": "Find differentiability-to-analyticity and cpow/exp analytic lemmas"
}
raw content_json (database row)
[{"type":"thinking","thinking":"- `AnalyticAt.congr (hf : AnalyticAt 𝕜 f x) (hg : f =ᶠ[𝓝 x] g) : AnalyticAt 𝕜 g x` ✓ — note direction: hg : f =ᶠ g gives g analytic. \n- zetaA pattern: `zetaA_apply {w} (hw : w ≠ 1) : zetaA w = (w−1)·ζ(w)`; `zetaA_analyticAt_of_ne (hw : w ≠ 1) : AnalyticAt ℂ zetaA w` ✓.\n\nSo AnalyticAt ζ at −2:\n```lean\nhave hzeta_an : AnalyticAt ℂ riemannZeta (-2) := by\n have hdiv : AnalyticAt ℂ (fun s => zetaA s / (s - 1)) (-2) :=\n (zetaA_analyticAt_of_ne (by norm_num)).div\n ((analyticAt_id).sub analyticAt_const) (by norm_num)\n apply hdiv.congr\n filter_upwards [eventually_ne_nhds (show (-2:ℂ) ≠ 1 by norm_num)] with s hs\n -- goal: zetaA s / (s−1) = riemannZeta s (direction: f =ᶠ g with f = the div fn, g = ζ)\n rw [zetaA_apply hs]\n field_simp [sub_ne_zero.mpr hs]\n```\nCareful with congr direction: hf : AnalyticAt f (−2) where f = fun s => zetaA s/(s−1); hg : f =ᶠ[𝓝(−2)] riemannZeta. So filter_upwards gives `zetaA s/(s−1) = riemannZeta s` ✓: rw [zetaA_apply hs]: (s−1)·ζ(s)/(s−1) = ζ(s): field_simp [sub_ne_zero.mpr hs] or `mul_div_cancel_right₀`: `mul_div_cancel_right₀ (a) (hb : b ≠ 0) : a * b / b = a` ✓. So: rw [zetaA_apply hs]; exact mul_div_cancel_right₀ _ (sub_ne_zero.mpr hs).\n\nHmm wait — `(s - 1) * riemannZeta s / (s - 1)` — mul_div_cancel_right₀ (h : b ≠ 0) : a * b / b = a ✓ exact.\n\nAlso `analyticAt_id` — name: `analyticAt_id : AnalyticAt 𝕜 id z`? there's `analyticAt_id`? In recent Mathlib `analyticAt_id (z) : AnalyticAt 𝕜 id z`? exists ✓ (maybe `analyticAt_id : AnalyticAt 𝕜 id x`). sub const: (analyticAt_id.sub analyticAt_const) ✓.\n\nThe division denominator: (fun s => s − 1) at −2: ≠ 0: `by norm_num` — (−2 : ℂ) − 1 ≠ 0: norm_num: −3 ≠ 0 ✓. (−2 : ℂ) ≠ 1 norm_num ✓.\n\nNow the main theorem. Structure:\n\n```lean\n/-! ## 5. Trivial-zero simplicity: zeroMult (−2) = 1 -/\n\n/-- The local factor of ΓR at −2: Hfun s = 4·π^{−s/2}·Γ(s/2+2)/s. Equals\n(s+2)·ΓR(s) off {−2, 0} (Gamma_add_one twice); analytic at −2 with\nHfun(−2) = −2π ≠ 0. -/\nprivate def Hfun (s : ℂ) : ℂ := 4 * (π : ℂ) ^ (-s / 2) * Complex.Gamma (s / 2 + 2) / s\n```\n\nHmm — private? No: the theorem zeroMult_neg_two is the deliverable; Hfun can be private but nothing wrong with public. Keep private def? In this codebase style, defs are public. I'll make it a plain def `gammaRFactor` hmm — name it `HfunNegTwo`? Simple: `def Hfun (s : ℂ) : ℂ := 4 * (Real.pi : ℂ) ^ (-s / 2) * Complex.Gamma (s / 2 + 2) / s`.\n\nNote about π: in Deligne.lean, `π ^ (-s / 2)` — what's π there? In Complex context, `π` is `Real.pi` coerced via `↑π`? The gotcha from journal-019/020: \"bare π auto-binds (use Real.pi)\". In the Complex namespace with open Complex, `π` refers to `Real.pi` (there's no Complex.pi) — coerced. Gammaℝ_def : Gammaℝ s = π ^ (-s / 2) * Gamma (s / 2) — with π : ℝ coerced to ℂ and ^ = cpow ✓. I'll write `((Real.pi : ℂ) : ℂ)`... just `(Real.pi : ℂ)` with explicit ascribe to avoid the auto-bind gotcha. Hmm — the gotcha: \"bare π auto-binds\" — in a definition `def Hfun (s : ℂ) : ℂ := 4 * π ^ (-s / 2) * ...` — π would elaborate as Real.pi coerced? Should be fine with open Complex... but the gotcha says bare π auto-BINDS (i.e., Lean parses `π` as a new bound variable?) in some positions. To be safe: write `(Real.pi : ℂ)` explicitly.\n\nComponents:\n\n(a) cpow piece: `AnalyticAt ℂ (fun s => (Real.pi : ℂ) ^ (-s / 2)) (-2)`:\n```lean\nhave hcpi : AnalyticAt ℂ (fun s => (Real.pi : ℂ) ^ (-s / 2)) (-2) := by\n have heq : (fun s => (Real.pi : ℂ) ^ (-s / 2))\n = fun s => Complex.exp (Complex.log (Real.pi : ℂ) * (-s / 2)) := by\n funext s\n rw [Complex.cpow_def_of_ne_zero (by norm_num : (Real.pi : ℂ) ≠ 0)] -- π^w = exp (log π * w)\n -- cpow def: x ^ y = exp (log x * y)? check form: cpow_def_of_ne_zero : x ≠ 0 → x ^ y = exp (log x * y)\n rw [heq]\n exact (Complex.analyticAt_exp _).comp (... analytic linear)\n```\n- cpow_def_of_ne_zero : `Complex.cpow_def_of_ne_zero (hx : x ≠ 0) : x ^ y = Complex.exp (Complex.log x * y)`? I think: `cpow_def_of_ne_zero (hx : x ≠ 0) : x ^ y = exp (log x * y)` ✓ roughly.\n- analyticAt_exp: `Complex.analyticAt_exp (z : ℂ) : AnalyticAt ℂ Complex.exp z`? name check: there's `Complex.analyticAt_exp`? or `analyticAt_exp`? grep needed. Then comp: `.comp (AnalyticAt ℂ (fun s => log π * (−s/2)) (−2))`: the linear map: log π * (−s/2) = (−log π / 2) * s: `analyticAt_const.mul analyticAt_id` with reshuffle via congr... AnalyticAt ℂ (fun s => c * s) z where c = log π * (−1/2): show function equals fun s => c * s via funext (ring), then analyticAt_const.mul analyticAt_id. Hmm — (fun s => Complex.log π * (−s/2)) = fun s => (Complex.log π * (−1/2)) * s: funext + ring ✓.\n\n(b) Gamma piece analyticity:\n```lean\nhave hGamma : AnalyticAt ℂ (fun s => Complex.Gamma (s / 2 + 2)) (-2) := by\n have hd : DifferentiableOn ℂ (fun s => Complex.Gamma (s / 2 + 2)) (Metric.ball (-2) 1) := by\n intro s hs\n apply DifferentiableAt.comp ... -- differentiableAt_Gamma (s/2+2) (h : ∀ m, s/2+2 ≠ -m)\n · exact differentiableAt_Gamma _ (fun m => ?_)\n · differentiability of s ↦ s/2+2: (differentiableAt_id.div_const _ |>.add ...) / fun_prop\n · continuity for DifferentiableAt.comp needs f differentiable at (g z): DifferentiableAt.comp (s) hf hg ✓\n -- the ∀ m condition: s ∈ ball(−2,1) ⟹ s/2+2 ≠ −m\n ...\n exact (hd.analyticOnNhd Metric.isOpen_ball).analyticAt (Metric.mem_ball_self zero_lt_one)\n```\n- `DifferentiableOn.analyticOnNhd` — exact name? For ℂ: I believe `DifferentiableOn.analyticOnNhd (hf : DifferentiableOn ℂ f s) (hs : IsOpen s) : AnalyticOnNhd ℂ f s` — hmm, might be `DifferentiableOn.analyticOn`? In current Mathlib: `DifferentiableOn.analyticOnNhd_of_isOpen`? Let me grep for the exact name. The Goursat theorem in Mathlib: `Mathlib/Analysis/Complex/CauchyIntegral.lean` has... `DifferentiableOn.contDiffOn`? and analyticity: `DifferentiableOn.analyticOnNhd`? I'll grep.\n- The ∀ m condition: s ∈ ball(−2,1): dist s (−2) < 1. Suppose s/2+2 = −m (m : ℕ): then s = −2m − 4 = −2(m+2): dist = |s−(−2)| = |−2m−4+2| = |−2m−2| = 2m+2 ≥ 2 > 1 contradiction. Formalize: s/2+2 = −(m:ℂ) ⟹ s = −2·(m)−4: linear: s = 2·(−m)−4. dist s (−2) = ‖s+2‖ = ‖−2m−2‖ = 2m+2 ≥ 2. So: \n```lean\n intro m hm -- hm : s / 2 + 2 = -(m : ℂ)\n have hs_eq : s = -2 * (m : ℂ) - 4 := by linear_combination 2 * hm -- from s/2+2 = −m: s/2 = −m−2: s = −2m−4\n -- dist: |s − (−2)| = |−2m−2| = 2m+2 ≥ 2 but hs : dist < 1\n rw [hs_eq] at hs\n -- Metric.mem_ball: dist s (−2) < 1: dist = ‖s − (−2)‖ = ‖−2m−2‖\n have : (2:ℝ) ≤ dist (-2 * (m : ℂ) - 4) (-2) := by\n rw [dist_eq_norm]\n have : (-2 * (m : ℂ) - 4) - (-2) = -((2 * m + 2 : ℝ) : ℂ) := by push_cast; ring\n rw [this, Complex.norm_neg, Complex.norm_real] -- norm of real cast = |·|\n rw [Real.norm_eq_abs, abs_of_nonneg (by positivity)]\n have : (2:ℝ) ≤ 2 * m + 2 := by have : (0:ℝ) ≤ m := by positivity; linarith\n linarith\n linarith [hs, this] -- hs : dist < 1 ≤ 2 ≤ dist contradiction\n```\nRoughly. `dist_eq_norm : dist a b = ‖a − b‖` ✓.\n\n(c) Hfun analytic: \n```lean\ntheorem Hfun_analyticAt_neg_two : AnalyticAt ℂ Hfun (-2) := by\n unfold Hfun\n -- 4 * π^(−s/2) * Γ(s/2+2) / s: AnalyticAt.div (mul (mul)) (denominator s ≠ 0 at −2)\n exact (((analyticAt_const.mul hcpi).mul hGamma).div analyticAt_id (by norm_num))\n```\nWait — 4 * π^.. * Γ.. / s = ((4 * π^..) * Γ..) / s ✓. analyticAt_const : AnalyticAt ℂ (fun _ => c) z ✓ (name: `analyticAt_const` ✓ exists). analyticAt_id : AnalyticAt ℂ id? — the denominator function is `fun s => s` = id? Hfun's last part `/ s` — the function is fun s => (numerator s) / s = fun s => num s / (fun s => s) s. AnalyticAt.div hf hg hg0 ✓ with hg = analyticAt_id... is it `analyticAt_id`? There's `analyticAt_id : AnalyticAt 𝕜 id z`? But our function is fun s => s — id ✓ defeq. Might need `analyticAt_id'`? Fine, iterate.\n\n(d) Hfun(−2) = −2π:\n```lean\ntheorem Hfun_neg_two : Hfun (-2) = -2 * (Real.pi : ℂ) := by\n unfold Hfun\n rw [show (-(−2 : ℂ) / 2) = 1 by norm_num, Complex.cpow_one,\n show ((-2 : ℂ) / 2 + 2) = 1 by norm_num, Complex.Gamma_one]\n field_simp -- 4 * π * 1 / (−2) = −2π: field_simp? (−2 ≠ 0): 4π/(−2) = −2π\n ring\n```\nHmm: 4 * π * 1 / (−2) = −2π ⟺ 4π/(−2) = −2π: `norm_num [mul_comm]`? do: `rw [mul_one]; field_simp; ring`? 4*π/(−2): div by nonzero constant: norm_num should simplify 4/(−2) = −2: `norm_num` might close 4*π*1/(−2) = −2*π after evaluating the division... Actually safest: \n```lean\n rw [show (4 : ℂ) * (Real.pi : ℂ) ^ (1:ℂ) * Complex.Gamma 1 / (-2) = ... ]\n```\nLet me just: unfold, norm_num [Complex.cpow_one, Complex.Gamma_one]? The goal after unfold Hfun: 4 * π^(−(−2)/2) * Γ(−2/2+2)/−2 = −2π. Steps: −(−2)/2 = 1 — the exponent is `-(−2 : ℂ)/2`: norm_num can evaluate `-(−2 : ℂ)/2 = 1`? It's a ℂ arithmetic of numerals ✓ norm_num. Then cpow_one, Gamma_one: 4·π·1/(−2) = −2π: field_simp + ring or norm_num with pi as atom... `norm_num` treats π as atom: 4*π/(−2) = −2*π: needs 4/(−2) = −2: norm_num should do this (division of literals) ✓ maybe with mul_one first. I'll iterate in compiler.\n\n(e) The punctured identity (s+2)·ΓR(s) = Hfun s for s ≠ −2, s ≠ 0:\n```lean\ntheorem Hfun_eq (s : ℂ) (hs2 : s ≠ -2) (hs0 : s ≠ 0) :\n (s + 2) * Complex.Gammaℝ s = Hfun s := by\n rw [Complex.Gammaℝ_def]\n -- Gamma (s/2) = Gamma (s/2+2) / ((s/2)(s/2+1))\n have h1 : Complex.Gamma (s / 2 + 1) = (s / 2) * Complex.Gamma (s / 2) :=\n Complex.Gamma_add_one _ (by ...)\n have h2 : Complex.Gamma (s / 2 + 2) = (s / 2 + 1) * Complex.Gamma (s / 2 + 1) := by\n rw [show s / 2 + 2 = (s / 2 + 1) + 1 by ring]\n exact Complex.Gamma_add_one _ (by ...) -- s/2+1 ≠ 0 ⟸ s ≠ −2\n -- solve for Gamma (s/2):\n have hG : Complex.Gamma (s / 2) = 4 * Complex.Gamma (s / 2 + 2) / (s * (s + 2)) := by\n -- from h1: Γ(s/2) = Γ(s/2+1)/(s/2) = Γ(s/2+2)/((s/2)(s/2+1))\n field_simp [hs0, hs2] hmm — fractions with s/2: field_simp handles\n ...\n```\nLet me do it linearly: Γ(s/2) = Γ(s/2+1)/(s/2) [h1, s/2 ≠ 0 ⟸ hs0]; Γ(s/2+1) = Γ(s/2+2)/(s/2+1) [h2, s/2+1 ≠ 0 ⟸ hs2]. So Γ(s/2) = Γ(s/2+2)/((s/2+1)(s/2)) = Γ(s/2+2)·4/(s(s+2)) since (s/2)(s/2+1) = s(s+2)/4.\nThen (s+2)·ΓR(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 ✓ (cancel s+2 ≠ 0 ⟸ hs2).\nIn Lean, this is field_simp + ring_nf with the three neqs (hs0, hs2, and s/2 ≠ 0, s/2+1 ≠ 0 derived). Plan:\n```lean\n have h2ne : s / 2 ≠ 0 := by positivity?no: div_ne_zero hs0 (two_ne_zero) ✓ `div_ne_zero hs0 two_ne_zero` — hmm (2:ℂ) ≠ 0: two_ne_zero' ℂ? `two_ne_zero` might be for monoids... `(two_ne_zero' ℂ)`? Simpler: `by norm_num : (2:ℂ) ≠ 0` then div_ne_zero hs0 this.\n have h21ne : s / 2 + 1 ≠ 0 := by\n intro h\n apply hs2\n -- s/2 + 1 = 0 ⟹ s = −2\n have : s = -2 := by linear_combination 2 * h -- s/2 = −1 ⟹ s = −2: linear_combination works? h : s/2+1 = 0: 2*(s/2+1) = 0: s + 2 = 0... linear_combination (2 * h): goal s = −2: s − (−2) = 2*(s/2+1 − 0) ✓ ring-check: s+2 vs 2*(s/2+1) = s+2 ✓. But linear_combination expects equalities — h : s/2+1 = 0 ✓, goal s = −2 ✓: linear_combination 2 * h should work (checks (s − (−2)) − 2*(s/2+1 − 0) = 0 by ring ✓).\n exact this\n have h1 := Complex.Gamma_add_one (s / 2) h2ne -- Γ(s/2 + 1) = (s/2)·Γ(s/2)\n have h2 := Complex.Gamma_add_one (s / 2 + 1) h21ne -- Γ(s/2+2) = (s/2+1)·Γ(s/2+1)?? \n```\nwait — Gamma_add_one (s/2+1) : Gamma ((s/2+1) + 1) = (s/2+1)·Gamma (s/2+1). (s/2+1)+1 = s/2+2 ✓ (ring — the statement has (s/2+1)+1 syntactically; my Hfun has s/2+2 — need a `show` or rw to align: have h2' : Complex.Gamma (s/2 + 2) = (s/2+1) * Complex.Gamma (s/2+1) := by rw [show s/2+2 = (s/2+1)+1 by ring]; exact Complex.Gamma_add_one _ h21ne ✓.\n\nThen:\n```lean\n -- Γ(s/2) = Γ(s/2+2) / ((s/2)(s/2+1)):\n have hG : Complex.Gamma (s / 2) = Complex.Gamma (s / 2 + 2) / ((s / 2) * (s / 2 + 1)) := by\n rw [h2'] at h1 -- h1 : Γ(s/2+2) = (s/2+1)·(s/2)·Γ(s/2)?? h1: Γ(s/2+1) = (s/2)Γ(s/2); h2': Γ(s/2+2) = (s/2+1)Γ(s/2+1) = (s/2+1)(s/2)Γ(s/2)\n -- so Γ(s/2) = Γ(s/2+2)/((s/2)(s/2+1))\n field_simp [h2ne, h21ne]\n rw [h1] at h2' ... \n```\nLet me do: from h1: Γ(s/2+1) = (s/2)·Γ(s/2); from h2': Γ(s/2+2) = (s/2+1)·Γ(s/2+1) = (s/2+1)·(s/2)·Γ(s/2). So Γ(s/2) = Γ(s/2+2)/((s/2+1)(s/2)): \n```lean\n have hG : Complex.Gamma (s / 2) = Complex.Gamma (s / 2 + 2) / ((s / 2) * (s / 2 + 1)) := by\n have h12 : Complex.Gamma (s / 2 + 2) = (s / 2 + 1) * (s / 2) * Complex.Gamma (s / 2) := by\n rw [h2', h1]; ring\n rw [h12]\n field_simp [mul_ne_zero h2ne h21ne]\n ring\n```\nΓ(s/2+2)/((s/2)(s/2+1)) with Γ(s/2+2) = (s/2+1)(s/2)Γ(s/2): the division cancels to Γ(s/2): goal: Γ(s/2) = ((s/2+1)(s/2)Γ(s/2))/((s/2)(s/2+1)): field_simp [denominator ≠ 0] then ring ✓.\n\nThen assemble:\n```lean\n rw [Complex.Gammaℝ_def, hG] -- hmm Gammaℝ s = π^(−s/2) * Γ(s/2)\n unfold Hfun\n field_simp [hs0, hs2]\n ring\n```\nGoal: (s+2)·(π^(−s/2)·(Γ(s/2+2)/((s/2)(s/2+1)))) = 4·π^(−s/2)·Γ(s/2+2)/s. field_simp clears: LHS·denoms vs RHS·denoms: ring identity: (s+2)·π·Γ·s = 4πΓ·(s/2)(s/2+1) ⟺ (s+2)s = 4(s/2)(s/2+1) = s(s+2) ✓ ring.\n\nHmm — field_simp with hs0 hs2 clears denominators ((s/2)(s/2+1) and s): the side conditions: s ≠ 0 ✓ and (s/2)(s/2+1) ≠ 0 — pass mul_ne_zero h2ne h21ne. OK.\n\n(f) G := fun s => completedRiemannZeta s / Hfun s:\n- Hfun_ne_zero near −2: Hfun continuous at −2 (analytic ⟹ continuous: hHfun_an.continuousAt) with Hfun(−2) ≠ 0 ⟹ ∀ᶠ s in 𝓝(−2), Hfun s ≠ 0: `ContinuousAt.eventually_ne hcont hne` ✓ exists (`ContinuousAt.eventually_ne : ContinuousAt f x → f x ≠ 0 → ∀ᶠ y in 𝓝 x, f y ≠ 0`).\n- G analytic at −2: hΛan.div hHfun_an hHfun_ne0 (needs point ≠ 0 for AnalyticAt.div: `(hf.div hg (hg0 : g x ≠ 0))` ✓).\n- Λ analytic at −2: from differentiableAt_completedZeta (s≠0)(s≠1) — DifferentiableAt NOT AnalyticAt; need neighborhood version: DifferentiableOn on ball(−2,1): ∀ s ∈ ball: differentiableAt_completedZeta (s ≠ 0) (s ≠ 1): |s−(−2)|<1 ⟹ s ≠ 0 (dist 0 (−2) = 2 > 1... formalize: if s = 0: dist 0 (−2) = 2 ≥ 1 contradiction ✓; s = 1: dist 1 (−2) = 3 ✓). Then DifferentiableOn.analyticOnNhd-ish lemma → AnalyticAt. Need the DifferentiableOn→AnalyticOnNhd lemma name. Let me grep for what converts differentiability to analyticity over ℂ.\n\n(g) The eventuallyEq: ∀ᶠ s in 𝓝(−2), riemannZeta s = (s − (−2))^1 • G s:\nTake ball(−2, r) small enough that: (i) ball ⊆ {s ≠ 0} (r < 2), (ii) Hfun ≠ 0 on ball (from (f): eventually_ne gives a nhds set; intersect with a ball — use Metric.eventually... take r from eventually: `Metric.eventually_nhds_iff_ball` gives ∃ b > 0, ∀ y ∈ ball x b, Hfun y ≠ 0. Choose r = min 1 b... simpler: work with the eventually statements directly:\n```lean\nhave hEv : ∀ᶠ s in 𝓝 (-2 : ℂ), riemannZeta s = (s - (-2)) ^ 1 • G s := by\n filter_upwards [Metric.ball_mem_nhds (-2) (zero_lt_one : (0:ℝ) < 1), hHfun_ev_ne] with s hs1 hs2\n -- hs1 : s ∈ ball (−2) 1 ⟹ s ≠ 0 and (s ≠ −2 case split)\n by_cases hs : s = -2\n · subst hs; simp [hzeta_neg_two] -- ζ(−2) = 0 and RHS = 0^1 • G = 0\n · -- s ≠ −2, s ≠ 0 (from ball), Hfun s ≠ 0:\n have hs0 : s ≠ 0 := by ... (ball radius 1 excludes 0)\n -- Λ(s) = ΓR(s)·ζ(s):\n have hΛ := completedRiemannZeta_eq_Gammaℝ_mul hs0 (hΓR_ne_zero hs hs0...)\n -- ΓR s ≠ 0: Gammaℝ_eq_zero_iff: ¬∃ n, s = −(2n): ball excludes −2n (n=1: −2 by hs; n=0: 0 by hs0; n≥2: |s+2| ≥ 2)\n -- ζ(s) = Λ(s)/ΓR(s) = Λ(s)·(s+2)/((s+2)ΓR(s)) = Λ(s)(s+2)/Hfun(s) = (s+2)·G(s)\n rw [pow_one, smul_eq_mul]\n -- goal: ζ s = (s − −2) * (Λ s / Hfun s) i.e. (s+2)·Λ/Hfun\n have hH : (s + 2) * Complex.Gammaℝ s = Hfun s := Hfun_eq s hs hs0\n -- ζ = Λ/ΓR:\n have hz : riemannZeta s = completedRiemannZeta s / Complex.Gammaℝ s := by\n rw [hΛ]; field_simp [hΓR] -- Λ = ΓR·ζ ⟹ ζ = Λ/ΓR: ΓR ≠ 0\n rw [hz]\n -- Λ/ΓR = (s+2)·Λ/Hfun ⟺ Λ·Hfun = (s+2)·Λ·ΓR: Hfun = (s+2)ΓR ✓\n rw [div_eq_div_iff? ...] -- field_simp [hΓR, hs2(Hfun ne)] then linear: Λ·Hfun s = (s+2)·Λ·ΓR ⟸ hH\n field_simp [hΓR, hs2]\n -- goal: Λ s * Hfun s = ... hmm direction\n rw [← hH]; ring -- or linear_combination\n```\nThe s − (−2) vs s + 2: sub_neg_eq_add: (s − −2) = s + 2 ✓ norm_num/simp.\n\nAt s = −2 case: goal ζ(−2) = (−2 − −2)^1 • G(−2): RHS = 0 • G = 0: simp [pow_one, smul_eq_mul, sub_self, zero_mul]; LHS: riemannZeta (−2) = 0: riemannZeta_neg_two_mul_nat_add_one 0 : ζ(−2·(0+1)) = 0 — −2·(0+1) = −2: `show riemannZeta (-2) = 0`; convert: `have := riemannZeta_neg_two_mul_nat_add_one 0; norm_num at this ⊢`? (−2·(0+1) : ℂ) = −2 ✓ norm_num at this. So: simp [this, pow_one, smul_eq_mul] or just rw both.\n\nζ(−2) = 0 needs casting care: riemannZeta_neg_two_mul_nat_add_one (n : ℕ) : riemannZeta (-2 * (n + 1)) = 0 — the argument is ℂ: −2 * (↑(0+1)) = −2·1 = −2 ✓.\n\n(h) hΓR_ne_zero: for s ∈ ball(−2,1), s ≠ −2: Gammaℝ s ≠ 0:\n```lean\nhave hΓR : Complex.Gammaℝ s ≠ 0 := by\n rw [Complex.Gammaℝ_eq_zero_iff] -- wait Gammaℝ_eq_zero_iff is in Complex namespace? Deligne.lean — namespace Complex: `lemma Gammaℝ_eq_zero_iff {s : ℂ} : Gammaℝ s = 0 ↔ ∃ n : ℕ, s = -(2 * n)` ✓\n push Not\n rintro ⟨m, hm⟩ -- s = −(2·m)\n -- |s − (−2)| = |2 − 2m| ≥ 2 for m ≠ 1; m = 1 gives s = −2 excluded\n rcases Nat.eq_zero_or_pos m with hm0 | hmpos\n · -- m = 0: s = 0, excluded by hs0\n subst hm0; simp at hm; exact hs0 hm.symm? hm : s = -(2*↑0) = 0: simp at hm: hm : s = 0: exact hs0 hm\n · -- m ≥ 1: m = 1 gives s = −2 ⟸ hs; m ≥ 2: distance ≥ 2\n rcases eq_or_ne m 1 with hm1 | hm1\n · subst hm1; norm_num at hm; exact hs hm -- hm : s = −2\n · -- m ≥ 2\n have hm2 : 2 ≤ m := by omega\n -- dist s (−2) = |s+2| = |−2m+2| = 2m−2 ≥ 2\n rw [hm] at hs1 -- hs1 : s ∈ ball (−2) 1\n rw [Metric.mem_ball, dist_eq_norm] at hs1\n have hnorm_eq : (-(2 * (m : ℂ)) - -2) = ((2 - 2 * m : ℝ) : ℂ) := by push_cast; ring\n rw [show (-(2 * (m : ℂ))) - -2 = ((2 - 2 * m : ℝ) : ℂ) by push_cast; ring,\n Complex.norm_real, Real.norm_eq_abs] at hs1\n -- |2 − 2m| = 2m − 2 ≥ 2\n rw [abs_of_nonpos (by ... 2 − 2m ≤ 0 ⟸ m ≥ 2)] at hs1\n -- hs1 : -(2 − 2m) < 1 ⟹ 2m − 2 < 1 ⟹ m < 1.5 ⟹ m ≤ 1 contradiction\n have : (m : ℝ) ≤ 1 := by nlinarith [hs1]... \n -- 2m−2 < 1 ⟹ 2m < 3 ⟹ m ≤ 1: omega-ish with cast\n have hmle : m ≤ 1 := by\n have : (2:ℝ) * m < 3 := by nlinarith [hs1, hm2] -- careful casts\n have : (m : ℝ) < 1.5 := by linarith\n by_contra h\n push Not at h -- 2 ≤ m\n have : (2:ℝ) ≤ m := by exact_mod_cast h\n linarith\n omega -- hm2 : 2 ≤ m, hmle : m ≤ 1\n```\nFiddly but standard. \n\n(i) Assemble the order:\n```lean\ntheorem zeroMult_neg_two : zeroMult (-2) = 1 := by\n -- G and its properties\n have hHfun_an : AnalyticAt ℂ Hfun (-2) := Hfun_analyticAt_neg_two\n have hHfun_ne : Hfun (-2) ≠ 0 := by rw [Hfun_neg_two]; norm_num [pi_ne_zero] -- −2π ≠ 0\n have hΛ_an : AnalyticAt ℂ completedRiemannZeta (-2) := ...\n have hG_an : AnalyticAt ℂ (fun s => completedRiemannZeta s / Hfun s) (-2) := hΛ_an.div hHfun_an hHfun_ne\n have hΛ_ne : completedRiemannZeta (-2) ≠ 0 := ...\n have hG_ne : completedRiemannZeta (-2) / Hfun (-2) ≠ 0 := div_ne_zero hΛ_ne hHfun_ne\n have hEv : ∀ᶠ s in 𝓝 (-2 : ℂ), riemannZeta s = (s - -2)^1 • (completedRiemannZeta s / Hfun s) := ...\n have hzeta_an : AnalyticAt ℂ riemannZeta (-2) := hG_an.mul (analyticAt_id.sub analyticAt_const) ... -- (s+2)·G analytic; congr\n```\nHmm — analyticOrderAt_eq_natCast needs AnalyticAt riemannZeta (−2) — get from the eventuallyEq + RHS analytic:\n```lean\n have hRHS_an : AnalyticAt ℂ (fun s => (s - -2)^1 • (completedRiemannZeta s / Hfun s)) (-2) := by\n fun_prop? — ((analyticAt_id.sub analyticAt_const).pow 1).smul hG_an — smul of ℂ-valued: smul = mul: AnalyticAt.smul? for ℂ·ℂ: AnalyticAt.mul after converting smul to mul... simpler write RHS as (s - -2) * G s and note pow_one/smul_eq_mul make them match.\n have hzeta_an : AnalyticAt ℂ riemannZeta (-2) := hRHS_an.congr hEv\n have horder : analyticOrderAt riemannZeta (-2) = 1 :=\n (hzeta_an.analyticOrderAt_eq_natCast).mpr ⟨_, hG_an, hG_ne, hEv⟩\n -- zeroMult = (analyticOrderAt ...).toNat\n rw [zeroMult, horder] -- ((1 : ℕ∞)).toNat = 1\n rfl / simp\n```\nzeroMult ρ := (analyticOrderAt riemannZeta ρ).toNat — with horder : analyticOrderAt riemannZeta (−2) = ↑1: rw gives (↑(1:ℕ)).toNat — for ℕ∞ = WithTop ℕ: `WithTop.toNat`? hmm — in current Mathlib, ℕ∞ is `WithTop ℕ`? and `.toNat` — there's `ENat.toNat`? The def in Zeta23: `(analyticOrderAt riemannZeta ρ).toNat` — whatever toNat instance it uses. simp [zeroMult, horder] should evaluate: WithTop.toNat 1 = 1? There might be a simp lemma `ENat.toNat_one`/`WithTop.toNat_coe`. Try `simp [zeroMult, horder]`; fallback `rw [zeroMult, horder]; rfl`? (↑1 : ℕ∞).toNat — if toNat is defined via WithTop.untop... rfl should work.\n\nAlso horder's target form: analyticOrderAt riemannZeta (-2) = 1 — the RHS 1 : ℕ∞ ✓.\n\n(j) hΛ_ne : completedRiemannZeta (−2) ≠ 0:\n```lean\n have hΛ3 : completedRiemannZeta 3 = Complex.Gammaℝ 3 * riemannZeta 3 :=\n completedRiemannZeta_eq_Gammaℝ_mul (by norm_num) hΓR3\n where hΓR3 : Gammaℝ 3 ≠ 0 := by\n rw [Complex.Gammaℝ_eq_zero_iff] -- hmm is it Complex.Gammaℝ_eq_zero_iff? Deligne namespace Complex\n push Not\n rintro ⟨m, hm⟩ -- (3:ℂ) = −(2m)\n have := congrArg Complex.re hm\n simp at this -- 3 = −2m real: −2m ≤ 0\n have : (0:ℝ) ≤ (m : ℝ) := by positivity\n nlinarith [this]\n have hζ3 : riemannZeta 3 ≠ 0 := riemannZeta_ne_zero_of_one_lt_re (by simp) -- (3:ℂ).re = 3 > 1\n have hΛ3_ne : completedRiemannZeta 3 ≠ 0 := by rw [hΛ3]; exact mul_ne_zero hΓR3 hζ3\n have hΛ_ne : completedRiemannZeta (-2) ≠ 0 := by\n have hfe := completedRiemannZeta_one_sub (-2) -- Λ(1−(−2)) = Λ(−2)\n norm_num at hfe -- 1−(−2) = 3: hfe : Λ 3 = Λ (−2)\n rw [← hfe] -- hmm direction: goal Λ(−2) ≠ 0: rw ← hfe rewrites Λ(−2)?? hfe : Λ(1−−2) = Λ(−2)... \n```\nCareful: completedRiemannZeta_one_sub (s) : Λ(1−s) = Λ(s). At s = −2: Λ(1−(−2)) = Λ(−2) i.e. Λ(3) = Λ(−2). I want to rewrite goal Λ(−2) ≠ 0 into Λ(3) ≠ 0: `rw [← completedRiemannZeta_one_sub (-2)]`? ← direction rewrites Λ(−2) → Λ(1−(−2)): then 1−(−2) needs norm_num to 3: `rw [← completedRiemannZeta_one_sub (-2)]; norm_num`? The goal becomes completedRiemannZeta (1−−2) ≠ 0 — `show completedRiemannZeta 3 ≠ 0` (1−−2 = 3: norm_num1?) then exact hΛ3_ne. Use: \n```lean\n rw [← completedRiemannZeta_one_sub (-2 : ℂ)]\n norm_num1 -- 1 - -2 = 3 — does norm_num1 rewrite in goal? goal is ≠ (Prop): norm_num1 might not simplify inside... use show:\n -- alternatively:\n have hfe : completedRiemannZeta (-2) = completedRiemannZeta 3 := by\n have h := completedRiemannZeta_one_sub (-2 : ℂ)\n norm_num at h -- h : Λ 3 = Λ (−2)?? norm_num simplifies 1 − −2 to 3 ✓\n exact h.symm\n rw [hfe]; exact hΛ3_ne\n```\nnorm_num at h: h : completedRiemannZeta (1 − −2) = completedRiemannZeta (−2) — norm_num reduces 1−−2 → 3? It should (numeral arithmetic inside function arg — norm_num simplifies ✓).\n\nriemannZeta_ne_zero_of_one_lt_re {s : ℂ} (hs : 1 < s.re) : riemannZeta s ≠ 0 — at 3: (3:ℂ).re = 3: `by simp` or `by norm_num`: 1 < (3:ℂ).re: simp [Complex.ofReal_re]? (3:ℂ) is OfNat — Complex.re of numeral: `by norm_num` ✓ (1 < 3 re).\n\nhΓR3: congrArg Complex.re hm : ((3:ℂ)).re = (−(2*↑m)).re: simp [Complex.neg_re, Complex.mul_re...] — (−(2·↑m)).re = −(2·↑m.re)?? simp should reduce to 3 = −2·↑m: simp [Complex.neg_re, Complex.mul_re, Complex.ofReal_re...]. Hmm — −(2 * (m:ℂ)): re = −(2·m).re = −(2·m·...): (2·↑m).re = 2·↑m: via Complex.mul_re: (2*↑m).re = 2.re·↑m.re − 2.im·↑m.im = 2·↑m − 0 = 2↑m ✓ simp [Complex.mul_re, Complex.ofReal_re, Complex.neg_re]. Then linarith with 0 ≤ (m:ℝ).\n\n(k) DifferentiableOn → AnalyticOnNhd name — let me grep Mathlib for \"analyticOnNhd\" from DifferentiableOn.\n\nAlso completedRiemannZeta analyticity at −2 — hmm, maybe simpler via differentiableAt_completedZeta → AnalyticAt: is there `DifferentiableAt.analyticAt` for ℂ?? I don't think so. The DifferentiableOn-ball route needs the converter name. Grep:","signature":""},{"type":"text","text":"Two more API names to pin down: DifferentiableOn→AnalyticOnNhd converter and cpow analyticity."},{"type":"tool_use","id":"Bash_105","name":"Bash","input":{"command":"cd D:/Python/Quantum/zeta-23-lean/.lake/packages/mathlib && grep -rn \"DifferentiableOn.analyticOnNhd\\|analyticOnNhd_of_differentiableOn\\|differentiableOn.*analyticOnNhd\" Mathlib/Analysis/Complex/ -r --include=*.lean | grep -i \"theorem\\|lemma\" | head -4; grep -rn \"theorem analyticAt_exp\\|lemma analyticAt_exp\\|analyticAt_cpow\" Mathlib/Analysis/SpecialFunctions/ -r --include=*.lean | head -6; grep -rn \"theorem analyticAt_id\\b\\|lemma analyticAt_id\\b\\|theorem analyticAt_const\" Mathlib/Analysis/Analytic/ -r --include=*.lean | head -4","description":"Find differentiability-to-analyticity and cpow/exp analytic lemmas"},"extra_content":null}]