Current task: —

← Session 32 — ii′-3b start: capstone axiom audit + moments

#1860 assistant 2026-08-24 23:46:22.639 UTC · 1539→17842 tok open ⤢
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}]