Current task: —

← Session 29 — ii′-5e-v: circle bound (far-tail + series bounds)

#1634 assistant 2026-08-24 02:01:51.807 UTC · 1006→11394 tok open ⤢
thinking (25234 chars)
Fexpr: `logDeriv riemannZeta s - seriesFun s + 1/s + 1/(s-1) - (Real.log Real.pi:ℂ)/2 + Complex.digamma (s/2)/2`. Now I have everything. Let me plan 5e-v-c's Lean build: **§10 pieces:** 1. `digamma_right_le`: for re w ≥ 1.75: ‖ψ w‖ ≤ 48 + 23·log(2+‖w‖). Cases: |im w| ≥ 5: sub-log (norm_digamma_sub_log_le_of_two_le_abs_im needs 2 ≤ |im w| ✓ 5 ≥ 2) + norm_log_le_of_one_le (‖w‖ ≥ re ≥ 1.75 ≥ 1 ✓): ‖ψ w‖ ≤ ‖ψ w − log w‖ + ‖log w‖ ≤ 3 + log‖w‖ + π. Need ≤ 48+23·log(2+‖w‖): 3+π ≤ 7 ≤ 48 ✓ and log‖w‖ ≤ log(2+‖w‖) ≤ 23·log(2+‖w‖) ✓. |im w| < 5: re w ≥ 2: (B): 20·log(2+‖w‖) ≤ 48+23·log(2+‖w‖) ✓. re w < 2 (with |im w| < 5): (A) c = 1: dist: ‖w+m‖ ≥ |re(w+m)| = re w + m ≥ 1.75 ≥ 1 ✓ ∀ m: ‖w‖... (A): (46+2/1)+23·log(2+‖w‖) = 48+23·log(2+‖w‖) ✓ EXACT. Formal structure: ``` lemma digamma_right_le {w : ℂ} (hwre : (1.75:ℝ) ≤ w.re) : ‖Complex.digamma w‖ ≤ 48 + 23 * Real.log (2 + ‖w‖) := by rcases le_or_gt (5:ℝ) |w.im| with him | him · -- sub-log have h1 := norm_digamma_sub_log_le_of_two_le_abs_im (by linarith [him] : (2:ℝ) ≤ |w.im|) have hwnorm : (1:ℝ) ≤ ‖w‖ := by have h2 := Complex.abs_re_le_norm w rw [abs_of_nonneg (by linarith [hwre])] at h2 linarith [hwre, h2] have h2 := norm_log_le_of_one_le hwnorm have h3 : ‖Complex.digamma w‖ ≤ ‖Complex.digamma w - Complex.log w‖ + ‖Complex.log w‖ := norm_sub_le_iff... -- ‖a‖ = ‖(a−b)+b‖ ≤ ‖a−b‖+‖b‖: norm_le_sub_norm_add? -- : ‖digamma w‖ = ‖(digamma w − log w) + log w‖ ≤ ...: calc ‖Complex.digamma w‖ = ‖(Complex.digamma w - Complex.log w) + Complex.log w‖ := by rw [sub_add_cancel] _ ≤ ‖Complex.digamma w - Complex.log w‖ + ‖Complex.log w‖ := norm_add_le _ _ _ ≤ 3 + (Real.log ‖w‖ + Real.pi) := add_le_add h1 h2 _ ≤ 48 + 23 * Real.log (2 + ‖w‖) := by have hlog2w : Real.log ‖w‖ ≤ Real.log (2 + ‖w‖) := Real.log_le_log (by linarith [hwnorm] : (0:ℝ) < ‖w‖) (by linarith [norm_nonneg w]) have hpi : Real.pi ≤ 45 := by have := Real.pi_lt_315; linarith have hlog2w_nn : (0:ℝ) ≤ Real.log (2+‖w‖) := Real.log_nonneg (by linarith [norm_nonneg w] : (1:ℝ) ≤ 2+‖w‖) linarith [hlog2w, hpi, hlog2w_nn] · -- |im| < 5 by_cases hwre2 : (2:ℝ) ≤ w.re · -- (B) have h1 := norm_digamma_le_of_two_le_re hwre2 (by linarith [him]) have hlog2w_nn : (0:ℝ) ≤ Real.log (2+‖w‖) := Real.log_nonneg (by linarith [norm_nonneg w]) linarith [h1, hlog2w_nn] · -- (A) c = 1 push Not at hwre2 have hdist : ∀ m : ℕ, (1:ℝ) ≤ ‖w + (m : ℂ)‖ := by intro m have h1 : ‖w + (m : ℂ)‖ ≥ |(w + (m : ℂ)).re| := Complex.abs_re_le_norm _ have h2 : (w + (m : ℂ)).re = w.re + (m : ℝ) := by rw [Complex.add_re, Complex.natCast_re] rw [h2] at h1 have h3 : (0:ℝ) ≤ (m : ℝ) := Nat.cast_nonneg _ linarith [hwre, h1, h3] have h1 := norm_digamma_le_of_dist_nat (show (0:ℝ) < 1 by norm_num) (by linarith [hwre2] : w.re ≤ 2) hdist -- (A) gives (46 + 2/1) + 23·log(2+‖w‖) = 48 + 23·log(2+‖w‖) have h2 : (46 : ℝ) + 2 / 1 = 48 := by norm_num rw [h2] at h1 exact h1 ``` Hmm — (A)'s hwre : w.re ≤ 2 ✓ (hwre2 negated). Note (A)'s conclusion has `(46 + 2 \ c)` — the backslash in the grep display is `/` (division). So with c = 1: 46+2/1 = 48 ✓. 2. `digamma_circle_le`: for s on the circle, ‖ψ(s/2)‖ ≤ 62 + 23·log(2+R/2)-ish. Cases: - re(s/2) ≤ 2 hmm — actually simplest uniform: split on re(s/2) ≤ 2 vs ≥ 2 hmm — but the dist-based (A) needs re ≤ 2 and dist(w,−ℕ) ≥ c. For the circle points with re(s/2) ≤ 2: dist(s/2, −ℕ) ≥ ? Two sub-cases: |im(s/2)| ≥ 5: sub-log: ‖ψ‖ ≤ 3 + log‖s/2‖ + π ≤ 62+23·log(2+‖s/2‖) ✓ (3+π ≤ 7 ≤ 62 ✓). |im(s/2)| < 5: then |re s| ≥ √(R²−100) hmm — |im s| < 10 ⟹ |re s| ≥ √(R²−100) ⟹ |re(s/2)| ≥ √(R²−100)/2 ≥ ~R/2: either re(s/2) ≥ R/2-ish ≥ 2 (use digamma_right_le: 48+23·log) or re(s/2) ≤ −√(R²−100)/2 (the left near-axis: dist(s/2,−ℕ) ≥ 1/8 from the ℤ-clearance: (A) c = 1/8: 46+16 = 62 ✓). So `digamma_circle_le` needs the dist-argument for the left near-axis — which needs the hgapInt property (dist(R/2,ℤ) ≥ 1/4). So the Fexpr circle bound theorem will take hgapInt as a hypothesis (from exists_gapCircle_radius's third component). The dist-lower-bound: for s with ‖s‖ = R, |im s| < 10, re s < 0 (the left near-axis): dist(s/2, −ℕ) ≥ 1/8: ∀ m : ℕ, 1/8 ≤ ‖s/2 + (m:ℂ)‖: ‖s/2+m‖ ≥ |re(s/2+m)| = |re s/2 + m|: m : ℕ: −m ∈ −ℕ: re s/2 ∈ [−R/2, −√(R²−100)/2]: |re s/2 − (−m)|: the nearest −m to re s/2: hmm — re s/2 + m: if −m is near re s/2: |re s/2 + m| ≥ dist(re s/2, −ℕ)... Let me formalize: re(s/2) = (re s)/2: re s ∈ [−R, −√(R²−100)]: re(s/2) ∈ [−R/2, −√(R²−100)/2]. Let x := re(s/2): x + R/2 ∈ [0, R/2 − √(R²−100)/2] — R/2 − √(R²−100)/2 = (R−√(R²−100))/2 = 50/(R+√(R²−100)) ≤ 50/R ≤ 26/R·... (R−√(R²−100))/2: R−√(R²−100) = 100/(R+√(R²−100)) ≤ 100/R: so x + R/2 ≤ 50/R. Hmm the design said 26/R: with √(R²−100) ≥ 0: R−√(R²−100) = 100/(R+√(R²−100)) ≤ 100/R: /2 = 50/R. For R ≥ 400: 50/R ≤ 1/8. R ≥ 16002 ✓ (50/16002 < 1/8 ⟺ 400 < 16002 ✓). dist(x, −ℕ): x ∈ [−R/2, −R/2+50/R]: write x = −R/2 + u, u ∈ [0, 50/R]: for m : ℕ: x + m = u + (m − R/2): |x + m| ≥ |m − R/2| − u ≥ 1/4 − 50/R ≥ 1/4 − 1/8 = 1/8 ✓ where |m − R/2| = |R/2 − m| ≥ 1/4 by hgapInt (m : ℤ). So ‖s/2 + m‖ ≥ |re(s/2+m)| = |x + m| ≥ 1/8 ✓. Formal: ‖s/2 + (m:ℂ)‖ ≥ |(s/2 + (m:ℂ)).re| = |(re s)/2 + m| (re(s/2) = (re s)/2: Complex.div_re? re(s/2): (s/2).re = s.re/2: via Complex.ext or simp [Complex.div_re, Complex.ofNat_re]: re(s/2) = re(s)/2 hmm: s/2 = s·(1/2): re = s.re·(1/2) = s.re/2: `Complex.div_ofNat_re`? simp lemma: Complex.div_re with ofNat — simp [Complex.div_re, Complex.ofNat_re] should give (s/2).re = s.re/2. Let me use: have : (s/2).re = s.re/2 := by simp [Complex.div_re, Complex.ofNat_re]... might need `Complex.ext`... Actually simpler: (s/2 + (m:ℂ)).re = s.re/2 + m: via simp [Complex.add_re, Complex.div_re, Complex.ofNat_re, Complex.natCast_re]. Then |(re s)/2 + m| ≥ 1/8: the above u-argument with hgapInt (m : ℤ): |R/2 − (m:ℝ)| ≥ 1/4: hgapInt's form: ∀ m : ℤ, 1/4 ≤ |R/2 − (m:ℝ)| ✓ (from exists_gapCircle_radius). (re s)/2 + m = ((re s)/2 + R/2) + (m − R/2) hmm: (re s)/2 + m = (m − R/2) + ((re s)/2 + R/2): |(re s)/2 + m| ≥ |m − R/2| − ((re s)/2 + R/2) (reverse triangle, (re s)/2+R/2 ≥ 0 ✓): ≥ 1/4 − 50/R ≥ 1/8 ✓ (50/R ≤ 1/8 ⟺ 400 ≤ R ✓). Need: (re s)/2 + R/2 ∈ [0, 50/R]: (re s)/2 ≥ −R/2 (re s ≥ −R: |re s| ≤ R ✓ abs_re_le_norm+hs) ⟹ (re s)/2 + R/2 ≥ 0 ✓; (re s)/2 ≤ −√(R²−100)/2 hmm — the upper: re s ≤ −√(R²−100) (this is the LEFT near-axis case: re s < 0 and |im s| < 10 ⟹ re² > R²−100 ⟹ re s < −√(R²−100) ✓). (re s)/2 + R/2 ≤ (R − √(R²−100))/2 = 50/(R+√(R²−100)) ≤ 50/R ✓ — the R−√(R²−100) = 100/(R+√(R²−100)) identity: (R−√)(R+√) = R²−(R²−100) = 100 (mul_self_sub_mul_self + Real.mul_self_sqrt). ~15 lines. Hmm wait — is the sqrt route needed? Alternative: avoid √: re s < 0, |im s| < 10: re² = R²−im² > R²−100: (re s)/2 + R/2 = (R + re s)/2: R+re s = (R²−re²)/(R−re s) = im²/(R−re s) ≤ 100/R (im² ≤ 100, R−re s ≥ R): so (re s)/2+R/2 = (R+re s)/2 ≤ 50/R ✓ NO SQRT NEEDED. R+re s ≥ 0 ✓ (re s ≥ −R). And the identity R+re s = im²/(R−re s): (R+re s)(R−re s) = R²−re² = im² (normSq) ⟹ R+re s = im²/(R−re s) (R−re s ≠ 0: R−re s ≥ R > 0 ✓). So `digamma_circle_le {s} (hs : ‖s‖ = R) (hgapInt : ∀ m : ℤ, 1/4 ≤ |R/2 − (m:ℝ)|) (hR : 16002 ≤ R) : ‖Complex.digamma (s/2)‖ ≤ 62 + 23 * Real.log (2 + R/2)`. Cases: |im(s/2)| ≥ 5 (⟺ |im s| ≥ 10): sub-log: ‖ψ(s/2)‖ ≤ 3 + log‖s/2‖ + π ≤ 3+log(R/2)+4 ≤ 62+23·log(2+R/2) (log(R/2) ≤ log(2+R/2) ✓; 3+π ≤ 7 ≤ 62-…; need 3 + log(R/2) + π ≤ 62 + 23·log(2+R/2): log(R/2) ≤ log(2+R/2) ✓ (R/2 ≤ 2+R/2, log mono); π ≤ 4 (pi_lt_315: 3.15): 3+4 = 7 ≤ 62 + 22·log(2+R/2) ✓ (log(2+R/2) ≥ log 2 ≥ 0). - |im(s/2)| < 5 ∧ re(s/2) ≥ ... split re(s/2) ≤ 2 vs > 2: re(s/2) > 2 hmm wait — the digamma_right_le needs re ≥ 1.75: for re(s/2) ≥ 1.75: 48+23·log(2+‖s/2‖) ≤ 62+23·log(2+R/2) (‖s/2‖ = R/2 ✓ 48 ≤ 62). For re(s/2) < 1.75 with |im(s/2)| < 5: |re(s/2)| ≥ ... |im s| < 10 ⟹ |re s| ≥ √(R²−100) — UGH sqrt again. Avoid: |im(s/2)| < 5 ⟹ |im s| < 10 ⟹ (re s)² = R² − (im s)² > R² − 100 ⟹ |re s| > √(R²−100)... just need re s ∉ (−5, 5)-ish: (re s)² > R²−100 ⟹ |re s| > R−... |re s| ≥ R−50/R: (R−|re s|)(R+|re s|) = im² < 100: R−|re s| < 100/(R+|re s|) ≤ 100/R: |re s| > R−100/R. So |re(s/2)| > R/2−50/R. With re(s/2) < 1.75: re(s/2) ∈ (−R/2+50/R)... re(s/2) < 1.75 and |re(s/2)| > R/2−50/R ≥ R/2−1 (50/R < 1): so re(s/2) < −(R/2−50/R) (negative branch since |re(s/2)| > R/2−50/R ≥ 1.75 would contradict if positive... |re(s/2)| > R/2−50/R ≥ R/2−1 ≥ 1.75 for R ≥ 6: so re(s/2) is either > 1.75 (contradiction) or < −1.75: hence re(s/2) < −1.75 < 0 ✓). So re(s/2) < 0, |re(s/2)| > R/2−50/R: i.e. (re s)/2 ∈ [−R/2, −(R/2−50/R)): (re s)/2 + R/2 ∈ [0, 50/R). Then the dist argument: (A) c = 1/8: hwre : (s/2).re ≤ 2 ✓ (re(s/2) < 0 ≤ 2): hdist ∀ m, 1/8 ≤ ‖s/2+m‖ ✓ (the u-argument). Result: 62+23·log(2+‖s/2‖) = 62+23·log(2+R/2) ✓ (‖s/2‖ = ‖s‖/2 = R/2: norm_div, norm_ofNat... ‖s/2‖ = ‖s‖/‖(2:ℂ)‖ = R/2 ✓). Summary of digamma_circle_le cases: (a) 5 ≤ |im(s/2)|: sub-log. (b) |im(s/2)| < 5 ∧ 1.75 ≤ re(s/2): right_le (48 ≤ 62). (c) |im(s/2)| < 5 ∧ re(s/2) < 1.75: the left dist (A) c = 1/8 (62 exact). ✓ 3. The near-sum count `nearZeros_count_le`: Σ_{ρ ∈ nearZeros t} (zeroMult ρ:ℝ) ≤ 3·A₀·log(3·max|t−1||t+1|+5) for |t| ≥ 10: via zerosIn(t−1, t+1] cover + finsum bridge + Ncount_le_of_interval_gen (b−a+1 = 3). Wait — one window suffices when |t| ≥ 10 ✓ (all γ in (t−1,t+1) same sign). But the zerosIn membership needs IsNontrivialZero ρ — from zeroDisc_isNontrivial? Let me check: session 023: "zeroDiscFinset + zeroDisc_isNontrivial (re ≥ 1 via Mathlib's one_le_re nonvanishing; re ≤ 0 via ΓR-pole/FE)". Signature: zeroDisc_isNontrivial {t} {ρ} (hρ : ρ ∈ zeroDiscFinset t) : IsNontrivialZero ρ? Need to check — also zeroDiscFinset needs ht : 10 ≤ |t|? Let me check zeroDiscFinset's def. 4. `logDeriv_circle_le`: the three-region logDeriv bound: region (i) re s ≥ 2: Dirichlet ≤ dirichletC2. region (ii) −5/2 ≤ re s ≤ 2 (⟹ |im s| ≥ 10 auto for R ≥ 11): the capstones + near sum: ‖logDeriv ζ s‖ ≤ ‖logDeriv ζ s − near‖ + ‖near‖ ≤ 200000·(log|t|)² + 32Ĉ₀·(3·A₀·log(3·max|t−1||t+1|+5)). with t := s.im: |t| ≥ 10 (auto: re² ≤ max(25/4, 4) = 25/4 hmm re ∈ [−5/2, 2]: re² ≤ 25/4: im² = R²−re² ≥ R²−25/4: |im| ≥ √(R²−25/4) ≥ 10 ✓ R ≥ 11). Split re s ≥ 1/2 (5c, 100000) vs ≤ 1/2 (5d-left, 200000): uniform ≤ 200000·(log|t|)² + near. log|t| ≤ log R (|t| ≤ R ✓). The near-sum: ‖Σ_{ρ ∈ nearZeros t} m/(s−ρ)‖ ≤ Σ m·‖1/(s−ρ)‖ = Σ m/‖s−ρ‖ ≤ 32Ĉ₀·Σ m: per ρ ∈ nearZeros t: ‖s−ρ‖ ≥ 1/(32Ĉ₀): ρ ∈ nearZeros t ⟹ |γ−t| < 1 ⟹ ‖ρ‖ ≥ |γ| ≥ |t|−1 and ‖ρ‖ ≤ |re|+|γ| ≤ 1+|t|+1 = |t|+2: with |t| ≤ R: ‖ρ‖ ≤ R+2 and ‖ρ‖ ≥ |t|−1. Case ‖ρ‖ > R−2: then ρ ∈ crit-shell (‖ρ‖ ∈ (R−2, R+2)) AND ρ ∈ circleZeros R (‖ρ‖ < R+2 ≤ 2R+1 ✓): shell_crit's hsep — BUT hsep is LOCAL to shell_crit (inside its proof). I need the separation as a STANDALONE lemma! Extract: `gapCircle_sep {k} (hk) {R} (hRlo) (hgap) {s} (hs : ‖s‖ = R) (hsz) {ρ : ℂ} (hρ : IsNontrivialZero ρ) (hρnorm : R−2 < ‖ρ‖ ∧ ‖ρ‖ < R+2) : 1/(32·Ĉ₀) ≤ ‖s − ρ‖`. Then shell_crit uses it too — hmm, shell_crit is already proved with the inline version. For 5e-v-c I'll prove the standalone `gapCircle_sep` (the same proof, taking ρ : ℂ with IsNontrivialZero instead of the subtype) and use it in the near-sum; shell_crit stays as is (duplication acceptable — or refactor shell_crit to use it; cleaner to refactor but the freeze protocol... LiCircleBound is THIS tier's file, editable. Simplest: prove standalone gapCircle_sep and leave shell_crit untouched (its inline proof already works — no need to touch). Case ‖ρ‖ ≤ R−2: ‖s−ρ‖ ≥ R−‖ρ‖ ≥ 2 ≥ 1/(32Ĉ₀) ✓. Also need hsz (s not a nontrivial zero — from not_isNontrivialZero_on_gapCircle) — only for the identity, not for the separation. Wait — the separation proof in shell_crit used the hgap on ρ OR conj ρ (both nontrivial) ✓ works for ρ : ℂ with IsNontrivialZero ρ ✓. And the t := s.im, γ := ρ.im arc analysis ✓ same. So near-sum ≤ 32Ĉ₀·(Σ_{nearZeros t} m) ≤ 32Ĉ₀·3A₀·log(3·max|t−1||t+1|+5) ≤ 32Ĉ₀·3A₀·2L = 192·Ĉ₀A₀L (3·max|t−1||t+1|+5 ≤ 3(R+1)+5 = 3R+8 ≤ 4R ⟹ log ≤ 2L ✓ — max|t−1||t+1| = |t|+1 ≤ R+1 ✓). region (ii) total: 200000·L² + 192·Ĉ₀A₀L ≤ 200000·L² + 192·Ĉ₀A₀L². region (iii) re s < −5/2: the FE route: logDeriv ζ s = −logDeriv ζ(1−s) − (logDeriv ΓR s + logDeriv ΓR(1−s)) via logDeriv_zeta_fe — needs 10 hyps: - s ≠ 0 ✓ (‖s‖ = R > 0), s ≠ 1 ✓ (re < 0). - Gammaℝ s ≠ 0: Gammaℝ_eq_zero_iff : Gammaℝ s = 0 ↔ ∃ m : ℕ, s = −(m:ℂ)? hmm — Gammaℝ zeros... ΓR(s) = π^{−s/2}Γ(s/2): zero iff Γ(s/2) pole: s/2 ∈ −ℕ: s ∈ −2ℕ: s = −2n. For our s: re s < −5/2, |im s| could be nonzero or s = −R: s = −2n would need s real: s = −R: R = 2n: dist(R/2,ℤ) ≥ 1/4 ⟹ R/2 ∉ ℤ ⟹ R ∉ 2ℤ ✓ excluded. For im s ≠ 0: s/2 ∉ ℝ·... −(m:ℂ) is real: s/2 = −m ⟹ im = 0 ✓ excluded. So Gammaℝ s ≠ 0 via Complex.Gammaℝ_eq_zero_iff (check the exact name/form — used in LiFEntire zeta_zero_classification: "Gammaℝ_eq_zero_iff gives −(2*↑m)"). - ζ s ≠ 0: zeta_zero_classification: zeros = nontrivial ∪ {0} ∪ {−2n}: s: re < −5/2 < 0, im = t: if ζ s = 0: s nontrivial (re ∈ (0,1) — no), s = 0 (no), s = −2n (excluded as above) ⟹ ζ s ≠ 0 ✓. - DifferentiableAt Gammaℝ s: Gammaℝ differentiable off its poles: s/2 ∉ −ℕ ✓ (same as above): there should be a lemma `differentiableAt_Gammaℝ` (used in 5d/5e-iv? — check: analyticAt_Gammaℝ or differentiableAt... In LiReflect they pass hd as hypothesis — there's a discharge lemma somewhere. Let me grep.) - Same at 1−s: 1−s ≠ 0 ✓ (s ≠ 1), ≠ 1 ✓ (s ≠ 0); Gammaℝ(1−s) ≠ 0: (1−s)/2 ∉ −ℕ: re((1−s)/2) > 0 ✓; ζ(1−s) ≠ 0: re(1−s) > 1: nonvanishing re ≥ 1 (Mathlib's `riemannZeta_ne_zero_of_one_le_re` or Zeta23's) ✓; DifferentiableAt ✓. Then: ‖logDeriv ζ s‖ ≤ ‖logDeriv ζ(1−s)‖ + ‖logDeriv ΓR s‖ + ‖logDeriv ΓR(1−s)‖ ≤ dirichletC2 (re(1−s) ≥ 1+5/2 > 2 ✓) + bracket. bracket via (G) — needs im s ≠ 0 AND im(1−s) ≠ 0 (same: im(1−s) = −im s): for im s ≠ 0: logDeriv ΓR s = −(log π)/2 + ½ψ(s/2); logDeriv ΓR(1−s) = −(log π)/2 + ½ψ((1−s)/2): bracket = −log π + ½(ψ(s/2)+ψ((1−s)/2)): ‖bracket‖ ≤ log π + ½(‖ψ(s/2)‖+‖ψ((1−s)/2)‖) ≤ log π + ½(62+23·log(2+R/2)) + ½(48+23·log(2+‖(1−s)/2‖)): ‖(1−s)/2‖ ≤ (1+R)/2: log(2+(1+R)/2) ≤ log(2+R) ≤ L+1 (2+R ≤ 2R ⟹ log ≤ log2+L ≤ 1+L): so ≤ log π + 31+12·log(2+R/2) + 24+12·(L+1) ≤ π+55+12·L+12·L+12 = π+67+24L ≤ 2+67+24L = 69+24L ≤ 69·A₀Ĉ₀L²-ish ✓ (absorbs). For im s = 0 (s = −R): the continuity extension. The bound B(s) := dirichletC2 + 69+24L is CONTINUOUS-free (a constant); the function s ↦ logDeriv ζ s is continuous at −R (ζ analytic + nonzero at −R ⟹ logDeriv continuous). And the bracket-bound holds at nearby arc points with im ≠ 0... but actually — the FE identity at s = −R ALSO holds (logDeriv_zeta_fe's hyps all checkable at −R ✓): logDeriv ζ(−R) = −logDeriv ζ(1+R) − (logDeriv ΓR(−R) + logDeriv ΓR(1+R)). The issue is only EVALUATING logDeriv ΓR(−R) — (G) needs im ≠ 0. So: continuity of logDeriv ΓR at −R + the formula on im ≠ 0 dense ⟹ the bound ‖logDeriv ΓR s + logDeriv ΓR(1−s)‖ ≤ 69+24L at s = −R by taking limits: the function s ↦ ‖logDeriv ΓR s + logDeriv ΓR(1−s)‖ is continuous at −R (logDeriv ΓR continuous at −R and at 1+R ✓ both Gammaℝ nonzero + differentiable) and bounded by C on the dense set {arc points with im ≠ 0} ⟹ ≤ C at −R (continuous + closure: ‖f(−R)‖ = lim ‖f(sₙ)‖ ≤ C). In Lean: choose sₙ := R·exp(I·(π − 1/(n+1))) hmm — or simpler: sₙ := ⟨−R·cos(1/(n+1)), R·sin(1/(n+1))⟩: ‖sₙ‖ = R ✓, im > 0 ✓, → ⟨−R, 0⟩ = −R. Tendsto: cos(1/(n+1)) → 1, sin(1/(n+1)) → 0. Continuity of the norm-function composition. Then `(continuous_norm.comp hcont).continuousAt` + Tendsto.le_of_eventually_le... Formally: Tendsto (fun n => ‖g(sₙ)‖) (𝓝 (‖g(−R)‖)) and ∀ n, ‖g(sₙ)‖ ≤ C ⟹ ‖g(−R)‖ ≤ C (le_of_tendsto_of_tendsto hmm — le_of_tendsto (h : Tendsto f atTop (𝓝 a)) (h' : ∀ᶠ n, f n ≤ C) : a ≤ C — `le_of_tendsto_of_tendsto'` or `le_of_tendsto` with tendsto_const. Something like: le_of_tendsto_of_tendsto (hf : Tendsto f l (𝓝 a)) (hg : Tendsto g l (𝓝 b)) (h : ∀ᶠ x, f x ≤ g x) : a ≤ b with g := const C.) This adds ~50-60 lines. Alternatively — handle s = −R directly: prove logDeriv_Gammaℝ_eq AT the real point too via continuity of both sides: both sides continuous at −R (logDeriv ΓR continuous; the RHS: digamma(s/2) continuous at −R/2 (analyticAt_digamma: −R/2 ∉ {0}∪−ℕ: dist(R/2,ℤ) ≥ 1/4 ⟹ R/2 ∉ ℤ... wait −R/2: is −R/2 ∈ {0}∪−ℕ? −R/2 = −m ⟺ R/2 = m ∈ ℤ — excluded ✓; = 0 no). So RHS continuous at −R) and equal on the dense im ≠ 0 ⟹ equal at −R (continuous extension of equality — Tendsto uniqueness: f − g continuous, = 0 on dense ⟹ = 0 at the point). That's the SAME continuity machinery but applied to the equality — equally heavy. OK, do the norm-continuity bound route. Hmm — actually, EVEN SIMPLER: note that at s = −R, instead of (G), evaluate the bracket bound DIRECTLY: ‖logDeriv ΓR(−R) + logDeriv ΓR(1+R)‖ — both arguments real. logDeriv ΓR(1+R): (1+R)/2: re > 0 big — hmm still needs (G). No way around: (G) is im ≠ 0 only. The continuity route it is. WAIT — actually, do I even need the bracket at s = −R via (G)? There's `logDeriv_Gammaℝ_shift` from 5d (the +4 shift used in the left capstone): `logDeriv ΓR s = logDeriv ΓR (s+4) − (1/s + 1/(s+1) + 1/(s+2) + 1/(s+3))`-ish — and 5d's left capstone uses StirlingVert's digamma_stirling on the shifted. For s = −R: logDeriv ΓR(−R) = logDeriv ΓR(4−R) − Σ 1/(−R+j): and digamma_stirling for the shifted (re(4−R) < 0 still...). Hmm the 5d machinery shifts by +4 to get digamma args in re > 0: logDeriv ΓR s = −(logπ)/2 + ½ψ(s/2) — the 5d proof of the bracket bound used logDeriv_Gammaℝ_shift + digamma_stirling — did 5d prove a BRACKET bound ≤ 4(log|t|)²? Yes: "the ΓR-bracket ≤ 4(log|t|)² (the +4 ΓR shift logDeriv_Gammaℝ_shift putting both digamma arguments in re > 0 + StirlingVert digamma_stirling)". That bound is for |t| ≥ 10 — at s = −R, t = 0 — not applicable. OK, continuity route it is. Actually hold on — for s = −R (real), maybe the cleanest: ψ(s/2) at s = −R: s/2 = −R/2: dist(−R/2, −ℕ) ≥ 1/4 (hgapInt) ⟹ digamma analytic at −R/2 ✓ and the (G) formula at −R: prove by the continuity-of-equality on the dense set... I'll do the norm-continuity bound route for the whole case (iii) at im = 0 — single use point (s = −R; also any other circle point with im = 0 is just ±R, and +R is region (i) ✓ — so ONLY s = −R needs it). Let me now define the exact region split for the logDeriv bound: - (i) 2 ≤ re s: Dirichlet. - (ii) −5/2 ≤ re s ∧ re s ≤ 2 hmm wait 5c needs re ≥ 1/2 and 5d-left needs re ≤ 1/2: union [−5/2, 7/2]: with (i) covering re ≥ 2: let region (ii) := −5/2 ≤ re s ∧ re s < 2: split at 1/2: [1/2, 2) → 5c (re ≤ 7/2 ✓ 2 ≤ 7/2 ✓); [−5/2, 1/2) → 5d-left (re ≤ 1/2 ✓). At re = 1/2 either works ✓ use 5c. - (iii) re s < −5/2: FE. Coverage: re ≥ 2 / −5/2 ≤ re < 2 / re < −5/2 ✓ all. The |t| ≥ 10 for region (ii): re ∈ [−5/2, 2] ⟹ re² ≤ 25/4 ⟹ im² = R²−re² ≥ R²−25/4: |im| ≥ √(R²−25/4) — avoid sqrt: |im| ≥ R−(25/4)/R·... R−|im| = re²/(R+|im|) ≤ (25/4)/R: |im| ≥ R−25/(4R) ≥ 10 ⟺ 25/(4R) ≤ R−10 ⟸ R ≥ 16002 ✓ linarith. 5. The elem bounds: 1/s, 1/(s−1), log π/2, ψ(s/2)/2: - ‖(1:ℂ)/s‖ = 1/‖s‖ = 1/R ≤ 1 (norm_div, norm_one, hs). - ‖1/(s−1)‖ = 1/‖s−1‖ ≤ 1/(R−1) ≤ 1 (‖s−1‖ ≥ ‖s‖−‖(1:ℂ)‖ = R−1 ≥ 1; 1/(R−1) ≤ 1 ⟺ R ≥ 2). - ‖(Real.log Real.pi : ℂ)/2‖ = (log π)/2 ≤ 1: log π ≤ 2: π ≤ e²: Real.pi_lt_315 (π < 3.15) hmm need log π ≤ 2: π ≤ e^2 ⟸ e^2 ≥ 7.29 > 3.15 > π ✓: Real.log_le_log (pi_pos) (π ≤ e^2): π < 3.15 ≤ 7.29 ≤ e^2 (e^2 ≥ 2.7² = 7.29 ✓). So log π ≤ 2, (log π)/2 ≤ 1 ✓. norm of cast: RCLike.norm_ofReal? `Complex.norm_ofReal`? norm_ofReal : ‖(x:ℂ)‖ = |x| ✓ (RCLike.norm_ofReal or Complex.norm_ofReal). And the cast is (Real.log Real.pi : ℂ): ‖(log π:ℂ)/2‖ = |log π|/2 = (log π)/2 (log π ≥ 0: π ≥ 1: Real.log_nonneg (le_of_lt Real.pi_gt_one... pi > 3.14 > 1)). - ‖digamma (s/2)/2‖ = ‖digamma (s/2)‖/2 ≤ (62+23·log(2+R/2))/2. 6. **The assembly** `Fexpr_circle_le`: ``` theorem Fexpr_circle_le {k : ℕ} (hk : 4000 ≤ k) {R : ℝ} (hRlo : 4*(k:ℝ)+5/2 ≤ R) (hRhi : R ≤ 4k+3) (hgap : ...) (hgapInt : ∀ m : ℤ, 1/4 ≤ |R/2 − (m:ℝ)|) {s : ℂ} (hs : ‖s‖ = R) : ‖Fexpr s‖ ≤ 2 * lowZeroConst + dirichletC2 + 400000 * A0count * C0hat (R+2) * (Real.log R)^2 ``` Hmm — wait: should the constant absorb dirichletC2 as well? dirichletC2 is a fixed finite constant (like lowZeroConst) — keep both symbolic-additive. Actually for the squeeze, ANY fixed constants are fine. Keep the form. Proof: unfold Fexpr; norm chain: ‖Fexpr s‖ ≤ ‖logDeriv ζ s‖ + ‖seriesFun s‖ + ‖1/s‖ + ‖1/(s−1)‖ + ‖(log π:ℂ)/2‖ + ‖digamma (s/2)/2‖ — via norm_add_le/norm_sub_le: Fexpr = ((logDeriv − seriesFun) + 1/s) + 1/(s−1) − c + ψ: bound: ‖a − b‖ ≤ ‖a‖+‖b‖: stepwise: ‖Fexpr‖ = ‖logDeriv − seriesFun + 1/s + 1/(s−1) − c + ψ‖ ≤ ‖logDeriv − seriesFun + 1/s + 1/(s−1) − c‖ + ‖ψ‖ ≤ ... — a few lines of calc with norm_sub_le/norm_add_le. Each piece bounded as computed. Ĉ₀(4k+9/2) ≤ Ĉ₀(R+2) via C0hat_mono (4k+9/2 ≥ 1 ✓, 4k+9/2 ≤ R+2 ⟺ 4k+5/2 ≤ R ✓ hRlo). Budget check with the actual haves: - series: 2·lowZeroConst + 2900·A₀·Ĉ₀(4k+9/2)·L² ≤ 2·lowZeroConst + 2900·A₀·Ĉ₀(R+2)·L² ✓. - logDeriv: max over regions: (i) dirichletC2; (ii) 200000·L²+192Ĉ₀A₀L² (with Ĉ₀(4k+9/2) → Ĉ₀(R+2) — WAIT: the separation 1/(32Ĉ₀) uses Ĉ₀(4k+9/2) (the gap property is stated with it) ✓ keep consistent, convert at the end); (iii) dirichletC2 + (log π + 69+24L)-ish ≤ dirichletC2 + 100·A₀Ĉ₀L². Uniform: dirichletC2 + 200000·L² + 192·Ĉ₀(R+2)A₀L² + 100·A₀Ĉ₀L². 200000·L² ≤ 100000·A₀Ĉ₀L² (A₀ ≥ 1, Ĉ₀ ≥ 2 ⟹ A₀Ĉ₀ ≥ 2 ⟹ A₀Ĉ₀L² ≥ 2L² ⟹ 200000L² = 100000·2L² ≤ 100000A₀Ĉ₀L² ✓). So logDeriv ≤ dirichletC2 + 100292·A₀Ĉ₀(R+2)L². - ψ-elem: 31 + 12·log(2+R/2): log(2+R/2) ≤ L (2+R/2 ≤ R ⟺ 4 ≤ R ✓): ≤ 31+12L ≤ 43·A₀Ĉ₀L² (43 ≤ 43·A₀Ĉ₀L²/(1)·... A₀Ĉ₀L² ≥ 2·81 = 162: 31+12L ≤ 31·(A₀Ĉ₀L²/162)·... ugh: 31 ≤ (31/162)·A₀Ĉ₀L² ≤ 0.2·A₀Ĉ₀L²; 12L ≤ 12·A₀Ĉ₀L² (A₀Ĉ₀L ≥ 1 ✓): total ≤ 12.2·A₀Ĉ₀L² ≤ 13·A₀Ĉ₀L² ✓). - 1/s + 1/(s−1) ≤ 2 ≤ (2/162)·A₀Ĉ₀L² ≤ A₀Ĉ₀L². - log π/2 ≤ 1 ≤ A₀Ĉ₀L². TOTAL: 2·lowZeroConst + [2900 + 100292 + 13 + 1 + 1]·A₀Ĉ₀L² + dirichletC2 = 2·lowZeroConst + dirichletC2 + 103207·A₀Ĉ₀L² ≤ 2·lowZeroConst + dirichletC2 + 400000·A₀Ĉ₀L² ✓. So final constant 400000 fits with room. Order of build: - c-i: `gapCircle_sep` (standalone separation, ~100 lines — adapted from shell_crit's hsep but for ρ : ℂ directly) + `nearZeros_count_le` (~60) + the near-sum bound (~80). - c-ii: `digamma_right_le` (~50) + `digamma_circle_le` (~120) + the small elems (~60). - c-iii: `logDeriv_circle_le` (~200 incl. the FE region + the s = −R continuity) + `Fexpr_circle_le` assembly (~80). The s = −R continuity: hmm — let me think about whether I can AVOID it. At s = −R: I need ‖logDeriv ΓR(−R) + logDeriv ΓR(1+R)‖ ≤ bracket. What if I bound the two logDeriv ΓR values SEPARATELY via the m-shift recurrence to a (G)-applicable point? logDeriv ΓR(−R) = logDeriv ΓR(−R+2i·...)? No — the recurrence is in the REAL direction (Gamma_add_one): logDeriv ΓR(s) = logDeriv ΓR(s+2) − (1/s + 1/(s+2))-ish (ΓR(s+2) = (s/2)·ΓR(s)?? Gammaℝ(s+2) = (s/2)·Gammaℝ(s): logDeriv: logDeriv ΓR(s+2)·(s+2)... hmm: ΓR(s+2) = (s/2)ΓR(s) ⟹ logDeriv ΓR(s) = logDeriv ΓR(s+2)·... the 5d `logDeriv_Gammaℝ_shift` already does a +4 shift chain: logDeriv ΓR s = logDeriv ΓR (s+4) − [1/s·2-ish terms]. For s = −R: logDeriv ΓR(−R) = logDeriv ΓR(4−R) − Σ_{j=0}^{3} (digamma-shift terms): and at (4−R): im still 0! (G) STILL not applicable (real point). ARGH. The (G) restriction is im ≠ 0 — every real point needs the continuity argument. OK, continuity route. Actually — WAIT. Alternative: prove (G) at real non-pole points too, by the identity principle! Both sides of `logDeriv ΓR s = −(log π)/2 + ½ψ(s/2)` are analytic on the connected open set ℂ ∖ ({0} ∪ −2ℕ-ish poles) hmm — logDeriv ΓR analytic where ΓR ≠ 0 and differentiable: off {−2ℕ}. The set U := ℂ ∖ (−2ℕ)?? hmm: ΓR(s) = π^{−s/2}Γ(s/2): poles where s/2 ∈ −ℕ ⟺ s ∈ −2ℕ∪{0}?? Γ(s/2) poles at s/2 ∈ {0,−1,−2,...} ⟺ s ∈ {0,−2,−4,...} = −2ℕ. And ΓR ≠ 0 everywhere else (Γ has no zeros). So both sides analytic on U := ℂ \ {0,−2,−4,...} — wait also need s/2 ∉ {0}∪−ℕ for digamma(s/2) — same set. U = ℂ ∖ {s : ∃ m:ℕ, s = −2m}: connected? ℂ minus a discrete set is connected ✓. The formula holds on {im ≠ 0} ⊆ U — which has a limit point in U ✓ (e.g. 1). Identity principle: AnalyticOnNhd.eq_of_isPreconnected_eq... Mathlib: `AnalyticOn.eqOn_of_preconnected_of_eventually_eq`? or `AnalyticOnNhd.eq_of_frequently_eq`? The journal-020 pattern used "identity principle" — let me grep for what was used. This is ~40 lines if the API cooperates. Then (G) holds at ALL non-pole points including −R. That's cleaner than the sequence-tendsto (no explicit sequence construction). Let me check what identity-principle API was used before (LiDigamma.lean "complex series by Weierstrass + identity principle"). Let me grep for the identity principle usage in the repo.
All signatures in hand. The s = −R (real point) needs the (G) formula off `im ≠ 0` — check which identity-principle API was used before in this repo.
tool: Grep ok
input
{
  "pattern": "(eq_of_frequently_eq|identity.*principle|AnalyticOnNhd.*eq|eqOn_of_preconnected)",
  "path": "D:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1",
  "output_mode": "content",
  "-n": true,
  "head_limit": 15
}
result 2026-08-24 02:01:52Z → 2026-08-26 19:31:58Z
mode='content' num_files=0 filenames=[] content="research\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean:47:theorem Jlag_differentiableAt_dogleg {n : ℕ} {s : ℂ}\nresearch\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-48-    (hre: 3 ≤ s.re) (him : 0 < s.im) :\nresearch\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-49-    DifferentiableAt ℂ (Jlag n) s:= by\nD:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-50-  apply Jlag_differentiableAt\nD:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-51-  · rintro rfl\nD:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-52-    simp at him\nD:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-53-  · exact riemannZeta_ne_zero_of_one_lt_re (by linarith)\nD:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-54-\nD:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-55-/-- Jlag is holomorphic on the whole dog-leg rectangle\n--\nresearch\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean:57:theorem holomorphicOn_Jlag_dogleg {n : ℕ} {T U XR : ℝ}\nresearch\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-58-    (hT: 0 < T) (hTU : T ≤ U) (hXR : 3 ≤ XR) :\nresearch\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-59-    HolomorphicOn (Jlag n) (Rectangle (dogZ T) (dogW XR U)):= by\nD:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-60-  intro s hs\nD:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-61-  rw [Rectangle, Complex.mem_reProdIm, dogZ_re, dogW_re, dogZ_im, dogW_im] at hs\nD:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-62-  rw [Set.uIcc_of_le hXR, Set.uIcc_of_le hTU] at hs\nD:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-63-  exact (Jlag_differentiableAt_dogleg hs.1.1 (by linarith [hs.2.1])).differentiableWithinAt\nD:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-64-\nD:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1\\LiDogLeg.lean-65-/-- **The dog-leg rectangle integral vanishes** (Cauchy; the region is\n--\nresearch\\lean\\NguyenRH1\\NguyenRH1\\LiSkeleton.lean:762:def DogLegRight (n : ℝ) : ℝ :=\nD:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1\\LiSkeleton.lean-763-  ((Real.sqrt n + 1) / 2) * (Real.exp (5 / 2) + 1) / 2 + 8.38 + IIMaj n / 4\nD:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1\\LiSkeleton.lean-764-\nresearch\\lean\\NguyenRH1\\NguyenRH1\\LiSkeleton.lean-765-\\-- The margin majorant chain (D-057, corrected per D-071): margiñ(n) =\nD:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1\\LiSkeleton.lean-766-S(n) − B̃(n) + 1 with the counting function majorized by a smooth\nD:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1\\LiSkeleton.lean-767-function F. M₀ = 1.3352 (E-023, grid-verified — see D-060 §4).\nresearch\\lean\\NguyenRH1\\NguyenRH1\\LiSkeleton.lean-768-CORRECTION (D-071, user-approved session 038): the bridge is 4F (the\nD:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1\\LiSkeleton.lean-769-residue sum λ_n(T) runs over BOTH signs of γ — D-036/D-037's 2N(T)\nD:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1\\LiSkeleton.lean-770-was a factor-2 accounting slip, R-004 unaffected) and the I_III" num_lines=29 num_matches=None applied_limit=None applied_offset=None
raw content_json (database row)
[{"type":"thinking","thinking":"Fexpr: `logDeriv riemannZeta s - seriesFun s + 1/s + 1/(s-1) - (Real.log Real.pi:ℂ)/2 + Complex.digamma (s/2)/2`.\n\nNow I have everything. Let me plan 5e-v-c's Lean build:\n\n**§10 pieces:**\n\n1. `digamma_right_le`: for re w ≥ 1.75: ‖ψ w‖ ≤ 48 + 23·log(2+‖w‖). Cases: |im w| ≥ 5: sub-log (norm_digamma_sub_log_le_of_two_le_abs_im needs 2 ≤ |im w| ✓ 5 ≥ 2) + norm_log_le_of_one_le (‖w‖ ≥ re ≥ 1.75 ≥ 1 ✓): ‖ψ w‖ ≤ ‖ψ w − log w‖ + ‖log w‖ ≤ 3 + log‖w‖ + π. Need ≤ 48+23·log(2+‖w‖): 3+π ≤ 7 ≤ 48 ✓ and log‖w‖ ≤ log(2+‖w‖) ≤ 23·log(2+‖w‖) ✓. |im w| < 5: re w ≥ 2: (B): 20·log(2+‖w‖) ≤ 48+23·log(2+‖w‖) ✓. re w < 2 (with |im w| < 5): (A) c = 1: dist: ‖w+m‖ ≥ |re(w+m)| = re w + m ≥ 1.75 ≥ 1 ✓ ∀ m: ‖w‖... (A): (46+2/1)+23·log(2+‖w‖) = 48+23·log(2+‖w‖) ✓ EXACT.\n   Formal structure:\n   ```\n   lemma digamma_right_le {w : ℂ} (hwre : (1.75:ℝ) ≤ w.re) :\n       ‖Complex.digamma w‖ ≤ 48 + 23 * Real.log (2 + ‖w‖) := by\n     rcases le_or_gt (5:ℝ) |w.im| with him | him\n     · -- sub-log\n       have h1 := norm_digamma_sub_log_le_of_two_le_abs_im (by linarith [him] : (2:ℝ) ≤ |w.im|)\n       have hwnorm : (1:ℝ) ≤ ‖w‖ := by\n         have h2 := Complex.abs_re_le_norm w\n         rw [abs_of_nonneg (by linarith [hwre])] at h2\n         linarith [hwre, h2]\n       have h2 := norm_log_le_of_one_le hwnorm\n       have h3 : ‖Complex.digamma w‖ ≤ ‖Complex.digamma w - Complex.log w‖ + ‖Complex.log w‖ :=\n         norm_sub_le_iff... -- ‖a‖ = ‖(a−b)+b‖ ≤ ‖a−b‖+‖b‖: norm_le_sub_norm_add? \n       -- : ‖digamma w‖ = ‖(digamma w − log w) + log w‖ ≤ ...: \n       calc ‖Complex.digamma w‖ = ‖(Complex.digamma w - Complex.log w) + Complex.log w‖ := by rw [sub_add_cancel]\n         _ ≤ ‖Complex.digamma w - Complex.log w‖ + ‖Complex.log w‖ := norm_add_le _ _\n         _ ≤ 3 + (Real.log ‖w‖ + Real.pi) := add_le_add h1 h2\n         _ ≤ 48 + 23 * Real.log (2 + ‖w‖) := by\n             have hlog2w : Real.log ‖w‖ ≤ Real.log (2 + ‖w‖) := Real.log_le_log (by linarith [hwnorm] : (0:ℝ) < ‖w‖) (by linarith [norm_nonneg w])\n             have hpi : Real.pi ≤ 45 := by have := Real.pi_lt_315; linarith\n             have hlog2w_nn : (0:ℝ) ≤ Real.log (2+‖w‖) := Real.log_nonneg (by linarith [norm_nonneg w] : (1:ℝ) ≤ 2+‖w‖)\n             linarith [hlog2w, hpi, hlog2w_nn]\n     · -- |im| < 5\n       by_cases hwre2 : (2:ℝ) ≤ w.re\n       · -- (B)\n         have h1 := norm_digamma_le_of_two_le_re hwre2 (by linarith [him])\n         have hlog2w_nn : (0:ℝ) ≤ Real.log (2+‖w‖) := Real.log_nonneg (by linarith [norm_nonneg w])\n         linarith [h1, hlog2w_nn]\n       · -- (A) c = 1\n         push Not at hwre2\n         have hdist : ∀ m : ℕ, (1:ℝ) ≤ ‖w + (m : ℂ)‖ := by\n           intro m\n           have h1 : ‖w + (m : ℂ)‖ ≥ |(w + (m : ℂ)).re| := Complex.abs_re_le_norm _\n           have h2 : (w + (m : ℂ)).re = w.re + (m : ℝ) := by\n             rw [Complex.add_re, Complex.natCast_re]\n           rw [h2] at h1\n           have h3 : (0:ℝ) ≤ (m : ℝ) := Nat.cast_nonneg _\n           linarith [hwre, h1, h3]\n         have h1 := norm_digamma_le_of_dist_nat (show (0:ℝ) < 1 by norm_num) (by linarith [hwre2] : w.re ≤ 2) hdist\n         -- (A) gives (46 + 2/1) + 23·log(2+‖w‖) = 48 + 23·log(2+‖w‖)\n         have h2 : (46 : ℝ) + 2 / 1 = 48 := by norm_num\n         rw [h2] at h1\n         exact h1\n   ```\n   Hmm — (A)'s hwre : w.re ≤ 2 ✓ (hwre2 negated). Note (A)'s conclusion has `(46 + 2 \\ c)` — the backslash in the grep display is `/` (division). So with c = 1: 46+2/1 = 48 ✓.\n\n2. `digamma_circle_le`: for s on the circle, ‖ψ(s/2)‖ ≤ 62 + 23·log(2+R/2)-ish. Cases:\n   - re(s/2) ≤ 2 hmm — actually simplest uniform: split on re(s/2) ≤ 2 vs ≥ 2 hmm — but the dist-based (A) needs re ≤ 2 and dist(w,−ℕ) ≥ c. For the circle points with re(s/2) ≤ 2: dist(s/2, −ℕ) ≥ ? Two sub-cases: |im(s/2)| ≥ 5: sub-log: ‖ψ‖ ≤ 3 + log‖s/2‖ + π ≤ 62+23·log(2+‖s/2‖) ✓ (3+π ≤ 7 ≤ 62 ✓). |im(s/2)| < 5: then |re s| ≥ √(R²−100) hmm — |im s| < 10 ⟹ |re s| ≥ √(R²−100) ⟹ |re(s/2)| ≥ √(R²−100)/2 ≥ ~R/2: either re(s/2) ≥ R/2-ish ≥ 2 (use digamma_right_le: 48+23·log) or re(s/2) ≤ −√(R²−100)/2 (the left near-axis: dist(s/2,−ℕ) ≥ 1/8 from the ℤ-clearance: (A) c = 1/8: 46+16 = 62 ✓).\n   So `digamma_circle_le` needs the dist-argument for the left near-axis — which needs the hgapInt property (dist(R/2,ℤ) ≥ 1/4). So the Fexpr circle bound theorem will take hgapInt as a hypothesis (from exists_gapCircle_radius's third component).\n   \n   The dist-lower-bound: for s with ‖s‖ = R, |im s| < 10, re s < 0 (the left near-axis): dist(s/2, −ℕ) ≥ 1/8: ∀ m : ℕ, 1/8 ≤ ‖s/2 + (m:ℂ)‖: ‖s/2+m‖ ≥ |re(s/2+m)| = |re s/2 + m|: m : ℕ: −m ∈ −ℕ: re s/2 ∈ [−R/2, −√(R²−100)/2]: |re s/2 − (−m)|: the nearest −m to re s/2: hmm — re s/2 + m: if −m is near re s/2: |re s/2 + m| ≥ dist(re s/2, −ℕ)... Let me formalize: re(s/2) = (re s)/2: re s ∈ [−R, −√(R²−100)]: re(s/2) ∈ [−R/2, −√(R²−100)/2]. Let x := re(s/2): x + R/2 ∈ [0, R/2 − √(R²−100)/2] — R/2 − √(R²−100)/2 = (R−√(R²−100))/2 = 50/(R+√(R²−100)) ≤ 50/R ≤ 26/R·... (R−√(R²−100))/2: R−√(R²−100) = 100/(R+√(R²−100)) ≤ 100/R: so x + R/2 ≤ 50/R. Hmm the design said 26/R: with √(R²−100) ≥ 0: R−√(R²−100) = 100/(R+√(R²−100)) ≤ 100/R: /2 = 50/R. For R ≥ 400: 50/R ≤ 1/8. R ≥ 16002 ✓ (50/16002 < 1/8 ⟺ 400 < 16002 ✓).\n   dist(x, −ℕ): x ∈ [−R/2, −R/2+50/R]: write x = −R/2 + u, u ∈ [0, 50/R]: for m : ℕ: x + m = u + (m − R/2): |x + m| ≥ |m − R/2| − u ≥ 1/4 − 50/R ≥ 1/4 − 1/8 = 1/8 ✓ where |m − R/2| = |R/2 − m| ≥ 1/4 by hgapInt (m : ℤ). So ‖s/2 + m‖ ≥ |re(s/2+m)| = |x + m| ≥ 1/8 ✓.\n   Formal: ‖s/2 + (m:ℂ)‖ ≥ |(s/2 + (m:ℂ)).re| = |(re s)/2 + m| (re(s/2) = (re s)/2: Complex.div_re? re(s/2): (s/2).re = s.re/2: via Complex.ext or simp [Complex.div_re, Complex.ofNat_re]: re(s/2) = re(s)/2 hmm: s/2 = s·(1/2): re = s.re·(1/2) = s.re/2: `Complex.div_ofNat_re`? simp lemma: Complex.div_re with ofNat — simp [Complex.div_re, Complex.ofNat_re] should give (s/2).re = s.re/2. Let me use: have : (s/2).re = s.re/2 := by simp [Complex.div_re, Complex.ofNat_re]... might need `Complex.ext`... Actually simpler: (s/2 + (m:ℂ)).re = s.re/2 + m: via simp [Complex.add_re, Complex.div_re, Complex.ofNat_re, Complex.natCast_re].\n   Then |(re s)/2 + m| ≥ 1/8: the above u-argument with hgapInt (m : ℤ): |R/2 − (m:ℝ)| ≥ 1/4: hgapInt's form: ∀ m : ℤ, 1/4 ≤ |R/2 − (m:ℝ)| ✓ (from exists_gapCircle_radius). (re s)/2 + m = ((re s)/2 + R/2) + (m − R/2) hmm: (re s)/2 + m = (m − R/2) + ((re s)/2 + R/2): |(re s)/2 + m| ≥ |m − R/2| − ((re s)/2 + R/2) (reverse triangle, (re s)/2+R/2 ≥ 0 ✓): ≥ 1/4 − 50/R ≥ 1/8 ✓ (50/R ≤ 1/8 ⟺ 400 ≤ R ✓).\n   Need: (re s)/2 + R/2 ∈ [0, 50/R]: (re s)/2 ≥ −R/2 (re s ≥ −R: |re s| ≤ R ✓ abs_re_le_norm+hs) ⟹ (re s)/2 + R/2 ≥ 0 ✓; (re s)/2 ≤ −√(R²−100)/2 hmm — the upper: re s ≤ −√(R²−100) (this is the LEFT near-axis case: re s < 0 and |im s| < 10 ⟹ re² > R²−100 ⟹ re s < −√(R²−100) ✓). (re s)/2 + R/2 ≤ (R − √(R²−100))/2 = 50/(R+√(R²−100)) ≤ 50/R ✓ — the R−√(R²−100) = 100/(R+√(R²−100)) identity: (R−√)(R+√) = R²−(R²−100) = 100 (mul_self_sub_mul_self + Real.mul_self_sqrt). ~15 lines.\n   \n   Hmm wait — is the sqrt route needed? Alternative: avoid √: re s < 0, |im s| < 10: re² = R²−im² > R²−100: (re s)/2 + R/2 = (R + re s)/2: R+re s = (R²−re²)/(R−re s) = im²/(R−re s) ≤ 100/R (im² ≤ 100, R−re s ≥ R): so (re s)/2+R/2 = (R+re s)/2 ≤ 50/R ✓ NO SQRT NEEDED. R+re s ≥ 0 ✓ (re s ≥ −R). And the identity R+re s = im²/(R−re s): (R+re s)(R−re s) = R²−re² = im² (normSq) ⟹ R+re s = im²/(R−re s) (R−re s ≠ 0: R−re s ≥ R > 0 ✓). \n\n   So `digamma_circle_le {s} (hs : ‖s‖ = R) (hgapInt : ∀ m : ℤ, 1/4 ≤ |R/2 − (m:ℝ)|) (hR : 16002 ≤ R) : ‖Complex.digamma (s/2)‖ ≤ 62 + 23 * Real.log (2 + R/2)`.\n   Cases: |im(s/2)| ≥ 5 (⟺ |im s| ≥ 10): sub-log: ‖ψ(s/2)‖ ≤ 3 + log‖s/2‖ + π ≤ 3+log(R/2)+4 ≤ 62+23·log(2+R/2) (log(R/2) ≤ log(2+R/2) ✓; 3+π ≤ 7 ≤ 62-…; need 3 + log(R/2) + π ≤ 62 + 23·log(2+R/2): log(R/2) ≤ log(2+R/2) ✓ (R/2 ≤ 2+R/2, log mono); π ≤ 4 (pi_lt_315: 3.15): 3+4 = 7 ≤ 62 + 22·log(2+R/2) ✓ (log(2+R/2) ≥ log 2 ≥ 0).\n   - |im(s/2)| < 5 ∧ re(s/2) ≥ ... split re(s/2) ≤ 2 vs > 2: re(s/2) > 2 hmm wait — the digamma_right_le needs re ≥ 1.75: for re(s/2) ≥ 1.75: 48+23·log(2+‖s/2‖) ≤ 62+23·log(2+R/2) (‖s/2‖ = R/2 ✓ 48 ≤ 62). For re(s/2) < 1.75 with |im(s/2)| < 5: |re(s/2)| ≥ ... |im s| < 10 ⟹ |re s| ≥ √(R²−100) — UGH sqrt again. Avoid: |im(s/2)| < 5 ⟹ |im s| < 10 ⟹ (re s)² = R² − (im s)² > R² − 100 ⟹ |re s| > √(R²−100)... just need re s ∉ (−5, 5)-ish: (re s)² > R²−100 ⟹ |re s| > R−... |re s| ≥ R−50/R: (R−|re s|)(R+|re s|) = im² < 100: R−|re s| < 100/(R+|re s|) ≤ 100/R: |re s| > R−100/R. So |re(s/2)| > R/2−50/R. With re(s/2) < 1.75: re(s/2) ∈ (−R/2+50/R)... re(s/2) < 1.75 and |re(s/2)| > R/2−50/R ≥ R/2−1 (50/R < 1): so re(s/2) < −(R/2−50/R) (negative branch since |re(s/2)| > R/2−50/R ≥ 1.75 would contradict if positive... |re(s/2)| > R/2−50/R ≥ R/2−1 ≥ 1.75 for R ≥ 6: so re(s/2) is either > 1.75 (contradiction) or < −1.75: hence re(s/2) < −1.75 < 0 ✓). So re(s/2) < 0, |re(s/2)| > R/2−50/R: i.e. (re s)/2 ∈ [−R/2, −(R/2−50/R)): (re s)/2 + R/2 ∈ [0, 50/R). Then the dist argument: (A) c = 1/8: hwre : (s/2).re ≤ 2 ✓ (re(s/2) < 0 ≤ 2): hdist ∀ m, 1/8 ≤ ‖s/2+m‖ ✓ (the u-argument). Result: 62+23·log(2+‖s/2‖) = 62+23·log(2+R/2) ✓ (‖s/2‖ = ‖s‖/2 = R/2: norm_div, norm_ofNat... ‖s/2‖ = ‖s‖/‖(2:ℂ)‖ = R/2 ✓).\n   Summary of digamma_circle_le cases: (a) 5 ≤ |im(s/2)|: sub-log. (b) |im(s/2)| < 5 ∧ 1.75 ≤ re(s/2): right_le (48 ≤ 62). (c) |im(s/2)| < 5 ∧ re(s/2) < 1.75: the left dist (A) c = 1/8 (62 exact). ✓\n\n3. The near-sum count `nearZeros_count_le`: Σ_{ρ ∈ nearZeros t} (zeroMult ρ:ℝ) ≤ 3·A₀·log(3·max|t−1||t+1|+5) for |t| ≥ 10: via zerosIn(t−1, t+1] cover + finsum bridge + Ncount_le_of_interval_gen (b−a+1 = 3).\n   Wait — one window suffices when |t| ≥ 10 ✓ (all γ in (t−1,t+1) same sign). But the zerosIn membership needs IsNontrivialZero ρ — from zeroDisc_isNontrivial? Let me check: session 023: \"zeroDiscFinset + zeroDisc_isNontrivial (re ≥ 1 via Mathlib's one_le_re nonvanishing; re ≤ 0 via ΓR-pole/FE)\". Signature: zeroDisc_isNontrivial {t} {ρ} (hρ : ρ ∈ zeroDiscFinset t) : IsNontrivialZero ρ? Need to check — also zeroDiscFinset needs ht : 10 ≤ |t|? Let me check zeroDiscFinset's def.\n\n4. `logDeriv_circle_le`: the three-region logDeriv bound:\n   region (i) re s ≥ 2: Dirichlet ≤ dirichletC2.\n   region (ii) −5/2 ≤ re s ≤ 2 (⟹ |im s| ≥ 10 auto for R ≥ 11): the capstones + near sum: \n     ‖logDeriv ζ s‖ ≤ ‖logDeriv ζ s − near‖ + ‖near‖ ≤ 200000·(log|t|)² + 32Ĉ₀·(3·A₀·log(3·max|t−1||t+1|+5)).\n     with t := s.im: |t| ≥ 10 (auto: re² ≤ max(25/4, 4) = 25/4 hmm re ∈ [−5/2, 2]: re² ≤ 25/4: im² = R²−re² ≥ R²−25/4: |im| ≥ √(R²−25/4) ≥ 10 ✓ R ≥ 11).\n     Split re s ≥ 1/2 (5c, 100000) vs ≤ 1/2 (5d-left, 200000): uniform ≤ 200000·(log|t|)² + near. log|t| ≤ log R (|t| ≤ R ✓).\n     The near-sum: ‖Σ_{ρ ∈ nearZeros t} m/(s−ρ)‖ ≤ Σ m·‖1/(s−ρ)‖ = Σ m/‖s−ρ‖ ≤ 32Ĉ₀·Σ m: per ρ ∈ nearZeros t: ‖s−ρ‖ ≥ 1/(32Ĉ₀): \n       ρ ∈ nearZeros t ⟹ |γ−t| < 1 ⟹ ‖ρ‖ ≥ |γ| ≥ |t|−1 and ‖ρ‖ ≤ |re|+|γ| ≤ 1+|t|+1 = |t|+2: with |t| ≤ R: ‖ρ‖ ≤ R+2 and ‖ρ‖ ≥ |t|−1.\n       Case ‖ρ‖ > R−2: then ρ ∈ crit-shell (‖ρ‖ ∈ (R−2, R+2)) AND ρ ∈ circleZeros R (‖ρ‖ < R+2 ≤ 2R+1 ✓): shell_crit's hsep — BUT hsep is LOCAL to shell_crit (inside its proof). I need the separation as a STANDALONE lemma! Extract: `gapCircle_sep {k} (hk) {R} (hRlo) (hgap) {s} (hs : ‖s‖ = R) (hsz) {ρ : ℂ} (hρ : IsNontrivialZero ρ) (hρnorm : R−2 < ‖ρ‖ ∧ ‖ρ‖ < R+2) : 1/(32·Ĉ₀) ≤ ‖s − ρ‖`. Then shell_crit uses it too — hmm, shell_crit is already proved with the inline version. For 5e-v-c I'll prove the standalone `gapCircle_sep` (the same proof, taking ρ : ℂ with IsNontrivialZero instead of the subtype) and use it in the near-sum; shell_crit stays as is (duplication acceptable — or refactor shell_crit to use it; cleaner to refactor but the freeze protocol... LiCircleBound is THIS tier's file, editable. Simplest: prove standalone gapCircle_sep and leave shell_crit untouched (its inline proof already works — no need to touch).\n       Case ‖ρ‖ ≤ R−2: ‖s−ρ‖ ≥ R−‖ρ‖ ≥ 2 ≥ 1/(32Ĉ₀) ✓.\n       Also need hsz (s not a nontrivial zero — from not_isNontrivialZero_on_gapCircle) — only for the identity, not for the separation.\n       Wait — the separation proof in shell_crit used the hgap on ρ OR conj ρ (both nontrivial) ✓ works for ρ : ℂ with IsNontrivialZero ρ ✓. And the t := s.im, γ := ρ.im arc analysis ✓ same.\n     So near-sum ≤ 32Ĉ₀·(Σ_{nearZeros t} m) ≤ 32Ĉ₀·3A₀·log(3·max|t−1||t+1|+5) ≤ 32Ĉ₀·3A₀·2L = 192·Ĉ₀A₀L (3·max|t−1||t+1|+5 ≤ 3(R+1)+5 = 3R+8 ≤ 4R ⟹ log ≤ 2L ✓ — max|t−1||t+1| = |t|+1 ≤ R+1 ✓).\n     region (ii) total: 200000·L² + 192·Ĉ₀A₀L ≤ 200000·L² + 192·Ĉ₀A₀L².\n   region (iii) re s < −5/2: the FE route:\n     logDeriv ζ s = −logDeriv ζ(1−s) − (logDeriv ΓR s + logDeriv ΓR(1−s)) via logDeriv_zeta_fe — needs 10 hyps:\n     - s ≠ 0 ✓ (‖s‖ = R > 0), s ≠ 1 ✓ (re < 0).\n     - Gammaℝ s ≠ 0: Gammaℝ_eq_zero_iff : Gammaℝ s = 0 ↔ ∃ m : ℕ, s = −(m:ℂ)? hmm — Gammaℝ zeros... ΓR(s) = π^{−s/2}Γ(s/2): zero iff Γ(s/2) pole: s/2 ∈ −ℕ: s ∈ −2ℕ: s = −2n. For our s: re s < −5/2, |im s| could be nonzero or s = −R: s = −2n would need s real: s = −R: R = 2n: dist(R/2,ℤ) ≥ 1/4 ⟹ R/2 ∉ ℤ ⟹ R ∉ 2ℤ ✓ excluded. For im s ≠ 0: s/2 ∉ ℝ·... −(m:ℂ) is real: s/2 = −m ⟹ im = 0 ✓ excluded. So Gammaℝ s ≠ 0 via Complex.Gammaℝ_eq_zero_iff (check the exact name/form — used in LiFEntire zeta_zero_classification: \"Gammaℝ_eq_zero_iff gives −(2*↑m)\").\n     - ζ s ≠ 0: zeta_zero_classification: zeros = nontrivial ∪ {0} ∪ {−2n}: s: re < −5/2 < 0, im = t: if ζ s = 0: s nontrivial (re ∈ (0,1) — no), s = 0 (no), s = −2n (excluded as above) ⟹ ζ s ≠ 0 ✓.\n     - DifferentiableAt Gammaℝ s: Gammaℝ differentiable off its poles: s/2 ∉ −ℕ ✓ (same as above): there should be a lemma `differentiableAt_Gammaℝ` (used in 5d/5e-iv? — check: analyticAt_Gammaℝ or differentiableAt... In LiReflect they pass hd as hypothesis — there's a discharge lemma somewhere. Let me grep.)\n     - Same at 1−s: 1−s ≠ 0 ✓ (s ≠ 1), ≠ 1 ✓ (s ≠ 0); Gammaℝ(1−s) ≠ 0: (1−s)/2 ∉ −ℕ: re((1−s)/2) > 0 ✓; ζ(1−s) ≠ 0: re(1−s) > 1: nonvanishing re ≥ 1 (Mathlib's `riemannZeta_ne_zero_of_one_le_re` or Zeta23's) ✓; DifferentiableAt ✓.\n     Then: ‖logDeriv ζ s‖ ≤ ‖logDeriv ζ(1−s)‖ + ‖logDeriv ΓR s‖ + ‖logDeriv ΓR(1−s)‖ ≤ dirichletC2 (re(1−s) ≥ 1+5/2 > 2 ✓) + bracket.\n     bracket via (G) — needs im s ≠ 0 AND im(1−s) ≠ 0 (same: im(1−s) = −im s): for im s ≠ 0: logDeriv ΓR s = −(log π)/2 + ½ψ(s/2); logDeriv ΓR(1−s) = −(log π)/2 + ½ψ((1−s)/2): bracket = −log π + ½(ψ(s/2)+ψ((1−s)/2)): ‖bracket‖ ≤ log π + ½(‖ψ(s/2)‖+‖ψ((1−s)/2)‖) ≤ log π + ½(62+23·log(2+R/2)) + ½(48+23·log(2+‖(1−s)/2‖)): ‖(1−s)/2‖ ≤ (1+R)/2: log(2+(1+R)/2) ≤ log(2+R) ≤ L+1 (2+R ≤ 2R ⟹ log ≤ log2+L ≤ 1+L): so ≤ log π + 31+12·log(2+R/2) + 24+12·(L+1) ≤ π+55+12·L+12·L+12 = π+67+24L ≤ 2+67+24L = 69+24L ≤ 69·A₀Ĉ₀L²-ish ✓ (absorbs).\n     For im s = 0 (s = −R): the continuity extension. The bound B(s) := dirichletC2 + 69+24L is CONTINUOUS-free (a constant); the function s ↦ logDeriv ζ s is continuous at −R (ζ analytic + nonzero at −R ⟹ logDeriv continuous). And the bracket-bound holds at nearby arc points with im ≠ 0... but actually — the FE identity at s = −R ALSO holds (logDeriv_zeta_fe's hyps all checkable at −R ✓): logDeriv ζ(−R) = −logDeriv ζ(1+R) − (logDeriv ΓR(−R) + logDeriv ΓR(1+R)). The issue is only EVALUATING logDeriv ΓR(−R) — (G) needs im ≠ 0. So: continuity of logDeriv ΓR at −R + the formula on im ≠ 0 dense ⟹ the bound ‖logDeriv ΓR s + logDeriv ΓR(1−s)‖ ≤ 69+24L at s = −R by taking limits: the function s ↦ ‖logDeriv ΓR s + logDeriv ΓR(1−s)‖ is continuous at −R (logDeriv ΓR continuous at −R and at 1+R ✓ both Gammaℝ nonzero + differentiable) and bounded by C on the dense set {arc points with im ≠ 0} ⟹ ≤ C at −R (continuous + closure: ‖f(−R)‖ = lim ‖f(sₙ)‖ ≤ C). \n     In Lean: choose sₙ := R·exp(I·(π − 1/(n+1))) hmm — or simpler: sₙ := ⟨−R·cos(1/(n+1)), R·sin(1/(n+1))⟩: ‖sₙ‖ = R ✓, im > 0 ✓, → ⟨−R, 0⟩ = −R. Tendsto: cos(1/(n+1)) → 1, sin(1/(n+1)) → 0. Continuity of the norm-function composition. Then `(continuous_norm.comp hcont).continuousAt` + Tendsto.le_of_eventually_le... Formally: Tendsto (fun n => ‖g(sₙ)‖) (𝓝 (‖g(−R)‖)) and ∀ n, ‖g(sₙ)‖ ≤ C ⟹ ‖g(−R)‖ ≤ C (le_of_tendsto_of_tendsto hmm — le_of_tendsto (h : Tendsto f atTop (𝓝 a)) (h' : ∀ᶠ n, f n ≤ C) : a ≤ C — `le_of_tendsto_of_tendsto'` or `le_of_tendsto` with tendsto_const. Something like: le_of_tendsto_of_tendsto (hf : Tendsto f l (𝓝 a)) (hg : Tendsto g l (𝓝 b)) (h : ∀ᶠ x, f x ≤ g x) : a ≤ b with g := const C.)\n     This adds ~50-60 lines. Alternatively — handle s = −R directly: prove logDeriv_Gammaℝ_eq AT the real point too via continuity of both sides: both sides continuous at −R (logDeriv ΓR continuous; the RHS: digamma(s/2) continuous at −R/2 (analyticAt_digamma: −R/2 ∉ {0}∪−ℕ: dist(R/2,ℤ) ≥ 1/4 ⟹ R/2 ∉ ℤ... wait −R/2: is −R/2 ∈ {0}∪−ℕ? −R/2 = −m ⟺ R/2 = m ∈ ℤ — excluded ✓; = 0 no). So RHS continuous at −R) and equal on the dense im ≠ 0 ⟹ equal at −R (continuous extension of equality — Tendsto uniqueness: f − g continuous, = 0 on dense ⟹ = 0 at the point). That's the SAME continuity machinery but applied to the equality — equally heavy. OK, do the norm-continuity bound route.\n     \n     Hmm — actually, EVEN SIMPLER: note that at s = −R, instead of (G), evaluate the bracket bound DIRECTLY: ‖logDeriv ΓR(−R) + logDeriv ΓR(1+R)‖ — both arguments real. logDeriv ΓR(1+R): (1+R)/2: re > 0 big — hmm still needs (G). No way around: (G) is im ≠ 0 only. The continuity route it is.\n     \n     WAIT — actually, do I even need the bracket at s = −R via (G)? There's `logDeriv_Gammaℝ_shift` from 5d (the +4 shift used in the left capstone): `logDeriv ΓR s = logDeriv ΓR (s+4) − (1/s + 1/(s+1) + 1/(s+2) + 1/(s+3))`-ish — and 5d's left capstone uses StirlingVert's digamma_stirling on the shifted. For s = −R: logDeriv ΓR(−R) = logDeriv ΓR(4−R) − Σ 1/(−R+j): and digamma_stirling for the shifted (re(4−R) < 0 still...). Hmm the 5d machinery shifts by +4 to get digamma args in re > 0: logDeriv ΓR s = −(logπ)/2 + ½ψ(s/2) — the 5d proof of the bracket bound used logDeriv_Gammaℝ_shift + digamma_stirling — did 5d prove a BRACKET bound ≤ 4(log|t|)²? Yes: \"the ΓR-bracket ≤ 4(log|t|)² (the +4 ΓR shift logDeriv_Gammaℝ_shift putting both digamma arguments in re > 0 + StirlingVert digamma_stirling)\". That bound is for |t| ≥ 10 — at s = −R, t = 0 — not applicable. OK, continuity route it is. Actually hold on — for s = −R (real), maybe the cleanest: ψ(s/2) at s = −R: s/2 = −R/2: dist(−R/2, −ℕ) ≥ 1/4 (hgapInt) ⟹ digamma analytic at −R/2 ✓ and the (G) formula at −R: prove by the continuity-of-equality on the dense set... I'll do the norm-continuity bound route for the whole case (iii) at im = 0 — single use point (s = −R; also any other circle point with im = 0 is just ±R, and +R is region (i) ✓ — so ONLY s = −R needs it).\n\n   Let me now define the exact region split for the logDeriv bound:\n   - (i) 2 ≤ re s: Dirichlet.\n   - (ii) −5/2 ≤ re s ∧ re s ≤ 2 hmm wait 5c needs re ≥ 1/2 and 5d-left needs re ≤ 1/2: union [−5/2, 7/2]: with (i) covering re ≥ 2: let region (ii) := −5/2 ≤ re s ∧ re s < 2: split at 1/2: [1/2, 2) → 5c (re ≤ 7/2 ✓ 2 ≤ 7/2 ✓); [−5/2, 1/2) → 5d-left (re ≤ 1/2 ✓). At re = 1/2 either works ✓ use 5c.\n   - (iii) re s < −5/2: FE.\n   Coverage: re ≥ 2 / −5/2 ≤ re < 2 / re < −5/2 ✓ all.\n\n   The |t| ≥ 10 for region (ii): re ∈ [−5/2, 2] ⟹ re² ≤ 25/4 ⟹ im² = R²−re² ≥ R²−25/4: |im| ≥ √(R²−25/4) — avoid sqrt: |im| ≥ R−(25/4)/R·... R−|im| = re²/(R+|im|) ≤ (25/4)/R: |im| ≥ R−25/(4R) ≥ 10 ⟺ 25/(4R) ≤ R−10 ⟸ R ≥ 16002 ✓ linarith.\n\n5. The elem bounds: 1/s, 1/(s−1), log π/2, ψ(s/2)/2:\n   - ‖(1:ℂ)/s‖ = 1/‖s‖ = 1/R ≤ 1 (norm_div, norm_one, hs).\n   - ‖1/(s−1)‖ = 1/‖s−1‖ ≤ 1/(R−1) ≤ 1 (‖s−1‖ ≥ ‖s‖−‖(1:ℂ)‖ = R−1 ≥ 1; 1/(R−1) ≤ 1 ⟺ R ≥ 2).\n   - ‖(Real.log Real.pi : ℂ)/2‖ = (log π)/2 ≤ 1: log π ≤ 2: π ≤ e²: Real.pi_lt_315 (π < 3.15) hmm need log π ≤ 2: π ≤ e^2 ⟸ e^2 ≥ 7.29 > 3.15 > π ✓: Real.log_le_log (pi_pos) (π ≤ e^2): π < 3.15 ≤ 7.29 ≤ e^2 (e^2 ≥ 2.7² = 7.29 ✓). So log π ≤ 2, (log π)/2 ≤ 1 ✓. norm of cast: RCLike.norm_ofReal? `Complex.norm_ofReal`? norm_ofReal : ‖(x:ℂ)‖ = |x| ✓ (RCLike.norm_ofReal or Complex.norm_ofReal). And the cast is (Real.log Real.pi : ℂ): ‖(log π:ℂ)/2‖ = |log π|/2 = (log π)/2 (log π ≥ 0: π ≥ 1: Real.log_nonneg (le_of_lt Real.pi_gt_one... pi > 3.14 > 1)).\n   - ‖digamma (s/2)/2‖ = ‖digamma (s/2)‖/2 ≤ (62+23·log(2+R/2))/2.\n\n6. **The assembly** `Fexpr_circle_le`: \n   ```\n   theorem Fexpr_circle_le {k : ℕ} (hk : 4000 ≤ k) {R : ℝ}\n       (hRlo : 4*(k:ℝ)+5/2 ≤ R) (hRhi : R ≤ 4k+3)\n       (hgap : ...) (hgapInt : ∀ m : ℤ, 1/4 ≤ |R/2 − (m:ℝ)|)\n       {s : ℂ} (hs : ‖s‖ = R) :\n       ‖Fexpr s‖ ≤ 2 * lowZeroConst + dirichletC2 + 400000 * A0count * C0hat (R+2) * (Real.log R)^2\n   ```\n   Hmm — wait: should the constant absorb dirichletC2 as well? dirichletC2 is a fixed finite constant (like lowZeroConst) — keep both symbolic-additive. Actually for the squeeze, ANY fixed constants are fine. Keep the form.\n   \n   Proof: unfold Fexpr; norm chain:\n   ‖Fexpr s‖ ≤ ‖logDeriv ζ s‖ + ‖seriesFun s‖ + ‖1/s‖ + ‖1/(s−1)‖ + ‖(log π:ℂ)/2‖ + ‖digamma (s/2)/2‖ — via norm_add_le/norm_sub_le: Fexpr = ((logDeriv − seriesFun) + 1/s) + 1/(s−1) − c + ψ: bound: ‖a − b‖ ≤ ‖a‖+‖b‖: stepwise:\n   ‖Fexpr‖ = ‖logDeriv − seriesFun + 1/s + 1/(s−1) − c + ψ‖ ≤ ‖logDeriv − seriesFun + 1/s + 1/(s−1) − c‖ + ‖ψ‖ ≤ ... — a few lines of calc with norm_sub_le/norm_add_le.\n   Each piece bounded as computed. Ĉ₀(4k+9/2) ≤ Ĉ₀(R+2) via C0hat_mono (4k+9/2 ≥ 1 ✓, 4k+9/2 ≤ R+2 ⟺ 4k+5/2 ≤ R ✓ hRlo). \n   \n   Budget check with the actual haves:\n   - series: 2·lowZeroConst + 2900·A₀·Ĉ₀(4k+9/2)·L² ≤ 2·lowZeroConst + 2900·A₀·Ĉ₀(R+2)·L² ✓.\n   - logDeriv: max over regions: (i) dirichletC2; (ii) 200000·L²+192Ĉ₀A₀L² (with Ĉ₀(4k+9/2) → Ĉ₀(R+2) — WAIT: the separation 1/(32Ĉ₀) uses Ĉ₀(4k+9/2) (the gap property is stated with it) ✓ keep consistent, convert at the end); (iii) dirichletC2 + (log π + 69+24L)-ish ≤ dirichletC2 + 100·A₀Ĉ₀L².\n     Uniform: dirichletC2 + 200000·L² + 192·Ĉ₀(R+2)A₀L² + 100·A₀Ĉ₀L². 200000·L² ≤ 100000·A₀Ĉ₀L² (A₀ ≥ 1, Ĉ₀ ≥ 2 ⟹ A₀Ĉ₀ ≥ 2 ⟹ A₀Ĉ₀L² ≥ 2L² ⟹ 200000L² = 100000·2L² ≤ 100000A₀Ĉ₀L² ✓). So logDeriv ≤ dirichletC2 + 100292·A₀Ĉ₀(R+2)L².\n   - ψ-elem: 31 + 12·log(2+R/2): log(2+R/2) ≤ L (2+R/2 ≤ R ⟺ 4 ≤ R ✓): ≤ 31+12L ≤ 43·A₀Ĉ₀L² (43 ≤ 43·A₀Ĉ₀L²/(1)·... A₀Ĉ₀L² ≥ 2·81 = 162: 31+12L ≤ 31·(A₀Ĉ₀L²/162)·... ugh: 31 ≤ (31/162)·A₀Ĉ₀L² ≤ 0.2·A₀Ĉ₀L²; 12L ≤ 12·A₀Ĉ₀L² (A₀Ĉ₀L ≥ 1 ✓): total ≤ 12.2·A₀Ĉ₀L² ≤ 13·A₀Ĉ₀L² ✓).\n   - 1/s + 1/(s−1) ≤ 2 ≤ (2/162)·A₀Ĉ₀L² ≤ A₀Ĉ₀L².\n   - log π/2 ≤ 1 ≤ A₀Ĉ₀L².\n   TOTAL: 2·lowZeroConst + [2900 + 100292 + 13 + 1 + 1]·A₀Ĉ₀L² + dirichletC2 = 2·lowZeroConst + dirichletC2 + 103207·A₀Ĉ₀L² ≤ 2·lowZeroConst + dirichletC2 + 400000·A₀Ĉ₀L² ✓.\n\n   So final constant 400000 fits with room.\n\nOrder of build:\n- c-i: `gapCircle_sep` (standalone separation, ~100 lines — adapted from shell_crit's hsep but for ρ : ℂ directly) + `nearZeros_count_le` (~60) + the near-sum bound (~80).\n- c-ii: `digamma_right_le` (~50) + `digamma_circle_le` (~120) + the small elems (~60).\n- c-iii: `logDeriv_circle_le` (~200 incl. the FE region + the s = −R continuity) + `Fexpr_circle_le` assembly (~80).\n\nThe s = −R continuity: hmm — let me think about whether I can AVOID it. At s = −R: I need ‖logDeriv ΓR(−R) + logDeriv ΓR(1+R)‖ ≤ bracket. What if I bound the two logDeriv ΓR values SEPARATELY via the m-shift recurrence to a (G)-applicable point? logDeriv ΓR(−R) = logDeriv ΓR(−R+2i·...)? No — the recurrence is in the REAL direction (Gamma_add_one): logDeriv ΓR(s) = logDeriv ΓR(s+2) − (1/s + 1/(s+2))-ish (ΓR(s+2) = (s/2)·ΓR(s)?? Gammaℝ(s+2) = (s/2)·Gammaℝ(s): logDeriv: logDeriv ΓR(s+2)·(s+2)... hmm: ΓR(s+2) = (s/2)ΓR(s) ⟹ logDeriv ΓR(s) = logDeriv ΓR(s+2)·... the 5d `logDeriv_Gammaℝ_shift` already does a +4 shift chain: logDeriv ΓR s = logDeriv ΓR (s+4) − [1/s·2-ish terms]. For s = −R: logDeriv ΓR(−R) = logDeriv ΓR(4−R) − Σ_{j=0}^{3} (digamma-shift terms): and at (4−R): im still 0! (G) STILL not applicable (real point). ARGH. The (G) restriction is im ≠ 0 — every real point needs the continuity argument. OK, continuity route.\n\nActually — WAIT. Alternative: prove (G) at real non-pole points too, by the identity principle! Both sides of `logDeriv ΓR s = −(log π)/2 + ½ψ(s/2)` are analytic on the connected open set ℂ ∖ ({0} ∪ −2ℕ-ish poles) hmm — logDeriv ΓR analytic where ΓR ≠ 0 and differentiable: off {−2ℕ}. The set U := ℂ ∖ (−2ℕ)?? hmm: ΓR(s) = π^{−s/2}Γ(s/2): poles where s/2 ∈ −ℕ ⟺ s ∈ −2ℕ∪{0}?? Γ(s/2) poles at s/2 ∈ {0,−1,−2,...} ⟺ s ∈ {0,−2,−4,...} = −2ℕ. And ΓR ≠ 0 everywhere else (Γ has no zeros). So both sides analytic on U := ℂ \\ {0,−2,−4,...} — wait also need s/2 ∉ {0}∪−ℕ for digamma(s/2) — same set. U = ℂ ∖ {s : ∃ m:ℕ, s = −2m}: connected? ℂ minus a discrete set is connected ✓. The formula holds on {im ≠ 0} ⊆ U — which has a limit point in U ✓ (e.g. 1). Identity principle: AnalyticOnNhd.eq_of_isPreconnected_eq... Mathlib: `AnalyticOn.eqOn_of_preconnected_of_eventually_eq`? or `AnalyticOnNhd.eq_of_frequently_eq`? The journal-020 pattern used \"identity principle\" — let me grep for what was used. This is ~40 lines if the API cooperates. Then (G) holds at ALL non-pole points including −R. That's cleaner than the sequence-tendsto (no explicit sequence construction). Let me check what identity-principle API was used before (LiDigamma.lean \"complex series by Weierstrass + identity principle\").\n\nLet me grep for the identity principle usage in the repo.","signature":""},{"type":"text","text":"All signatures in hand. The s = −R (real point) needs the (G) formula off `im ≠ 0` — check which identity-principle API was used before in this repo."},{"type":"tool_use","id":"Grep_145","name":"Grep","input":{"pattern":"(eq_of_frequently_eq|identity.*principle|AnalyticOnNhd.*eq|eqOn_of_preconnected)","path":"D:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1","output_mode":"content","-n":true,"head_limit":15},"extra_content":null}]