Current task: —

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

#1511 assistant 2026-08-23 16:24:45.062 UTC · 859→9259 tok open ⤢
thinking (24330 chars)
Now §7–§9. Write: §7: Fexpr_eventually_nontrivial (the nontrivial-zero witness). §8: Fexpr_analyticAt_of_not_bad + exists_ball_good_of_not_bad. §9: Gentire + gentire_eq_Fexpr + gentire_analyticAt + the capstone exists. §7 details: ```lean /-! ## 7. The witness at a nontrivial zero -/ lemma Fexpr_eventually_nontrivial {ρ₀ : ℂ} (hρ : IsNontrivialZero ρ₀) : ∃ W : ℂ → ℂ, AnalyticAt ℂ W ρ₀ ∧ ∀ᶠ s in 𝓝[≠] ρ₀, Fexpr s = W s := by have hρ1 : ρ₀ ≠ 1 := by intro h rw [h] at hρ have hlt := hρ.2.2 rw [Complex.one_re] at hlt exact lt_irrefl 1 hlt obtain ⟨W0, hW0, hW0eq⟩ := logDeriv_zeta_sub_mult_div_eventually hρ.1 hρ1 -- series minus its polar term, analytic at ρ₀ (5e-iii) have hS : AnalyticAt ℂ (fun s => seriesFun s - (zeroMult ρ₀ : ℂ) / (s - ρ₀)) ρ₀ := seriesFun_sub_polar_analyticAt ⟨ρ₀, hρ⟩ have hC : AnalyticAt ℂ (fun s : ℂ => 1 / s) ρ₀ := by apply AnalyticAt.div analyticAt_const analyticAt_id (by intro hh rw [hh] at hρ... -- ρ₀ = 0 contra re > 0: hρ.2.1 : 0 < ρ₀.re: rw [hh, Complex.zero_re] at hρ... have hpos := hρ.2.1 rw [hh, Complex.zero_re] at hpos exact lt_irrefl 0 hpos) have hC1 : AnalyticAt ℂ (fun s : ℂ => 1 / (s - 1)) ρ₀ := by apply AnalyticAt.div analyticAt_const (g := fun s : ℂ => s - 1) _ (sub_ne_zero.mpr hρ1) exact analyticAt_id.sub analyticAt_const have hD : AnalyticAt ℂ (fun _ : ℂ => (Real.log Real.pi : ℂ) / 2) ρ₀ := analyticAt_const have hE : AnalyticAt ℂ (fun s => Complex.digamma (s / 2) / 2) ρ₀ := by apply analyticAt_digamma_div_two intro m h -- ρ₀/2 = −↑m: re: re ρ₀ / 2 = −m ≤ 0 contra re ρ₀ > 0 have hre := congrArg Complex.re h have h1 : (ρ₀ / 2).re = ρ₀.re / 2 := by simp [Complex.div_re, ...]?? — (ρ₀/2).re = ρ₀.re/2: `Complex.div_re`: (a/b).re = (a.re*b.re + a.im*b.im)/(b.re²+b.im²)... messy. Better: from h : ρ₀/2 = −↑m: ρ₀ = −2↑m via linear_combination 2*h — then re: ρ₀.re = −2m ≤ 0 contra hρ.2.1: have h2 : ρ₀ = -2 * (m : ℂ) := by linear_combination 2 * h have h3 : ρ₀.re = -2 * (m : ℝ) := by rw [h2]; simp have h4 : (0 : ℝ) ≤ (m : ℝ) := Nat.cast_nonneg m linarith [hρ.2.1] refine ⟨fun s => W0 s - (seriesFun s - (zeroMult ρ₀ : ℂ) / (s - ρ₀)) + 1 / s + 1 / (s - 1) - (Real.log Real.pi : ℂ) / 2 + Complex.digamma (s / 2) / 2, ?_, ?_⟩ · exact ((((hW0.sub hS).add hC).add hC1).sub hD).add hE · filter_upwards [hW0eq] with s hs -- hs : logDeriv ζ s − m/(s−ρ₀) = W0 s show logDeriv riemannZeta s - seriesFun s + 1/s + 1/(s-1) - c + digamma(s/2)/2 = W0 s - (seriesFun s - m/(s-ρ₀)) + 1/s + 1/(s-1) - c + digamma(s/2)/2 linear_combination hs ``` The final: from hs : logDeriv ζ s − m/(s−ρ₀) = W0 s: LHS − RHS = (logDerivζ − series) − (W0 − (series − m/(s−ρ₀))) = logDerivζ − W0 − m/(s−ρ₀) = 0 ✓ linear_combination hs ✓ (atoms: m/(s−ρ₀) both sides ✓). Wait — the show RHS: the W lambda applied is a beta-redex `(fun s => ...) s` — show's RHS is the reduced form ✓ defeq ✓. hS's statement: seriesFun_sub_polar_analyticAt ⟨ρ₀, hρ⟩ : AnalyticAt ℂ (fun s => seriesFun s − (↑(zeroMult ↑(⟨ρ₀, hρ⟩)))/(s − ↑(⟨ρ₀,hρ⟩))) ↑(⟨ρ₀,hρ⟩) — coercions ↑⟨ρ₀,hρ⟩ reduce to ρ₀ definitionally ✓ ascription defeq ✓. §8: ```lean /-! ## 8. The generic point -/ lemma not_badPoint_of_not_bad {s : ℂ} ... — skip lemma Fexpr_analyticAt_of_not_bad {s : ℂ} (hs : ¬ badPoint s) : AnalyticAt ℂ Fexpr s := by have hs0 : s ≠ 0 := fun h => hs (Or.inr (Or.inl h)) have hs1 : s ≠ 1 := fun h => hs (Or.inr (Or.inr (Or.inl h))) have hζ : riemannZeta s ≠ 0 := by intro hz apply hs rcases zeta_zero_classification hz with h | h | ⟨n, hn, h⟩ · exact Or.inl h · exact Or.inr (Or.inl h) · exact Or.inr (Or.inr (Or.inr ⟨n, hn, h⟩)) have hnontriv : ¬ IsNontrivialZero s := fun h => hs (Or.inl h) have hA : AnalyticAt ℂ (logDeriv riemannZeta) s := ((analyticAt_riemannZeta hs1).deriv).div (analyticAt_riemannZeta hs1) hζ have hB : AnalyticAt ℂ seriesFun s := seriesFun_analyticAt hnontriv have hC : AnalyticAt ℂ (fun s : ℂ => 1 / s) s := analyticAt_const.div analyticAt_id hs0 have hC1 : AnalyticAt ℂ (fun s : ℂ => 1 / (s - 1)) s := by apply AnalyticAt.div analyticAt_const (g := fun s : ℂ => s - 1) _ (sub_ne_zero.mpr hs1) exact analyticAt_id.sub analyticAt_const have hD : AnalyticAt ℂ (fun _ : ℂ => (Real.log Real.pi : ℂ) / 2) s := analyticAt_const have hE : AnalyticAt ℂ (fun s => Complex.digamma (s / 2) / 2) s := by apply analyticAt_digamma_div_two intro m h apply hs have h2 : s = -2 * (m : ℂ) := by linear_combination 2 * h rcases Nat.eq_zero_or_pos m with hm0 | hm · subst hm0 simp at h2 exact Or.inr (Or.inl h2) · exact Or.inr (Or.inr (Or.inr ⟨m, hm, h2⟩)) show AnalyticAt ℂ (fun s => logDeriv riemannZeta s - seriesFun s + 1 / s + 1 / (s - 1) - (Real.log Real.pi : ℂ) / 2 + Complex.digamma (s / 2) / 2) s exact ((((hA.sub hB).add hC).add hC1).sub hD).add hE ``` Check the show: Fexpr s unfolds to the lambda applied — defeq ✓. hC's hg0: analyticAt_id hs0?? — AnalyticAt.div (hf) (hg) (hg0 : g x ≠ 0): g = id: g s = id s — defeq s: hs0 : s ≠ 0 ✓ exact-defeq. But `analyticAt_const.div analyticAt_id hs0` as a TERM with the Pi-div type vs the ascribed lambda — risk (session gotcha). Use apply-form to be safe: ```lean have hC : AnalyticAt ℂ (fun s : ℂ => 1 / s) s := by apply AnalyticAt.div analyticAt_const analyticAt_id hs0 ``` apply unifies conclusion fun x => f x / g x with fun s => 1/s ✓ hg0 := hs0 : s ≠ 0 vs id s ≠ 0 defeq ✓. The m=0 case: h2 : s = -2 * ((0:ℕ):ℂ): simp at h2: Nat.cast_zero, mul_zero, neg_zero: h2 : s = 0 ✓ Or.inr (Or.inl h2) ✓. §8b the good ball: ```lean /-- Around a good point there is a ball of good points (ζ ≠ 0 ball ∩ avoidance of {0, 1}). -/ lemma exists_ball_good_of_not_bad {s : ℂ} (hs : ¬ badPoint s) : ∃ δ : ℝ, 0 < δ ∧ ∀ y ∈ Metric.ball s δ, ¬ badPoint y := by have hs0 : s ≠ 0 := fun h => hs (Or.inr (Or.inl h)) have hs1 : s ≠ 1 := fun h => hs (Or.inr (Or.inr (Or.inl h))) have hζ : riemannZeta s ≠ 0 := by intro hz apply hs rcases zeta_zero_classification hz with h | h | ⟨n, hn, h⟩ · exact Or.inl h · exact Or.inr (Or.inl h) · exact Or.inr (Or.inr (Or.inr ⟨n, hn, h⟩)) obtain ⟨ε₁, hε₁, hball₁⟩ := Metric.eventually_nhds_iff_ball.mp ((analyticAt_riemannZeta hs1).continuousAt.eventually_ne hζ) have hs0n : (0 : ℝ) < ‖s‖ := norm_pos_iff.mpr hs0 have hs1n : (0 : ℝ) < ‖s - 1‖ := norm_pos_iff.mpr (sub_ne_zero.mpr hs1) refine ⟨min ε₁ (min (‖s‖ / 2) (‖s - 1‖ / 2)), ?_, ?_⟩ · positivity -- min of positives: lt_min hε₁ (lt_min (half_pos hs0n) (half_pos hs1n)): positivity can't use hyps: exact lt_min hε₁ (lt_min (half_pos hs0n) (half_pos hs1n)) · intro y hy -- y ≠ 0, y ≠ 1, ζ y ≠ 0 have hε₁y : dist y s < ε₁ := lt_of_lt_of_le (Metric.mem_ball.mp hy) (min_le_left _ _) have hζy : riemannZeta y ≠ 0 := hball₁ y (Metric.mem_ball.mpr hε₁y) have hδs : dist y s < ‖s‖ / 2 := lt_of_lt_of_le (Metric.mem_ball.mp hy) ((min_le_right _ _).trans (min_le_left _ _)) have hδ1 : dist y s < ‖s - 1‖ / 2 := lt_of_lt_of_le (Metric.mem_ball.mp hy) ((min_le_right _ _).trans (min_le_right _ _)) have hy0 : y ≠ 0 := by intro h rw [h, dist_zero_right] at hδs -- dist 0 s = ‖s‖: wait dist y s with y = 0: dist 0 s = ‖0 − s‖ = ‖s‖: dist_zero_right : dist 0 s?? dist_eq_norm: dist 0 s = ‖0 − s‖ = ‖−s‖ = ‖s‖: hδs : ‖s‖ < ‖s‖/2 contra: have : (dist (0:ℂ) s) = ‖s‖ := by rw [Complex.dist_eq]; simp rw [h, this] at hδs linarith have hy1 : y ≠ 1 := by intro h rw [h] at hδ1 -- dist 1 s = ‖s − 1‖: dist_eq_norm: ‖1 − s‖ = ‖s−1‖ (norm_sub_rev): have : (dist (1:ℂ) s) = ‖s - 1‖ := by rw [Complex.dist_eq, ← norm_neg]; ring_nf?? ‖1 − s‖ = ‖−(s−1)‖ = ‖s−1‖: rw [Complex.dist_eq]; conv_lhs...: (1 − s) = -(s−1): rw [show (1:ℂ) − s = -(s − 1) by ring, norm_neg] ✓ rw [h, this] at hδ1 linarith rintro (h | h | h | ⟨n, hn, h⟩) · exact hζy h.1 · exact hy0 h · exact hy1 h · rw [h] at hζy exact hζy (riemannZeta_neg_two_mul hn) ``` §9 G assembly: ```lean /-! ## 9. The entire extension -/ /-- The entire extension of Fexpr: the punctured-limit value. -/ def Gentire : ℂ → ℂ := fun s => limUnder (𝓝[≠] s) Fexpr /-- At a good point, Gentire = Fexpr (continuity ⟹ punctured limit = value). -/ lemma gentire_eq_Fexpr {s : ℂ} (hs : ¬ badPoint s) : Gentire s = Fexpr s := by haveI := nhdsNE_neBot s have hcont := (Fexpr_analyticAt_of_not_bad hs).continuousAt have hlim : Tendsto Fexpr (𝓝[≠] s) (𝓝 (Fexpr s)) := hcont.tendsto.mono nhdsWithin_le_nhds exact tendsto_nhds_unique (tendsto_nhds_limUnder ⟨Fexpr s, hlim⟩) hlim ``` Wait — `ContinuousAt.tendsto`?? ContinuousAt unfolds to Tendsto f (𝓝 s) (𝓝 (f s)) — `hcont : ContinuousAt Fexpr s` — ContinuousAt is DEFINED as Tendsto f (𝓝 s) (𝓝 (f s)) ✓ so hcont is the Tendsto — `hcont.mono nhdsWithin_le_nhds` ✓ (Tendsto.mono (hf : Tendsto f l₁ L) (hl : l₂ ≤ l₁) : Tendsto f l₂ L ✓). tendsto_nhds_unique (tendsto_nhds_limUnder ⟨Fexpr s, hlim⟩) hlim : first arg : Tendsto Fexpr (𝓝[≠]s) (𝓝 (limUnder (𝓝[≠]s) Fexpr)); second hlim : Tendsto Fexpr (𝓝[≠]s) (𝓝 (Fexpr s)): tendsto_nhds_unique : a = b where first's target = limUnder, second's = Fexpr s: so gives limUnder (𝓝[≠] s) Fexpr = Fexpr s ✓ and Gentire s unfolds to exactly that ✓ — the goal Gentire s = Fexpr s — `show limUnder (𝓝[≠] s) Fexpr = Fexpr s`? defeq unfold of Gentire s ≡ limUnder... ✓ exact accepts. nhdsNE_neBot : (x : α) → NeBot (𝓝[≠] x) — from Normed/Field/Basic.lean:248 — for α a NontriviallyNormedField? ℂ ✓. Is it an instance? The line said `theorem nhdsNE_neBot` — probably not an instance (name-based). `haveI := nhdsNE_neBot s` ✓. Hmm wait — actually there might be a proper instance `instNeBot...`: Module.punctured_nhds_neBot was an instance-ish. Whatever, haveI works. ```lean /-- The local eventual agreement: at a bad point, Gentire agrees (on a full neighborhood) with the analytic witness. -/ lemma gentire_eventually_eq_witness {s : ℂ} (hbad : badPoint s) : ∃ W : ℂ → ℂ, AnalyticAt ℂ W s ∧ Gentire =ᶠ[𝓝 s] W := by -- the witness from the case split obtain ⟨W, hW, hWeq⟩ : ∃ W, AnalyticAt ℂ W s ∧ ∀ᶠ y in 𝓝[≠] s, Fexpr y = W y := by rcases hbad with h | h | h | ⟨n, hn, h⟩ · exact Fexpr_eventually_nontrivial h · subst h; exact Fexpr_eventually_zero · subst h; exact Fexpr_eventually_one · subst h; exact Fexpr_eventually_neg_two_mul hn -- the avoidance ball: every y ≠ s near s is good obtain ⟨δ₂, hδ₂, hgood⟩ : ∃ δ₂ > 0, ∀ y ∈ Metric.ball s δ₂, y ≠ s → ¬ badPoint y := by rcases hbad with h | h | h | ⟨n, hn, h⟩ · -- nontrivial ρ₀: isolation ∩ re-strip obtain ⟨δ, hδ, hiso⟩ := nontrivialZero_isolated ⟨s, h⟩ -- re strip radius have hr0 : (0 : ℝ) < s.re := h.2.1 have hr1 : (0 : ℝ) < 1 - s.re := by linarith [h.2.2] refine ⟨min δ (min s.re (1 - s.re)), lt_min hδ (lt_min hr0 hr1), fun y hy hyne hby => ?_⟩ -- re y ∈ (0, 1) have hrey : (0 : ℝ) < y.re ∧ y.re < 1 := by have hd := Metric.mem_ball.mp hy rw [Complex.dist_eq] at hd have hre_le : |y.re - s.re| ≤ ‖y - s‖ := by have : (y - s).re = y.re - s.re := Complex.sub_re rw [← this] exact Complex.abs_re_le_norm _ have hlt : ‖y - s‖ < min s.re (1 - s.re) := lt_of_lt_of_le hd (min_le_right _ _) rcases abs_lt.mp (lt_of_le_of_lt hre_le hlt) with ⟨h1, h2⟩ constructor <;> linarith rcases hby with hb | hb | hb | ⟨m, hm, hb⟩ · -- another nontrivial zero: distance ≥ δ contra have hle := hiso ⟨y, hb⟩ (by intro heq apply hyne exact Subtype.ext_iff.mp?? — ⟨y, hb⟩ = ⟨s, h⟩ ⟹ y = s: Subtype.ext_iff: ⟨y,hb⟩ = ⟨s,h⟩ ↔ y = s: `Subtype.ext_iff.mp heq`? heq : (⟨y, hb⟩ : subtype) = ⟨s, h⟩: Subtype.ext_iff.mp heq : y = s?? Subtype.ext_iff : ⟨a, ha⟩ = ⟨b, hb⟩ ↔ a = b ✓: exact hyne (Subtype.ext_iff.mp heq)) -- hle : δ ≤ ‖y − s‖; but dist y s < δ (ball, min_left): contra have hd := Metric.mem_ball.mp hy rw [Complex.dist_eq] at hd linarith [lt_of_lt_of_le hd (min_le_left _ _), hle] · rw [hb, Complex.zero_re] at hrey; exact lt_irrefl 0 hrey.1 · rw [hb, Complex.one_re] at hrey; exact lt_irrefl 1 hrey.2 · -- y = −2m: re = −2m ≤ 0 contra hrey.1 have hre : y.re = -2 * (m : ℝ) := by rw [hb]; simp have hm1 : (1 : ℝ) ≤ (m : ℝ) := by exact_mod_cast hm linarith [hrey.1, hre, hm1] · subst h -- s = 0: ball(0, 1/2) ∩ ζ-continuity ball obtain ⟨ε₁, hε₁, hball₁⟩ := Metric.eventually_nhds_iff_ball.mp ((analyticAt_riemannZeta (by norm_num : (0:ℂ) ≠ 1)).continuousAt.eventually_ne (by rw [riemannZeta_zero]; norm_num)) refine ⟨min ε₁ (1 / 2), lt_min hε₁ (by norm_num), fun y hy hyne hby => ?_⟩ have hy0 : y ≠ 0 := hyne have hε₁y : y ∈ Metric.ball 0 ε₁ := Metric.ball_subset_ball (min_le_left _ _) hy have hζy : riemannZeta y ≠ 0 := hball₁ y hε₁y rcases hby with hb | hb | hb | ⟨m, hm, hb⟩ · exact hζy hb.1 · exact hy0 hb · rw [hb] at hy -- y = 1: dist 1 0 < 1/2 contra have hd := Metric.mem_ball.mp (Metric.ball_subset_ball (min_le_right _ _) hy) rw [Complex.dist_eq] at hd norm_num at hd -- ‖1 − 0‖ < 1/2: ‖1‖ = 1: 1 < 1/2 false ✓ norm_num: ‖(1:ℂ) − 0‖ = 1? simp: sub_zero, norm_one: norm_num at hd might reduce to 1 < 1/2 → closes False goal ✓ (norm_num at h with a false hypothesis closes the goal ✓) · exact hζy (hb ▸ riemannZeta_neg_two_mul hm) -- hb : y = −2m: ζ(−2m) = 0: `hb ▸ ...`? rw [hb] at hζy; exact hζy (riemannZeta_neg_two_mul hm) ✓ cleaner · subst h -- s = 1: zetaA ball obtain ⟨ε₁, hε₁, hball₁⟩ := Metric.eventually_nhds_iff_ball.mp zetaA_ne_zero_near_one refine ⟨min ε₁ (1 / 2), lt_min hε₁ (by norm_num), fun y hy hyne hby => ?_⟩ have hε₁y : y ∈ Metric.ball 1 ε₁ := Metric.ball_subset_ball (min_le_left _ _) hy have hZA : zetaA y ≠ 0 := hball₁ y hε₁y have hy1 : y ≠ 1 := hyne have hζy : riemannZeta y ≠ 0 := by have e := zetaA_apply hy1 intro hz rw [hz, mul_zero] at e exact hZA e.symm -- wait direction: e : zetaA y = (y−1)*0 = 0: hZA e? e.symm : 0 = zetaA y... hZA : zetaA y ≠ 0: hZA e where e : zetaA y = 0 ✓ — after rw [hz, mul_zero] at e: e : zetaA y = 0 ✓ hZA e ✓ (no .symm) rcases hby with hb | hb | hb | ⟨m, hm, hb⟩ · exact hζy hb.1 · -- y = 0: dist 0 1 < 1/2 contra rw [hb] at hy have hd := Metric.mem_ball.mp (Metric.ball_subset_ball (min_le_right _ _) hy) rw [Complex.dist_eq] at hd norm_num at hd · exact hy1 hb · rw [hb] at hζy exact hζy (riemannZeta_neg_two_mul hm) · subst h -- s = −2n: ball(−2n, 1/2) refine ⟨1 / 2, by norm_num, fun y hy hyne hby => ?_⟩ have hrey : y.re < 0 := by have hd := Metric.mem_ball.mp hy rw [Complex.dist_eq] at hd have hre_le : |y.re - (-2 * (n : ℝ))| ≤ ‖y - -2 * (n : ℂ)‖ := by have h1 : (y - -2 * (n : ℂ)).re = y.re - (-2 * (n : ℝ)) := by simp [Complex.sub_re, Complex.mul_re] -- hmm (−2↑n).re = −2n: simp [Complex.neg_re, Complex.mul_re, Complex.natCast_re, Complex.ofNat_re] rw [← h1] exact Complex.abs_re_le_norm _ have hn1 : (1 : ℝ) ≤ (n : ℝ) := by exact_mod_cast hn rcases abs_lt.mp (lt_of_le_of_lt hre_le hd) with ⟨h1, h2⟩ linarith rcases hby with hb | hb | hb | ⟨m, hm, hb⟩ · have hpos := hb.2.1 linarith · rw [hb, Complex.zero_re] at hrey; exact lt_irrefl 0 hrey · rw [hb, Complex.one_re] at hrey; exact lt_irrefl 0 hrey -- hrey : 1 < 0 after rw: (1:ℂ).re = 1: rw [hb] at hrey: hrey : (1:ℂ).re < 0: rw [Complex.one_re] at hrey: 1 < 0 ✓ lt_irrefl 0 hrey?? 1 < 0: `norm_num at hrey` ✓ better · -- y = −2m, y ≠ −2n ⟹ m ≠ n ⟹ |y − (−2n)| ≥ 1 contra dist < 1/2 have hd := Metric.mem_ball.mp hy rw [hb, Complex.dist_eq] at hd -- ‖−2m + 2n‖ = 2|m − n| ≥ 2 (m ≠ n) have hmn : m ≠ n := by intro hmn apply hyne rw [hb, hmn] ... ``` Hmm the −2n case's last sub-case needs |−2m − (−2n)| ≥ 2 > 1/2: ‖(−2↑m) − (−2↑n)‖ = 2|↑m − ↑n|: m ≠ n: |m − n| ≥ 1 (integers): 2·1 = 2 > 1/2 ✓. Chain: (−2↑m) − (−2↑n) = −(2↑m − 2↑n)... = 2(↑n − ↑m): ‖·‖ = 2·‖↑n − ↑m‖: ‖↑n − ↑m‖ = |↑n − ↑m| via... the re-trick again: |(↑n − ↑m).re| ≤ ‖·‖: re = ↑n − ↑m: |↑n − ↑m| ≥ 1 (distinct nats: |↑n − ↑m| = ↑|n − m... in ℝ: |↑n − ↑m| ≥ 1 from m ≠ n: n < m or >: exact_mod_cast with Int... Simpler: use the factored integerComplement-style: actually simplest: ```lean have hnorm : (2 : ℝ) ≤ ‖(-2 * (m : ℂ)) - -2 * (n : ℂ)‖ := by have e : (-2 * (m : ℂ)) - -2 * (n : ℂ) = ((2 * ((n : ℝ) - (m : ℝ))) : ℂ) := by push_cast; ring rw [e, RCLike.norm_ofReal]?? — the cast-matching risk again... use abs_re: have h6 : |((-2 * (m : ℂ)) - -2 * (n : ℂ)).re| ≤ ‖(-2 * (m : ℂ)) - -2 * (n : ℂ)‖ := Complex.abs_re_le_norm _ have hre : ((-2 * (m : ℂ)) - -2 * (n : ℂ)).re = 2 * ((n : ℝ) - (m : ℝ)) := by simp rw [hre] at h6 have hmn' : (1 : ℝ) ≤ |(n : ℝ) - (m : ℝ)| := by rcases lt_or_gt_of_ne hmn?? — hmn : m ≠ n: lt_or_gt_of_ne hmn : n < m ∨ n > m?? lt_or_gt_of_ne (h : a ≠ b) : a < b ∨ a > b: hmn : m ≠ n gives m < n ∨ m > n: adapt: rcases lt_or_gt_of_ne hmn with hlt | hgt · -- m < n: ↑n − ↑m ≥ 1 have : (m : ℝ) + 1 ≤ (n : ℝ) := by exact_mod_cast Nat.succ_le_of_lt hlt rw [abs_of_nonneg (by linarith)] -- ↑n − ↑m ≥ 0 linarith · have : (n : ℝ) + 1 ≤ (m : ℝ) := by exact_mod_cast Nat.succ_le_of_lt hgt rw [abs_of_nonpos (by linarith)] linarith rw [abs_mul] at h6?? — h6 : |2·(↑n−↑m)| ≤ ‖·‖: |2·x| = 2|x|: abs_mul: |2*x| = |2|*|x| = 2|x| (abs_ofNat...): rw [abs_mul, abs_ofNat...]?? messy: have h7 : |2 * ((n:ℝ) - (m:ℝ))| = 2 * |(n:ℝ) - (m:ℝ)| := by rw [abs_mul]; norm_num rw [h7] at h6 linarith [h6, hmn'] linarith [hd, hnorm] ``` OK. This is all mechanical. Then the final assembly: ```lean -- hWeq : ∀ᶠ y in 𝓝[≠] s, Fexpr y = W y — ball form: rw [eventually_nhdsWithin_iff, Metric.eventually_nhds_iff_ball] at hWeq obtain ⟨ε₁, hε₁, hWeq⟩ := hWeq refine ⟨W, hW, ?_⟩ -- Gentire =ᶠ[𝓝 s] W: on ball(min ε₁ δ₂): y = s: limUnder = W s; y ≠ s: good ⟹ G y = Fexpr y = W y rw [Metric.eventually_nhds_iff_ball] refine ⟨min ε₁ δ₂, lt_min hε₁ hδ₂, fun y hy => ?_⟩ have hε₁y : y ∈ Metric.ball s ε₁ := Metric.ball_subset_ball (min_le_left _ _) hy have hδ₂y : y ∈ Metric.ball s δ₂ := Metric.ball_subset_ball (min_le_right _ _) hy by_cases hye : y = s · subst hye -- Gentire s = W s: limUnder uniqueness haveI := nhdsNE_neBot s have hWcont : Tendsto W (𝓝[≠] s) (𝓝 (W s)) := hW.continuousAt.mono nhdsWithin_le_nhds -- ContinuousAt.mono?? hW.continuousAt : ContinuousAt W s = Tendsto W (𝓝 s) (𝓝 (W s)) ✓ .mono nhdsWithin_le_nhds ✓ have hlim : Tendsto Fexpr (𝓝[≠] s) (𝓝 (W s)) := hWeq'.symm... — Tendsto.congr' : f₁ =ᶠ f₂ → Tendsto f₁ → Tendsto f₂: I have hWeq : ∀ᶠ, Fexpr y = W y i.e. Fexpr =ᶠ[𝓝[≠]s] W; and Tendsto W: want Tendsto Fexpr: Tendsto.congr' h.symm hWcont?? — Tendsto.congr' (hl : f₁ =ᶠ[l] f₂) (hf : Tendsto f₁ l l₂) : Tendsto f₂ l l₂: so hl := hWeq.symm : W =ᶠ Fexpr, hf := hWcont : Tendsto W: gives Tendsto Fexpr ✓: `hWeq.symm... wait hWeq after the rw is in ball-form — keep the original! Don't rw hWeq; keep it as the EventuallyEq and obtain the ball separately: Filter.Eventually + ball: I need both: the EventuallyEq for the Tendsto.congr' AND the pointwise at y. Keep hWeq as the eventual form; get the pointwise via hWeq.self_of... no — pointwise at y ≠ s in the ball: from the Eventually: (hWeq.filter_mono nhdsWithin_le_nhds)... converts to 𝓝 s — loses the ≠ . Use the ball form for pointwise (after rw) and reconstruct Tendsto via the ball form? Alternative: obtain the ball form FIRST into a separate hypothesis: ``` Restructure: keep hWeq (the ∀ᶠ in 𝓝[≠]). For the pointwise at y: `Filter.EventuallyEq` — from hWeq and y ≠ s close to s: (hWeq.eventually_nhds... no: ∀ᶠ in 𝓝[≠] s ⟹ ∃ ball: rw at a COPY: `have hWeqBall := hWeq; rw [...] at hWeqBall; obtain ⟨ε₁, ...⟩ := hWeqBall` — have hWeqBall := hWeq creates a copy ✓ then rw at the copy ✓. Then: ```lean have hlim : Tendsto Fexpr (𝓝[≠] s) (𝓝 (W s)) := Tendsto.congr' hWeq.symm hWcont -- hmm: Tendsto.congr' signature: (hl : f₁ =ᶠ[l] f₂) (hf : Tendsto f₁ l l₂) : Tendsto f₂ l l₂ — hWeq.symm : W =ᶠ[𝓝[≠]s] Fexpr; hWcont : Tendsto W (𝓝[≠]s) (𝓝 (W s)) ⟹ Tendsto Fexpr ... ✓ show limUnder (𝓝[≠] s) Fexpr = W s exact tendsto_nhds_unique (tendsto_nhds_limUnder ⟨W s, hlim⟩) hlim · -- y ≠ s: good ⟹ G y = Fexpr y; ball ⟹ Fexpr y = W y have hygood : ¬ badPoint y := hgood y hδ₂y hye rw [gentire_eq_Fexpr hygood] -- goal Gentire y = W y → Fexpr y = W y exact hWeqBallPt y hε₁y hye -- the pointwise from the ball form: hWeqBall : ∀ y ∈ ball s ε₁, y ∈ {s}ᶜ → Fexpr y = W y: apply: hWeqBall y hε₁y (Set.mem_compl_singleton_iff.mpr hye) ``` Wait — goal: Gentire y = W y (from the refine's fun y hy => ?_: after rw [Metric.eventually_nhds_iff_ball] the goal is ∀ y ∈ ball s (min...), Gentire y = W y — intro y hy: goal Gentire y = W y). `rw [gentire_eq_Fexpr hygood]` — gentire_eq_Fexpr hygood : Gentire y = Fexpr y: rw rewrites Gentire y → Fexpr y ✓ goal Fexpr y = W y ✓. And the case y = s: goal Gentire s = W s — after subst hye (y := s): show limUnder ... — Gentire s unfolds: `show limUnder (𝓝[≠] s) Fexpr = W s` — Gentire s ≡ limUnder (𝓝[≠] s) Fexpr: defeq ✓ show accepts. Hmm wait — Tendsto.congr' argument order — check: `theorem Filter.Tendsto.congr' {f₁ f₂ : α → β} {l₁ : Filter α} {l₂ : Filter β} (hl : f₁ =ᶠ[l₁] f₂) (hf : Tendsto f₁ l₁ l₂) : Tendsto f₂ l₁ l₂` ✓. Capstone: ```lean /-- The ii′-5e-iv capstone: Fexpr extends to an entire function agreeing with it at every good point. -/ theorem exists_entire_Gentire : (∀ s : ℂ, AnalyticAt ℂ Gentire s) ∧ ∀ s : ℂ, ¬ badPoint s → Gentire s = Fexpr s := by refine ⟨fun s => ?_, fun s hs => gentire_eq_Fexpr hs⟩ by_cases hs : badPoint s · obtain ⟨W, hW, hWeq⟩ := gentire_eventually_eq_witness hs exact hW.congr hWeq -- AnalyticAt.congr (hf : AnalyticAt f x) (hg : f =ᶠ[𝓝 x] g) : AnalyticAt g x — hW : AnalyticAt W s; hWeq : Gentire =ᶠ W: need W =ᶠ Gentire: hWeq.symm: exact hW.congr hWeq.symm?? — hWeq : Gentire =ᶠ[𝓝 s] W: AnalyticAt.congr hW hWeq.symm : AnalyticAt Gentire s ✓ · exact (Fexpr_analyticAt_of_not_bad hs).congr (Filter.Eventually.of_forall fun y => ?_) -- need Gentire =ᶠ[𝓝 s] Fexpr: full-nhd agreement on the good ball: obtain ⟨δ, hδ, hgood⟩ := exists_ball_good_of_not_bad hs exact (Fexpr_analyticAt_of_not_bad hs).congr (by rw [Metric.eventually_nhds_iff_ball] exact ⟨δ, hδ, fun y hy => gentire_eq_Fexpr (hgood y hy)⟩) ``` Careful with AnalyticAt.congr direction: `AnalyticAt.congr (hf : AnalyticAt 𝕜 f x) (hg : f =ᶠ[𝓝 x] g) : AnalyticAt 𝕜 g x` — so to prove AnalyticAt Gentire s from AnalyticAt W s: need W =ᶠ[𝓝 s] Gentire: hWeq.symm ✓. For the good case: AnalyticAt.congr (Fexpr-analytic) (hg : Fexpr =ᶠ[𝓝 s] Gentire): the ball gives Gentire y = Fexpr y: so hg : Fexpr =ᶠ Gentire: ⟨δ, hδ, fun y hy => (gentire_eq_Fexpr (hgood y hy)).symm⟩ ✓. Also note gentire_eq_Fexpr's statement IS Gentire s = Fexpr s ✓ used directly in the second component. One more check — `hW.continuousAt` : AnalyticAt.continuousAt ✓ (used in LiResidue). Tendsto.mono: `Filter.Tendsto.mono (hf : Tendsto f l₁ l₂) (hl : l' ≤ l₁) : Tendsto f l' l₂`? name: `Tendsto.mono`? or `tendsto.mono_right`... For shrinking the source filter: `Filter.Tendsto.mono_left : Tendsto f l l' → l'' ≤ l → Tendsto f l'' l'`? Hmm — direction: I have Tendsto W (𝓝 s) ... and want Tendsto W (𝓝[≠] s): source shrink: nhdsWithin_le_nhds : 𝓝[≠] s ≤ 𝓝 s: the lemma: `Tendsto.mono_left (hf : Tendsto f l₁ l₂) (hl : l₂ ≤ l₁)?? names clash with l₂. It's `Filter.Tendsto.mono_left`?? Let me check quickly. Actually in 5e-iii-ish code... I haven't done this yet in the project. Check: `tendsto_nhdsWithin_of_tendsto_nhds`? `Tendsto.mono_left`? grep.
Now §7–§9. Checking the source-filter restriction lemma name first.
tool: Bash
input
{
  "command": "cd D:/Python/Quantum/zeta-23-lean/.lake/packages/mathlib && grep -rn \"theorem Tendsto.mono_left\\|lemma Tendsto.mono_left\\|tendsto_nhdsWithin_of_tendsto_nhds\\b\" Mathlib/Order/Filter/ Mathlib/Topology/ -r --include=*.lean | head -4; grep -rn \"nhdsWithin_le_nhds\" Mathlib/Topology/ -r --include=*.lean | head -2",
  "description": "Source-filter restriction lemma"
}
raw content_json (database row)
[{"type":"thinking","thinking":"Now §7–§9. Write:\n\n§7: Fexpr_eventually_nontrivial (the nontrivial-zero witness).\n§8: Fexpr_analyticAt_of_not_bad + exists_ball_good_of_not_bad.\n§9: Gentire + gentire_eq_Fexpr + gentire_analyticAt + the capstone exists.\n\n§7 details:\n```lean\n/-! ## 7. The witness at a nontrivial zero -/\n\nlemma Fexpr_eventually_nontrivial {ρ₀ : ℂ} (hρ : IsNontrivialZero ρ₀) :\n    ∃ W : ℂ → ℂ, AnalyticAt ℂ W ρ₀ ∧ ∀ᶠ s in 𝓝[≠] ρ₀, Fexpr s = W s := by\n  have hρ1 : ρ₀ ≠ 1 := by\n    intro h\n    rw [h] at hρ\n    have hlt := hρ.2.2\n    rw [Complex.one_re] at hlt\n    exact lt_irrefl 1 hlt\n  obtain ⟨W0, hW0, hW0eq⟩ := logDeriv_zeta_sub_mult_div_eventually hρ.1 hρ1\n  -- series minus its polar term, analytic at ρ₀ (5e-iii)\n  have hS : AnalyticAt ℂ (fun s => seriesFun s - (zeroMult ρ₀ : ℂ) / (s - ρ₀)) ρ₀ :=\n    seriesFun_sub_polar_analyticAt ⟨ρ₀, hρ⟩\n  have hC : AnalyticAt ℂ (fun s : ℂ => 1 / s) ρ₀ := by\n    apply AnalyticAt.div analyticAt_const analyticAt_id (by\n      intro hh\n      rw [hh] at hρ... -- ρ₀ = 0 contra re > 0: hρ.2.1 : 0 < ρ₀.re: rw [hh, Complex.zero_re] at hρ... \n      have hpos := hρ.2.1\n      rw [hh, Complex.zero_re] at hpos\n      exact lt_irrefl 0 hpos)\n  have hC1 : AnalyticAt ℂ (fun s : ℂ => 1 / (s - 1)) ρ₀ := by\n    apply AnalyticAt.div analyticAt_const (g := fun s : ℂ => s - 1) _ (sub_ne_zero.mpr hρ1)\n    exact analyticAt_id.sub analyticAt_const\n  have hD : AnalyticAt ℂ (fun _ : ℂ => (Real.log Real.pi : ℂ) / 2) ρ₀ := analyticAt_const\n  have hE : AnalyticAt ℂ (fun s => Complex.digamma (s / 2) / 2) ρ₀ := by\n    apply analyticAt_digamma_div_two\n    intro m h\n    -- ρ₀/2 = −↑m: re: re ρ₀ / 2 = −m ≤ 0 contra re ρ₀ > 0\n    have hre := congrArg Complex.re h\n    have h1 : (ρ₀ / 2).re = ρ₀.re / 2 := by simp [Complex.div_re, ...]?? — (ρ₀/2).re = ρ₀.re/2: `Complex.div_re`: (a/b).re = (a.re*b.re + a.im*b.im)/(b.re²+b.im²)... messy. Better: from h : ρ₀/2 = −↑m: ρ₀ = −2↑m via linear_combination 2*h — then re: ρ₀.re = −2m ≤ 0 contra hρ.2.1:\n    have h2 : ρ₀ = -2 * (m : ℂ) := by linear_combination 2 * h\n    have h3 : ρ₀.re = -2 * (m : ℝ) := by rw [h2]; simp\n    have h4 : (0 : ℝ) ≤ (m : ℝ) := Nat.cast_nonneg m\n    linarith [hρ.2.1]\n  refine ⟨fun s => W0 s - (seriesFun s - (zeroMult ρ₀ : ℂ) / (s - ρ₀)) + 1 / s + 1 / (s - 1)\n      - (Real.log Real.pi : ℂ) / 2 + Complex.digamma (s / 2) / 2, ?_, ?_⟩\n  · exact ((((hW0.sub hS).add hC).add hC1).sub hD).add hE\n  · filter_upwards [hW0eq] with s hs\n    -- hs : logDeriv ζ s − m/(s−ρ₀) = W0 s\n    show logDeriv riemannZeta s - seriesFun s + 1/s + 1/(s-1) - c + digamma(s/2)/2\n        = W0 s - (seriesFun s - m/(s-ρ₀)) + 1/s + 1/(s-1) - c + digamma(s/2)/2\n    linear_combination hs\n```\nThe final: from hs : logDeriv ζ s − m/(s−ρ₀) = W0 s: LHS − RHS = (logDerivζ − series) − (W0 − (series − m/(s−ρ₀))) = logDerivζ − W0 − m/(s−ρ₀) = 0 ✓ linear_combination hs ✓ (atoms: m/(s−ρ₀) both sides ✓).\n\nWait — the show RHS: the W lambda applied is a beta-redex `(fun s => ...) s` — show's RHS is the reduced form ✓ defeq ✓.\n\nhS's statement: seriesFun_sub_polar_analyticAt ⟨ρ₀, hρ⟩ : AnalyticAt ℂ (fun s => seriesFun s − (↑(zeroMult ↑(⟨ρ₀, hρ⟩)))/(s − ↑(⟨ρ₀,hρ⟩))) ↑(⟨ρ₀,hρ⟩) — coercions ↑⟨ρ₀,hρ⟩ reduce to ρ₀ definitionally ✓ ascription defeq ✓.\n\n§8:\n```lean\n/-! ## 8. The generic point -/\n\nlemma not_badPoint_of_not_bad {s : ℂ} ... — skip\n\nlemma Fexpr_analyticAt_of_not_bad {s : ℂ} (hs : ¬ badPoint s) :\n    AnalyticAt ℂ Fexpr s := by\n  have hs0 : s ≠ 0 := fun h => hs (Or.inr (Or.inl h))\n  have hs1 : s ≠ 1 := fun h => hs (Or.inr (Or.inr (Or.inl h)))\n  have hζ : riemannZeta s ≠ 0 := by\n    intro hz\n    apply hs\n    rcases zeta_zero_classification hz with h | h | ⟨n, hn, h⟩\n    · exact Or.inl h\n    · exact Or.inr (Or.inl h)\n    · exact Or.inr (Or.inr (Or.inr ⟨n, hn, h⟩))\n  have hnontriv : ¬ IsNontrivialZero s := fun h => hs (Or.inl h)\n  have hA : AnalyticAt ℂ (logDeriv riemannZeta) s :=\n    ((analyticAt_riemannZeta hs1).deriv).div (analyticAt_riemannZeta hs1) hζ\n  have hB : AnalyticAt ℂ seriesFun s := seriesFun_analyticAt hnontriv\n  have hC : AnalyticAt ℂ (fun s : ℂ => 1 / s) s :=\n    analyticAt_const.div analyticAt_id hs0\n  have hC1 : AnalyticAt ℂ (fun s : ℂ => 1 / (s - 1)) s := by\n    apply AnalyticAt.div analyticAt_const (g := fun s : ℂ => s - 1) _ (sub_ne_zero.mpr hs1)\n    exact analyticAt_id.sub analyticAt_const\n  have hD : AnalyticAt ℂ (fun _ : ℂ => (Real.log Real.pi : ℂ) / 2) s := analyticAt_const\n  have hE : AnalyticAt ℂ (fun s => Complex.digamma (s / 2) / 2) s := by\n    apply analyticAt_digamma_div_two\n    intro m h\n    apply hs\n    have h2 : s = -2 * (m : ℂ) := by linear_combination 2 * h\n    rcases Nat.eq_zero_or_pos m with hm0 | hm\n    · subst hm0\n      simp at h2\n      exact Or.inr (Or.inl h2)\n    · exact Or.inr (Or.inr (Or.inr ⟨m, hm, h2⟩))\n  show AnalyticAt ℂ (fun s => logDeriv riemannZeta s - seriesFun s + 1 / s + 1 / (s - 1)\n      - (Real.log Real.pi : ℂ) / 2 + Complex.digamma (s / 2) / 2) s\n  exact ((((hA.sub hB).add hC).add hC1).sub hD).add hE\n```\nCheck the show: Fexpr s unfolds to the lambda applied — defeq ✓.\n\nhC's hg0: analyticAt_id hs0?? — AnalyticAt.div (hf) (hg) (hg0 : g x ≠ 0): g = id: g s = id s — defeq s: hs0 : s ≠ 0 ✓ exact-defeq. But `analyticAt_const.div analyticAt_id hs0` as a TERM with the Pi-div type vs the ascribed lambda — risk (session gotcha). Use apply-form to be safe:\n```lean\n  have hC : AnalyticAt ℂ (fun s : ℂ => 1 / s) s := by\n    apply AnalyticAt.div analyticAt_const analyticAt_id hs0\n```\napply unifies conclusion fun x => f x / g x with fun s => 1/s ✓ hg0 := hs0 : s ≠ 0 vs id s ≠ 0 defeq ✓.\n\nThe m=0 case: h2 : s = -2 * ((0:ℕ):ℂ): simp at h2: Nat.cast_zero, mul_zero, neg_zero: h2 : s = 0 ✓ Or.inr (Or.inl h2) ✓.\n\n§8b the good ball:\n```lean\n/-- Around a good point there is a ball of good points (ζ ≠ 0 ball ∩\navoidance of {0, 1}). -/\nlemma exists_ball_good_of_not_bad {s : ℂ} (hs : ¬ badPoint s) :\n    ∃ δ : ℝ, 0 < δ ∧ ∀ y ∈ Metric.ball s δ, ¬ badPoint y := by\n  have hs0 : s ≠ 0 := fun h => hs (Or.inr (Or.inl h))\n  have hs1 : s ≠ 1 := fun h => hs (Or.inr (Or.inr (Or.inl h)))\n  have hζ : riemannZeta s ≠ 0 := by\n    intro hz\n    apply hs\n    rcases zeta_zero_classification hz with h | h | ⟨n, hn, h⟩\n    · exact Or.inl h\n    · exact Or.inr (Or.inl h)\n    · exact Or.inr (Or.inr (Or.inr ⟨n, hn, h⟩))\n  obtain ⟨ε₁, hε₁, hball₁⟩ := Metric.eventually_nhds_iff_ball.mp\n    ((analyticAt_riemannZeta hs1).continuousAt.eventually_ne hζ)\n  have hs0n : (0 : ℝ) < ‖s‖ := norm_pos_iff.mpr hs0\n  have hs1n : (0 : ℝ) < ‖s - 1‖ := norm_pos_iff.mpr (sub_ne_zero.mpr hs1)\n  refine ⟨min ε₁ (min (‖s‖ / 2) (‖s - 1‖ / 2)), ?_, ?_⟩\n  · positivity  -- min of positives: lt_min hε₁ (lt_min (half_pos hs0n) (half_pos hs1n)): positivity can't use hyps: exact lt_min hε₁ (lt_min (half_pos hs0n) (half_pos hs1n))\n  · intro y hy\n    -- y ≠ 0, y ≠ 1, ζ y ≠ 0\n    have hε₁y : dist y s < ε₁ := lt_of_lt_of_le (Metric.mem_ball.mp hy) (min_le_left _ _)\n    have hζy : riemannZeta y ≠ 0 := hball₁ y (Metric.mem_ball.mpr hε₁y)\n    have hδs : dist y s < ‖s‖ / 2 := lt_of_lt_of_le (Metric.mem_ball.mp hy)\n      ((min_le_right _ _).trans (min_le_left _ _))\n    have hδ1 : dist y s < ‖s - 1‖ / 2 := lt_of_lt_of_le (Metric.mem_ball.mp hy)\n      ((min_le_right _ _).trans (min_le_right _ _))\n    have hy0 : y ≠ 0 := by\n      intro h\n      rw [h, dist_zero_right] at hδs  -- dist 0 s = ‖s‖: wait dist y s with y = 0: dist 0 s = ‖0 − s‖ = ‖s‖: dist_zero_right : dist 0 s?? dist_eq_norm: dist 0 s = ‖0 − s‖ = ‖−s‖ = ‖s‖: hδs : ‖s‖ < ‖s‖/2 contra: \n      have : (dist (0:ℂ) s) = ‖s‖ := by rw [Complex.dist_eq]; simp\n      rw [h, this] at hδs\n      linarith\n    have hy1 : y ≠ 1 := by\n      intro h\n      rw [h] at hδ1  -- dist 1 s = ‖s − 1‖: dist_eq_norm: ‖1 − s‖ = ‖s−1‖ (norm_sub_rev):\n      have : (dist (1:ℂ) s) = ‖s - 1‖ := by rw [Complex.dist_eq, ← norm_neg]; ring_nf?? ‖1 − s‖ = ‖−(s−1)‖ = ‖s−1‖: rw [Complex.dist_eq]; conv_lhs...: (1 − s) = -(s−1): rw [show (1:ℂ) − s = -(s − 1) by ring, norm_neg] ✓\n      rw [h, this] at hδ1\n      linarith\n    rintro (h | h | h | ⟨n, hn, h⟩)\n    · exact hζy h.1\n    · exact hy0 h\n    · exact hy1 h\n    · rw [h] at hζy\n      exact hζy (riemannZeta_neg_two_mul hn)\n```\n\n§9 G assembly:\n```lean\n/-! ## 9. The entire extension -/\n\n/-- The entire extension of Fexpr: the punctured-limit value. -/\ndef Gentire : ℂ → ℂ := fun s => limUnder (𝓝[≠] s) Fexpr\n\n/-- At a good point, Gentire = Fexpr (continuity ⟹ punctured limit = value). -/\nlemma gentire_eq_Fexpr {s : ℂ} (hs : ¬ badPoint s) : Gentire s = Fexpr s := by\n  haveI := nhdsNE_neBot s\n  have hcont := (Fexpr_analyticAt_of_not_bad hs).continuousAt\n  have hlim : Tendsto Fexpr (𝓝[≠] s) (𝓝 (Fexpr s)) :=\n    hcont.tendsto.mono nhdsWithin_le_nhds\n  exact tendsto_nhds_unique (tendsto_nhds_limUnder ⟨Fexpr s, hlim⟩) hlim\n```\nWait — `ContinuousAt.tendsto`?? ContinuousAt unfolds to Tendsto f (𝓝 s) (𝓝 (f s)) — `hcont : ContinuousAt Fexpr s` — ContinuousAt is DEFINED as Tendsto f (𝓝 s) (𝓝 (f s)) ✓ so hcont is the Tendsto — `hcont.mono nhdsWithin_le_nhds` ✓ (Tendsto.mono (hf : Tendsto f l₁ L) (hl : l₂ ≤ l₁) : Tendsto f l₂ L ✓).\n\ntendsto_nhds_unique (tendsto_nhds_limUnder ⟨Fexpr s, hlim⟩) hlim : first arg : Tendsto Fexpr (𝓝[≠]s) (𝓝 (limUnder (𝓝[≠]s) Fexpr)); second hlim : Tendsto Fexpr (𝓝[≠]s) (𝓝 (Fexpr s)): tendsto_nhds_unique : a = b where first's target = limUnder, second's = Fexpr s: so gives limUnder (𝓝[≠] s) Fexpr = Fexpr s ✓ and Gentire s unfolds to exactly that ✓ — the goal Gentire s = Fexpr s — `show limUnder (𝓝[≠] s) Fexpr = Fexpr s`? defeq unfold of Gentire s ≡ limUnder... ✓ exact accepts.\n\nnhdsNE_neBot : (x : α) → NeBot (𝓝[≠] x) — from Normed/Field/Basic.lean:248 — for α a NontriviallyNormedField? ℂ ✓. Is it an instance? The line said `theorem nhdsNE_neBot` — probably not an instance (name-based). `haveI := nhdsNE_neBot s` ✓. Hmm wait — actually there might be a proper instance `instNeBot...`: Module.punctured_nhds_neBot was an instance-ish. Whatever, haveI works.\n\n```lean\n/-- The local eventual agreement: at a bad point, Gentire agrees (on a\nfull neighborhood) with the analytic witness. -/\nlemma gentire_eventually_eq_witness {s : ℂ} (hbad : badPoint s) :\n    ∃ W : ℂ → ℂ, AnalyticAt ℂ W s ∧ Gentire =ᶠ[𝓝 s] W := by\n  -- the witness from the case split\n  obtain ⟨W, hW, hWeq⟩ : ∃ W, AnalyticAt ℂ W s ∧ ∀ᶠ y in 𝓝[≠] s, Fexpr y = W y := by\n    rcases hbad with h | h | h | ⟨n, hn, h⟩\n    · exact Fexpr_eventually_nontrivial h\n    · subst h; exact Fexpr_eventually_zero\n    · subst h; exact Fexpr_eventually_one\n    · subst h; exact Fexpr_eventually_neg_two_mul hn\n  -- the avoidance ball: every y ≠ s near s is good\n  obtain ⟨δ₂, hδ₂, hgood⟩ : ∃ δ₂ > 0, ∀ y ∈ Metric.ball s δ₂, y ≠ s → ¬ badPoint y := by\n    rcases hbad with h | h | h | ⟨n, hn, h⟩\n    · -- nontrivial ρ₀: isolation ∩ re-strip\n      obtain ⟨δ, hδ, hiso⟩ := nontrivialZero_isolated ⟨s, h⟩\n      -- re strip radius\n      have hr0 : (0 : ℝ) < s.re := h.2.1\n      have hr1 : (0 : ℝ) < 1 - s.re := by linarith [h.2.2]\n      refine ⟨min δ (min s.re (1 - s.re)), lt_min hδ (lt_min hr0 hr1), fun y hy hyne hby => ?_⟩\n      -- re y ∈ (0, 1)\n      have hrey : (0 : ℝ) < y.re ∧ y.re < 1 := by\n        have hd := Metric.mem_ball.mp hy\n        rw [Complex.dist_eq] at hd\n        have hre_le : |y.re - s.re| ≤ ‖y - s‖ := by\n          have : (y - s).re = y.re - s.re := Complex.sub_re\n          rw [← this]\n          exact Complex.abs_re_le_norm _\n        have hlt : ‖y - s‖ < min s.re (1 - s.re) :=\n          lt_of_lt_of_le hd (min_le_right _ _)\n        rcases abs_lt.mp (lt_of_le_of_lt hre_le hlt) with ⟨h1, h2⟩\n        constructor <;> linarith\n      rcases hby with hb | hb | hb | ⟨m, hm, hb⟩\n      · -- another nontrivial zero: distance ≥ δ contra\n        have hle := hiso ⟨y, hb⟩ (by\n          intro heq\n          apply hyne\n          exact Subtype.ext_iff.mp?? — ⟨y, hb⟩ = ⟨s, h⟩ ⟹ y = s: Subtype.ext_iff: ⟨y,hb⟩ = ⟨s,h⟩ ↔ y = s: `Subtype.ext_iff.mp heq`? heq : (⟨y, hb⟩ : subtype) = ⟨s, h⟩: Subtype.ext_iff.mp heq : y = s?? Subtype.ext_iff : ⟨a, ha⟩ = ⟨b, hb⟩ ↔ a = b ✓: exact hyne (Subtype.ext_iff.mp heq))\n        -- hle : δ ≤ ‖y − s‖; but dist y s < δ (ball, min_left): contra\n        have hd := Metric.mem_ball.mp hy\n        rw [Complex.dist_eq] at hd\n        linarith [lt_of_lt_of_le hd (min_le_left _ _), hle]\n      · rw [hb, Complex.zero_re] at hrey; exact lt_irrefl 0 hrey.1\n      · rw [hb, Complex.one_re] at hrey; exact lt_irrefl 1 hrey.2\n      · -- y = −2m: re = −2m ≤ 0 contra hrey.1\n        have hre : y.re = -2 * (m : ℝ) := by rw [hb]; simp\n        have hm1 : (1 : ℝ) ≤ (m : ℝ) := by exact_mod_cast hm\n        linarith [hrey.1, hre, hm1]\n    · subst h\n      -- s = 0: ball(0, 1/2) ∩ ζ-continuity ball\n      obtain ⟨ε₁, hε₁, hball₁⟩ := Metric.eventually_nhds_iff_ball.mp\n        ((analyticAt_riemannZeta (by norm_num : (0:ℂ) ≠ 1)).continuousAt.eventually_ne\n          (by rw [riemannZeta_zero]; norm_num))\n      refine ⟨min ε₁ (1 / 2), lt_min hε₁ (by norm_num), fun y hy hyne hby => ?_⟩\n      have hy0 : y ≠ 0 := hyne\n      have hε₁y : y ∈ Metric.ball 0 ε₁ := Metric.ball_subset_ball (min_le_left _ _) hy\n      have hζy : riemannZeta y ≠ 0 := hball₁ y hε₁y\n      rcases hby with hb | hb | hb | ⟨m, hm, hb⟩\n      · exact hζy hb.1\n      · exact hy0 hb\n      · rw [hb] at hy  -- y = 1: dist 1 0 < 1/2 contra\n        have hd := Metric.mem_ball.mp (Metric.ball_subset_ball (min_le_right _ _) hy)\n        rw [Complex.dist_eq] at hd\n        norm_num at hd  -- ‖1 − 0‖ < 1/2: ‖1‖ = 1: 1 < 1/2 false ✓ norm_num: ‖(1:ℂ) − 0‖ = 1? simp: sub_zero, norm_one: norm_num at hd might reduce to 1 < 1/2 → closes False goal ✓ (norm_num at h with a false hypothesis closes the goal ✓)\n      · exact hζy (hb ▸ riemannZeta_neg_two_mul hm)  -- hb : y = −2m: ζ(−2m) = 0: `hb ▸ ...`? rw [hb] at hζy; exact hζy (riemannZeta_neg_two_mul hm) ✓ cleaner\n    · subst h\n      -- s = 1: zetaA ball\n      obtain ⟨ε₁, hε₁, hball₁⟩ := Metric.eventually_nhds_iff_ball.mp zetaA_ne_zero_near_one\n      refine ⟨min ε₁ (1 / 2), lt_min hε₁ (by norm_num), fun y hy hyne hby => ?_⟩\n      have hε₁y : y ∈ Metric.ball 1 ε₁ := Metric.ball_subset_ball (min_le_left _ _) hy\n      have hZA : zetaA y ≠ 0 := hball₁ y hε₁y\n      have hy1 : y ≠ 1 := hyne\n      have hζy : riemannZeta y ≠ 0 := by\n        have e := zetaA_apply hy1\n        intro hz\n        rw [hz, mul_zero] at e\n        exact hZA e.symm  -- wait direction: e : zetaA y = (y−1)*0 = 0: hZA e? e.symm : 0 = zetaA y... hZA : zetaA y ≠ 0: hZA e where e : zetaA y = 0 ✓ — after rw [hz, mul_zero] at e: e : zetaA y = 0 ✓ hZA e ✓ (no .symm)\n      rcases hby with hb | hb | hb | ⟨m, hm, hb⟩\n      · exact hζy hb.1\n      · -- y = 0: dist 0 1 < 1/2 contra\n        rw [hb] at hy\n        have hd := Metric.mem_ball.mp (Metric.ball_subset_ball (min_le_right _ _) hy)\n        rw [Complex.dist_eq] at hd\n        norm_num at hd\n      · exact hy1 hb\n      · rw [hb] at hζy\n        exact hζy (riemannZeta_neg_two_mul hm)\n    · subst h\n      -- s = −2n: ball(−2n, 1/2)\n      refine ⟨1 / 2, by norm_num, fun y hy hyne hby => ?_⟩\n      have hrey : y.re < 0 := by\n        have hd := Metric.mem_ball.mp hy\n        rw [Complex.dist_eq] at hd\n        have hre_le : |y.re - (-2 * (n : ℝ))| ≤ ‖y - -2 * (n : ℂ)‖ := by\n          have h1 : (y - -2 * (n : ℂ)).re = y.re - (-2 * (n : ℝ)) := by\n            simp [Complex.sub_re, Complex.mul_re]  -- hmm (−2↑n).re = −2n: simp [Complex.neg_re, Complex.mul_re, Complex.natCast_re, Complex.ofNat_re]\n          rw [← h1]\n          exact Complex.abs_re_le_norm _\n        have hn1 : (1 : ℝ) ≤ (n : ℝ) := by exact_mod_cast hn\n        rcases abs_lt.mp (lt_of_le_of_lt hre_le hd) with ⟨h1, h2⟩\n        linarith\n      rcases hby with hb | hb | hb | ⟨m, hm, hb⟩\n      · have hpos := hb.2.1\n        linarith\n      · rw [hb, Complex.zero_re] at hrey; exact lt_irrefl 0 hrey\n      · rw [hb, Complex.one_re] at hrey; exact lt_irrefl 0 hrey  -- hrey : 1 < 0 after rw: (1:ℂ).re = 1: rw [hb] at hrey: hrey : (1:ℂ).re < 0: rw [Complex.one_re] at hrey: 1 < 0 ✓ lt_irrefl 0 hrey?? 1 < 0: `norm_num at hrey` ✓ better\n      · -- y = −2m, y ≠ −2n ⟹ m ≠ n ⟹ |y − (−2n)| ≥ 1 contra dist < 1/2\n        have hd := Metric.mem_ball.mp hy\n        rw [hb, Complex.dist_eq] at hd\n        -- ‖−2m + 2n‖ = 2|m − n| ≥ 2 (m ≠ n)\n        have hmn : m ≠ n := by\n          intro hmn\n          apply hyne\n          rw [hb, hmn]\n        ...\n```\nHmm the −2n case's last sub-case needs |−2m − (−2n)| ≥ 2 > 1/2: ‖(−2↑m) − (−2↑n)‖ = 2|↑m − ↑n|: m ≠ n: |m − n| ≥ 1 (integers): 2·1 = 2 > 1/2 ✓. Chain: (−2↑m) − (−2↑n) = −(2↑m − 2↑n)... = 2(↑n − ↑m): ‖·‖ = 2·‖↑n − ↑m‖: ‖↑n − ↑m‖ = |↑n − ↑m| via... the re-trick again: |(↑n − ↑m).re| ≤ ‖·‖: re = ↑n − ↑m: |↑n − ↑m| ≥ 1 (distinct nats: |↑n − ↑m| = ↑|n − m... in ℝ: |↑n − ↑m| ≥ 1 from m ≠ n: n < m or >: exact_mod_cast with Int... \n\nSimpler: use the factored integerComplement-style: actually simplest: \n```lean\n        have hnorm : (2 : ℝ) ≤ ‖(-2 * (m : ℂ)) - -2 * (n : ℂ)‖ := by\n          have e : (-2 * (m : ℂ)) - -2 * (n : ℂ) = ((2 * ((n : ℝ) - (m : ℝ))) : ℂ) := by\n            push_cast; ring\n          rw [e, RCLike.norm_ofReal]?? — the cast-matching risk again... use abs_re:\n          have h6 : |((-2 * (m : ℂ)) - -2 * (n : ℂ)).re| ≤ ‖(-2 * (m : ℂ)) - -2 * (n : ℂ)‖ :=\n            Complex.abs_re_le_norm _\n          have hre : ((-2 * (m : ℂ)) - -2 * (n : ℂ)).re = 2 * ((n : ℝ) - (m : ℝ)) := by simp\n          rw [hre] at h6\n          have hmn' : (1 : ℝ) ≤ |(n : ℝ) - (m : ℝ)| := by\n            rcases lt_or_gt_of_ne hmn?? — hmn : m ≠ n: lt_or_gt_of_ne hmn : n < m ∨ n > m?? lt_or_gt_of_ne (h : a ≠ b) : a < b ∨ a > b: hmn : m ≠ n gives m < n ∨ m > n: adapt:\n            rcases lt_or_gt_of_ne hmn with hlt | hgt\n            · -- m < n: ↑n − ↑m ≥ 1\n              have : (m : ℝ) + 1 ≤ (n : ℝ) := by exact_mod_cast Nat.succ_le_of_lt hlt\n              rw [abs_of_nonneg (by linarith)]  -- ↑n − ↑m ≥ 0\n              linarith\n            · have : (n : ℝ) + 1 ≤ (m : ℝ) := by exact_mod_cast Nat.succ_le_of_lt hgt\n              rw [abs_of_nonpos (by linarith)]\n              linarith\n          rw [abs_mul] at h6?? — h6 : |2·(↑n−↑m)| ≤ ‖·‖: |2·x| = 2|x|: abs_mul: |2*x| = |2|*|x| = 2|x| (abs_ofNat...): \n          rw [abs_mul, abs_ofNat...]?? messy: have h7 : |2 * ((n:ℝ) - (m:ℝ))| = 2 * |(n:ℝ) - (m:ℝ)| := by rw [abs_mul]; norm_num\n          rw [h7] at h6\n          linarith [h6, hmn']\n        linarith [hd, hnorm]\n```\nOK. This is all mechanical. Then the final assembly:\n\n```lean\n  -- hWeq : ∀ᶠ y in 𝓝[≠] s, Fexpr y = W y — ball form:\n  rw [eventually_nhdsWithin_iff, Metric.eventually_nhds_iff_ball] at hWeq\n  obtain ⟨ε₁, hε₁, hWeq⟩ := hWeq\n  refine ⟨W, hW, ?_⟩\n  -- Gentire =ᶠ[𝓝 s] W: on ball(min ε₁ δ₂): y = s: limUnder = W s; y ≠ s: good ⟹ G y = Fexpr y = W y\n  rw [Metric.eventually_nhds_iff_ball]\n  refine ⟨min ε₁ δ₂, lt_min hε₁ hδ₂, fun y hy => ?_⟩\n  have hε₁y : y ∈ Metric.ball s ε₁ := Metric.ball_subset_ball (min_le_left _ _) hy\n  have hδ₂y : y ∈ Metric.ball s δ₂ := Metric.ball_subset_ball (min_le_right _ _) hy\n  by_cases hye : y = s\n  · subst hye\n    -- Gentire s = W s: limUnder uniqueness\n    haveI := nhdsNE_neBot s\n    have hWcont : Tendsto W (𝓝[≠] s) (𝓝 (W s)) :=\n      hW.continuousAt.mono nhdsWithin_le_nhds  -- ContinuousAt.mono?? hW.continuousAt : ContinuousAt W s = Tendsto W (𝓝 s) (𝓝 (W s)) ✓ .mono nhdsWithin_le_nhds ✓\n    have hlim : Tendsto Fexpr (𝓝[≠] s) (𝓝 (W s)) := hWeq'.symm... — Tendsto.congr' : f₁ =ᶠ f₂ → Tendsto f₁ → Tendsto f₂: I have hWeq : ∀ᶠ, Fexpr y = W y i.e. Fexpr =ᶠ[𝓝[≠]s] W; and Tendsto W: want Tendsto Fexpr: Tendsto.congr' h.symm hWcont?? — Tendsto.congr' (hl : f₁ =ᶠ[l] f₂) (hf : Tendsto f₁ l l₂) : Tendsto f₂ l l₂: so hl := hWeq.symm : W =ᶠ Fexpr, hf := hWcont : Tendsto W: gives Tendsto Fexpr ✓: `hWeq.symm... wait hWeq after the rw is in ball-form — keep the original! Don't rw hWeq; keep it as the EventuallyEq and obtain the ball separately: Filter.Eventually + ball: I need both: the EventuallyEq for the Tendsto.congr' AND the pointwise at y. Keep hWeq as the eventual form; get the pointwise via hWeq.self_of... no — pointwise at y ≠ s in the ball: from the Eventually: (hWeq.filter_mono nhdsWithin_le_nhds)... converts to 𝓝 s — loses the ≠ . Use the ball form for pointwise (after rw) and reconstruct Tendsto via the ball form? Alternative: obtain the ball form FIRST into a separate hypothesis:\n```\nRestructure: keep hWeq (the ∀ᶠ in 𝓝[≠]). For the pointwise at y: `Filter.EventuallyEq` — from hWeq and y ≠ s close to s: (hWeq.eventually_nhds... no: ∀ᶠ in 𝓝[≠] s ⟹ ∃ ball: rw at a COPY: `have hWeqBall := hWeq; rw [...] at hWeqBall; obtain ⟨ε₁, ...⟩ := hWeqBall` — have hWeqBall := hWeq creates a copy ✓ then rw at the copy ✓.\n\nThen:\n```lean\n    have hlim : Tendsto Fexpr (𝓝[≠] s) (𝓝 (W s)) := Tendsto.congr' hWeq.symm hWcont\n    -- hmm: Tendsto.congr' signature: (hl : f₁ =ᶠ[l] f₂) (hf : Tendsto f₁ l l₂) : Tendsto f₂ l l₂ — hWeq.symm : W =ᶠ[𝓝[≠]s] Fexpr; hWcont : Tendsto W (𝓝[≠]s) (𝓝 (W s)) ⟹ Tendsto Fexpr ... ✓\n    show limUnder (𝓝[≠] s) Fexpr = W s\n    exact tendsto_nhds_unique (tendsto_nhds_limUnder ⟨W s, hlim⟩) hlim\n  · -- y ≠ s: good ⟹ G y = Fexpr y; ball ⟹ Fexpr y = W y\n    have hygood : ¬ badPoint y := hgood y hδ₂y hye\n    rw [gentire_eq_Fexpr hygood]  -- goal Gentire y = W y → Fexpr y = W y\n    exact hWeqBallPt y hε₁y hye  -- the pointwise from the ball form: hWeqBall : ∀ y ∈ ball s ε₁, y ∈ {s}ᶜ → Fexpr y = W y: apply: hWeqBall y hε₁y (Set.mem_compl_singleton_iff.mpr hye)\n```\nWait — goal: Gentire y = W y (from the refine's fun y hy => ?_: after rw [Metric.eventually_nhds_iff_ball] the goal is ∀ y ∈ ball s (min...), Gentire y = W y — intro y hy: goal Gentire y = W y). `rw [gentire_eq_Fexpr hygood]` — gentire_eq_Fexpr hygood : Gentire y = Fexpr y: rw rewrites Gentire y → Fexpr y ✓ goal Fexpr y = W y ✓.\n\nAnd the case y = s: goal Gentire s = W s — after subst hye (y := s): show limUnder ... — Gentire s unfolds: `show limUnder (𝓝[≠] s) Fexpr = W s` — Gentire s ≡ limUnder (𝓝[≠] s) Fexpr: defeq ✓ show accepts.\n\nHmm wait — Tendsto.congr' argument order — check: `theorem Filter.Tendsto.congr' {f₁ f₂ : α → β} {l₁ : Filter α} {l₂ : Filter β} (hl : f₁ =ᶠ[l₁] f₂) (hf : Tendsto f₁ l₁ l₂) : Tendsto f₂ l₁ l₂` ✓.\n\nCapstone:\n```lean\n/-- The ii′-5e-iv capstone: Fexpr extends to an entire function agreeing\nwith it at every good point. -/\ntheorem exists_entire_Gentire :\n    (∀ s : ℂ, AnalyticAt ℂ Gentire s) ∧ ∀ s : ℂ, ¬ badPoint s → Gentire s = Fexpr s := by\n  refine ⟨fun s => ?_, fun s hs => gentire_eq_Fexpr hs⟩\n  by_cases hs : badPoint s\n  · obtain ⟨W, hW, hWeq⟩ := gentire_eventually_eq_witness hs\n    exact hW.congr hWeq  -- AnalyticAt.congr (hf : AnalyticAt f x) (hg : f =ᶠ[𝓝 x] g) : AnalyticAt g x — hW : AnalyticAt W s; hWeq : Gentire =ᶠ W: need W =ᶠ Gentire: hWeq.symm: exact hW.congr hWeq.symm?? — hWeq : Gentire =ᶠ[𝓝 s] W: AnalyticAt.congr hW hWeq.symm : AnalyticAt Gentire s ✓\n  · exact (Fexpr_analyticAt_of_not_bad hs).congr (Filter.Eventually.of_forall fun y => ?_)  \n    -- need Gentire =ᶠ[𝓝 s] Fexpr: full-nhd agreement on the good ball:\n    obtain ⟨δ, hδ, hgood⟩ := exists_ball_good_of_not_bad hs\n    exact (Fexpr_analyticAt_of_not_bad hs).congr (by\n      rw [Metric.eventually_nhds_iff_ball]\n      exact ⟨δ, hδ, fun y hy => gentire_eq_Fexpr (hgood y hy)⟩)\n```\nCareful with AnalyticAt.congr direction: `AnalyticAt.congr (hf : AnalyticAt 𝕜 f x) (hg : f =ᶠ[𝓝 x] g) : AnalyticAt 𝕜 g x` — so to prove AnalyticAt Gentire s from AnalyticAt W s: need W =ᶠ[𝓝 s] Gentire: hWeq.symm ✓. For the good case: AnalyticAt.congr (Fexpr-analytic) (hg : Fexpr =ᶠ[𝓝 s] Gentire): the ball gives Gentire y = Fexpr y: so hg : Fexpr =ᶠ Gentire: ⟨δ, hδ, fun y hy => (gentire_eq_Fexpr (hgood y hy)).symm⟩ ✓.\n\nAlso note gentire_eq_Fexpr's statement IS Gentire s = Fexpr s ✓ used directly in the second component.\n\nOne more check — `hW.continuousAt` : AnalyticAt.continuousAt ✓ (used in LiResidue). Tendsto.mono: `Filter.Tendsto.mono (hf : Tendsto f l₁ l₂) (hl : l' ≤ l₁) : Tendsto f l' l₂`? name: `Tendsto.mono`? or `tendsto.mono_right`... For shrinking the source filter: `Filter.Tendsto.mono_left : Tendsto f l l' → l'' ≤ l → Tendsto f l'' l'`? Hmm — direction: I have Tendsto W (𝓝 s) ... and want Tendsto W (𝓝[≠] s): source shrink: nhdsWithin_le_nhds : 𝓝[≠] s ≤ 𝓝 s: the lemma: `Tendsto.mono_left (hf : Tendsto f l₁ l₂) (hl : l₂ ≤ l₁)?? names clash with l₂. It's `Filter.Tendsto.mono_left`?? Let me check quickly. Actually in 5e-iii-ish code... I haven't done this yet in the project. Check: `tendsto_nhdsWithin_of_tendsto_nhds`? `Tendsto.mono_left`? grep.","signature":""},{"type":"text","text":"Now §7–§9. Checking the source-filter restriction lemma name first."},{"type":"tool_use","id":"Bash_195","name":"Bash","input":{"command":"cd D:/Python/Quantum/zeta-23-lean/.lake/packages/mathlib && grep -rn \"theorem Tendsto.mono_left\\|lemma Tendsto.mono_left\\|tendsto_nhdsWithin_of_tendsto_nhds\\b\" Mathlib/Order/Filter/ Mathlib/Topology/ -r --include=*.lean | head -4; grep -rn \"nhdsWithin_le_nhds\" Mathlib/Topology/ -r --include=*.lean | head -2","description":"Source-filter restriction lemma"},"extra_content":null}]