Current task: —

← Session 28 — ii′-5e: partial-fraction identity (zero series + F entire)

#1473 assistant 2026-08-23 14:11:07.875 UTC · 421→2009 tok open ⤢
thinking (4951 chars)
`Summable.norm` exists (alias of `summable_norm_iff`): `Summable.norm (hf : Summable f) : Summable fun a => ‖f a‖` ✓. All names verified. Now write the file. Also need to double check `analyticAt_riemannZeta` and `zetaA_ne_zero_near_one`, `zetaA_apply` are accessible — zetaA stuff is in NguyenRH1 namespace (LiResidue) ✓ imported via LiSides (which imports LiPrincipal which imports LiResidue presumably). I'll import LiSides directly. One more consideration — `open scoped Nat`? LiSides has `open scoped Nat`. I might need it for ↑n notation — ℕ→ℂ casts work without. Skip. Also `zeroMult` — from Zeta23.Statement; imported via Zeta23.Statement.SeamClosed? SeamClosed imports Statement presumably. LiSkeleton imports: Mathlib, Zeta23.Statement, Zeta23.WeilEF.ZeroSummability, Zeta23.Statement.SeamClosed. I'll import the same + NguyenRH1.LiSides. Let me also double-check `Complex.norm_natCast` vs `RCLike.norm_natCast`: LiSkeleton used RCLike.norm_natCast — use that. `Metric.mem_ball_self` — check: `Metric.mem_ball_self (h : 0 < r) : x ∈ ball x r`? Actually I recall `mem_ball_self : 0 < ε → x ∈ ball x ε` in Metric namespace ✓. Now about `Set.Finite.of_finite_image`: signature `Set.Finite.of_finite_image (hs : (f '' s).Finite) (hi : Set.InjOn f s) : s.Finite` — used in liSummable as `Set.Finite.of_finite_image himg (Subtype.val_injective.injOn)` ✓. `Subtype.val_injective` — liSummable used `Subtype.val_injective.injOn` ✓. For the `hfin` in seriesSummable I use finite_subtype_norm_lt + subset via not_le. Let me also reconsider `seriesTerm_norm_le`'s calc-entry: after `rw [seriesTerm, halg, norm_mul, RCLike.norm_natCast, norm_div, norm_mul]`: - seriesTerm s ρ unfolds to (zeroMult ↑ρ : ℂ) * (1/(s − ↑ρ) + 1/↑ρ). rw [seriesTerm] — the LHS of goal is ‖seriesTerm s ρ‖: rw [seriesTerm] rewrites to the body ✓ (def rewrite with pattern seriesTerm s ρ — hmm rw [seriesTerm] works if seriesTerm is a def: `rw [seriesTerm]` unfolds? rw with a def name doesn't unfold — need `show` or `simp only [seriesTerm]` or `unfold seriesTerm`. In Lean4 Mathlib, `rw [seriesTerm]` fails (not an equation). Use `unfold seriesTerm` or `simp only [seriesTerm]` or state via `show`. Safest: `rw [show seriesTerm s ρ = _ from rfl]`? Simply: `unfold seriesTerm`. Or `simp only [seriesTerm]` — simp only with a def name uses the equational lemma `seriesTerm.eq_...`? For plain defs, `simp only [seriesTerm]` works via auto-generated equation lemmas ✓ (standard practice). I'll use `simp only [seriesTerm]` then the goal has ‖(zeroMult ↑ρ : ℂ) * (1/(s−↑ρ) + 1/↑ρ)‖. Actually careful — after simp only [seriesTerm], halg rewrite: `rw [halg]` rewrites 1/(s−ρ)+1/ρ to s/(ρ*(s−ρ)) ✓. Then norm_mul on ‖(mult:ℂ) * (s/(ρ*(s−ρ)))‖ → ‖mult‖ * ‖s/(ρ*(s−ρ))‖; RCLike.norm_natCast: ‖(zeroMult ρ : ℂ)‖ = (zeroMult ρ : ℝ)? RCLike.norm_natCast : ‖(n : R)‖ = ↑n ✓. Then norm_div: ‖s/(ρ*(s−ρ))‖ → ‖s‖/‖ρ*(s−ρ)‖; norm_mul: → ‖ρ‖*‖s−ρ‖ ✓. The coercion display: ‖(ρ : ℂ)‖ where ρ is the subtype — fine. Another subtlety — in `one_add_normSq_gammaOf_le`, the normSq_eq_norm_sq: `Complex.normSq_eq_norm_sq z : normSq z = ‖z‖ ^ 2` — LiSkeleton line 96: `Complex.normSq_eq_norm_sq z` ✓. hρ2 used in h0 proof: rw [h, norm_zero] at hρ2 — h : (ρ:ℂ) = 0: norm_zero : ‖0‖ = 0; hρ2 : 2 ≤ (0:ℝ): `norm_num at hρ2` closes ✓. Also in seriesTerm_norm_le, `hsρ : 2 * ‖s‖ ≤ ‖(ρ:ℂ)‖` gives hsnorm : ‖s‖ ≤ ‖ρ‖/2 — unused actually; the bound uses 2‖s‖/‖ρ‖² directly. Fine, drop hsnorm. Now the `hden` via nlinarith: ‖ρ‖²/2 ≤ ‖ρ‖*‖s−ρ‖: from hsr : ‖ρ‖/2 ≤ ‖s−ρ‖ and ‖ρ‖ > 0: mul: ‖ρ‖*(‖ρ‖/2) ≤ ‖ρ‖*‖s−ρ‖: `mul_le_mul_of_nonneg_left hsr hρpos.le : ‖ρ‖*(‖ρ‖/2) ≤ ‖ρ‖*‖s−ρ‖`; then ‖ρ‖*(‖ρ‖/2) = ‖ρ‖²/2: ring: so `hden := by have := mul_le_mul_of_nonneg_left hsr hρpos.le; ... convert/linarith`: linarith with the product equality needs ring-normal forms: nlinarith [mul_le_mul_of_nonneg_left hsr hρpos.le] — the term ‖ρ‖*(‖ρ‖/2) vs ‖ρ‖^2/2: nlinarith ring-normalizes ✓ should close. hfrac: ‖s‖/(‖ρ‖*‖s−ρ‖) ≤ 2‖s‖/‖ρ‖²: ```lean rw [div_le_div_iff₀ hden0 hρsq0] -- goal: ‖s‖ * ‖ρ‖^2 ≤ (2‖s‖) * (‖ρ‖*‖s−ρ‖) nlinarith [hden, norm_nonneg s, hρpos] ``` where hden0 : 0 < ‖ρ‖*‖s−ρ‖: both pos: mul_pos hρpos (by linarith [hsr, hρpos] : 0 < ‖s−ρ‖) — hsr : ‖ρ‖/2 ≤ ‖s−ρ‖, ‖ρ‖/2 > 0 ✓. hρsq0 : 0 < ‖ρ‖^2 := pow_pos hρpos 2. After div_le_div_iff₀: a*d ≤ c*b form: div_le_div_iff₀ (hb : 0 < b) (hd : 0 < d) : a/b ≤ c/d ↔ a*d ≤ c*b ✓: goal ‖s‖*(‖ρ‖^2) ≤ (2*‖s‖)*(‖ρ‖*‖s−ρ‖): from hden : ‖ρ‖²/2 ≤ ‖ρ‖‖s−ρ‖: multiply by 2‖s‖ ≥ 0: nlinarith [hden, norm_nonneg s] ✓ (needs product 2‖s‖·hden — nlinarith multiplies hypotheses with nonneg terms ✓). OK. The div_le_div_iff₀ name — check it exists with that signature (4 args? div_le_div_iff₀ (hb : 0 < b) (hd : 0 < d)). In recent Mathlib there's div_le_div_iff_of_pos... and div_le_div_iff₀? Not sure. Alternatives: `div_le_div_iff (hb : 0 < b) (hd : 0 < d)` (older name). LiDigamma used `div_le_div_iff_of_pos_right`. Hmm. Let me check what's available.
Two more name checks (`div_le_div_iff₀`, `mem_ball_self`, `one_div_le_one_div_of_le` usage pattern).
tool: Bash
input
{
  "command": "cd D:/Python/Quantum/zeta-23-lean/.lake/packages/mathlib && grep -rn \"theorem div_le_div_iff\u2080\\b\\|theorem div_le_div_iff\\b\" Mathlib/Algebra/Order/ -r | head -4; grep -rn \"theorem Metric.mem_ball_self\\b\\|lemma mem_ball_self\\b\" Mathlib/Topology/MetricSpace/ -r | head -3; grep -rn \"div_le_div_iff\u2080\" D:/Python/Quantum/research/lean/NguyenRH1/NguyenRH1/*.lean | head -3",
  "description": "Check div_le_div_iff names"
}
raw content_json (database row)
[{"type":"thinking","thinking":"`Summable.norm` exists (alias of `summable_norm_iff`): `Summable.norm (hf : Summable f) : Summable fun a => ‖f a‖` ✓.\n\nAll names verified. Now write the file. Also need to double check `analyticAt_riemannZeta` and `zetaA_ne_zero_near_one`, `zetaA_apply` are accessible — zetaA stuff is in NguyenRH1 namespace (LiResidue) ✓ imported via LiSides (which imports LiPrincipal which imports LiResidue presumably). I'll import LiSides directly.\n\nOne more consideration — `open scoped Nat`? LiSides has `open scoped Nat`. I might need it for ↑n notation — ℕ→ℂ casts work without. Skip.\n\nAlso `zeroMult` — from Zeta23.Statement; imported via Zeta23.Statement.SeamClosed? SeamClosed imports Statement presumably. LiSkeleton imports: Mathlib, Zeta23.Statement, Zeta23.WeilEF.ZeroSummability, Zeta23.Statement.SeamClosed. I'll import the same + NguyenRH1.LiSides.\n\nLet me also double-check `Complex.norm_natCast` vs `RCLike.norm_natCast`: LiSkeleton used RCLike.norm_natCast — use that.\n\n`Metric.mem_ball_self` — check: `Metric.mem_ball_self (h : 0 < r) : x ∈ ball x r`? Actually I recall `mem_ball_self : 0 < ε → x ∈ ball x ε` in Metric namespace ✓.\n\nNow about `Set.Finite.of_finite_image`: signature `Set.Finite.of_finite_image (hs : (f '' s).Finite) (hi : Set.InjOn f s) : s.Finite` — used in liSummable as `Set.Finite.of_finite_image himg (Subtype.val_injective.injOn)` ✓. `Subtype.val_injective` — liSummable used `Subtype.val_injective.injOn` ✓.\n\nFor the `hfin` in seriesSummable I use finite_subtype_norm_lt + subset via not_le.\n\nLet me also reconsider `seriesTerm_norm_le`'s calc-entry: after `rw [seriesTerm, halg, norm_mul, RCLike.norm_natCast, norm_div, norm_mul]`:\n- seriesTerm s ρ unfolds to (zeroMult ↑ρ : ℂ) * (1/(s − ↑ρ) + 1/↑ρ). rw [seriesTerm] — the LHS of goal is ‖seriesTerm s ρ‖: rw [seriesTerm] rewrites to the body ✓ (def rewrite with pattern seriesTerm s ρ — hmm rw [seriesTerm] works if seriesTerm is a def: `rw [seriesTerm]` unfolds? rw with a def name doesn't unfold — need `show` or `simp only [seriesTerm]` or `unfold seriesTerm`. In Lean4 Mathlib, `rw [seriesTerm]` fails (not an equation). Use `unfold seriesTerm` or `simp only [seriesTerm]` or state via `show`. Safest: `rw [show seriesTerm s ρ = _ from rfl]`? Simply: `unfold seriesTerm`. Or `simp only [seriesTerm]` — simp only with a def name uses the equational lemma `seriesTerm.eq_...`? For plain defs, `simp only [seriesTerm]` works via auto-generated equation lemmas ✓ (standard practice). I'll use `simp only [seriesTerm]` then the goal has ‖(zeroMult ↑ρ : ℂ) * (1/(s−↑ρ) + 1/↑ρ)‖.\n\nActually careful — after simp only [seriesTerm], halg rewrite: `rw [halg]` rewrites 1/(s−ρ)+1/ρ to s/(ρ*(s−ρ)) ✓. Then norm_mul on ‖(mult:ℂ) * (s/(ρ*(s−ρ)))‖ → ‖mult‖ * ‖s/(ρ*(s−ρ))‖; RCLike.norm_natCast: ‖(zeroMult ρ : ℂ)‖ = (zeroMult ρ : ℝ)? RCLike.norm_natCast : ‖(n : R)‖ = ↑n ✓. Then norm_div: ‖s/(ρ*(s−ρ))‖ → ‖s‖/‖ρ*(s−ρ)‖; norm_mul: → ‖ρ‖*‖s−ρ‖ ✓.\n\nThe coercion display: ‖(ρ : ℂ)‖ where ρ is the subtype — fine.\n\nAnother subtlety — in `one_add_normSq_gammaOf_le`, the normSq_eq_norm_sq: `Complex.normSq_eq_norm_sq z : normSq z = ‖z‖ ^ 2` — LiSkeleton line 96: `Complex.normSq_eq_norm_sq z` ✓.\n\nhρ2 used in h0 proof: rw [h, norm_zero] at hρ2 — h : (ρ:ℂ) = 0: norm_zero : ‖0‖ = 0; hρ2 : 2 ≤ (0:ℝ): `norm_num at hρ2` closes ✓.\n\nAlso in seriesTerm_norm_le, `hsρ : 2 * ‖s‖ ≤ ‖(ρ:ℂ)‖` gives hsnorm : ‖s‖ ≤ ‖ρ‖/2 — unused actually; the bound uses 2‖s‖/‖ρ‖² directly. Fine, drop hsnorm.\n\nNow the `hden` via nlinarith: ‖ρ‖²/2 ≤ ‖ρ‖*‖s−ρ‖: from hsr : ‖ρ‖/2 ≤ ‖s−ρ‖ and ‖ρ‖ > 0: mul: ‖ρ‖*(‖ρ‖/2) ≤ ‖ρ‖*‖s−ρ‖: `mul_le_mul_of_nonneg_left hsr hρpos.le : ‖ρ‖*(‖ρ‖/2) ≤ ‖ρ‖*‖s−ρ‖`; then ‖ρ‖*(‖ρ‖/2) = ‖ρ‖²/2: ring: so `hden := by have := mul_le_mul_of_nonneg_left hsr hρpos.le; ... convert/linarith`: linarith with the product equality needs ring-normal forms: nlinarith [mul_le_mul_of_nonneg_left hsr hρpos.le] — the term ‖ρ‖*(‖ρ‖/2) vs ‖ρ‖^2/2: nlinarith ring-normalizes ✓ should close.\n\nhfrac: ‖s‖/(‖ρ‖*‖s−ρ‖) ≤ 2‖s‖/‖ρ‖²: \n```lean\n  rw [div_le_div_iff₀ hden0 hρsq0]\n  -- goal: ‖s‖ * ‖ρ‖^2 ≤ (2‖s‖) * (‖ρ‖*‖s−ρ‖)\n  nlinarith [hden, norm_nonneg s, hρpos]\n```\nwhere hden0 : 0 < ‖ρ‖*‖s−ρ‖: both pos: mul_pos hρpos (by linarith [hsr, hρpos] : 0 < ‖s−ρ‖) — hsr : ‖ρ‖/2 ≤ ‖s−ρ‖, ‖ρ‖/2 > 0 ✓. hρsq0 : 0 < ‖ρ‖^2 := pow_pos hρpos 2.\nAfter div_le_div_iff₀: a*d ≤ c*b form: div_le_div_iff₀ (hb : 0 < b) (hd : 0 < d) : a/b ≤ c/d ↔ a*d ≤ c*b ✓: goal ‖s‖*(‖ρ‖^2) ≤ (2*‖s‖)*(‖ρ‖*‖s−ρ‖): from hden : ‖ρ‖²/2 ≤ ‖ρ‖‖s−ρ‖: multiply by 2‖s‖ ≥ 0: nlinarith [hden, norm_nonneg s] ✓ (needs product 2‖s‖·hden — nlinarith multiplies hypotheses with nonneg terms ✓).\n\nOK. The div_le_div_iff₀ name — check it exists with that signature (4 args? div_le_div_iff₀ (hb : 0 < b) (hd : 0 < d)). In recent Mathlib there's div_le_div_iff_of_pos... and div_le_div_iff₀? Not sure. Alternatives: `div_le_div_iff (hb : 0 < b) (hd : 0 < d)` (older name). LiDigamma used `div_le_div_iff_of_pos_right`. Hmm. Let me check what's available.","signature":""},{"type":"text","text":"Two more name checks (`div_le_div_iff₀`, `mem_ball_self`, `one_div_le_one_div_of_le` usage pattern)."},{"type":"tool_use","id":"Bash_45","name":"Bash","input":{"command":"cd D:/Python/Quantum/zeta-23-lean/.lake/packages/mathlib && grep -rn \"theorem div_le_div_iff₀\\b\\|theorem div_le_div_iff\\b\" Mathlib/Algebra/Order/ -r | head -4; grep -rn \"theorem Metric.mem_ball_self\\b\\|lemma mem_ball_self\\b\" Mathlib/Topology/MetricSpace/ -r | head -3; grep -rn \"div_le_div_iff₀\" D:/Python/Quantum/research/lean/NguyenRH1/NguyenRH1/*.lean | head -3","description":"Check div_le_div_iff names"},"extra_content":null}]