← Session 32 — ii′-3b start: capstone axiom audit + moments
thinking (44089 chars)
The skeleton is clear. For summable_mult_div_norm_sq I need the comparison: mult/‖ρ‖² ≤ (9/4)·mult/(1+‖γ‖²) for ‖ρ‖ ≥ 2 — that's normSq_gammaOf_le_mul_norm_sq inverted: 1+‖γ‖² ≤ (9/4)‖ρ‖² ⟹ 1/‖ρ‖² ≤ (9/4)/(1+‖γ‖²) ⟹ mult/‖ρ‖² ≤ (9/4)mult/(1+‖γ‖²). From LiSwaps:205-208: the exact algebra heq: mult/‖ρ‖²·((9/4)‖ρ‖²) = (9/4)mult. The comparison: hbound : mult/‖ρ‖² ≤ ... — let me write directly:
```lean
lemma summable_mult_div_norm_sq :
Summable (fun ρ : {ρ : ℂ // IsNontrivialZero ρ} => (zeroMult ρ : ℝ) / ‖(ρ : ℂ)‖ ^ 2) := by
have hbase : Summable (fun ρ : {ρ : ℂ // IsNontrivialZero ρ} =>
(9 / 4) * ((zeroMult ρ : ℝ) / (1 + Complex.normSq (gammaOf ρ)))) :=
(WeilEF.zero_sum_inv_sq zetaSeam).mul_left (9 / 4)
set D : {ρ : ℂ // IsNontrivialZero ρ} → ℝ := fun ρ =>
if (2 : ℝ) ≤ ‖(ρ : ℂ)‖ then
(9 / 4) * (zeroMult ρ : ℝ) / (1 + Complex.normSq (gammaOf ρ))
else (zeroMult ρ : ℝ) / ‖(ρ : ℂ)‖ ^ 2 with hDdef
... (same finite/E/hD assembly)
refine Summable.of_norm_bounded hD (fun ρ => ?_)
by_cases hρ : (2 : ℝ) ≤ ‖(ρ : ℂ)‖
· simp only [D, if_pos hρ]
-- ‖mult/‖ρ‖²‖ ≤ (9/4)mult/(1+‖γ‖²): from normSq_gammaOf_le_mul_norm_sq
...
· simp only [D, if_neg hρ]
-- ‖mult/‖ρ‖²‖ = mult/‖ρ‖² (nonneg): le_refl after Real.norm_of_nonneg
```
The comparison per-term: for ‖ρ‖ ≥ 2: normSq_gammaOf_le_mul_norm_sq (n := 1) le_rfl (re nonneg) (re ≤ 1) hρ2 — signature check from LiSwaps:134: `normSq_gammaOf_le_mul_norm_sq (n := 1) le_rfl hre0 hre1 (by simpa using hρ)` — args: (n)(h : 1 ≤ n)(hre0 : 0 ≤ re)(hre1 : re ≤ 1)(hρ : n ≤ ‖ρ‖)?? with n := 1, the last is 1 ≤ ‖ρ‖ (by simpa using hρ : 2 ≤ ‖ρ‖). Result: 1 + normSq γ ≤ (9/4)·‖ρ‖²... wait with n := 1: the statement at ii′-1a: (9/4)‖ρ‖² comparison — from LiSwaps:134: `hcomp : 1 + Complex.normSq (gammaOf ρ) ≤ 9 / 4 * ‖(ρ : ℂ)‖ ^ 2`. ✓
Then: mult/‖ρ‖² ≤ (9/4)·mult/(1+‖γ‖²):
```lean
have hz := ρ.2
have hρpos : (0 : ℝ) < ‖(ρ : ℂ)‖ := lt_of_lt_of_le (by norm_num) hρ
have hgpos : (0 : ℝ) < 1 + Complex.normSq (gammaOf (ρ : ℂ)) := by
have := Complex.normSq_nonneg (gammaOf (ρ : ℂ)); linarith
-- mult/‖ρ‖² ≤ (9/4)mult/(1+‖γ‖²) ⟺ mult·(1+‖γ‖²) ≤ (9/4)mult·‖ρ‖²
rw [div_le_div_iff_of_pos_right?? hmm
```
Use: div_le_div (h : a ≤ b)? — div_le_div_of_nonneg? The clean way:
```lean
have key : (zeroMult ρ : ℝ) / ‖(ρ : ℂ)‖ ^ 2 ≤
(9 / 4) * (zeroMult ρ : ℝ) / (1 + Complex.normSq (gammaOf ρ)) := by
rw [div_le_div_iff₀ (pow_pos hρpos 2) hgpos]
-- goal: mult·(1+‖γ‖²) ≤ ((9/4)·mult)·‖ρ‖²
have hcomp : 1 + Complex.normSq (gammaOf (ρ : ℂ)) ≤ 9 / 4 * ‖(ρ : ℂ)‖ ^ 2 :=
normSq_gammaOf_le_mul_norm_sq (n := 1) le_rfl hz.2.1.le hz.2.2.le (by simpa using hρ)
calc (zeroMult ρ : ℝ) * (1 + Complex.normSq (gammaOf ρ))
≤ (zeroMult ρ : ℝ) * (9 / 4 * ‖(ρ : ℂ)‖ ^ 2) :=
mul_le_mul_of_nonneg_left hcomp (Nat.cast_nonneg _)
_ = (9 / 4 * (zeroMult ρ : ℝ)) * ‖(ρ : ℂ)‖ ^ 2 := by ring
rw [Real.norm_of_nonneg (by positivity)] -- ‖mult/‖ρ‖²‖ = itself
exact key
```
Wait — div_le_div_iff₀ signature: `div_le_div_iff₀ (hb : 0 < b) (hd : 0 < d) : a / b ≤ c / d ↔ a * d ≤ c * b`. In this Mathlib version, from session-033 banked: "div_lt_iff₀ is a/c<b here (lt_div_iff₀ for a<b/c)" — so div_le_div_iff₀ (hb : 0 < b) (hd : 0 < d) : a/b ≤ c/d ↔ a*d ≤ c*b ✓ plausibly. My goal: mult/‖ρ‖² ≤ (9/4·mult)/(1+‖γ‖²) — a = mult, b = ‖ρ‖², c = 9/4·mult, d = 1+‖γ‖²: ↔ mult·(1+‖γ‖²) ≤ (9/4·mult)·‖ρ‖² ✓ my calc matches.
norm target: ‖(mult:ℝ)/‖ρ‖²‖ — Real.norm_of_nonneg (div_nonneg (Nat.cast_nonneg _) (pow_nonneg (norm_nonneg _) _)) — positivity should handle: `by positivity`.
For the if_neg branch: D ρ = mult/‖ρ‖²: goal ‖mult/‖ρ‖²‖ ≤ D ρ = mult/‖ρ‖²: rw [Real.norm_of_nonneg (by positivity)] → le_refl ✓.
Now — since this is ℝ-valued, note the summability conclusion is for the ℝ family ✓ (used as dominator).
Next:
```lean
lemma summable_mult_inv_pow {k : ℕ} (hk : 2 ≤ k) :
Summable (fun ρ : {ρ : ℂ // IsNontrivialZero ρ} => (zeroMult ρ : ℂ) * (1 / (ρ : ℂ)) ^ k) := by
obtain ⟨m, rfl⟩ := Nat.exists_eq_add_of_le hk -- k = 2 + m
obtain ⟨δ, hδ, hball⟩ := exists_ball_avoid_nontrivialZeros 0 not_isNontrivialZero_zero
have hδle : ∀ ρ : {ρ : ℂ // IsNontrivialZero ρ}, δ ≤ ‖(ρ : ℂ)‖ := by
intro ρ
by_contra h
exact hball ρ (by rw [Metric.mem_ball, dist_zero_right]; exact lt_of_not_ge h)
apply Summable.of_norm_bounded (summable_mult_div_norm_sq.mul_left ((1 / δ) ^ m))
intro ρ
have hρpos : (0 : ℝ) < ‖(ρ : ℂ)‖ := lt_of_lt_of_le hδ (hδle ρ)
have hle : ‖(zeroMult ρ : ℂ) * (1 / (ρ : ℂ)) ^ (2 + m)‖ ≤
(1 / δ) ^ m * ((zeroMult ρ : ℝ) / ‖(ρ : ℂ)‖ ^ 2) := by
rw [norm_mul, norm_pow, norm_div, norm_one, RCLike.norm_natCast]
-- mult·(1/‖ρ‖)^{2+m} ≤ (1/δ)^m·mult/‖ρ‖²
rw [div_pow, one_pow]
-- = mult·(1/‖ρ‖^{2+m}) = mult·(1/(‖ρ‖²·‖ρ‖^m)) ≤ mult·((1/δ^m)/‖ρ‖²)
have hpow : (1 : ℝ) / ‖(ρ : ℂ)‖ ^ (2 + m) ≤ (1 / δ ^ m) / ‖(ρ : ℂ)‖ ^ 2 := by
rw [pow_add]
rw [one_div_mul_eq... ] hmm
```
algebra: 1/‖ρ‖^{2+m} = 1/(‖ρ‖²·‖ρ‖^m) = (1/‖ρ‖²)·(1/‖ρ‖^m) ≤ (1/‖ρ‖²)·(1/δ^m) since 1/‖ρ‖^m ≤ 1/δ^m (pow_le_pow_left₀ δ≤‖ρ‖ then one_div_le_one_div_of_le (pow_pos hδ m) that). Then mult·(...) ≤ mult·(...) (mult nonneg) and (1/δ)^m = 1/δ^m ✓ (div_pow, one_pow). Assemble:
```lean
rw [pow_add, one_div (‖ρ‖² * ‖ρ‖^m)?...]
```
Let me structure: goal after rw [div_pow, one_pow]: (zeroMult ρ:ℝ)·(1/‖ρ‖^{2+m}) ≤ (1/δ)^m·(mult/‖ρ‖²). Write:
```lean
calc (zeroMult ρ : ℝ) * (1 / ‖(ρ : ℂ)‖ ^ (2 + m))
= (zeroMult ρ : ℝ) * ((1 / ‖(ρ : ℂ)‖ ^ 2) * (1 / ‖(ρ : ℂ)‖ ^ m)) := by
rw [pow_add]
rw [one_div_mul_one_div??]...
```
one_div_mul: `one_div_mul_one_div (a b) : (1/a)*(1/b) = 1/(a*b)`? — `one_div_mul_one_div : 1 / a * (1 / b) = 1 / (a * b)` ✓ exists (symm direction). So:
```lean
= (zeroMult ρ : ℝ) * ((1 / ‖(ρ : ℂ)‖ ^ 2) * (1 / ‖(ρ : ℂ)‖ ^ m)) := by
rw [pow_add, ← one_div_mul_one_div]
_ ≤ (zeroMult ρ : ℝ) * ((1 / ‖(ρ : ℂ)‖ ^ 2) * (1 / δ ^ m)) := by
apply mul_le_mul_of_nonneg_left _ (Nat.cast_nonneg _)
apply mul_le_mul_of_nonneg_left _ (by positivity : (0:ℝ) ≤ 1/‖(ρ:ℂ)‖^2)
exact one_div_le_one_div_of_le (pow_pos hδ m) (pow_le_pow_left₀ hδ.le (hδle ρ) m)
_ = (1 / δ) ^ m * ((zeroMult ρ : ℝ) / ‖(ρ : ℂ)‖ ^ 2) := by
rw [div_pow, one_pow]
ring
```
pow_le_pow_left₀ (ha : 0 ≤ a) (hab : a ≤ b) (n) : a^n ≤ b^n ✓ (signature from LiDigamma:746: pow_le_pow_left₀ (by positivity) hnormS (k+1) ✓). one_div_le_one_div_of_le (ha : 0 < a) (hab : a ≤ b) : 1/b ≤ 1/a ✓ (session-033 banked: "one_div_le_one_div_of_le takes the small side's positivity first" ✓ matches (pow_pos hδ m) then (pow_le...)).
Then 1/δ > 0: hδ : 0 < δ ✓ from exists_ball_avoid. pow_pos hδ m ✓.
Hmm wait — Nat.exists_eq_add_of_le : a ≤ b → ∃ c, b = a + c — with hk : 2 ≤ k: ∃ m, k = 2 + m ✓ obtain ⟨m, rfl⟩.
Dominant form note: the of_norm_bounded dominator family: ((1/δ)^m)·(mult/‖ρ‖²) — summable_mult_div_norm_sq.mul_left ((1/δ)^m) : Summable (fun ρ => (1/δ)^m * (mult/‖ρ‖²)) ✓ matches my calc final form ✓.
Next: sigmaP_eq_unpaired (k ≥ 2):
```lean
lemma sigmaP_eq_unpaired {k : ℕ} (hk : 2 ≤ k) :
sigmaP k = ∑' ρ : {ρ : ℂ // IsNontrivialZero ρ}, (zeroMult ρ : ℂ) * (1 / (ρ : ℂ)) ^ k := by
have hs1 := summable_mult_inv_pow hk
have hs2 : Summable (fun ρ : {ρ : ℂ // IsNontrivialZero ρ} =>
(zeroMult ρ : ℂ) * (1 / ((starRingEnd ℂ) (ρ : ℂ))) ^ k) := by
-- transfer via conjZeroEquiv
have e : (fun ρ : {ρ : ℂ // IsNontrivialZero ρ} =>
(zeroMult ρ : ℂ) * (1 / ((starRingEnd ℂ) (ρ : ℂ))) ^ k) =
(fun σ : {ρ : ℂ // IsNontrivialZero ρ} => (zeroMult σ : ℂ) * (1 / (σ : ℂ)) ^ k) ∘
conjZeroEquiv := by
funext ρ
simp only [Function.comp_apply, conjZeroEquiv]
rw [zeroMult_conj ρ.2]
rw [e]
exact hs1.comp_injective?? no — Summable of f ∘ e for equiv e: `Equiv.summable_iff e : Summable (f ∘ e) ↔ Summable f` — use (conjZeroEquiv.summable_iff).mpr hs1
-- main:
have hre : ∑' ρ, (zeroMult ρ : ℂ) * (1 / ((starRingEnd ℂ) (ρ : ℂ))) ^ k =
∑' ρ, (zeroMult ρ : ℂ) * (1 / (ρ : ℂ)) ^ k := by
have h := Equiv.tsum_eq conjZeroEquiv (fun σ => (zeroMult σ : ℂ) * (1 / (σ : ℂ)) ^ k)
-- h : ∑' a, f (conjZeroEquiv a) = ∑' b, f b
rw [← h]
apply tsum_congr
intro ρ
simp only [conjZeroEquiv, Function.comp?? ] -- f (conjZeroEquiv ρ) = mult(conjρ)(1/conjρ)^k → mult(ρ)(1/conjρ)^k via zeroMult_conj
...
-- sigmaP k = (1/2)(S + S)
rw [sigmaP]
-- sigmaSlice k ρ = (mult/2)(A + B); split the tsum
have hsplit : ∑' ρ, sigmaSlice k ρ =
(1 / 2 : ℂ) * (∑' ρ, (zeroMult ρ : ℂ) * (1 / (ρ:ℂ)) ^ k +
∑' ρ, (zeroMult ρ : ℂ) * (1 / ((starRingEnd ℂ) (ρ:ℂ))) ^ k) := by
rw [← tsum_add hs1 hs2, ← tsum_mul_left] -- forms
apply tsum_congr
intro ρ
rw [sigmaSlice]
ring
rw [hsplit, hre]
ring
```
Careful with tsum forms (banked gotcha: "Summable.mul_left/add lambda forms; tsum_add beta-rfl bridges"). `tsum_add hs1 hs2 : ∑' (f + g)?? ` — tsum_add : ∑' i, (f i + g i) = ∑' f + ∑' g with Summable hyps? Signature: `tsum_add (hf : Summable f) (hg : Summable g) : ∑' i, (f i + g i) = ∑' i, f i + ∑' i, g i` ✓. And `tsum_mul_left : ∑' i, c * f i = c * ∑' i, f i` (no summability needed? tsum_mul_left works unconditionally? I recall tsum_mul_left : ∑' (c * f) = c * ∑' f — unconditional ✓ (both sides 0 if nonsummable)). The summand in hsplit's goal after ← rw: (1/2)·(mult·A + mult·B) vs (mult/2)(A+B): per-term ring ✓ but the lambda forms must match for rw ← — the ← tsum_add produces ∑' ρ, (f ρ + g ρ) — then ← tsum_mul_left : pattern c * f i... my target summand after apply tsum_congr — hmm order: I want to transform the GOAL ∑' sigmaSlice = (1/2)(S1+S2) into per-term. Direction: conv on RHS? Let me instead:
```lean
have step : ∑' ρ, sigmaSlice k ρ = ∑' ρ, (1/2 : ℂ) *
((zeroMult ρ : ℂ) * (1 / (ρ:ℂ)) ^ k + (zeroMult ρ : ℂ) * (1 / ((starRingEnd ℂ) (ρ:ℂ))) ^ k) := by
apply tsum_congr
intro ρ
rw [sigmaSlice]
ring
rw [step, tsum_mul_left, tsum_add hs1 hs2]
```
✓ cleaner: after rw [step]: goal (1/2)·∑'(...) = ... — rw [tsum_mul_left]: ∑' ((1/2)·g) = (1/2)·∑' g: matches LHS ✓; rw [tsum_add hs1 hs2]: ∑' (fρ + gρ) = S1+S2 — the summand form (mult·A + mult·B) matches f+g lambda ✓. Then hre.
For hre: after rw [← h]?? — h : ∑' a, f(conjZeroEquiv a) = ∑' b, f b. Goal: ∑' ρ, mult·(1/conjρ)^k = ∑' ρ, mult·(1/ρ)^k. Rewrite goal LHS to ∑' ρ, f(conjZeroEquiv ρ): tsum_congr: per-term: f(conjZeroEquiv ρ) = mult(conj ρ)·(1/conj ρ)^k: need = mult(ρ)·(1/conjρ)^k: zeroMult_conj ρ.2 : zeroMult (conj ρ) = zeroMult ρ — cast. So:
```lean
have hre : ... := by
have h := Equiv.tsum_eq conjZeroEquiv
(fun σ : {ρ : ℂ // IsNontrivialZero ρ} => (zeroMult σ : ℂ) * (1 / (σ : ℂ)) ^ k)
rw [← h]
apply tsum_congr
intro ρ
simp only [conjZeroEquiv, Equiv.coe_fn_mk]
rw [zeroMult_conj ρ.2]
```
Equiv.tsum_eq signature check: `Equiv.tsum_eq (e : α ≃ β) (f : β → M) : ∑' a, f (e a) = ∑' b, f b` ✓ I'm fairly confident. simp [conjZeroEquiv] to expose the application: conjZeroEquiv ρ = ⟨conj ρ, _⟩: its coercion to ℂ: ((conjZeroEquiv ρ : {ρ // IsNontrivialZero ρ}) : ℂ) = conj ρ — via Equiv.coe_fn_mk + Subtype coe simp. `simp only [conjZeroEquiv, Equiv.coe_fn_mk, Coe.coe]`? Fragile — alternative: show the equality of the CASTS first:
```lean
intro ρ
have e1 : ((conjZeroEquiv ρ : {ρ : ℂ // IsNontrivialZero ρ}) : ℂ) = (starRingEnd ℂ) (ρ : ℂ) := rfl
rw [e1, zeroMult_conj ρ.2]
```
e1 by rfl: conjZeroEquiv ρ = ⟨conj ρ, _⟩ so its .1 = conj ρ ✓ rfl should hold (defeq through the structure). zeroMult_conj ρ.2 : zeroMult (conj ρ) = zeroMult ρ — the LHS term is zeroMult ((conjZeroEquiv ρ : subtype)) — after rw [e1]: zeroMult (conj ρ) — matches ✓. But zeroMult takes ℂ (zeroMult (ρ:ℂ) vs zeroMult of the subtype — in the summand it's (zeroMult ρ : ℂ) with ρ the SUBTYPE — zeroMult applied to the subtype's coerced value: zeroMult (ρ:ℂ)? In sigmaSlice def: (zeroMult ρ : ℂ) — ρ : subtype, zeroMult ρ means zeroMult (ρ:ℂ) via coe ✓. So rw [e1] changes the argument ✓.
Then hs2's e : function equality: funext ρ: goal mult·(1/conjρ)^k = (f ∘ conjZeroEquiv) ρ = f(conjZeroEquiv ρ): same e1 rewrite:
```lean
funext ρ
show (zeroMult ρ : ℂ) * (1 / ((starRingEnd ℂ) (ρ:ℂ))) ^ k =
(zeroMult (conjZeroEquiv ρ) : ℂ) * (1 / ((conjZeroEquiv ρ : {ρ // _}) : ℂ)) ^ k
rw [e1??, zeroMult_conj ρ.2]
```
Hmm the RHS after Function.comp_apply simp. Let me write hs2 via:
```lean
rw [← conjZeroEquiv.summable_iff] at hs1 ⊢??
```
Cleaner: `Equiv.summable_iff (e) : Summable (fun a => f (e a)) ↔ Summable f`?? or (f ∘ e)? Signature: `Equiv.summable_iff (e : α ≃ β) : Summable (f ∘ e) ↔ Summable f`?? Hmm — there's `Equiv.summable_iff (e : α ≃ β) (f : β → M) : (Summable fun a => f (e a)) ↔ Summable f` I think. So:
```lean
have hs2 : Summable (fun ρ : {ρ : ℂ // IsNontrivialZero ρ} =>
(zeroMult ρ : ℂ) * (1 / ((starRingEnd ℂ) (ρ : ℂ))) ^ k) := by
rw [show (fun ρ : {ρ : ℂ // IsNontrivialZero ρ} =>
(zeroMult ρ : ℂ) * (1 / ((starRingEnd ℂ) (ρ : ℂ))) ^ k) =
fun ρ => (fun σ : {ρ : ℂ // IsNontrivialZero ρ} => (zeroMult σ : ℂ) * (1 / (σ : ℂ)) ^ k)
(conjZeroEquiv ρ) from ?_]
· exact (Equiv.summable_iff conjZeroEquiv _).mpr hs1 -- hmm direction
· funext ρ
...per-term...
```
Direction: Equiv.summable_iff e f : Summable (fun a => f (e a)) ↔ Summable f — .mpr takes Summable f → Summable (f∘e) ✓.
Per-term for the show: goal fun-family equality — funext ρ: mult(ρ)·(1/conjρ)^k = mult(conjZeroEquiv ρ)·(1/(conjZeroEquiv ρ:ℂ))^k: rw [e1, zeroMult_conj] as before ✓.
Next k=1 pieces:
```lean
/-- The reflected master summability: Σ mult/‖1−ρ‖². -/
lemma summable_mult_div_norm_sq_one_sub :
Summable (fun ρ : {ρ : ℂ // IsNontrivialZero ρ} => (zeroMult ρ : ℝ) / ‖(1 : ℂ) - (ρ : ℂ)‖ ^ 2) := by
have e : (fun ρ : {ρ : ℂ // IsNontrivialZero ρ} => (zeroMult ρ : ℝ) / ‖(1 : ℂ) - (ρ : ℂ)‖ ^ 2) =
fun ρ => (fun σ : {ρ : ℂ // IsNontrivialZero ρ} => (zeroMult σ : ℝ) / ‖(σ : ℂ)‖ ^ 2)
(oneSubZeroEquiv ρ) := by
funext ρ
have e1 : ((oneSubZeroEquiv ρ : {ρ : ℂ // IsNontrivialZero ρ}) : ℂ) = 1 - (ρ : ℂ) := rfl
rw [e1, zeroMult_one_sub ρ.2.2.1 ρ.2.2.2]
rw [e]
exact (Equiv.summable_iff oneSubZeroEquiv _).mpr summable_mult_div_norm_sq
```
zeroMult_one_sub {ρ} (h0 : 0 < ρ.re) (h1 : ρ.re < 1) : zeroMult (1−ρ) = zeroMult ρ ✓ (LiReflect:388) — with ρ.2.2.1/ρ.2.2.2 (subtype access) ✓.
```lean
/-- The mixed term family Σ mult/(ρ(1−ρ)) is absolutely summable (AM-GM). -/
lemma summable_mult_one_div_mul_one_sub :
Summable (fun ρ : {ρ : ℂ // IsNontrivialZero ρ} =>
(zeroMult ρ : ℂ) * (1 / ((ρ : ℂ) * (1 - (ρ : ℂ))))) := by
have hsum := summable_mult_div_norm_sq.add summable_mult_div_norm_sq_one_sub
apply Summable.of_norm_bounded (hsum.mul_left (1 / 2))
intro ρ
have hρ0 : (0 : ℝ) < ‖(ρ : ℂ)‖ := by
have h2 := ρ.2.2.1
-- 0 < re ≤ ‖ρ‖
have hre : (ρ:ℂ).re ≤ ‖(ρ:ℂ)‖ := Complex.re_le_norm _
linarith
have h1ρ0 : (0 : ℝ) < ‖(1 : ℂ) - (ρ : ℂ)‖ := by
have h2 := ρ.2.2.2
have hre : (1 - (ρ:ℂ)).re ≤ ‖1 - (ρ:ℂ)‖ := Complex.re_le_norm _
have : (1 - (ρ:ℂ)).re = 1 - (ρ:ℂ).re := by simp [Complex.sub_re, Complex.one_re]
linarith
rw [norm_mul, norm_div, norm_one, RCLike.norm_natCast, norm_mul]
-- mult/(‖ρ‖‖1−ρ‖) ≤ (1/2)(mult/‖ρ‖² + mult/‖1−ρ‖²)
have hbound : (zeroMult ρ : ℝ) / (‖(ρ : ℂ)‖ * ‖(1 : ℂ) - (ρ : ℂ)‖) ≤
(1 / 2) * ((zeroMult ρ : ℝ) / ‖(ρ : ℂ)‖ ^ 2 + (zeroMult ρ : ℝ) / ‖(1 : ℂ) - (ρ : ℂ)‖ ^ 2) := by
-- AM-GM: 1/(ab) ≤ (1/2)(1/a² + 1/b²)
have hmul : (0 : ℝ) ≤ (zeroMult ρ : ℝ) := Nat.cast_nonneg _
rw [div_le_iff₀ (mul_pos hρ0 h1ρ0)]
-- mult ≤ (1/2)(mult/‖ρ‖² + mult/‖1−ρ‖²)·(‖ρ‖‖1−ρ‖)
rw [mul_assoc]
-- expand RHS: (1/2)·mult·(‖1−ρ‖/‖ρ‖ + ‖ρ‖/‖1−ρ‖) — messy; alternative: use two_mul_div_add...
...
```
AM-GM form: for a,b > 0: 1/(ab) ≤ (a⁻² + b⁻²)/2 ⟺ 2ab ≤ ... multiply both sides by 2·a²b²·... Let me use the standard inequality: (1/a)² + (1/b)² ≥ 2/(ab) — from (1/a − 1/b)² ≥ 0: 1/a² + 1/b² ≥ 2/(ab) ✓. In Lean:
```lean
have key : 2 / (‖(ρ : ℂ)‖ * ‖(1 : ℂ) - (ρ : ℂ)‖) ≤
1 / ‖(ρ : ℂ)‖ ^ 2 + 1 / ‖(1 : ℂ) - (ρ : ℂ)‖ ^ 2 := by
have h1 : (0 : ℝ) ≤ (1 / ‖(ρ : ℂ)‖ - 1 / ‖(1 : ℂ) - (ρ : ℂ)‖) ^ 2 := sq_nonneg _
-- expand: 1/‖ρ‖² − 2/(‖ρ‖‖1−ρ‖) + 1/‖1−ρ‖² ≥ 0
have hexp : (1 / ‖(ρ : ℂ)‖ - 1 / ‖(1 : ℂ) - (ρ : ℂ)‖) ^ 2 =
1 / ‖(ρ : ℂ)‖ ^ 2 - 2 / (‖(ρ : ℂ)‖ * ‖(1 : ℂ) - (ρ : ℂ)‖) + 1 / ‖(1 : ℂ) - (ρ : ℂ)‖ ^ 2 := by
field_simp [ne_of_gt hρ0, ne_of_gt h1ρ0]
ring
rw [hexp] at h1
linarith
calc (zeroMult ρ : ℝ) / (‖(ρ : ℂ)‖ * ‖(1 : ℂ) - (ρ : ℂ)‖)
= (zeroMult ρ : ℝ) / 2 * (2 / (‖(ρ : ℂ)‖ * ‖(1 : ℂ) - (ρ : ℂ)‖)) := by ring
_ ≤ (zeroMult ρ : ℝ) / 2 * (1 / ‖(ρ : ℂ)‖ ^ 2 + 1 / ‖(1 : ℂ) - (ρ : ℂ)‖ ^ 2) :=
mul_le_mul_of_nonneg_left key (div_nonneg (Nat.cast_nonneg _) (by norm_num))
_ = (1 / 2) * ((zeroMult ρ : ℝ) / ‖(ρ : ℂ)‖ ^ 2 + (zeroMult ρ : ℝ) / ‖(1 : ℂ) - (ρ : ℂ)‖ ^ 2) := by ring
exact hbound
```
Note: div_le_iff₀ not needed in this version. field_simp with the ne facts then ring for hexp ✓ (or field_simp closes; add ring guarded — if field_simp closes, ring errors... risk. Write hexp differently: rw [sub_sq, ...]: (a−b)² = a² − 2ab + b²: a = 1/‖ρ‖: a² = 1/‖ρ‖² (div_pow, one_pow); 2ab = 2·(1/‖ρ‖)·(1/‖1−ρ‖) = 2/(‖ρ‖‖1−ρ‖) (one_div_mul_one_div): pure rw chain:
```lean
have hexp : (1 / ‖(ρ : ℂ)‖ - 1 / ‖(1 : ℂ) - (ρ : ℂ)‖) ^ 2 =
1 / ‖(ρ : ℂ)‖ ^ 2 - 2 / (‖(ρ : ℂ)‖ * ‖(1 : ℂ) - (ρ : ℂ)‖) + 1 / ‖(1 : ℂ) - (ρ : ℂ)‖ ^ 2 := by
rw [sub_sq, div_pow, div_pow, one_pow, one_pow]
rw [mul_sub, mul_comm (2:ℝ)...] hmm
```
sub_sq : (a−b)² = a² − 2ab + b² ✓. Then 2·(1/‖ρ‖)·(1/‖1−ρ‖): show = 2/(‖ρ‖·‖1−ρ‖): rw [one_div_mul_one_div]?? one_div_mul_one_div : (1/a)·(1/b) = 1/(a·b): then 2·(1/(‖ρ‖‖1−ρ‖)) = 2/(‖ρ‖‖1−ρ‖): mul_one_div: 2·(1/x) = 2/x ✓ `mul_one_div`. So:
```lean
rw [sub_sq, div_pow, div_pow, one_pow, one_pow, one_div_mul_one_div, mul_one_div]
```
Result: 1/‖ρ‖² − 2/(‖ρ‖‖1−ρ‖) + 1/‖1−ρ‖² = RHS ✓ — but wait the goal RHS has 1/‖ρ‖^2 with ^2 — div_pow gives (1/‖ρ‖)² = 1²/‖ρ‖²... after one_pow: 1/‖ρ‖^2 ✓ but the LHS sub_sq's a² is (1/‖ρ‖)^2 — div_pow turns (1/‖ρ‖)^2 into 1^2/‖ρ‖^2 ✓ then one_pow → 1/‖ρ‖^2 ✓ matches. Careful: div_pow : (a/b)^n = a^n/b^n ✓.
Then the vTerm (for V = 0):
```lean
/-- The V-family: mult·(1/ρ̄ − 1/(1−ρ)), absolutely summable (O(‖ρ‖^{-1}‖1−ρ‖^{-1})). -/
lemma summable_mult_vTerm :
Summable (fun ρ : {ρ : ℂ // IsNontrivialZero ρ} =>
(zeroMult ρ : ℂ) * (1 / ((starRingEnd ℂ) (ρ : ℂ)) - 1 / (1 - (ρ : ℂ)))) := by
have hsum := summable_mult_div_norm_sq.add summable_mult_div_norm_sq_one_sub
apply Summable.of_norm_bounded (hsum.mul_left (1 / 2))
intro ρ
-- 1/conjρ − 1/(1−ρ) = (1−ρ−conjρ)/(conjρ(1−ρ)); ‖1−ρ−conjρ‖ = |1−2re| ≤ 1
have hρ0 : (0:ℝ) < ‖(ρ:ℂ)‖ := ... (as above)
have h1ρ0 : (0:ℝ) < ‖(1:ℂ)−(ρ:ℂ)‖ := ...
have hconj0 : (0:ℝ) < ‖((starRingEnd ℂ) (ρ:ℂ))‖ := by rw [starRingEnd_apply, norm_conj?? ...] — ‖conj ρ‖ = ‖ρ‖: `Complex.norm_conj`? hmm: RCLike.norm_conj? `norm_conj : ‖conj z‖ = ‖z‖`? For ℂ: `Complex.abs_conj`? or norm_star: ‖star z‖ = ‖z‖: `norm_star` ✓ (used LiSwaps:174: norm_star ✓). So rw [starRingEnd_apply, norm_star, ...] or norm_conj. Use: have : ‖((starRingEnd ℂ) (ρ:ℂ))‖ = ‖(ρ:ℂ)‖ := by rw [starRingEnd_apply, Complex.norm_conj]?? — starRingEnd_apply : starRingEnd ℂ z = conj z? it's rfl: starRingEnd ℂ z = star z = conj z: `starRingEnd_apply` simp lemma ✓; norm_conj : ‖conj z‖ = ‖z‖ ✓ `Complex.norm_conj`? hmm — safer `norm_star : ‖star z‖ = ‖z‖` ✓ exists. starRingEnd ℂ z = star z definitionally? starRingEnd_apply gives conj — and norm_conj — let me just: simp [starRingEnd_apply, Complex.norm_conj]... I'll use norm_star after starRingEnd_apply... The cleanest: ‖((starRingEnd ℂ) (ρ:ℂ))‖ = ‖(ρ:ℂ)‖ := norm_star _?? — starRingEnd ℂ ρ = star ρ (defeq?): starRingEnd is defined as star for RCLike: (starRingEnd ℂ) z = star z ✓ rfl? I think `starRingEnd_apply : (starRingEnd R) x = star x` is rfl-lemma ✓. So norm_star _ : ‖star ρ‖ = ‖ρ‖ — with the starRingEnd application defeq star — `exact norm_star _` might work by defeq. Fallback simp.
-- the identity:
have hid : 1 / ((starRingEnd ℂ) (ρ:ℂ)) - 1 / (1 - (ρ:ℂ)) =
((1 : ℂ) - (ρ:ℂ) - (starRingEnd ℂ) (ρ:ℂ)) / (((starRingEnd ℂ) (ρ:ℂ)) * (1 - (ρ:ℂ))) := by
field_simp [ne_of_gt hconj0-as-ℂ-ne, ne_of_gt h1ρ0-as-ℂ-ne]
ring
-- ‖num‖ = |1 − 2re| ≤ 1:
have hnum : ‖(1 : ℂ) - (ρ:ℂ) - (starRingEnd ℂ) (ρ:ℂ)‖ ≤ 1 := by
have e : (1 : ℂ) - (ρ:ℂ) - (starRingEnd ℂ) (ρ:ℂ) = ((1 - 2 * (ρ:ℂ).re : ℝ) : ℂ) := by
rw [starRingEnd_apply]
-- 1 − ρ − conj ρ = 1 − (ρ + conjρ) = 1 − 2re
have h := Complex.add_conj (ρ:ℂ) -- ρ + conjρ = 2re
...
push_cast
ring_nf??
rw [e, Complex.norm_real, Real.norm_eq_abs]
have hre0 := ρ.2.2.1; have hre1 := ρ.2.2.2
rw [abs_le]
constructor <;> linarith
rw [hid, norm_div, norm_mul, norm_mul, RCLike.norm_natCast]
-- mult·‖num‖/(‖conjρ‖‖1−ρ‖) ≤ mult·1/(‖ρ‖‖1−ρ‖) ≤ (1/2)(...) via the AM-GM hbound machinery
...
```
Reuse: factor the AM-GM bound as a separate lemma to avoid duplication:
```lean
lemma mult_div_norm_mul_norm_le (ρ : {ρ : ℂ // IsNontrivialZero ρ}) :
(zeroMult ρ : ℝ) / (‖(ρ : ℂ)‖ * ‖(1 : ℂ) - (ρ : ℂ)‖) ≤
(1 / 2) * ((zeroMult ρ : ℝ) / ‖(ρ : ℂ)‖ ^ 2 + (zeroMult ρ : ℝ) / ‖(1 : ℂ) - (ρ : ℂ)‖ ^ 2)
```
(As designed above.) Then:
- summable_mult_one_div_mul_one_sub: term norm = mult/(‖ρ‖‖1−ρ‖) (norm computations) ≤ the AM-GM bound ✓ dominator ((1/2)·sum) summable ✓.
- summable_mult_vTerm: term norm = mult·‖num‖/(‖conjρ‖‖1−ρ‖) ≤ mult·1/(‖ρ‖‖1−ρ‖) ≤ AM-GM bound ✓.
For e : 1 − ρ − conjρ = ((1 − 2re : ℝ):ℂ):
```lean
have e : (1 : ℂ) - (ρ:ℂ) - (starRingEnd ℂ) (ρ:ℂ) = ((1 - 2 * (ρ:ℂ).re : ℝ) : ℂ) := by
have h2 : (starRingEnd ℂ) (ρ:ℂ) = ((2 * (ρ:ℂ).re : ℝ) : ℂ) - (ρ:ℂ) := by
have h := Complex.add_conj (ρ:ℂ) -- ρ + conj ρ = ↑(2·re)
-- conj ρ = 2re − ρ
rw [starRingEnd_apply] -- goal conjρ = 2re − ρ
have h2 : (ρ:ℂ) + (starRingEnd ℂ) (ρ:ℂ) = ((2 * (ρ:ℂ).re : ℝ) : ℂ) := h
-- solve
have h3 := congrArg (fun z => z - (ρ:ℂ)) h2
simp at h3
-- h3 : conjρ = 2re − ρ?? add_sub: ρ + conjρ − ρ = conjρ
convert h3 using 1
ring
rw [h2]
push_cast
ring
```
Complex.add_conj : z + conj z = ↑(2·z.re)? — from LiSwaps:150: `hac : ∀ z : ℂ, z + (starRingEnd ℂ) z = ((2 * z.re : ℝ) : ℂ) := fun z => Complex.add_conj z` ✓ exact form confirmed. Then ρ + conjρ = 2re ⟹ conjρ = 2re − ρ: h3 = congrArg (· − ρ) h2: (ρ + conjρ) − ρ = 2re − ρ: LHS = conjρ (add_sub_cancel?? ρ + conjρ − ρ = conjρ: `add_sub_cancel_left`? ρ + w − ρ = w: `add_sub_cancel_left : a + b − a = b` ✓). simp might do it; or rw [add_sub_cancel_left] at h3. Then 1 − ρ − (2re − ρ) = 1 − 2re: push_cast; ring ✓ (h2 substitution then ring).
Hmm — but actually maybe simpler: directly: 1 − ρ − conjρ = 1 − (ρ + conjρ) = 1 − 2re: rw [← sub_sub, hac...]: 1 − ρ − conjρ = 1 − (ρ + conjρ) via `sub_sub : a − b − c = a − (b + c)` ✓: rw [sub_sub, Complex.add_conj]; push_cast; ring? After sub_sub: 1 − (ρ + conjρ): rw [Complex.add_conj]: 1 − ((2·re:ℝ):ℂ): goal: 1 − ↑(2·re) = ↑(1−2·re): push_cast; ring ✓. Cleaner!
abs_le: |1−2re| ≤ 1 ⟺ −1 ≤ 1−2re ∧ 1−2re ≤ 1: from 0 < re < 1: 1−2re ∈ (−1, 1) ✓ linarith with re0 re1.
Now the V = 0 lemma:
```lean
/-- The V-sum vanishes: the conj and reflect reindexes give V = −V. -/
lemma vTerm_tsum_eq_zero :
∑' ρ : {ρ : ℂ // IsNontrivialZero ρ},
(zeroMult ρ : ℂ) * (1 / ((starRingEnd ℂ) (ρ : ℂ)) - 1 / (1 - (ρ : ℂ))) = 0 := by
set V := ∑' ρ : {ρ : ℂ // IsNontrivialZero ρ},
(zeroMult ρ : ℂ) * (1 / ((starRingEnd ℂ) (ρ : ℂ)) - 1 / (1 - (ρ : ℂ))) with hV
have h1 : V = ∑' ρ : {ρ : ℂ // IsNontrivialZero ρ},
(zeroMult ρ : ℂ) * (1 / (ρ : ℂ) - 1 / (1 - (starRingEnd ℂ) (ρ : ℂ))) := by
rw [hV]
have h := Equiv.tsum_eq conjZeroEquiv (fun σ : {σ : ℂ // IsNontrivialZero σ} =>
(zeroMult σ : ℂ) * (1 / (σ : ℂ) - 1 / (1 - (starRingEnd ℂ) (σ : ℂ))))
-- h : ∑' a, f (conjZeroEquiv a) = ∑' b, f b
rw [← h]
apply tsum_congr
intro ρ
have e1 : ((conjZeroEquiv ρ : {ρ : ℂ // IsNontrivialZero ρ}) : ℂ) = (starRingEnd ℂ) (ρ : ℂ) := rfl
rw [e1, zeroMult_conj ρ.2]
-- mult·(1/conjρ − 1/(1−conj(conjρ))) = mult·(1/conjρ − 1/(1−ρ))??
```
WAIT — check the algebra direction. h1's RHS family at the conjZeroEquiv image: f(⟨conjρ, _⟩) = mult(conjρ)·(1/conjρ − 1/(1−conj(conjρ))) = mult(ρ)·(1/conjρ − 1/(1−ρ)) (zeroMult_conj; conj(conjρ) = ρ). Hmm — that gives V = ∑' mult·(1/conjρ − 1/(1−ρ)) = V — trivially. WRONG choice of f. Let me redo.
V = ∑' ρ, mult·v(ρ) where v(ρ) = 1/conjρ − 1/(1−ρ).
Reindex by conjEquiv e₁: V = ∑' ρ, mult(e₁ρ)·v'(e₁ρ)... Equiv.tsum_eq e₁ g : ∑' a, g(e₁ a) = ∑' b, g b. To get V on the RHS: choose g = the v-family: g σ = mult(σ)·(1/conjσ − 1/(1−σ)): ∑' ρ, g(e₁ρ) = V. g(e₁ρ) = mult(conjρ)·(1/conj(conjρ) − 1/(1−conjρ)) = mult(ρ)·(1/ρ − 1/(1−conjρ)). So:
W := ∑' ρ, mult·(1/ρ − 1/(1−conjρ)) = V. (I)
Reindex W by oneSubEquiv e₂: W = ∑' ρ, g'(e₂ρ) with g' τ = mult(τ)·(1/τ − 1/(1−conjτ)): g'(e₂ρ) = mult(1−ρ)·(1/(1−ρ) − 1/(1−conj(1−ρ))) = mult(ρ)·(1/(1−ρ) − 1/conjρ) (zeroMult_one_sub; 1−conj(1−ρ) = 1−(1−conjρ) = conjρ). = −mult·v(ρ). So W = ∑' ρ, −mult·v(ρ) = −V (tsum_neg). (II)
From (I),(II): V = −V ⟹ V = 0 ✓.
So h1 : V = W (via conjZeroEquiv with g = v-family) and h2 : W = −V (via oneSubEquiv with g = w-family). Then V = 0.
In Lean:
```lean
have h1 : V = ∑' ρ : {ρ : ℂ // IsNontrivialZero ρ},
(zeroMult ρ : ℂ) * (1 / (ρ : ℂ) - 1 / (1 - (starRingEnd ℂ) (ρ : ℂ))) := by
have h := Equiv.tsum_eq conjZeroEquiv (fun σ : {σ : ℂ // IsNontrivialZero σ} =>
(zeroMult σ : ℂ) * (1 / ((starRingEnd ℂ) (σ : ℂ)) - 1 / (1 - (σ : ℂ))))
-- h : ∑' ρ, vFam(conjZeroEquiv ρ) = V
rw [hV, ← h]
apply tsum_congr
intro ρ
have e1 : ((conjZeroEquiv ρ : {ρ : ℂ // IsNontrivialZero ρ}) : ℂ) = (starRingEnd ℂ) (ρ : ℂ) := rfl
rw [e1, zeroMult_conj ρ.2]
congr 2
-- goal: 1/conjρ − 1/(1−ρ) = 1/conjρ − 1/(1−conj(conjρ)): conj conj
rw [starRingEnd_apply, starRingEnd_apply, Complex.conj_conj]
```
Hmm — the goal after rw [e1, zeroMult_conj]: LHS (V's summand at ρ): mult·(1/conjρ − 1/(1−ρ)); RHS: mult·(1/ρ?? — wait let me redo. h1 claims V = W where W's summand is mult·(1/ρ − 1/(1−conjρ)). The proof: V = ∑' vFam = [Equiv.tsum_eq conjZeroEquiv vFam : ∑' ρ, vFam(conjEquiv ρ) = ∑' vFam] — so ∑' vFam = ∑' ρ, vFam(conjEquiv ρ) (.symm). vFam(conjEquiv ρ) = mult(conjρ)·(1/conj(conjρ) − 1/(1−conjρ)) = mult(ρ)·(1/ρ − 1/(1−conjρ)) = W's summand ✓. So:
```lean
have h1 : V = W := by
have h := Equiv.tsum_eq conjZeroEquiv vFam -- h : ∑' ρ, vFam (conjZeroEquiv ρ) = V
rw [hV, ← h]
apply tsum_congr
intro ρ
-- goal: vFam ρ = vFam (conjZeroEquiv ρ)
rw [e1, zeroMult_conj ρ.2]
-- LHS: mult·(1/conjρ − 1/(1−ρ)); RHS: mult·(1/conj(conjρ) − 1/(1−conjρ))
rw [starRingEnd_apply, Complex.conj_conj]
```
the last rw: conj(conjρ) → ρ: starRingEnd_apply rewrites starRingEnd ℂ z → conj z (if it's the simp form) then Complex.conj_conj : conj (conj z) = z ✓. Might need to target: the RHS has 1/((starRingEnd ℂ) ((starRingEnd ℂ) ρ)) — rw [starRingEnd_apply] turns into 1/(conj (conj ρ))... starRingEnd_apply : starRingEnd R x = star x?? and conj = star for ℂ — the outer form: after e1, the term is 1 / ((starRingEnd ℂ) ((starRingEnd ℂ) (ρ:ℂ))). simp [starRingEnd_apply]: starRingEnd ℂ z = conj z? Hmm — actually starRingEnd_apply is `starRingEnd_apply : starRingEnd R x = star x`?? or is it an rfl-lemma about application? In Mathlib: `starRingEnd_apply : (starRingEnd R) x = star x` — rfl. And for ℂ: star x = conj x: `RCLike.star_def`? or Complex.star_def : star z = conj z ✓. So simp only [starRingEnd_apply, Complex.star_def, Complex.conj_conj] should reduce starRingEnd (starRingEnd ρ) → conj(conj ρ) → ρ ✓. I'll use a small simp call and fix at build. Where does W = −V come from:
```lean
have h2 : (∑' ρ : {ρ : ℂ // IsNontrivialZero ρ},
(zeroMult ρ : ℂ) * (1 / (ρ : ℂ) - 1 / (1 - (starRingEnd ℂ) (ρ : ℂ)))) = -V := by
have h := Equiv.tsum_eq oneSubZeroEquiv (fun σ : {σ : ℂ // IsNontrivialZero σ} =>
(zeroMult σ : ℂ) * (1 / (σ : ℂ) - 1 / (1 - (starRingEnd ℂ) (σ : ℂ))))
-- h : ∑' ρ, wFam(oneSubZeroEquiv ρ) = W
rw [← h]
-- goal: ∑' ρ, wFam(oneSubZeroEquiv ρ) = -V: per-term = −vFam ρ; tsum_neg
rw [show (fun ρ => (zeroMult (oneSubZeroEquiv ρ) : ℂ) *
(1 / ((oneSubZeroEquiv ρ : {ρ // _}) : ℂ) - 1 / (1 - (starRingEnd ℂ) ((oneSubZeroEquiv ρ : {ρ // _}) : ℂ)))) =
fun ρ => -((zeroMult ρ : ℂ) * (1 / ((starRingEnd ℂ) (ρ : ℂ)) - 1 / (1 - (ρ : ℂ)))) from ?_]
· rw [tsum_neg, hV]
· funext ρ
have e1 : ((oneSubZeroEquiv ρ : {ρ : ℂ // IsNontrivialZero ρ}) : ℂ) = 1 - (ρ : ℂ) := rfl
rw [e1, zeroMult_one_sub ρ.2.2.1 ρ.2.2.2]
-- mult·(1/(1−ρ) − 1/(1−conj(1−ρ))) = −mult·(1/conjρ − 1/(1−ρ))
have e2 : (1 : ℂ) - (starRingEnd ℂ) (1 - (ρ : ℂ)) = (starRingEnd ℂ) (ρ : ℂ) := by
simp [starRingEnd_apply, Complex.star_def?? map_sub, map_one]
-- conj(1−ρ) = 1 − conjρ: map_sub, map_one; 1 − (1−conjρ) = conjρ: sub_sub_cancel
rw [e2]
ring
-- V = −V
have h3 : V = -V := h1.trans h2
-- ⟹ V = 0
have h4 : V + V = V + (-V) := congrArg (V + ·) h3 -- hmm simpler: eq_zero_of_neg_eq
...
```
For V = −V ⟹ V = 0 in ℂ: `eq_zero_of_neg_eq : -a = a → a = 0`? or: from h3 : V = −V: two_mul: 2V = 0:
```lean
have : V = 0 := by
have h4 : V + V = 0 := by
calc V + V = V + (-V) := by rw [h3]
_ = 0 := add_neg_cancel V
-- V + V = 0 ⟹ V = 0
have h5 : (2 : ℂ) * V = 0 := by linear_combination h4
exact (mul_eq_zero.mp h5).resolve_left (by norm_num)
```
Or `eq_zero_of_neg_eq h3.symm`?? eq_zero_of_neg_eq : -a = a → a = 0 — h3 : V = −V: h3.symm : −V = V ✓ `exact eq_zero_of_neg_eq h3.symm` ✓ cleaner (if the lemma name is right — `eq_zero_of_neg_eq` exists in Mathlib.Algebra... ✓ I'm fairly confident).
e2: 1 − conj(1−ρ) = conjρ: conj(1−ρ) = conj 1 − conj ρ = 1 − conjρ (map_sub, map_one/starRingEnd): then 1 − (1 − conjρ) = conjρ (sub_sub_cancel). simp [starRingEnd_apply, map_sub, map_one, sub_sub_cancel]?? — starRingEnd is a ring hom: (starRingEnd ℂ) (1−ρ) = 1 − (starRingEnd ℂ)ρ via map_sub/map_one ✓ simp lemmas. So: rw [map_sub, map_one, starRingEnd_apply??] — careful with the conj forms: starRingEnd_apply : starRingEnd ℂ x = star x? hmm — earlier code: (starRingEnd ℂ) ρ used directly with Complex.add_conj — LiSwaps:147: `hconj : (1 / ((starRingEnd ℂ) (ρ:ℂ))) = (starRingEnd ℂ) (1 / (ρ:ℂ)) := by rw [map_div₀, map_one]` — so they rw with map_* directly on starRingEnd applications ✓. For e2:
```lean
have e2 : (1 : ℂ) - (starRingEnd ℂ) (1 - (ρ : ℂ)) = (starRingEnd ℂ) (ρ : ℂ) := by
rw [map_sub, map_one]
-- 1 − (1 − starRingEnd ρ) = starRingEnd ρ
rw [sub_sub_cancel]
```
map_sub : f (a−b) = f a − f b ✓ (starRingEnd is ring hom); map_one ✓; sub_sub_cancel : a − (a − b) = b ✓.
Also in h2's `show ... from ?_`: the lambda with oneSubZeroEquiv applications inside — messy. Alternative formulation avoiding the show:
```lean
have h2 : W = -V := by
rw [← tsum_neg]
-- goal: W = ∑' ρ, −(vFam ρ)
rw [← h] -- h : ∑' ρ, wFam(oneSubZeroEquiv ρ) = W; ← rewrites W → that tsum
apply tsum_congr
intro ρ
-- per-term: wFam(oneSubZeroEquiv ρ) = −(vFam ρ)
...
```
Hmm rw [← tsum_neg] on goal W = −V: −V = −(∑' vFam): tsum_neg : ∑' (−f) = −∑' f: ← turns −∑' vFam into ∑' (−vFam) ✓ — but −V where V is `set` variable — the set makes V a local def; −V vs −∑' vFam: rw [hV] first to expose. Order:
```lean
have h2 : W = -V := by
rw [hV, ← tsum_neg, ← h]
apply tsum_congr
...
```
Wait — rw [hV] rewrites V → ∑' vFam EVERYWHERE in goal W = −V → W = −∑' vFam ✓; ← tsum_neg: −∑' vFam → ∑' ρ, −vFam ρ ✓; ← h: W → ∑' wFam(oneSubZeroEquiv ρ)?? h : ∑' ρ, wFam(oneSubZeroEquiv ρ) = W: ← h rewrites W → ∑' ρ, wFam(oneSubZeroEquiv ρ) ✓. Goal: ∑' ρ, wFam(e₂ρ) = ∑' ρ, −vFam ρ ✓ tsum_congr. But h's W must be stated with the explicit tsum (not the set-V). Let me NOT use `set` for W; write both families explicitly. OK.
Similarly h1: goal V = Wtsum: rw [hV, ← h]: hV : V = ∑' vFam (the set definition — hV is the set equation: `set V := ∑' ... with hV` gives hV : V = ∑' ...). rw [hV]: goal ∑' vFam = Wtsum; ← h : h : ∑' ρ, vFam(conjEquiv ρ) = ∑' vFam: ← h rewrites the LHS ∑' vFam → ∑' ρ, vFam(conjEquiv ρ) ✓. Goal: ∑' ρ, vFam(conjEquiv ρ) = Wtsum: tsum_congr per-term: vFam(conjEquiv ρ) = wFam ρ ✓ as computed.
Per-term h1: vFam(conjZeroEquiv ρ) = mult(conjρ)·(1/conj(conjρ) − 1/(1−conjρ)): after e1/zeroMult_conj/simp-conj-conj: = mult·(1/ρ − 1/(1−conjρ)) ✓ = wFam ρ ✓ — the congr: after rw [e1, zeroMult_conj ρ.2]: goal mult·(1/conjρ − 1/(1−ρ))?? NO WAIT — LHS is vFam(conjZeroEquiv ρ): with e1 the zeroMult argument becomes conjρ → zeroMult_conj turns to mult(ρ); the rest: (1/((starRingEnd ℂ)((conjZeroEquiv ρ):ℂ)) − 1/(1−((conjZeroEquiv ρ):ℂ))): e1 rewrites the casts: (1/(starRingEnd (starRingEnd ρ)) − 1/(1−starRingEnd ρ)) = (1/ρ − 1/(1−conjρ)) after conj-conj simp. So goal after rws: mult·(1/ρ − 1/(1−conjρ)) = wFam ρ ✓ — need conj-conj rewrite BEFORE matching: order: rw [e1] (casts), then the starRingEnd-double: simp only [starRingEnd_apply, Complex.star_def, Complex.conj_conj]... hmm the (starRingEnd ℂ) ((starRingEnd ℂ) ρ) — after starRingEnd_apply twice: conj (conj ρ) → ρ via Complex.conj_conj ✓. But careful starRingEnd_apply might rewrite ALL instances including the outer ones I want to keep (1−starRingEnd ρ) — that's fine: (1 − conj ρ) ✓ same thing, then tsum_congr closes by rfl.
The final RHS form must match W's declared family EXACTLY: W family := mult·(1/ρ − 1/(1−starRingEnd ρ)). After simp: LHS: mult·(1/ρ − 1/(1−conj ρ)) — star vs conj: starRingEnd_apply would also turn the RHS pattern... in tsum_congr the goal is vFam(e₁ρ) = wFam(ρ): RHS wFam(ρ) = mult·(1/ρ − 1/(1−starRingEnd ρ)): after simp [starRingEnd_apply, Complex.star_def]: RHS → mult·(1/ρ − 1/(1−conjρ))?? wait starRingEnd_apply turns starRingEnd→star, then star_def: star z = conj z. Ugh — actually for ℂ: starRingEnd ℂ = conj as functions? `RCLike.starRingEnd_eq_conj`? Hmm — in Mathlib, for RCLike types: `starRingEnd_apply : starRingEnd R x = star x` and Complex: star = conj (`Complex.star_def : star z = conj z`? or it's rfl). LiSwaps:150 used Complex.add_conj : z + starRingEnd ℂ z = 2re — so starRingEnd ℂ z IS conj z for the lemma. OK — I'll normalize with simp only [starRingEnd_apply] which should leave `star`, and both sides will have star — matching. Let me not over-plan: use `simp` per-term and see.
Now two_mul_sigmaP_one:
```lean
/-- Twice σ₁ is the mixed series: 2·sigmaP 1 = Σ mult/(ρ(1−ρ)). -/
lemma two_mul_sigmaP_one :
(2 : ℂ) * sigmaP 1 = ∑' ρ : {ρ : ℂ // IsNontrivialZero ρ},
(zeroMult ρ : ℂ) * (1 / ((ρ : ℂ) * (1 - (ρ : ℂ)))) := by
have hT : Summable ... := summable_mult_one_div_mul_one_sub
have hσ : Summable (sigmaSlice 1) := sigmaSlice_summable 1 le_rfl
-- per-term: 2·sigmaSlice 1 ρ = mult·(1/ρ + 1/conjρ)
have h1 : (2 : ℂ) * sigmaP 1 = ∑' ρ : {ρ : ℂ // IsNontrivialZero ρ},
(zeroMult ρ : ℂ) * (1 / (ρ : ℂ) + 1 / ((starRingEnd ℂ) (ρ : ℂ))) := by
rw [sigmaP, ← tsum_mul_left]
apply tsum_congr
intro ρ
rw [sigmaSlice, pow_one, pow_one]
ring
-- per-term: mult·(1/(ρ(1−ρ))) = mult·(1/ρ + 1/(1−ρ))
have h2 : (∑' ρ : {ρ : ℂ // IsNontrivialZero ρ},
(zeroMult ρ : ℂ) * (1 / ((ρ : ℂ) * (1 - (ρ : ℂ))))) =
∑' ρ : {ρ : ℂ // IsNontrivialZero ρ},
(zeroMult ρ : ℂ) * (1 / (ρ : ℂ) + 1 / (1 - (ρ : ℂ))) := by
apply tsum_congr
intro ρ
have hρ0 : (ρ : ℂ) ≠ 0 := ...
have h1ρ : (1 : ℂ) - (ρ : ℂ) ≠ 0 := ...
congr 1
field_simp [hρ0, h1ρ]
ring
rw [h1, h2]
-- difference is V = 0
have h3 : (∑' ρ, mult·(1/ρ + 1/conjρ)) - (∑' ρ, mult·(1/ρ + 1/(1−ρ))) =
∑' ρ, mult·(1/conjρ − 1/(1−ρ)) := by
rw [← tsum_sub ??]
· apply tsum_congr
intro ρ
ring
· -- summable of first family
...
· -- summable of second family
...
-- the second family summable: from hT via per-term rewrite
have hsnd : Summable (fun ρ => (zeroMult ρ : ℂ) * (1 / (ρ : ℂ) + 1 / (1 - (ρ : ℂ)))) := by
apply hT.congr
intro ρ
... per-term field identity ...
-- the first family summable: sigmaSlice_summable 1 via per-term rewrite
have hfst : Summable (fun ρ => (zeroMult ρ : ℂ) * (1 / (ρ : ℂ) + 1 / ((starRingEnd ℂ) (ρ : ℂ)))) := by
apply (sigmaSlice_summable 1 le_rfl).congr
intro ρ
rw [sigmaSlice, pow_one, pow_one]
ring
rw [h3, vTerm_tsum_eq_zero] at *??
```
Assemble: h1 : 2σ₁ = Fst; h2 : T = Snd; h3 : Fst − Snd = V = 0 ⟹ Fst = Snd = T: so 2σ₁ = T ✓:
```lean
have hFst : Fst = Snd := sub_eq_zero.mp (by rw [h3]; exact vTerm_tsum_eq_zero)
rw [h1, hFst, ← h2]
```
Summable.congr : Summable f → (∀ i, f i = g i) → Summable g ✓ exists (`Summable.congr`). tsum_sub : ∑' (f − g) = ∑' f − ∑' g with summabilities: `tsum_sub (hf : Summable f) (hg : Summable g)` ✓.
For h1's ← tsum_mul_left: goal (2)·∑' sigmaSlice = ∑' (2·sigmaSlice)?? tsum_mul_left : ∑' (c * f) = c * ∑' f: ← turns (2)·∑' → ∑' (2·sigmaSlice)?? the pattern: (2:ℂ) * sigmaP 1 where sigmaP 1 = ∑' sigmaSlice 1 — rw [sigmaP] exposes; ← tsum_mul_left: rewrites (2:ℂ) * ∑' sigmaSlice 1 → ∑' ρ, 2 * sigmaSlice 1 ρ ✓ then tsum_congr: 2·sigmaSlice 1 ρ = mult·(1/ρ + 1/conjρ): rw [sigmaSlice, pow_one, pow_one]: 2·((mult/2)(1/ρ + 1/conjρ)) = ...: ring ✓.
h2's per-term: 1/(ρ(1−ρ)) = 1/ρ + 1/(1−ρ): field_simp [hρ0, h1ρ]; ring — wait direction: goal after congr 1: 1/((ρ)*(1−ρ)) = 1/ρ + 1/(1−ρ): field_simp; ring ✓ (if field_simp closes, ring errors — the banked gotcha... write field_simp [hρ0, h1ρ] then ring only if needed — I'll include ring and remove if "no goals" error appears).
Hmm — congr 1: goal mult·(1/(ρ(1−ρ))) = mult·(1/ρ + 1/(1−ρ)): congr 1 reduces to 1/(ρ(1−ρ)) = 1/ρ + 1/(1−ρ) ✓.
Then the k=1 capstone:
```lean
/-- (M) at k = 1: σ₁ = −gFun(0). -/
lemma sigmaP_one_eq_neg_gFun_zero (hZC : ZeroCountProp) : sigmaP 1 = -gFun 0 := by
have h2 := two_mul_sigmaP_one
rw [← seriesFun_one] at h2 -- 2·σ₁ = seriesFun 1
have hg1 := gFun_one hZC -- gFun 1 = B + seriesFun 1
have hg0 := gFun_zero hZC -- gFun 0 = B
have hfe := gFun_one_eq_neg -- gFun 1 = −gFun 0
-- seriesFun 1 = gFun 1 − B = −2B
-- 2σ₁ = −2·gFun 0 ⟹ σ₁ = −gFun 0
linear_combination h2 + hg1 - hg0 - hfe
```
linear_combination over ℂ ✓ works (it's for commutative rings ✓). Check: goal σ₁ = −gFun 0: coeffs: h2 : 2σ₁ = seriesFun 1; hg1 : gFun 1 = B + seriesFun 1; hg0 : gFun 0 = B; hfe : gFun 1 = −gFun 0. goal−LHS combos: 2σ₁ − (−gFun0)?? Let me verify: h2 + hg1 − hg0 − hfe: LHS: 2σ₁ + gFun1 − gFun0 − gFun1 = 2σ₁ − gFun0; RHS: seriesFun1 + (B + seriesFun1) − B − (−gFun0) = 2·seriesFun1 + gFun0. So 2σ₁ − gFun0 = 2·seriesFun1 + gFun0 — that's not the goal form... linear_combination checks goal LHS − combo LHS = goal RHS − combo RHS as ring identity? linear_combination e : proves goal a = b when a − (LHS e) = b − (RHS e) by ring. e = h2 + hg1 − hg0 − hfe: LHS e = 2σ₁+gFun1−gFun0−gFun1 = 2σ₁ − gFun0; RHS e = seriesFun1 + B + seriesFun1 − B + gFun0 = 2·seriesFun1 + gFun0. Goal: σ₁ = −gFun0: check σ₁ − (2σ₁ − gFun0) = −σ₁ + gFun0 vs −gFun0 − (2seriesFun1 + gFun0) = −2seriesFun1 − 2gFun0: ring identity?? −σ₁+gFun0 ≠ −2seriesFun1−2gFun0 in general ✗. Wrong combo. Solve: want σ₁ = −g0 given 2σ₁ = SF1, g1 = B+SF1, g0 = B, g1 = −g0: 2σ₁ = SF1 = g1 − B = −g0 − g0 = −2g0 ✓. e should satisfy: LHS e = 2·(goal LHS), i.e. take e = h2 − hg1 + hg0 + hfe: LHS: 2σ₁ − g1 + g0 + g1 = 2σ₁ + g0; RHS: SF1 − (B+SF1) + B + (−g0) = −g0. So e: 2σ₁+g0 = −g0: goal σ₁ = −g0: σ₁ − (2σ₁+g0)/2... linear_combination e/2: linear_combination (h2 - hg1 + hg0 + hfe)/2: check: goal − e/2: σ₁ − (2σ₁+g0)/2 = −g0/2... and −g0 − (−g0)/2 = −g0/2 ✓ ring ✓. So `linear_combination (h2 - hg1 + hg0 + hfe) / 2` ✓.
§5 — the derivative machine:
```lean
/-! ## 5. Termwise iterated derivation at 0 (k ≥ 2) -/
/-- The zpow derivative lemma (no leading minus; c := −ρ). -/
lemma iteratedDeriv_zpow_neg_one (k : ℕ) (c : ℂ) {s : ℂ} (hs : s + c ≠ 0) :
iteratedDeriv k (fun s : ℂ => (s + c) ^ (-1 : ℤ)) s =
(-1 : ℂ) ^ k * (k ! : ℂ) * (s + c) ^ (-(k : ℤ) - 1) := by
have h := iteratedDeriv_neg_zpow_neg_one_add k c hs
have e : (fun s : ℂ => (s + c) ^ (-1 : ℤ)) = fun s => -(-((s + c) ^ (-1 : ℤ))) := by
funext s
rw [neg_neg]
rw [e, ← iteratedDeriv_neg, h]
ring
```
iteratedDeriv_neg : iteratedDeriv n (−f) = −iteratedDeriv n f — `iteratedDeriv_neg`?? hmm — check: iteratedDerivWithin_neg exists? There's `iteratedDeriv_neg`?? not sure. Fallback: iteratedDeriv n (−f) x = −(iteratedDeriv n f x) via `iteratedDerivWithin_neg` on univ + Within-of-isOpen... Or avoid: my per-term: 1/(s−ρ) = (s+(−ρ))^{−1} — use LiDigamma's lemma with the negation INSIDE: (s+(−ρ))^{−1} = −(−((s+(−ρ))^{−1})): so iteratedDeriv k (that) = −(−(−1)^k k! (s+(−ρ))^{−k−1}) = (−1)^k k! (s+(−ρ))^{−k−1} ✓ same. The iteratedDeriv_neg name: Mathlib has `iteratedDeriv_neg : iteratedDeriv n (-f) = -iteratedDeriv n f`?? — grep Mathlib quickly at build. If missing: use iteratedDeriv_const_mul with c = −1: −g = (−1)·g: `iteratedDeriv_const_mul`?? also uncertain. Hmm — safest: use Filter.EventuallyEq: (−f) — or just prove via deriv induction... Actually simplest: note our per-term function is mult·((s+c)^{−1} + 1/ρ) and the closed-form lemma iteratedDeriv_neg_zpow_neg_one_add proves iteratedDeriv k (fun s => −((s+c)^{−1})) = −(−1)^k k! (s+c)^{−k−1}. Our function (s+c)^{−1} = −(−((s+c)^{−1})) — define g := fun s => −((s+c)^{−1}): our f = −g: iteratedDeriv k (−g) — STILL need neg. OK just check existence of iteratedDeriv_neg at build; alternatives iteratedDerivWithin_neg (univ) + transfer: iteratedDeriv n f x = iteratedDerivWithin n f univ x (symm of Within_of_isOpen) — then iteratedDerivWithin_neg exists? `iteratedDerivWithin_neg`? also uncertain.
Mathlib search needed. Actually — I recall Mathlib has `iteratedDeriv_neg`? In Mathlib.Analysis.Calculus.IteratedDeriv.DefConvergence... there's iteratedDerivWithin_neg : iteratedDerivWithin n (−f) s = −iteratedDerivWithin n f s? Hmm — there ARE iteratedDerivWithin_const_mul, iteratedDerivWithin_add, iteratedDerivWithin_sub... `iteratedDerivWithin_neg` probably exists, and global `iteratedDeriv_neg`? Let me just probe with #check in a scratch. I'll include a probe run.
Per-term derivative:
```lean
lemma iteratedDeriv_seriesTerm (j : ℕ) (hj : 1 ≤ j) (ρ : {ρ : ℂ // IsNontrivialZero ρ})
{s : ℂ} (hs : s - (ρ : ℂ) ≠ 0) :
iteratedDeriv j (fun s => seriesTerm s ρ) s =
(zeroMult ρ : ℂ) * ((-1 : ℂ) ^ j * (j ! : ℂ) * (s - (ρ : ℂ)) ^ (-(j : ℤ) - 1)) := by
have hρ0 : (ρ : ℂ) ≠ 0 := ...
have e : (fun s => seriesTerm s ρ) =
fun s => (zeroMult ρ : ℂ) * ((s + -(ρ : ℂ)) ^ (-1 : ℤ) + 1 / (ρ : ℂ)) := by
funext t
rw [seriesTerm, zpow_neg_one]
congr 2
· congr 1
ring
· rfl?? — hmm: 1/(t−ρ) = (t+(−ρ))^{−1}: zpow_neg_one: (t+(−ρ))^{(−1:ℤ)} = (t+(−ρ))⁻¹: congr 1: t−ρ = t+(−ρ): ring ✓
rw [e]
-- iteratedDeriv j (mult·(f + const)) = mult·(iteratedDeriv j f + 0)
have hscf : ContDiffAt ℂ (j : ℕ∞)?? for iteratedDeriv_add — check the exact requirement
rw [iteratedDeriv_const_mul?...]
```
iteratedDeriv_const_mul : iteratedDeriv n (fun x => c * f x) x = c * iteratedDeriv n f x — check existence. iteratedDeriv_add (hf : ContDiffAt ...) — from LiDigamma:702 usage: `rw [iteratedDeriv_add hcf hcg]` — hcf/hcg : ContDiffAt?? Let me grep LiDigamma for "hcf" to see their exact forms.
Let me check those two things in LiDigamma before writing §5: (i) the hcf/hcg ContDiff forms near line 700; (ii) whether iteratedDeriv_const_mul/iteratedDeriv_neg exist (probe Mathlib via grep on the package source — faster than a Lean probe: grep Mathlib/Mathlib/Analysis/Calculus/IteratedDeriv* for theorem names).
§4 needs two name checks first — the `ContDiff` side-condition forms in `iteratedDeriv_add` and whether `iteratedDeriv_neg`/`iteratedDeriv_const_mul` exist.
tool: Bash
input
{
"command": "cd D:/Python/Quantum/zeta-23-lean/.lake/packages/mathlib && grep -rn \"theorem iteratedDeriv_neg\\|theorem iteratedDeriv_const_mul\\|theorem iteratedDeriv_add\" Mathlib/Analysis/Calculus/ | head -10",
"description": "Check iteratedDeriv lemma names in Mathlib"
}
tool: Grep ok
input
{
"pattern": "hcf|hcg|ContDiff",
"path": "D:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1\\LiDigamma.lean",
"output_mode": "content",
"-n": true,
"head_limit": 20
}
result 2026-08-24 23:46:23Z → 2026-08-26 18:10:59Z
mode='content' num_files=0 filenames=[] content='research\\lean\\NguyenRH1\\NguyenRH1\\LiContour.lean:503:theorem kFun_shift_norm_le_exp_four_add_one {n : ℕ} {s : ℂ}\nresearch\\lean\\NguyenRH1\\NguyenRH1\\LiContour.lean-504- (hσ: s.re ≤ 3) (hT : (n : ℝ) ≤ s.im ^ 2) :\nresearch\\lean\\NguyenRH1\\NguyenRH1\\LiContour.lean-505- ‖kFun n (s + 1)‖ ≤ Real.exp 4 + 1:= by\nD:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1\\LiContour.lean-506- rcases Nat.eq_zero_or_pos n with hn | hn\nD:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1\\LiContour.lean-507- · subst hn\nD:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1\\LiContour.lean-508- simp only [kFun, pow_zero, sub_self, norm_zero]\nD:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1\\LiContour.lean-509- positivity\nresearch\\lean\\NguyenRH1\\NguyenRH1\\LiContour.lean-510- · have hnR: (1:ℝ) ≤ (n : ℝ) := by exact_mod_cast hn\nresearch\\lean\\NguyenRH1\\NguyenRH1\\LiContour.lean-511- have hTim: 0 < s.im ^ 2 := by nlinarith [hT, hnR]\nresearch\\lean\\NguyenRH1\\NguyenRH1\\LiContour.lean-512- have hs0: s ≠ 0 := by\nD:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1\\LiContour.lean-513- rintro h\n--\nresearch\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean:1300:theorem hIntegral_Jlag_low_le_dogLegUpper {n : ℕ} {T : ℝ}\nresearch\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-1301- (hn: 16 ≤ n) (hTn : Real.sqrt (n : ℝ) ≤ T) (hTn1 : T ≤ Real.sqrt (n : ℝ) + 1) :\nresearch\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-1302- ‖HIntegral (Jlag n) 3 (2 * Real.sqrt (n: ℝ)) T‖ ≤\nresearch\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-1303- ((Real.sqrt (n: ℝ) + 1) / 2) * (Real.exp (5 / 2) + 1) / 2 + (8.38 : ℝ) +\nresearch\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-1304- IIMaj (n: ℝ) / 4 := by\nresearch\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-1305- have hnR: (16 : ℝ) ≤ (n : ℝ) := by exact_mod_cast hn\nresearch\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-1306- have hsqrt4: (4 : ℝ) ≤ Real.sqrt (n : ℝ) := by\nresearch\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-1307- have h1: Real.sqrt 16 ≤ Real.sqrt (n : ℝ) :=\nresearch\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-1308- Real.sqrt_le_sqrt (by exact_mod_cast hn: (16 : ℝ) ≤ (n : ℝ))\nresearch\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-1309- have h2: Real.sqrt 16 = 4 := by\nD:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-1310- rw [Real.sqrt_eq_iff_eq_sq (by norm_num) (by norm_num)]; norm_num\n--\nresearch\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean:1367:theorem hIntegral_Jlag_low_neg_norm_le_dogLegUpper {n : ℕ} {T : ℝ}\nresearch\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-1368- (hn: 16 ≤ n) (hTn : Real.sqrt (n : ℝ) ≤ T) (hTn1 : T ≤ Real.sqrt (n : ℝ) + 1) :\nresearch\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-1369- ‖HIntegral (Jlag n) 3 (2 * Real.sqrt (n: ℝ)) (-T)‖ ≤\nresearch\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-1370- ((Real.sqrt (n: ℝ) + 1) / 2) * (Real.exp (5 / 2) + 1) / 2 + (8.38 : ℝ) +\nresearch\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-1371- IIMaj (n: ℝ) / 4 := by\nresearch\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-1372- have hT0: (0 : ℝ) < T := by\nresearch\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-1373- have hnR: (16 : ℝ) ≤ (n : ℝ) := by exact_mod_cast hn\nresearch\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-1374- have hsqrt4: (4 : ℝ) ≤ Real.sqrt (n : ℝ) := by\nresearch\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-1375- have h1: Real.sqrt 16 ≤ Real.sqrt (n : ℝ) :=\nresearch\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-1376- Real.sqrt_le_sqrt (by exact_mod_cast hn: (16 : ℝ) ≤ (n : ℝ))\nresearch\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-1377- have h2: Real.sqrt 16 = 4 := by' num_lines=35 num_matches=None applied_limit=None applied_offset=None
raw content_json (database row)
[{"type":"thinking","thinking":"The skeleton is clear. For summable_mult_div_norm_sq I need the comparison: mult/‖ρ‖² ≤ (9/4)·mult/(1+‖γ‖²) for ‖ρ‖ ≥ 2 — that's normSq_gammaOf_le_mul_norm_sq inverted: 1+‖γ‖² ≤ (9/4)‖ρ‖² ⟹ 1/‖ρ‖² ≤ (9/4)/(1+‖γ‖²) ⟹ mult/‖ρ‖² ≤ (9/4)mult/(1+‖γ‖²). From LiSwaps:205-208: the exact algebra heq: mult/‖ρ‖²·((9/4)‖ρ‖²) = (9/4)mult. The comparison: hbound : mult/‖ρ‖² ≤ ... — let me write directly:\n\n```lean\nlemma summable_mult_div_norm_sq :\n Summable (fun ρ : {ρ : ℂ // IsNontrivialZero ρ} => (zeroMult ρ : ℝ) / ‖(ρ : ℂ)‖ ^ 2) := by\n have hbase : Summable (fun ρ : {ρ : ℂ // IsNontrivialZero ρ} =>\n (9 / 4) * ((zeroMult ρ : ℝ) / (1 + Complex.normSq (gammaOf ρ)))) :=\n (WeilEF.zero_sum_inv_sq zetaSeam).mul_left (9 / 4)\n set D : {ρ : ℂ // IsNontrivialZero ρ} → ℝ := fun ρ =>\n if (2 : ℝ) ≤ ‖(ρ : ℂ)‖ then\n (9 / 4) * (zeroMult ρ : ℝ) / (1 + Complex.normSq (gammaOf ρ))\n else (zeroMult ρ : ℝ) / ‖(ρ : ℂ)‖ ^ 2 with hDdef\n ... (same finite/E/hD assembly)\n refine Summable.of_norm_bounded hD (fun ρ => ?_)\n by_cases hρ : (2 : ℝ) ≤ ‖(ρ : ℂ)‖\n · simp only [D, if_pos hρ]\n -- ‖mult/‖ρ‖²‖ ≤ (9/4)mult/(1+‖γ‖²): from normSq_gammaOf_le_mul_norm_sq\n ...\n · simp only [D, if_neg hρ]\n -- ‖mult/‖ρ‖²‖ = mult/‖ρ‖² (nonneg): le_refl after Real.norm_of_nonneg\n```\nThe comparison per-term: for ‖ρ‖ ≥ 2: normSq_gammaOf_le_mul_norm_sq (n := 1) le_rfl (re nonneg) (re ≤ 1) hρ2 — signature check from LiSwaps:134: `normSq_gammaOf_le_mul_norm_sq (n := 1) le_rfl hre0 hre1 (by simpa using hρ)` — args: (n)(h : 1 ≤ n)(hre0 : 0 ≤ re)(hre1 : re ≤ 1)(hρ : n ≤ ‖ρ‖)?? with n := 1, the last is 1 ≤ ‖ρ‖ (by simpa using hρ : 2 ≤ ‖ρ‖). Result: 1 + normSq γ ≤ (9/4)·‖ρ‖²... wait with n := 1: the statement at ii′-1a: (9/4)‖ρ‖² comparison — from LiSwaps:134: `hcomp : 1 + Complex.normSq (gammaOf ρ) ≤ 9 / 4 * ‖(ρ : ℂ)‖ ^ 2`. ✓\nThen: mult/‖ρ‖² ≤ (9/4)·mult/(1+‖γ‖²): \n```lean\n have hz := ρ.2\n have hρpos : (0 : ℝ) < ‖(ρ : ℂ)‖ := lt_of_lt_of_le (by norm_num) hρ\n have hgpos : (0 : ℝ) < 1 + Complex.normSq (gammaOf (ρ : ℂ)) := by\n have := Complex.normSq_nonneg (gammaOf (ρ : ℂ)); linarith\n -- mult/‖ρ‖² ≤ (9/4)mult/(1+‖γ‖²) ⟺ mult·(1+‖γ‖²) ≤ (9/4)mult·‖ρ‖²\n rw [div_le_div_iff_of_pos_right?? hmm\n```\nUse: div_le_div (h : a ≤ b)? — div_le_div_of_nonneg? The clean way: \n```lean\n have key : (zeroMult ρ : ℝ) / ‖(ρ : ℂ)‖ ^ 2 ≤\n (9 / 4) * (zeroMult ρ : ℝ) / (1 + Complex.normSq (gammaOf ρ)) := by\n rw [div_le_div_iff₀ (pow_pos hρpos 2) hgpos]\n -- goal: mult·(1+‖γ‖²) ≤ ((9/4)·mult)·‖ρ‖²\n have hcomp : 1 + Complex.normSq (gammaOf (ρ : ℂ)) ≤ 9 / 4 * ‖(ρ : ℂ)‖ ^ 2 :=\n normSq_gammaOf_le_mul_norm_sq (n := 1) le_rfl hz.2.1.le hz.2.2.le (by simpa using hρ)\n calc (zeroMult ρ : ℝ) * (1 + Complex.normSq (gammaOf ρ))\n ≤ (zeroMult ρ : ℝ) * (9 / 4 * ‖(ρ : ℂ)‖ ^ 2) :=\n mul_le_mul_of_nonneg_left hcomp (Nat.cast_nonneg _)\n _ = (9 / 4 * (zeroMult ρ : ℝ)) * ‖(ρ : ℂ)‖ ^ 2 := by ring\n rw [Real.norm_of_nonneg (by positivity)] -- ‖mult/‖ρ‖²‖ = itself\n exact key\n```\nWait — div_le_div_iff₀ signature: `div_le_div_iff₀ (hb : 0 < b) (hd : 0 < d) : a / b ≤ c / d ↔ a * d ≤ c * b`. In this Mathlib version, from session-033 banked: \"div_lt_iff₀ is a/c<b here (lt_div_iff₀ for a<b/c)\" — so div_le_div_iff₀ (hb : 0 < b) (hd : 0 < d) : a/b ≤ c/d ↔ a*d ≤ c*b ✓ plausibly. My goal: mult/‖ρ‖² ≤ (9/4·mult)/(1+‖γ‖²) — a = mult, b = ‖ρ‖², c = 9/4·mult, d = 1+‖γ‖²: ↔ mult·(1+‖γ‖²) ≤ (9/4·mult)·‖ρ‖² ✓ my calc matches.\n\nnorm target: ‖(mult:ℝ)/‖ρ‖²‖ — Real.norm_of_nonneg (div_nonneg (Nat.cast_nonneg _) (pow_nonneg (norm_nonneg _) _)) — positivity should handle: `by positivity`.\n\nFor the if_neg branch: D ρ = mult/‖ρ‖²: goal ‖mult/‖ρ‖²‖ ≤ D ρ = mult/‖ρ‖²: rw [Real.norm_of_nonneg (by positivity)] → le_refl ✓.\n\nNow — since this is ℝ-valued, note the summability conclusion is for the ℝ family ✓ (used as dominator). \n\nNext:\n```lean\nlemma summable_mult_inv_pow {k : ℕ} (hk : 2 ≤ k) :\n Summable (fun ρ : {ρ : ℂ // IsNontrivialZero ρ} => (zeroMult ρ : ℂ) * (1 / (ρ : ℂ)) ^ k) := by\n obtain ⟨m, rfl⟩ := Nat.exists_eq_add_of_le hk -- k = 2 + m\n obtain ⟨δ, hδ, hball⟩ := exists_ball_avoid_nontrivialZeros 0 not_isNontrivialZero_zero\n have hδle : ∀ ρ : {ρ : ℂ // IsNontrivialZero ρ}, δ ≤ ‖(ρ : ℂ)‖ := by\n intro ρ\n by_contra h\n exact hball ρ (by rw [Metric.mem_ball, dist_zero_right]; exact lt_of_not_ge h)\n apply Summable.of_norm_bounded (summable_mult_div_norm_sq.mul_left ((1 / δ) ^ m))\n intro ρ\n have hρpos : (0 : ℝ) < ‖(ρ : ℂ)‖ := lt_of_lt_of_le hδ (hδle ρ)\n have hle : ‖(zeroMult ρ : ℂ) * (1 / (ρ : ℂ)) ^ (2 + m)‖ ≤\n (1 / δ) ^ m * ((zeroMult ρ : ℝ) / ‖(ρ : ℂ)‖ ^ 2) := by\n rw [norm_mul, norm_pow, norm_div, norm_one, RCLike.norm_natCast]\n -- mult·(1/‖ρ‖)^{2+m} ≤ (1/δ)^m·mult/‖ρ‖²\n rw [div_pow, one_pow]\n -- = mult·(1/‖ρ‖^{2+m}) = mult·(1/(‖ρ‖²·‖ρ‖^m)) ≤ mult·((1/δ^m)/‖ρ‖²)\n have hpow : (1 : ℝ) / ‖(ρ : ℂ)‖ ^ (2 + m) ≤ (1 / δ ^ m) / ‖(ρ : ℂ)‖ ^ 2 := by\n rw [pow_add]\n rw [one_div_mul_eq... ] hmm\n```\nalgebra: 1/‖ρ‖^{2+m} = 1/(‖ρ‖²·‖ρ‖^m) = (1/‖ρ‖²)·(1/‖ρ‖^m) ≤ (1/‖ρ‖²)·(1/δ^m) since 1/‖ρ‖^m ≤ 1/δ^m (pow_le_pow_left₀ δ≤‖ρ‖ then one_div_le_one_div_of_le (pow_pos hδ m) that). Then mult·(...) ≤ mult·(...) (mult nonneg) and (1/δ)^m = 1/δ^m ✓ (div_pow, one_pow). Assemble:\n```lean\n rw [pow_add, one_div (‖ρ‖² * ‖ρ‖^m)?...]\n```\nLet me structure: goal after rw [div_pow, one_pow]: (zeroMult ρ:ℝ)·(1/‖ρ‖^{2+m}) ≤ (1/δ)^m·(mult/‖ρ‖²). Write:\n```lean\n calc (zeroMult ρ : ℝ) * (1 / ‖(ρ : ℂ)‖ ^ (2 + m))\n = (zeroMult ρ : ℝ) * ((1 / ‖(ρ : ℂ)‖ ^ 2) * (1 / ‖(ρ : ℂ)‖ ^ m)) := by\n rw [pow_add]\n rw [one_div_mul_one_div??]...\n```\none_div_mul: `one_div_mul_one_div (a b) : (1/a)*(1/b) = 1/(a*b)`? — `one_div_mul_one_div : 1 / a * (1 / b) = 1 / (a * b)` ✓ exists (symm direction). So:\n```lean\n = (zeroMult ρ : ℝ) * ((1 / ‖(ρ : ℂ)‖ ^ 2) * (1 / ‖(ρ : ℂ)‖ ^ m)) := by\n rw [pow_add, ← one_div_mul_one_div]\n _ ≤ (zeroMult ρ : ℝ) * ((1 / ‖(ρ : ℂ)‖ ^ 2) * (1 / δ ^ m)) := by\n apply mul_le_mul_of_nonneg_left _ (Nat.cast_nonneg _)\n apply mul_le_mul_of_nonneg_left _ (by positivity : (0:ℝ) ≤ 1/‖(ρ:ℂ)‖^2)\n exact one_div_le_one_div_of_le (pow_pos hδ m) (pow_le_pow_left₀ hδ.le (hδle ρ) m)\n _ = (1 / δ) ^ m * ((zeroMult ρ : ℝ) / ‖(ρ : ℂ)‖ ^ 2) := by\n rw [div_pow, one_pow]\n ring\n```\npow_le_pow_left₀ (ha : 0 ≤ a) (hab : a ≤ b) (n) : a^n ≤ b^n ✓ (signature from LiDigamma:746: pow_le_pow_left₀ (by positivity) hnormS (k+1) ✓). one_div_le_one_div_of_le (ha : 0 < a) (hab : a ≤ b) : 1/b ≤ 1/a ✓ (session-033 banked: \"one_div_le_one_div_of_le takes the small side's positivity first\" ✓ matches (pow_pos hδ m) then (pow_le...)).\n\nThen 1/δ > 0: hδ : 0 < δ ✓ from exists_ball_avoid. pow_pos hδ m ✓.\n\nHmm wait — Nat.exists_eq_add_of_le : a ≤ b → ∃ c, b = a + c — with hk : 2 ≤ k: ∃ m, k = 2 + m ✓ obtain ⟨m, rfl⟩.\n\nDominant form note: the of_norm_bounded dominator family: ((1/δ)^m)·(mult/‖ρ‖²) — summable_mult_div_norm_sq.mul_left ((1/δ)^m) : Summable (fun ρ => (1/δ)^m * (mult/‖ρ‖²)) ✓ matches my calc final form ✓.\n\nNext: sigmaP_eq_unpaired (k ≥ 2):\n\n```lean\nlemma sigmaP_eq_unpaired {k : ℕ} (hk : 2 ≤ k) :\n sigmaP k = ∑' ρ : {ρ : ℂ // IsNontrivialZero ρ}, (zeroMult ρ : ℂ) * (1 / (ρ : ℂ)) ^ k := by\n have hs1 := summable_mult_inv_pow hk\n have hs2 : Summable (fun ρ : {ρ : ℂ // IsNontrivialZero ρ} =>\n (zeroMult ρ : ℂ) * (1 / ((starRingEnd ℂ) (ρ : ℂ))) ^ k) := by\n -- transfer via conjZeroEquiv\n have e : (fun ρ : {ρ : ℂ // IsNontrivialZero ρ} =>\n (zeroMult ρ : ℂ) * (1 / ((starRingEnd ℂ) (ρ : ℂ))) ^ k) =\n (fun σ : {ρ : ℂ // IsNontrivialZero ρ} => (zeroMult σ : ℂ) * (1 / (σ : ℂ)) ^ k) ∘\n conjZeroEquiv := by\n funext ρ\n simp only [Function.comp_apply, conjZeroEquiv]\n rw [zeroMult_conj ρ.2]\n rw [e]\n exact hs1.comp_injective?? no — Summable of f ∘ e for equiv e: `Equiv.summable_iff e : Summable (f ∘ e) ↔ Summable f` — use (conjZeroEquiv.summable_iff).mpr hs1\n -- main:\n have hre : ∑' ρ, (zeroMult ρ : ℂ) * (1 / ((starRingEnd ℂ) (ρ : ℂ))) ^ k =\n ∑' ρ, (zeroMult ρ : ℂ) * (1 / (ρ : ℂ)) ^ k := by\n have h := Equiv.tsum_eq conjZeroEquiv (fun σ => (zeroMult σ : ℂ) * (1 / (σ : ℂ)) ^ k)\n -- h : ∑' a, f (conjZeroEquiv a) = ∑' b, f b\n rw [← h]\n apply tsum_congr\n intro ρ\n simp only [conjZeroEquiv, Function.comp?? ] -- f (conjZeroEquiv ρ) = mult(conjρ)(1/conjρ)^k → mult(ρ)(1/conjρ)^k via zeroMult_conj\n ...\n -- sigmaP k = (1/2)(S + S)\n rw [sigmaP]\n -- sigmaSlice k ρ = (mult/2)(A + B); split the tsum\n have hsplit : ∑' ρ, sigmaSlice k ρ =\n (1 / 2 : ℂ) * (∑' ρ, (zeroMult ρ : ℂ) * (1 / (ρ:ℂ)) ^ k +\n ∑' ρ, (zeroMult ρ : ℂ) * (1 / ((starRingEnd ℂ) (ρ:ℂ))) ^ k) := by\n rw [← tsum_add hs1 hs2, ← tsum_mul_left] -- forms\n apply tsum_congr\n intro ρ\n rw [sigmaSlice]\n ring\n rw [hsplit, hre]\n ring\n```\nCareful with tsum forms (banked gotcha: \"Summable.mul_left/add lambda forms; tsum_add beta-rfl bridges\"). `tsum_add hs1 hs2 : ∑' (f + g)?? ` — tsum_add : ∑' i, (f i + g i) = ∑' f + ∑' g with Summable hyps? Signature: `tsum_add (hf : Summable f) (hg : Summable g) : ∑' i, (f i + g i) = ∑' i, f i + ∑' i, g i` ✓. And `tsum_mul_left : ∑' i, c * f i = c * ∑' i, f i` (no summability needed? tsum_mul_left works unconditionally? I recall tsum_mul_left : ∑' (c * f) = c * ∑' f — unconditional ✓ (both sides 0 if nonsummable)). The summand in hsplit's goal after ← rw: (1/2)·(mult·A + mult·B) vs (mult/2)(A+B): per-term ring ✓ but the lambda forms must match for rw ← — the ← tsum_add produces ∑' ρ, (f ρ + g ρ) — then ← tsum_mul_left : pattern c * f i... my target summand after apply tsum_congr — hmm order: I want to transform the GOAL ∑' sigmaSlice = (1/2)(S1+S2) into per-term. Direction: conv on RHS? Let me instead: \n```lean\n have step : ∑' ρ, sigmaSlice k ρ = ∑' ρ, (1/2 : ℂ) *\n ((zeroMult ρ : ℂ) * (1 / (ρ:ℂ)) ^ k + (zeroMult ρ : ℂ) * (1 / ((starRingEnd ℂ) (ρ:ℂ))) ^ k) := by\n apply tsum_congr\n intro ρ\n rw [sigmaSlice]\n ring\n rw [step, tsum_mul_left, tsum_add hs1 hs2]\n```\n✓ cleaner: after rw [step]: goal (1/2)·∑'(...) = ... — rw [tsum_mul_left]: ∑' ((1/2)·g) = (1/2)·∑' g: matches LHS ✓; rw [tsum_add hs1 hs2]: ∑' (fρ + gρ) = S1+S2 — the summand form (mult·A + mult·B) matches f+g lambda ✓. Then hre.\n\nFor hre: after rw [← h]?? — h : ∑' a, f(conjZeroEquiv a) = ∑' b, f b. Goal: ∑' ρ, mult·(1/conjρ)^k = ∑' ρ, mult·(1/ρ)^k. Rewrite goal LHS to ∑' ρ, f(conjZeroEquiv ρ): tsum_congr: per-term: f(conjZeroEquiv ρ) = mult(conj ρ)·(1/conj ρ)^k: need = mult(ρ)·(1/conjρ)^k: zeroMult_conj ρ.2 : zeroMult (conj ρ) = zeroMult ρ — cast. So:\n```lean\n have hre : ... := by\n have h := Equiv.tsum_eq conjZeroEquiv\n (fun σ : {ρ : ℂ // IsNontrivialZero ρ} => (zeroMult σ : ℂ) * (1 / (σ : ℂ)) ^ k)\n rw [← h]\n apply tsum_congr\n intro ρ\n simp only [conjZeroEquiv, Equiv.coe_fn_mk]\n rw [zeroMult_conj ρ.2]\n```\nEquiv.tsum_eq signature check: `Equiv.tsum_eq (e : α ≃ β) (f : β → M) : ∑' a, f (e a) = ∑' b, f b` ✓ I'm fairly confident. simp [conjZeroEquiv] to expose the application: conjZeroEquiv ρ = ⟨conj ρ, _⟩: its coercion to ℂ: ((conjZeroEquiv ρ : {ρ // IsNontrivialZero ρ}) : ℂ) = conj ρ — via Equiv.coe_fn_mk + Subtype coe simp. `simp only [conjZeroEquiv, Equiv.coe_fn_mk, Coe.coe]`? Fragile — alternative: show the equality of the CASTS first:\n```lean\n intro ρ\n have e1 : ((conjZeroEquiv ρ : {ρ : ℂ // IsNontrivialZero ρ}) : ℂ) = (starRingEnd ℂ) (ρ : ℂ) := rfl\n rw [e1, zeroMult_conj ρ.2]\n```\ne1 by rfl: conjZeroEquiv ρ = ⟨conj ρ, _⟩ so its .1 = conj ρ ✓ rfl should hold (defeq through the structure). zeroMult_conj ρ.2 : zeroMult (conj ρ) = zeroMult ρ — the LHS term is zeroMult ((conjZeroEquiv ρ : subtype)) — after rw [e1]: zeroMult (conj ρ) — matches ✓. But zeroMult takes ℂ (zeroMult (ρ:ℂ) vs zeroMult of the subtype — in the summand it's (zeroMult ρ : ℂ) with ρ the SUBTYPE — zeroMult applied to the subtype's coerced value: zeroMult (ρ:ℂ)? In sigmaSlice def: (zeroMult ρ : ℂ) — ρ : subtype, zeroMult ρ means zeroMult (ρ:ℂ) via coe ✓. So rw [e1] changes the argument ✓.\n\nThen hs2's e : function equality: funext ρ: goal mult·(1/conjρ)^k = (f ∘ conjZeroEquiv) ρ = f(conjZeroEquiv ρ): same e1 rewrite: \n```lean\n funext ρ\n show (zeroMult ρ : ℂ) * (1 / ((starRingEnd ℂ) (ρ:ℂ))) ^ k =\n (zeroMult (conjZeroEquiv ρ) : ℂ) * (1 / ((conjZeroEquiv ρ : {ρ // _}) : ℂ)) ^ k\n rw [e1??, zeroMult_conj ρ.2]\n```\nHmm the RHS after Function.comp_apply simp. Let me write hs2 via: \n```lean\n rw [← conjZeroEquiv.summable_iff] at hs1 ⊢?? \n```\nCleaner: `Equiv.summable_iff (e) : Summable (fun a => f (e a)) ↔ Summable f`?? or (f ∘ e)? Signature: `Equiv.summable_iff (e : α ≃ β) : Summable (f ∘ e) ↔ Summable f`?? Hmm — there's `Equiv.summable_iff (e : α ≃ β) (f : β → M) : (Summable fun a => f (e a)) ↔ Summable f` I think. So:\n```lean\n have hs2 : Summable (fun ρ : {ρ : ℂ // IsNontrivialZero ρ} =>\n (zeroMult ρ : ℂ) * (1 / ((starRingEnd ℂ) (ρ : ℂ))) ^ k) := by\n rw [show (fun ρ : {ρ : ℂ // IsNontrivialZero ρ} =>\n (zeroMult ρ : ℂ) * (1 / ((starRingEnd ℂ) (ρ : ℂ))) ^ k) =\n fun ρ => (fun σ : {ρ : ℂ // IsNontrivialZero ρ} => (zeroMult σ : ℂ) * (1 / (σ : ℂ)) ^ k)\n (conjZeroEquiv ρ) from ?_]\n · exact (Equiv.summable_iff conjZeroEquiv _).mpr hs1 -- hmm direction\n · funext ρ\n ...per-term...\n```\nDirection: Equiv.summable_iff e f : Summable (fun a => f (e a)) ↔ Summable f — .mpr takes Summable f → Summable (f∘e) ✓.\n\nPer-term for the show: goal fun-family equality — funext ρ: mult(ρ)·(1/conjρ)^k = mult(conjZeroEquiv ρ)·(1/(conjZeroEquiv ρ:ℂ))^k: rw [e1, zeroMult_conj] as before ✓.\n\nNext k=1 pieces:\n\n```lean\n/-- The reflected master summability: Σ mult/‖1−ρ‖². -/\nlemma summable_mult_div_norm_sq_one_sub :\n Summable (fun ρ : {ρ : ℂ // IsNontrivialZero ρ} => (zeroMult ρ : ℝ) / ‖(1 : ℂ) - (ρ : ℂ)‖ ^ 2) := by\n have e : (fun ρ : {ρ : ℂ // IsNontrivialZero ρ} => (zeroMult ρ : ℝ) / ‖(1 : ℂ) - (ρ : ℂ)‖ ^ 2) =\n fun ρ => (fun σ : {ρ : ℂ // IsNontrivialZero ρ} => (zeroMult σ : ℝ) / ‖(σ : ℂ)‖ ^ 2)\n (oneSubZeroEquiv ρ) := by\n funext ρ\n have e1 : ((oneSubZeroEquiv ρ : {ρ : ℂ // IsNontrivialZero ρ}) : ℂ) = 1 - (ρ : ℂ) := rfl\n rw [e1, zeroMult_one_sub ρ.2.2.1 ρ.2.2.2]\n rw [e]\n exact (Equiv.summable_iff oneSubZeroEquiv _).mpr summable_mult_div_norm_sq\n```\nzeroMult_one_sub {ρ} (h0 : 0 < ρ.re) (h1 : ρ.re < 1) : zeroMult (1−ρ) = zeroMult ρ ✓ (LiReflect:388) — with ρ.2.2.1/ρ.2.2.2 (subtype access) ✓.\n\n```lean\n/-- The mixed term family Σ mult/(ρ(1−ρ)) is absolutely summable (AM-GM). -/\nlemma summable_mult_one_div_mul_one_sub :\n Summable (fun ρ : {ρ : ℂ // IsNontrivialZero ρ} =>\n (zeroMult ρ : ℂ) * (1 / ((ρ : ℂ) * (1 - (ρ : ℂ))))) := by\n have hsum := summable_mult_div_norm_sq.add summable_mult_div_norm_sq_one_sub\n apply Summable.of_norm_bounded (hsum.mul_left (1 / 2))\n intro ρ\n have hρ0 : (0 : ℝ) < ‖(ρ : ℂ)‖ := by\n have h2 := ρ.2.2.1\n -- 0 < re ≤ ‖ρ‖\n have hre : (ρ:ℂ).re ≤ ‖(ρ:ℂ)‖ := Complex.re_le_norm _\n linarith\n have h1ρ0 : (0 : ℝ) < ‖(1 : ℂ) - (ρ : ℂ)‖ := by\n have h2 := ρ.2.2.2\n have hre : (1 - (ρ:ℂ)).re ≤ ‖1 - (ρ:ℂ)‖ := Complex.re_le_norm _\n have : (1 - (ρ:ℂ)).re = 1 - (ρ:ℂ).re := by simp [Complex.sub_re, Complex.one_re]\n linarith\n rw [norm_mul, norm_div, norm_one, RCLike.norm_natCast, norm_mul]\n -- mult/(‖ρ‖‖1−ρ‖) ≤ (1/2)(mult/‖ρ‖² + mult/‖1−ρ‖²)\n have hbound : (zeroMult ρ : ℝ) / (‖(ρ : ℂ)‖ * ‖(1 : ℂ) - (ρ : ℂ)‖) ≤\n (1 / 2) * ((zeroMult ρ : ℝ) / ‖(ρ : ℂ)‖ ^ 2 + (zeroMult ρ : ℝ) / ‖(1 : ℂ) - (ρ : ℂ)‖ ^ 2) := by\n -- AM-GM: 1/(ab) ≤ (1/2)(1/a² + 1/b²)\n have hmul : (0 : ℝ) ≤ (zeroMult ρ : ℝ) := Nat.cast_nonneg _\n rw [div_le_iff₀ (mul_pos hρ0 h1ρ0)]\n -- mult ≤ (1/2)(mult/‖ρ‖² + mult/‖1−ρ‖²)·(‖ρ‖‖1−ρ‖)\n rw [mul_assoc]\n -- expand RHS: (1/2)·mult·(‖1−ρ‖/‖ρ‖ + ‖ρ‖/‖1−ρ‖) — messy; alternative: use two_mul_div_add...\n ...\n```\nAM-GM form: for a,b > 0: 1/(ab) ≤ (a⁻² + b⁻²)/2 ⟺ 2ab ≤ ... multiply both sides by 2·a²b²·... Let me use the standard inequality: (1/a)² + (1/b)² ≥ 2/(ab) — from (1/a − 1/b)² ≥ 0: 1/a² + 1/b² ≥ 2/(ab) ✓. In Lean: \n```lean\n have key : 2 / (‖(ρ : ℂ)‖ * ‖(1 : ℂ) - (ρ : ℂ)‖) ≤\n 1 / ‖(ρ : ℂ)‖ ^ 2 + 1 / ‖(1 : ℂ) - (ρ : ℂ)‖ ^ 2 := by\n have h1 : (0 : ℝ) ≤ (1 / ‖(ρ : ℂ)‖ - 1 / ‖(1 : ℂ) - (ρ : ℂ)‖) ^ 2 := sq_nonneg _\n -- expand: 1/‖ρ‖² − 2/(‖ρ‖‖1−ρ‖) + 1/‖1−ρ‖² ≥ 0\n have hexp : (1 / ‖(ρ : ℂ)‖ - 1 / ‖(1 : ℂ) - (ρ : ℂ)‖) ^ 2 =\n 1 / ‖(ρ : ℂ)‖ ^ 2 - 2 / (‖(ρ : ℂ)‖ * ‖(1 : ℂ) - (ρ : ℂ)‖) + 1 / ‖(1 : ℂ) - (ρ : ℂ)‖ ^ 2 := by\n field_simp [ne_of_gt hρ0, ne_of_gt h1ρ0]\n ring\n rw [hexp] at h1\n linarith\n calc (zeroMult ρ : ℝ) / (‖(ρ : ℂ)‖ * ‖(1 : ℂ) - (ρ : ℂ)‖)\n = (zeroMult ρ : ℝ) / 2 * (2 / (‖(ρ : ℂ)‖ * ‖(1 : ℂ) - (ρ : ℂ)‖)) := by ring\n _ ≤ (zeroMult ρ : ℝ) / 2 * (1 / ‖(ρ : ℂ)‖ ^ 2 + 1 / ‖(1 : ℂ) - (ρ : ℂ)‖ ^ 2) :=\n mul_le_mul_of_nonneg_left key (div_nonneg (Nat.cast_nonneg _) (by norm_num))\n _ = (1 / 2) * ((zeroMult ρ : ℝ) / ‖(ρ : ℂ)‖ ^ 2 + (zeroMult ρ : ℝ) / ‖(1 : ℂ) - (ρ : ℂ)‖ ^ 2) := by ring\n exact hbound\n```\nNote: div_le_iff₀ not needed in this version. field_simp with the ne facts then ring for hexp ✓ (or field_simp closes; add ring guarded — if field_simp closes, ring errors... risk. Write hexp differently: rw [sub_sq, ...]: (a−b)² = a² − 2ab + b²: a = 1/‖ρ‖: a² = 1/‖ρ‖² (div_pow, one_pow); 2ab = 2·(1/‖ρ‖)·(1/‖1−ρ‖) = 2/(‖ρ‖‖1−ρ‖) (one_div_mul_one_div): pure rw chain:\n```lean\n have hexp : (1 / ‖(ρ : ℂ)‖ - 1 / ‖(1 : ℂ) - (ρ : ℂ)‖) ^ 2 =\n 1 / ‖(ρ : ℂ)‖ ^ 2 - 2 / (‖(ρ : ℂ)‖ * ‖(1 : ℂ) - (ρ : ℂ)‖) + 1 / ‖(1 : ℂ) - (ρ : ℂ)‖ ^ 2 := by\n rw [sub_sq, div_pow, div_pow, one_pow, one_pow]\n rw [mul_sub, mul_comm (2:ℝ)...] hmm\n```\nsub_sq : (a−b)² = a² − 2ab + b² ✓. Then 2·(1/‖ρ‖)·(1/‖1−ρ‖): show = 2/(‖ρ‖·‖1−ρ‖): rw [one_div_mul_one_div]?? one_div_mul_one_div : (1/a)·(1/b) = 1/(a·b): then 2·(1/(‖ρ‖‖1−ρ‖)) = 2/(‖ρ‖‖1−ρ‖): mul_one_div: 2·(1/x) = 2/x ✓ `mul_one_div`. So:\n```lean\n rw [sub_sq, div_pow, div_pow, one_pow, one_pow, one_div_mul_one_div, mul_one_div]\n```\nResult: 1/‖ρ‖² − 2/(‖ρ‖‖1−ρ‖) + 1/‖1−ρ‖² = RHS ✓ — but wait the goal RHS has 1/‖ρ‖^2 with ^2 — div_pow gives (1/‖ρ‖)² = 1²/‖ρ‖²... after one_pow: 1/‖ρ‖^2 ✓ but the LHS sub_sq's a² is (1/‖ρ‖)^2 — div_pow turns (1/‖ρ‖)^2 into 1^2/‖ρ‖^2 ✓ then one_pow → 1/‖ρ‖^2 ✓ matches. Careful: div_pow : (a/b)^n = a^n/b^n ✓.\n\nThen the vTerm (for V = 0):\n\n```lean\n/-- The V-family: mult·(1/ρ̄ − 1/(1−ρ)), absolutely summable (O(‖ρ‖^{-1}‖1−ρ‖^{-1})). -/\nlemma summable_mult_vTerm :\n Summable (fun ρ : {ρ : ℂ // IsNontrivialZero ρ} =>\n (zeroMult ρ : ℂ) * (1 / ((starRingEnd ℂ) (ρ : ℂ)) - 1 / (1 - (ρ : ℂ)))) := by\n have hsum := summable_mult_div_norm_sq.add summable_mult_div_norm_sq_one_sub\n apply Summable.of_norm_bounded (hsum.mul_left (1 / 2))\n intro ρ\n -- 1/conjρ − 1/(1−ρ) = (1−ρ−conjρ)/(conjρ(1−ρ)); ‖1−ρ−conjρ‖ = |1−2re| ≤ 1\n have hρ0 : (0:ℝ) < ‖(ρ:ℂ)‖ := ... (as above)\n have h1ρ0 : (0:ℝ) < ‖(1:ℂ)−(ρ:ℂ)‖ := ...\n have hconj0 : (0:ℝ) < ‖((starRingEnd ℂ) (ρ:ℂ))‖ := by rw [starRingEnd_apply, norm_conj?? ...] — ‖conj ρ‖ = ‖ρ‖: `Complex.norm_conj`? hmm: RCLike.norm_conj? `norm_conj : ‖conj z‖ = ‖z‖`? For ℂ: `Complex.abs_conj`? or norm_star: ‖star z‖ = ‖z‖: `norm_star` ✓ (used LiSwaps:174: norm_star ✓). So rw [starRingEnd_apply, norm_star, ...] or norm_conj. Use: have : ‖((starRingEnd ℂ) (ρ:ℂ))‖ = ‖(ρ:ℂ)‖ := by rw [starRingEnd_apply, Complex.norm_conj]?? — starRingEnd_apply : starRingEnd ℂ z = conj z? it's rfl: starRingEnd ℂ z = star z = conj z: `starRingEnd_apply` simp lemma ✓; norm_conj : ‖conj z‖ = ‖z‖ ✓ `Complex.norm_conj`? hmm — safer `norm_star : ‖star z‖ = ‖z‖` ✓ exists. starRingEnd ℂ z = star z definitionally? starRingEnd_apply gives conj — and norm_conj — let me just: simp [starRingEnd_apply, Complex.norm_conj]... I'll use norm_star after starRingEnd_apply... The cleanest: ‖((starRingEnd ℂ) (ρ:ℂ))‖ = ‖(ρ:ℂ)‖ := norm_star _?? — starRingEnd ℂ ρ = star ρ (defeq?): starRingEnd is defined as star for RCLike: (starRingEnd ℂ) z = star z ✓ rfl? I think `starRingEnd_apply : (starRingEnd R) x = star x` is rfl-lemma ✓. So norm_star _ : ‖star ρ‖ = ‖ρ‖ — with the starRingEnd application defeq star — `exact norm_star _` might work by defeq. Fallback simp.\n -- the identity:\n have hid : 1 / ((starRingEnd ℂ) (ρ:ℂ)) - 1 / (1 - (ρ:ℂ)) =\n ((1 : ℂ) - (ρ:ℂ) - (starRingEnd ℂ) (ρ:ℂ)) / (((starRingEnd ℂ) (ρ:ℂ)) * (1 - (ρ:ℂ))) := by\n field_simp [ne_of_gt hconj0-as-ℂ-ne, ne_of_gt h1ρ0-as-ℂ-ne]\n ring\n -- ‖num‖ = |1 − 2re| ≤ 1:\n have hnum : ‖(1 : ℂ) - (ρ:ℂ) - (starRingEnd ℂ) (ρ:ℂ)‖ ≤ 1 := by\n have e : (1 : ℂ) - (ρ:ℂ) - (starRingEnd ℂ) (ρ:ℂ) = ((1 - 2 * (ρ:ℂ).re : ℝ) : ℂ) := by\n rw [starRingEnd_apply]\n -- 1 − ρ − conj ρ = 1 − (ρ + conjρ) = 1 − 2re\n have h := Complex.add_conj (ρ:ℂ) -- ρ + conjρ = 2re\n ...\n push_cast\n ring_nf?? \n rw [e, Complex.norm_real, Real.norm_eq_abs]\n have hre0 := ρ.2.2.1; have hre1 := ρ.2.2.2\n rw [abs_le]\n constructor <;> linarith\n rw [hid, norm_div, norm_mul, norm_mul, RCLike.norm_natCast]\n -- mult·‖num‖/(‖conjρ‖‖1−ρ‖) ≤ mult·1/(‖ρ‖‖1−ρ‖) ≤ (1/2)(...) via the AM-GM hbound machinery\n ...\n```\nReuse: factor the AM-GM bound as a separate lemma to avoid duplication:\n```lean\nlemma mult_div_norm_mul_norm_le (ρ : {ρ : ℂ // IsNontrivialZero ρ}) :\n (zeroMult ρ : ℝ) / (‖(ρ : ℂ)‖ * ‖(1 : ℂ) - (ρ : ℂ)‖) ≤\n (1 / 2) * ((zeroMult ρ : ℝ) / ‖(ρ : ℂ)‖ ^ 2 + (zeroMult ρ : ℝ) / ‖(1 : ℂ) - (ρ : ℂ)‖ ^ 2)\n```\n(As designed above.) Then:\n- summable_mult_one_div_mul_one_sub: term norm = mult/(‖ρ‖‖1−ρ‖) (norm computations) ≤ the AM-GM bound ✓ dominator ((1/2)·sum) summable ✓.\n- summable_mult_vTerm: term norm = mult·‖num‖/(‖conjρ‖‖1−ρ‖) ≤ mult·1/(‖ρ‖‖1−ρ‖) ≤ AM-GM bound ✓.\n\nFor e : 1 − ρ − conjρ = ((1 − 2re : ℝ):ℂ): \n```lean\n have e : (1 : ℂ) - (ρ:ℂ) - (starRingEnd ℂ) (ρ:ℂ) = ((1 - 2 * (ρ:ℂ).re : ℝ) : ℂ) := by\n have h2 : (starRingEnd ℂ) (ρ:ℂ) = ((2 * (ρ:ℂ).re : ℝ) : ℂ) - (ρ:ℂ) := by\n have h := Complex.add_conj (ρ:ℂ) -- ρ + conj ρ = ↑(2·re)\n -- conj ρ = 2re − ρ\n rw [starRingEnd_apply] -- goal conjρ = 2re − ρ\n have h2 : (ρ:ℂ) + (starRingEnd ℂ) (ρ:ℂ) = ((2 * (ρ:ℂ).re : ℝ) : ℂ) := h\n -- solve\n have h3 := congrArg (fun z => z - (ρ:ℂ)) h2\n simp at h3\n -- h3 : conjρ = 2re − ρ?? add_sub: ρ + conjρ − ρ = conjρ\n convert h3 using 1\n ring\n rw [h2]\n push_cast\n ring\n```\nComplex.add_conj : z + conj z = ↑(2·z.re)? — from LiSwaps:150: `hac : ∀ z : ℂ, z + (starRingEnd ℂ) z = ((2 * z.re : ℝ) : ℂ) := fun z => Complex.add_conj z` ✓ exact form confirmed. Then ρ + conjρ = 2re ⟹ conjρ = 2re − ρ: h3 = congrArg (· − ρ) h2: (ρ + conjρ) − ρ = 2re − ρ: LHS = conjρ (add_sub_cancel?? ρ + conjρ − ρ = conjρ: `add_sub_cancel_left`? ρ + w − ρ = w: `add_sub_cancel_left : a + b − a = b` ✓). simp might do it; or rw [add_sub_cancel_left] at h3. Then 1 − ρ − (2re − ρ) = 1 − 2re: push_cast; ring ✓ (h2 substitution then ring).\n\nHmm — but actually maybe simpler: directly: 1 − ρ − conjρ = 1 − (ρ + conjρ) = 1 − 2re: rw [← sub_sub, hac...]: 1 − ρ − conjρ = 1 − (ρ + conjρ) via `sub_sub : a − b − c = a − (b + c)` ✓: rw [sub_sub, Complex.add_conj]; push_cast; ring? After sub_sub: 1 − (ρ + conjρ): rw [Complex.add_conj]: 1 − ((2·re:ℝ):ℂ): goal: 1 − ↑(2·re) = ↑(1−2·re): push_cast; ring ✓. Cleaner!\n\nabs_le: |1−2re| ≤ 1 ⟺ −1 ≤ 1−2re ∧ 1−2re ≤ 1: from 0 < re < 1: 1−2re ∈ (−1, 1) ✓ linarith with re0 re1.\n\nNow the V = 0 lemma:\n\n```lean\n/-- The V-sum vanishes: the conj and reflect reindexes give V = −V. -/\nlemma vTerm_tsum_eq_zero :\n ∑' ρ : {ρ : ℂ // IsNontrivialZero ρ},\n (zeroMult ρ : ℂ) * (1 / ((starRingEnd ℂ) (ρ : ℂ)) - 1 / (1 - (ρ : ℂ))) = 0 := by\n set V := ∑' ρ : {ρ : ℂ // IsNontrivialZero ρ},\n (zeroMult ρ : ℂ) * (1 / ((starRingEnd ℂ) (ρ : ℂ)) - 1 / (1 - (ρ : ℂ))) with hV\n have h1 : V = ∑' ρ : {ρ : ℂ // IsNontrivialZero ρ},\n (zeroMult ρ : ℂ) * (1 / (ρ : ℂ) - 1 / (1 - (starRingEnd ℂ) (ρ : ℂ))) := by\n rw [hV]\n have h := Equiv.tsum_eq conjZeroEquiv (fun σ : {σ : ℂ // IsNontrivialZero σ} =>\n (zeroMult σ : ℂ) * (1 / (σ : ℂ) - 1 / (1 - (starRingEnd ℂ) (σ : ℂ))))\n -- h : ∑' a, f (conjZeroEquiv a) = ∑' b, f b\n rw [← h]\n apply tsum_congr\n intro ρ\n have e1 : ((conjZeroEquiv ρ : {ρ : ℂ // IsNontrivialZero ρ}) : ℂ) = (starRingEnd ℂ) (ρ : ℂ) := rfl\n rw [e1, zeroMult_conj ρ.2]\n -- mult·(1/conjρ − 1/(1−conj(conjρ))) = mult·(1/conjρ − 1/(1−ρ))?? \n```\nWAIT — check the algebra direction. h1's RHS family at the conjZeroEquiv image: f(⟨conjρ, _⟩) = mult(conjρ)·(1/conjρ − 1/(1−conj(conjρ))) = mult(ρ)·(1/conjρ − 1/(1−ρ)) (zeroMult_conj; conj(conjρ) = ρ). Hmm — that gives V = ∑' mult·(1/conjρ − 1/(1−ρ)) = V — trivially. WRONG choice of f. Let me redo.\n\nV = ∑' ρ, mult·v(ρ) where v(ρ) = 1/conjρ − 1/(1−ρ).\nReindex by conjEquiv e₁: V = ∑' ρ, mult(e₁ρ)·v'(e₁ρ)... Equiv.tsum_eq e₁ g : ∑' a, g(e₁ a) = ∑' b, g b. To get V on the RHS: choose g = the v-family: g σ = mult(σ)·(1/conjσ − 1/(1−σ)): ∑' ρ, g(e₁ρ) = V. g(e₁ρ) = mult(conjρ)·(1/conj(conjρ) − 1/(1−conjρ)) = mult(ρ)·(1/ρ − 1/(1−conjρ)). So:\nW := ∑' ρ, mult·(1/ρ − 1/(1−conjρ)) = V. (I)\nReindex W by oneSubEquiv e₂: W = ∑' ρ, g'(e₂ρ) with g' τ = mult(τ)·(1/τ − 1/(1−conjτ)): g'(e₂ρ) = mult(1−ρ)·(1/(1−ρ) − 1/(1−conj(1−ρ))) = mult(ρ)·(1/(1−ρ) − 1/conjρ) (zeroMult_one_sub; 1−conj(1−ρ) = 1−(1−conjρ) = conjρ). = −mult·v(ρ). So W = ∑' ρ, −mult·v(ρ) = −V (tsum_neg). (II)\nFrom (I),(II): V = −V ⟹ V = 0 ✓.\n\nSo h1 : V = W (via conjZeroEquiv with g = v-family) and h2 : W = −V (via oneSubEquiv with g = w-family). Then V = 0.\n\nIn Lean:\n```lean\n have h1 : V = ∑' ρ : {ρ : ℂ // IsNontrivialZero ρ},\n (zeroMult ρ : ℂ) * (1 / (ρ : ℂ) - 1 / (1 - (starRingEnd ℂ) (ρ : ℂ))) := by\n have h := Equiv.tsum_eq conjZeroEquiv (fun σ : {σ : ℂ // IsNontrivialZero σ} =>\n (zeroMult σ : ℂ) * (1 / ((starRingEnd ℂ) (σ : ℂ)) - 1 / (1 - (σ : ℂ))))\n -- h : ∑' ρ, vFam(conjZeroEquiv ρ) = V\n rw [hV, ← h]\n apply tsum_congr\n intro ρ\n have e1 : ((conjZeroEquiv ρ : {ρ : ℂ // IsNontrivialZero ρ}) : ℂ) = (starRingEnd ℂ) (ρ : ℂ) := rfl\n rw [e1, zeroMult_conj ρ.2]\n congr 2\n -- goal: 1/conjρ − 1/(1−ρ) = 1/conjρ − 1/(1−conj(conjρ)): conj conj\n rw [starRingEnd_apply, starRingEnd_apply, Complex.conj_conj]\n```\nHmm — the goal after rw [e1, zeroMult_conj]: LHS (V's summand at ρ): mult·(1/conjρ − 1/(1−ρ)); RHS: mult·(1/ρ?? — wait let me redo. h1 claims V = W where W's summand is mult·(1/ρ − 1/(1−conjρ)). The proof: V = ∑' vFam = [Equiv.tsum_eq conjZeroEquiv vFam : ∑' ρ, vFam(conjEquiv ρ) = ∑' vFam] — so ∑' vFam = ∑' ρ, vFam(conjEquiv ρ) (.symm). vFam(conjEquiv ρ) = mult(conjρ)·(1/conj(conjρ) − 1/(1−conjρ)) = mult(ρ)·(1/ρ − 1/(1−conjρ)) = W's summand ✓. So:\n```lean\n have h1 : V = W := by\n have h := Equiv.tsum_eq conjZeroEquiv vFam -- h : ∑' ρ, vFam (conjZeroEquiv ρ) = V\n rw [hV, ← h]\n apply tsum_congr\n intro ρ\n -- goal: vFam ρ = vFam (conjZeroEquiv ρ)\n rw [e1, zeroMult_conj ρ.2]\n -- LHS: mult·(1/conjρ − 1/(1−ρ)); RHS: mult·(1/conj(conjρ) − 1/(1−conjρ))\n rw [starRingEnd_apply, Complex.conj_conj]\n```\nthe last rw: conj(conjρ) → ρ: starRingEnd_apply rewrites starRingEnd ℂ z → conj z (if it's the simp form) then Complex.conj_conj : conj (conj z) = z ✓. Might need to target: the RHS has 1/((starRingEnd ℂ) ((starRingEnd ℂ) ρ)) — rw [starRingEnd_apply] turns into 1/(conj (conj ρ))... starRingEnd_apply : starRingEnd R x = star x?? and conj = star for ℂ — the outer form: after e1, the term is 1 / ((starRingEnd ℂ) ((starRingEnd ℂ) (ρ:ℂ))). simp [starRingEnd_apply]: starRingEnd ℂ z = conj z? Hmm — actually starRingEnd_apply is `starRingEnd_apply : starRingEnd R x = star x`?? or is it an rfl-lemma about application? In Mathlib: `starRingEnd_apply : (starRingEnd R) x = star x` — rfl. And for ℂ: star x = conj x: `RCLike.star_def`? or Complex.star_def : star z = conj z ✓. So simp only [starRingEnd_apply, Complex.star_def, Complex.conj_conj] should reduce starRingEnd (starRingEnd ρ) → conj(conj ρ) → ρ ✓. I'll use a small simp call and fix at build. Where does W = −V come from:\n\n```lean\n have h2 : (∑' ρ : {ρ : ℂ // IsNontrivialZero ρ},\n (zeroMult ρ : ℂ) * (1 / (ρ : ℂ) - 1 / (1 - (starRingEnd ℂ) (ρ : ℂ)))) = -V := by\n have h := Equiv.tsum_eq oneSubZeroEquiv (fun σ : {σ : ℂ // IsNontrivialZero σ} =>\n (zeroMult σ : ℂ) * (1 / (σ : ℂ) - 1 / (1 - (starRingEnd ℂ) (σ : ℂ))))\n -- h : ∑' ρ, wFam(oneSubZeroEquiv ρ) = W\n rw [← h]\n -- goal: ∑' ρ, wFam(oneSubZeroEquiv ρ) = -V: per-term = −vFam ρ; tsum_neg\n rw [show (fun ρ => (zeroMult (oneSubZeroEquiv ρ) : ℂ) *\n (1 / ((oneSubZeroEquiv ρ : {ρ // _}) : ℂ) - 1 / (1 - (starRingEnd ℂ) ((oneSubZeroEquiv ρ : {ρ // _}) : ℂ)))) =\n fun ρ => -((zeroMult ρ : ℂ) * (1 / ((starRingEnd ℂ) (ρ : ℂ)) - 1 / (1 - (ρ : ℂ)))) from ?_]\n · rw [tsum_neg, hV]\n · funext ρ\n have e1 : ((oneSubZeroEquiv ρ : {ρ : ℂ // IsNontrivialZero ρ}) : ℂ) = 1 - (ρ : ℂ) := rfl\n rw [e1, zeroMult_one_sub ρ.2.2.1 ρ.2.2.2]\n -- mult·(1/(1−ρ) − 1/(1−conj(1−ρ))) = −mult·(1/conjρ − 1/(1−ρ))\n have e2 : (1 : ℂ) - (starRingEnd ℂ) (1 - (ρ : ℂ)) = (starRingEnd ℂ) (ρ : ℂ) := by\n simp [starRingEnd_apply, Complex.star_def?? map_sub, map_one]\n -- conj(1−ρ) = 1 − conjρ: map_sub, map_one; 1 − (1−conjρ) = conjρ: sub_sub_cancel\n rw [e2]\n ring\n -- V = −V\n have h3 : V = -V := h1.trans h2\n -- ⟹ V = 0\n have h4 : V + V = V + (-V) := congrArg (V + ·) h3 -- hmm simpler: eq_zero_of_neg_eq\n ...\n```\nFor V = −V ⟹ V = 0 in ℂ: `eq_zero_of_neg_eq : -a = a → a = 0`? or: from h3 : V = −V: two_mul: 2V = 0: \n```lean\n have : V = 0 := by\n have h4 : V + V = 0 := by\n calc V + V = V + (-V) := by rw [h3]\n _ = 0 := add_neg_cancel V\n -- V + V = 0 ⟹ V = 0\n have h5 : (2 : ℂ) * V = 0 := by linear_combination h4\n exact (mul_eq_zero.mp h5).resolve_left (by norm_num)\n```\nOr `eq_zero_of_neg_eq h3.symm`?? eq_zero_of_neg_eq : -a = a → a = 0 — h3 : V = −V: h3.symm : −V = V ✓ `exact eq_zero_of_neg_eq h3.symm` ✓ cleaner (if the lemma name is right — `eq_zero_of_neg_eq` exists in Mathlib.Algebra... ✓ I'm fairly confident).\n\ne2: 1 − conj(1−ρ) = conjρ: conj(1−ρ) = conj 1 − conj ρ = 1 − conjρ (map_sub, map_one/starRingEnd): then 1 − (1 − conjρ) = conjρ (sub_sub_cancel). simp [starRingEnd_apply, map_sub, map_one, sub_sub_cancel]?? — starRingEnd is a ring hom: (starRingEnd ℂ) (1−ρ) = 1 − (starRingEnd ℂ)ρ via map_sub/map_one ✓ simp lemmas. So: rw [map_sub, map_one, starRingEnd_apply??] — careful with the conj forms: starRingEnd_apply : starRingEnd ℂ x = star x? hmm — earlier code: (starRingEnd ℂ) ρ used directly with Complex.add_conj — LiSwaps:147: `hconj : (1 / ((starRingEnd ℂ) (ρ:ℂ))) = (starRingEnd ℂ) (1 / (ρ:ℂ)) := by rw [map_div₀, map_one]` — so they rw with map_* directly on starRingEnd applications ✓. For e2:\n```lean\n have e2 : (1 : ℂ) - (starRingEnd ℂ) (1 - (ρ : ℂ)) = (starRingEnd ℂ) (ρ : ℂ) := by\n rw [map_sub, map_one]\n -- 1 − (1 − starRingEnd ρ) = starRingEnd ρ\n rw [sub_sub_cancel]\n```\nmap_sub : f (a−b) = f a − f b ✓ (starRingEnd is ring hom); map_one ✓; sub_sub_cancel : a − (a − b) = b ✓. \n\nAlso in h2's `show ... from ?_`: the lambda with oneSubZeroEquiv applications inside — messy. Alternative formulation avoiding the show: \n```lean\n have h2 : W = -V := by\n rw [← tsum_neg]\n -- goal: W = ∑' ρ, −(vFam ρ)\n rw [← h] -- h : ∑' ρ, wFam(oneSubZeroEquiv ρ) = W; ← rewrites W → that tsum\n apply tsum_congr\n intro ρ\n -- per-term: wFam(oneSubZeroEquiv ρ) = −(vFam ρ)\n ...\n```\nHmm rw [← tsum_neg] on goal W = −V: −V = −(∑' vFam): tsum_neg : ∑' (−f) = −∑' f: ← turns −∑' vFam into ∑' (−vFam) ✓ — but −V where V is `set` variable — the set makes V a local def; −V vs −∑' vFam: rw [hV] first to expose. Order:\n```lean\n have h2 : W = -V := by\n rw [hV, ← tsum_neg, ← h]\n apply tsum_congr\n ...\n```\nWait — rw [hV] rewrites V → ∑' vFam EVERYWHERE in goal W = −V → W = −∑' vFam ✓; ← tsum_neg: −∑' vFam → ∑' ρ, −vFam ρ ✓; ← h: W → ∑' wFam(oneSubZeroEquiv ρ)?? h : ∑' ρ, wFam(oneSubZeroEquiv ρ) = W: ← h rewrites W → ∑' ρ, wFam(oneSubZeroEquiv ρ) ✓. Goal: ∑' ρ, wFam(e₂ρ) = ∑' ρ, −vFam ρ ✓ tsum_congr. But h's W must be stated with the explicit tsum (not the set-V). Let me NOT use `set` for W; write both families explicitly. OK.\n\nSimilarly h1: goal V = Wtsum: rw [hV, ← h]: hV : V = ∑' vFam (the set definition — hV is the set equation: `set V := ∑' ... with hV` gives hV : V = ∑' ...). rw [hV]: goal ∑' vFam = Wtsum; ← h : h : ∑' ρ, vFam(conjEquiv ρ) = ∑' vFam: ← h rewrites the LHS ∑' vFam → ∑' ρ, vFam(conjEquiv ρ) ✓. Goal: ∑' ρ, vFam(conjEquiv ρ) = Wtsum: tsum_congr per-term: vFam(conjEquiv ρ) = wFam ρ ✓ as computed.\n\nPer-term h1: vFam(conjZeroEquiv ρ) = mult(conjρ)·(1/conj(conjρ) − 1/(1−conjρ)): after e1/zeroMult_conj/simp-conj-conj: = mult·(1/ρ − 1/(1−conjρ)) ✓ = wFam ρ ✓ — the congr: after rw [e1, zeroMult_conj ρ.2]: goal mult·(1/conjρ − 1/(1−ρ))?? NO WAIT — LHS is vFam(conjZeroEquiv ρ): with e1 the zeroMult argument becomes conjρ → zeroMult_conj turns to mult(ρ); the rest: (1/((starRingEnd ℂ)((conjZeroEquiv ρ):ℂ)) − 1/(1−((conjZeroEquiv ρ):ℂ))): e1 rewrites the casts: (1/(starRingEnd (starRingEnd ρ)) − 1/(1−starRingEnd ρ)) = (1/ρ − 1/(1−conjρ)) after conj-conj simp. So goal after rws: mult·(1/ρ − 1/(1−conjρ)) = wFam ρ ✓ — need conj-conj rewrite BEFORE matching: order: rw [e1] (casts), then the starRingEnd-double: simp only [starRingEnd_apply, Complex.star_def, Complex.conj_conj]... hmm the (starRingEnd ℂ) ((starRingEnd ℂ) ρ) — after starRingEnd_apply twice: conj (conj ρ) → ρ via Complex.conj_conj ✓. But careful starRingEnd_apply might rewrite ALL instances including the outer ones I want to keep (1−starRingEnd ρ) — that's fine: (1 − conj ρ) ✓ same thing, then tsum_congr closes by rfl.\n\nThe final RHS form must match W's declared family EXACTLY: W family := mult·(1/ρ − 1/(1−starRingEnd ρ)). After simp: LHS: mult·(1/ρ − 1/(1−conj ρ)) — star vs conj: starRingEnd_apply would also turn the RHS pattern... in tsum_congr the goal is vFam(e₁ρ) = wFam(ρ): RHS wFam(ρ) = mult·(1/ρ − 1/(1−starRingEnd ρ)): after simp [starRingEnd_apply, Complex.star_def]: RHS → mult·(1/ρ − 1/(1−conjρ))?? wait starRingEnd_apply turns starRingEnd→star, then star_def: star z = conj z. Ugh — actually for ℂ: starRingEnd ℂ = conj as functions? `RCLike.starRingEnd_eq_conj`? Hmm — in Mathlib, for RCLike types: `starRingEnd_apply : starRingEnd R x = star x` and Complex: star = conj (`Complex.star_def : star z = conj z`? or it's rfl). LiSwaps:150 used Complex.add_conj : z + starRingEnd ℂ z = 2re — so starRingEnd ℂ z IS conj z for the lemma. OK — I'll normalize with simp only [starRingEnd_apply] which should leave `star`, and both sides will have star — matching. Let me not over-plan: use `simp` per-term and see.\n\nNow two_mul_sigmaP_one:\n```lean\n/-- Twice σ₁ is the mixed series: 2·sigmaP 1 = Σ mult/(ρ(1−ρ)). -/\nlemma two_mul_sigmaP_one :\n (2 : ℂ) * sigmaP 1 = ∑' ρ : {ρ : ℂ // IsNontrivialZero ρ},\n (zeroMult ρ : ℂ) * (1 / ((ρ : ℂ) * (1 - (ρ : ℂ)))) := by\n have hT : Summable ... := summable_mult_one_div_mul_one_sub\n have hσ : Summable (sigmaSlice 1) := sigmaSlice_summable 1 le_rfl\n -- per-term: 2·sigmaSlice 1 ρ = mult·(1/ρ + 1/conjρ)\n have h1 : (2 : ℂ) * sigmaP 1 = ∑' ρ : {ρ : ℂ // IsNontrivialZero ρ},\n (zeroMult ρ : ℂ) * (1 / (ρ : ℂ) + 1 / ((starRingEnd ℂ) (ρ : ℂ))) := by\n rw [sigmaP, ← tsum_mul_left]\n apply tsum_congr\n intro ρ\n rw [sigmaSlice, pow_one, pow_one]\n ring\n -- per-term: mult·(1/(ρ(1−ρ))) = mult·(1/ρ + 1/(1−ρ))\n have h2 : (∑' ρ : {ρ : ℂ // IsNontrivialZero ρ},\n (zeroMult ρ : ℂ) * (1 / ((ρ : ℂ) * (1 - (ρ : ℂ))))) =\n ∑' ρ : {ρ : ℂ // IsNontrivialZero ρ},\n (zeroMult ρ : ℂ) * (1 / (ρ : ℂ) + 1 / (1 - (ρ : ℂ))) := by\n apply tsum_congr\n intro ρ\n have hρ0 : (ρ : ℂ) ≠ 0 := ...\n have h1ρ : (1 : ℂ) - (ρ : ℂ) ≠ 0 := ...\n congr 1\n field_simp [hρ0, h1ρ]\n ring\n rw [h1, h2]\n -- difference is V = 0\n have h3 : (∑' ρ, mult·(1/ρ + 1/conjρ)) - (∑' ρ, mult·(1/ρ + 1/(1−ρ))) =\n ∑' ρ, mult·(1/conjρ − 1/(1−ρ)) := by\n rw [← tsum_sub ??]\n · apply tsum_congr\n intro ρ\n ring\n · -- summable of first family\n ...\n · -- summable of second family\n ...\n -- the second family summable: from hT via per-term rewrite\n have hsnd : Summable (fun ρ => (zeroMult ρ : ℂ) * (1 / (ρ : ℂ) + 1 / (1 - (ρ : ℂ)))) := by\n apply hT.congr\n intro ρ\n ... per-term field identity ...\n -- the first family summable: sigmaSlice_summable 1 via per-term rewrite\n have hfst : Summable (fun ρ => (zeroMult ρ : ℂ) * (1 / (ρ : ℂ) + 1 / ((starRingEnd ℂ) (ρ : ℂ)))) := by\n apply (sigmaSlice_summable 1 le_rfl).congr\n intro ρ\n rw [sigmaSlice, pow_one, pow_one]\n ring\n rw [h3, vTerm_tsum_eq_zero] at *?? \n```\nAssemble: h1 : 2σ₁ = Fst; h2 : T = Snd; h3 : Fst − Snd = V = 0 ⟹ Fst = Snd = T: so 2σ₁ = T ✓: \n```lean\n have hFst : Fst = Snd := sub_eq_zero.mp (by rw [h3]; exact vTerm_tsum_eq_zero)\n rw [h1, hFst, ← h2]\n```\nSummable.congr : Summable f → (∀ i, f i = g i) → Summable g ✓ exists (`Summable.congr`). tsum_sub : ∑' (f − g) = ∑' f − ∑' g with summabilities: `tsum_sub (hf : Summable f) (hg : Summable g)` ✓.\n\nFor h1's ← tsum_mul_left: goal (2)·∑' sigmaSlice = ∑' (2·sigmaSlice)?? tsum_mul_left : ∑' (c * f) = c * ∑' f: ← turns (2)·∑' → ∑' (2·sigmaSlice)?? the pattern: (2:ℂ) * sigmaP 1 where sigmaP 1 = ∑' sigmaSlice 1 — rw [sigmaP] exposes; ← tsum_mul_left: rewrites (2:ℂ) * ∑' sigmaSlice 1 → ∑' ρ, 2 * sigmaSlice 1 ρ ✓ then tsum_congr: 2·sigmaSlice 1 ρ = mult·(1/ρ + 1/conjρ): rw [sigmaSlice, pow_one, pow_one]: 2·((mult/2)(1/ρ + 1/conjρ)) = ...: ring ✓.\n\nh2's per-term: 1/(ρ(1−ρ)) = 1/ρ + 1/(1−ρ): field_simp [hρ0, h1ρ]; ring — wait direction: goal after congr 1: 1/((ρ)*(1−ρ)) = 1/ρ + 1/(1−ρ): field_simp; ring ✓ (if field_simp closes, ring errors — the banked gotcha... write field_simp [hρ0, h1ρ] then ring only if needed — I'll include ring and remove if \"no goals\" error appears).\n\nHmm — congr 1: goal mult·(1/(ρ(1−ρ))) = mult·(1/ρ + 1/(1−ρ)): congr 1 reduces to 1/(ρ(1−ρ)) = 1/ρ + 1/(1−ρ) ✓.\n\nThen the k=1 capstone:\n```lean\n/-- (M) at k = 1: σ₁ = −gFun(0). -/\nlemma sigmaP_one_eq_neg_gFun_zero (hZC : ZeroCountProp) : sigmaP 1 = -gFun 0 := by\n have h2 := two_mul_sigmaP_one\n rw [← seriesFun_one] at h2 -- 2·σ₁ = seriesFun 1\n have hg1 := gFun_one hZC -- gFun 1 = B + seriesFun 1\n have hg0 := gFun_zero hZC -- gFun 0 = B\n have hfe := gFun_one_eq_neg -- gFun 1 = −gFun 0\n -- seriesFun 1 = gFun 1 − B = −2B\n -- 2σ₁ = −2·gFun 0 ⟹ σ₁ = −gFun 0\n linear_combination h2 + hg1 - hg0 - hfe\n```\nlinear_combination over ℂ ✓ works (it's for commutative rings ✓). Check: goal σ₁ = −gFun 0: coeffs: h2 : 2σ₁ = seriesFun 1; hg1 : gFun 1 = B + seriesFun 1; hg0 : gFun 0 = B; hfe : gFun 1 = −gFun 0. goal−LHS combos: 2σ₁ − (−gFun0)?? Let me verify: h2 + hg1 − hg0 − hfe: LHS: 2σ₁ + gFun1 − gFun0 − gFun1 = 2σ₁ − gFun0; RHS: seriesFun1 + (B + seriesFun1) − B − (−gFun0) = 2·seriesFun1 + gFun0. So 2σ₁ − gFun0 = 2·seriesFun1 + gFun0 — that's not the goal form... linear_combination checks goal LHS − combo LHS = goal RHS − combo RHS as ring identity? linear_combination e : proves goal a = b when a − (LHS e) = b − (RHS e) by ring. e = h2 + hg1 − hg0 − hfe: LHS e = 2σ₁+gFun1−gFun0−gFun1 = 2σ₁ − gFun0; RHS e = seriesFun1 + B + seriesFun1 − B + gFun0 = 2·seriesFun1 + gFun0. Goal: σ₁ = −gFun0: check σ₁ − (2σ₁ − gFun0) = −σ₁ + gFun0 vs −gFun0 − (2seriesFun1 + gFun0) = −2seriesFun1 − 2gFun0: ring identity?? −σ₁+gFun0 ≠ −2seriesFun1−2gFun0 in general ✗. Wrong combo. Solve: want σ₁ = −g0 given 2σ₁ = SF1, g1 = B+SF1, g0 = B, g1 = −g0: 2σ₁ = SF1 = g1 − B = −g0 − g0 = −2g0 ✓. e should satisfy: LHS e = 2·(goal LHS), i.e. take e = h2 − hg1 + hg0 + hfe: LHS: 2σ₁ − g1 + g0 + g1 = 2σ₁ + g0; RHS: SF1 − (B+SF1) + B + (−g0) = −g0. So e: 2σ₁+g0 = −g0: goal σ₁ = −g0: σ₁ − (2σ₁+g0)/2... linear_combination e/2: linear_combination (h2 - hg1 + hg0 + hfe)/2: check: goal − e/2: σ₁ − (2σ₁+g0)/2 = −g0/2... and −g0 − (−g0)/2 = −g0/2 ✓ ring ✓. So `linear_combination (h2 - hg1 + hg0 + hfe) / 2` ✓.\n\n§5 — the derivative machine:\n\n```lean\n/-! ## 5. Termwise iterated derivation at 0 (k ≥ 2) -/\n\n/-- The zpow derivative lemma (no leading minus; c := −ρ). -/\nlemma iteratedDeriv_zpow_neg_one (k : ℕ) (c : ℂ) {s : ℂ} (hs : s + c ≠ 0) :\n iteratedDeriv k (fun s : ℂ => (s + c) ^ (-1 : ℤ)) s =\n (-1 : ℂ) ^ k * (k ! : ℂ) * (s + c) ^ (-(k : ℤ) - 1) := by\n have h := iteratedDeriv_neg_zpow_neg_one_add k c hs\n have e : (fun s : ℂ => (s + c) ^ (-1 : ℤ)) = fun s => -(-((s + c) ^ (-1 : ℤ))) := by\n funext s\n rw [neg_neg]\n rw [e, ← iteratedDeriv_neg, h]\n ring\n```\niteratedDeriv_neg : iteratedDeriv n (−f) = −iteratedDeriv n f — `iteratedDeriv_neg`?? hmm — check: iteratedDerivWithin_neg exists? There's `iteratedDeriv_neg`?? not sure. Fallback: iteratedDeriv n (−f) x = −(iteratedDeriv n f x) via `iteratedDerivWithin_neg` on univ + Within-of-isOpen... Or avoid: my per-term: 1/(s−ρ) = (s+(−ρ))^{−1} — use LiDigamma's lemma with the negation INSIDE: (s+(−ρ))^{−1} = −(−((s+(−ρ))^{−1})): so iteratedDeriv k (that) = −(−(−1)^k k! (s+(−ρ))^{−k−1}) = (−1)^k k! (s+(−ρ))^{−k−1} ✓ same. The iteratedDeriv_neg name: Mathlib has `iteratedDeriv_neg : iteratedDeriv n (-f) = -iteratedDeriv n f`?? — grep Mathlib quickly at build. If missing: use iteratedDeriv_const_mul with c = −1: −g = (−1)·g: `iteratedDeriv_const_mul`?? also uncertain. Hmm — safest: use Filter.EventuallyEq: (−f) — or just prove via deriv induction... Actually simplest: note our per-term function is mult·((s+c)^{−1} + 1/ρ) and the closed-form lemma iteratedDeriv_neg_zpow_neg_one_add proves iteratedDeriv k (fun s => −((s+c)^{−1})) = −(−1)^k k! (s+c)^{−k−1}. Our function (s+c)^{−1} = −(−((s+c)^{−1})) — define g := fun s => −((s+c)^{−1}): our f = −g: iteratedDeriv k (−g) — STILL need neg. OK just check existence of iteratedDeriv_neg at build; alternatives iteratedDerivWithin_neg (univ) + transfer: iteratedDeriv n f x = iteratedDerivWithin n f univ x (symm of Within_of_isOpen) — then iteratedDerivWithin_neg exists? `iteratedDerivWithin_neg`? also uncertain.\n\nMathlib search needed. Actually — I recall Mathlib has `iteratedDeriv_neg`? In Mathlib.Analysis.Calculus.IteratedDeriv.DefConvergence... there's iteratedDerivWithin_neg : iteratedDerivWithin n (−f) s = −iteratedDerivWithin n f s? Hmm — there ARE iteratedDerivWithin_const_mul, iteratedDerivWithin_add, iteratedDerivWithin_sub... `iteratedDerivWithin_neg` probably exists, and global `iteratedDeriv_neg`? Let me just probe with #check in a scratch. I'll include a probe run.\n\nPer-term derivative:\n```lean\nlemma iteratedDeriv_seriesTerm (j : ℕ) (hj : 1 ≤ j) (ρ : {ρ : ℂ // IsNontrivialZero ρ})\n {s : ℂ} (hs : s - (ρ : ℂ) ≠ 0) :\n iteratedDeriv j (fun s => seriesTerm s ρ) s =\n (zeroMult ρ : ℂ) * ((-1 : ℂ) ^ j * (j ! : ℂ) * (s - (ρ : ℂ)) ^ (-(j : ℤ) - 1)) := by\n have hρ0 : (ρ : ℂ) ≠ 0 := ...\n have e : (fun s => seriesTerm s ρ) =\n fun s => (zeroMult ρ : ℂ) * ((s + -(ρ : ℂ)) ^ (-1 : ℤ) + 1 / (ρ : ℂ)) := by\n funext t\n rw [seriesTerm, zpow_neg_one]\n congr 2\n · congr 1\n ring\n · rfl?? — hmm: 1/(t−ρ) = (t+(−ρ))^{−1}: zpow_neg_one: (t+(−ρ))^{(−1:ℤ)} = (t+(−ρ))⁻¹: congr 1: t−ρ = t+(−ρ): ring ✓\n rw [e]\n -- iteratedDeriv j (mult·(f + const)) = mult·(iteratedDeriv j f + 0)\n have hscf : ContDiffAt ℂ (j : ℕ∞)?? for iteratedDeriv_add — check the exact requirement\n rw [iteratedDeriv_const_mul?...]\n```\niteratedDeriv_const_mul : iteratedDeriv n (fun x => c * f x) x = c * iteratedDeriv n f x — check existence. iteratedDeriv_add (hf : ContDiffAt ...) — from LiDigamma:702 usage: `rw [iteratedDeriv_add hcf hcg]` — hcf/hcg : ContDiffAt?? Let me grep LiDigamma for \"hcf\" to see their exact forms.\n\nLet me check those two things in LiDigamma before writing §5: (i) the hcf/hcg ContDiff forms near line 700; (ii) whether iteratedDeriv_const_mul/iteratedDeriv_neg exist (probe Mathlib via grep on the package source — faster than a Lean probe: grep Mathlib/Mathlib/Analysis/Calculus/IteratedDeriv* for theorem names).","signature":""},{"type":"text","text":"§4 needs two name checks first — the `ContDiff` side-condition forms in `iteratedDeriv_add` and whether `iteratedDeriv_neg`/`iteratedDeriv_const_mul` exist."},{"type":"tool_use","id":"Bash_86","name":"Bash","input":{"command":"cd D:/Python/Quantum/zeta-23-lean/.lake/packages/mathlib && grep -rn \"theorem iteratedDeriv_neg\\|theorem iteratedDeriv_const_mul\\|theorem iteratedDeriv_add\" Mathlib/Analysis/Calculus/ | head -10","description":"Check iteratedDeriv lemma names in Mathlib"},"extra_content":null},{"type":"tool_use","id":"Grep_87","name":"Grep","input":{"pattern":"hcf|hcg|ContDiff","path":"D:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1\\LiDigamma.lean","output_mode":"content","-n":true,"head_limit":20},"extra_content":null}]