← Session 29 — ii′-5e-v: circle bound (far-tail + series bounds)
thinking (5250 chars)
All present:
- `Complex.Gammaℝ_eq_zero_iff : Gammaℝ s = 0 ↔ ∃ m : ℕ, s = -2 * (m : ℂ)` (used with rw at LiContour:492).
- `Complex.Gamma_ne_zero (h : ∀ m : ℕ, s ≠ -(m : ℂ)) : Gamma s ≠ 0`.
- `riemannZeta_ne_zero_of_one_le_re : 1 ≤ s.re → s ≠ 1 → riemannZeta s ≠ 0` (from LiDisc:73 usage: `riemannZeta_ne_zero_of_one_le_re h h2`).
- `zeta_zero_classification {s} (hs : riemannZeta s = 0) : IsNontrivialZero s ∨ s = 0 ∨ ∃ n : ℕ, 1 ≤ n ∧ s = -2 * (n : ℂ)`.
Now let me set up the todo list and start building c-i. I'll write §10 in LiCircleBound.lean.
First block (c-i):
1. `differentiableAt_Gammaℝ_of_not_neg_nat`.
2. `logDeriv_Gammaℝ_eq_of_not_neg_nat`.
3. `gapCircle_sep` (standalone separation for ρ : ℂ).
4. `nearZeros_count_le`.
5. `gapCircle_sep_near` (the separation for ρ ∈ nearZeros (s.im) — any ‖ρ‖).
For #3 (gapCircle_sep): the shell_crit hsep proof but for ρ : ℂ with IsNontrivialZero ρ. The proof used hgap on ρ or conj ρ (both ℂ-valued, fine), the arc analysis with t := s.im, γ := ρ.im. It also used ρ.re ∈ (0,1) (|re ρ| ≤ 1) for the near-axis case. Signature:
```
theorem gapCircle_sep {k : ℕ} (hk : 4000 ≤ k) {R : ℝ} (hRlo : 4 * (k : ℝ) + 5 / 2 ≤ R)
(hgap : ∀ ρ : ℂ, IsNontrivialZero ρ →
1 / (16 * C0hat (4 * (k : ℝ) + 9 / 2)) ≤ |ρ.im - R| ∨ 1 ≤ |ρ.im - R|)
{s : ℂ} (hs : ‖s‖ = R) {ρ : ℂ} (hρ : IsNontrivialZero ρ)
(hρnorm : R - 2 < ‖ρ‖) :
1 / (32 * C0hat (4 * (k : ℝ) + 9 / 2)) ≤ ‖s - ρ‖
```
Note: only need ‖ρ‖ > R−2 (the term bound used ‖ρ‖ > R−2 for the denominator, but the SEPARATION itself didn't use the shell range except... let me recheck hsep's proof: the strip-arc case: |t−γ| ≥ ||γ|−R| − 13/R — the hγR used hgap (any nontrivial zero) ✓ no norm range. The near-axis case: |s.re|−1 with |ρ.re| ≤ 1 ✓ no norm range. So the separation holds for ALL nontrivial ρ — no ‖ρ‖ range needed at all!! Interesting — so gapCircle_sep can drop hρnorm entirely. (In shell_crit the range was for the TERM bound, not the separation.) But careful — in shell_crit's hsep, hρRm2'/hρRp2 were obtained but... scanning my proof: hsep's strip case used only hgap + the arc bounds ✓; the near-axis case used hreρ : |ρ.re| ≤ 1 ✓. So no norm range — drop it.
5. `gapCircle_sep_near`: for ρ ∈ nearZeros (s.im) with the gap circle: 1/(32Ĉ₀) ≤ ‖s−ρ‖:
```
theorem gapCircle_sep_of_mem_nearZeros {k} (hk) {R} (hRlo) (hgap) {s : ℂ} (hs : ‖s‖ = R)
{ρ : ℂ} (hρ : ρ ∈ nearZeros (s.im)) :
1 / (32 * C0hat (4 * (k : ℝ) + 9 / 2)) ≤ ‖s - ρ‖ := by
-- ρ nontrivial from zeroDisc_isNontrivial
by_cases hn : R - 2 < ‖ρ‖
· exact gapCircle_sep hk hRlo hgap hs (nontrivial)
· -- ‖ρ‖ ≤ R−2: ‖s−ρ‖ ≥ R−‖ρ‖ ≥ 2 ≥ 1/(32Ĉ₀)
push Not at hn
have h1 : (2:ℝ) ≤ ‖s - ρ‖ := by
have h2 := abs_norm_sub_norm_le s ρ
rw [hs, abs_of_nonneg (by linarith [hn, hRlo...] : 0 ≤ R − ‖ρ‖)] at h2
linarith [h2, hn]
have h3 : 1/(32*Ĉ₀) ≤ 2 := by (Ĉ₀ ≥ 2)
exact h3.trans h1
```
zeroDisc_isNontrivial — need the exact signature: from session 023/024: `zeroDisc_isNontrivial : ρ ∈ zeroDiscFinset t → IsNontrivialZero ρ`? Let me check. Also whether nearZeros membership gives it: nearZeros t := (zeroDiscFinset t).filter (· |im−t| < 1): mem_nearZeros gives ρ ∈ zeroDiscFinset t ∧ |ρ.im − t| < 1 ✓.
6. `nearZeros_count_le {t} (ht : 10 ≤ |t|) : ∑ ρ ∈ nearZeros t, (zeroMult ρ : ℝ) ≤ 3 * A0count * Real.log (3 * max |t-1| |t+1| + 5)`:
```
-- nearZeros t ⊆ (zerosIn (t−1) (t+1)).toFinset
have hsub : nearZeros t ⊆ (Zeta23.zerosIn (t-1) (t+1)).toFinset := by
intro ρ hρ
rw [mem_nearZeros] at hρ
obtain ⟨hρd, hρt⟩ := hρ
rw [Set.Finite.mem_toFinset]
refine ⟨zeroDisc_isNontrivial hρd, ?_, ?_⟩
· have h1 : t - 1 < ρ.im := by
have := (abs_lt.mp hρt).1 -- −1 < ρ.im − t
linarith
exact h1
· have h2 : ρ.im ≤ t + 1 := by
have := (abs_lt.mp hρt).2 -- ρ.im − t < 1
linarith
exact h2
-- bridge to Ncount
calc ∑ ρ ∈ nearZeros t, (zeroMult ρ : ℝ)
≤ ∑ ρ ∈ (zerosIn (t−1) (t+1)).toFinset, (zeroMult ρ : ℝ) :=
Finset.sum_le_sum_of_subset_of_nonneg hsub (fun z _ _ => Nat.cast_nonneg _)
_ = (Zeta23.Ncount (t−1) (t+1) : ℝ) := by
rw [Zeta23.Ncount, finsum_mem_eq_finite_toFinset_sum _ (Zeta23.zerosIn_finite _ _), Nat.cast_sum]
_ ≤ A0count * 3 * Real.log (3 * max |t−1| |t+1| + 5) := by
have h1 := Ncount_le_of_interval_gen (a := t−1) (b := t+1) (by linarith)
have h2 : t + 1 - (t - 1) + 1 = 3 := by ring
rw [h2] at h1
exact h1
_ = 3 * A0count * Real.log (3 * max |t−1| |t+1| + 5) := by ring
```
Hmm wait — zerosIn membership requires IsNontrivialZero ρ AND a < im ∧ im ≤ b — zerosIn's def: {ρ | IsNontrivialZero ρ ∧ a < im ∧ im ≤ b} ✓ refine ⟨nt, h1, h2⟩ — but is the finset's underlying set in that form? zerosIn_finite (a) (b) : (zerosIn a b).Finite: toFinset membership via Set.Finite.mem_toFinset ⟸ membership in the set ✓.
Hmm — careful: zerosIn's set-builder: check Zeta23.Ncount def: Ncount a b := ∑ᶠ ρ ∈ zerosIn a b, zeroMult ρ — zerosIn a b := {ρ : ℂ | IsNontrivialZero ρ ∧ a < ρ.im ∧ ρ.im ≤ b} — the exact field order (from Ncount_add_of_le's proof: obtain ⟨hρ, ha, hc⟩ := hρc with hρ : IsNontrivialZero, ha : a < im, hc : im ≤ c ✓).
Let me check zeroDisc_isNontrivial's signature.
Check `zeroDisc_isNontrivial`'s exact signature, then start building c-i.
tool: Grep ok
input
{
"pattern": "zeroDisc_isNontrivial",
"path": "D:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1\\LiDisc.lean",
"output_mode": "content",
"-n": true,
"-B": 2,
"-A": 4,
"head_limit": 20
}
result 2026-08-24 02:26:45Z → 2026-08-24 02:26:45Z
mode='content' num_files=0 filenames=[] content='54-`riemannZeta_ne_zero_of_one_le_re`; re ≤ 0 excluded by the FE since the\n55-disc avoids {−2n} and 0). -/\n56:theorem zeroDisc_isNontrivial {t : ℝ} {ρ : ℂ} (hρ : ρ ∈ zeroDiscFinset t) :\n57- IsNontrivialZero ρ := by\n58- have h2 := (mem_zeroDiscFinset.mp hρ).2\n59- have hball := (mem_zeroDiscFinset.mp hρ).1\n60- -- ρ ∈ closedBall (2+it) (5/2) ⟹ re ρ ∈ [−1/2, 9/2]\n--\n1000- rw [mem_nearZeros] at hρ\n1001- obtain ⟨hρdisc, hρim⟩ := hρ\n1002: have hρnt : IsNontrivialZero ρ := zeroDisc_isNontrivial hρdisc\n1003- have hρ0 : riemannZeta ρ = 0 := hρnt.1\n1004- have hnorm1 : ‖ρ - discCenter t‖ ≤ Real.sqrt 5 := by\n1005- have hsq : Complex.normSq (ρ - discCenter t) ≤ 5 := by\n1006- rw [Complex.normSq_apply]' num_lines=15 num_matches=None applied_limit=None applied_offset=None
raw content_json (database row)
[{"type":"thinking","thinking":"All present:\n- `Complex.Gammaℝ_eq_zero_iff : Gammaℝ s = 0 ↔ ∃ m : ℕ, s = -2 * (m : ℂ)` (used with rw at LiContour:492).\n- `Complex.Gamma_ne_zero (h : ∀ m : ℕ, s ≠ -(m : ℂ)) : Gamma s ≠ 0`.\n- `riemannZeta_ne_zero_of_one_le_re : 1 ≤ s.re → s ≠ 1 → riemannZeta s ≠ 0` (from LiDisc:73 usage: `riemannZeta_ne_zero_of_one_le_re h h2`).\n- `zeta_zero_classification {s} (hs : riemannZeta s = 0) : IsNontrivialZero s ∨ s = 0 ∨ ∃ n : ℕ, 1 ≤ n ∧ s = -2 * (n : ℂ)`.\n\nNow let me set up the todo list and start building c-i. I'll write §10 in LiCircleBound.lean.\n\nFirst block (c-i):\n1. `differentiableAt_Gammaℝ_of_not_neg_nat`.\n2. `logDeriv_Gammaℝ_eq_of_not_neg_nat`.\n3. `gapCircle_sep` (standalone separation for ρ : ℂ).\n4. `nearZeros_count_le`.\n5. `gapCircle_sep_near` (the separation for ρ ∈ nearZeros (s.im) — any ‖ρ‖).\n\nFor #3 (gapCircle_sep): the shell_crit hsep proof but for ρ : ℂ with IsNontrivialZero ρ. The proof used hgap on ρ or conj ρ (both ℂ-valued, fine), the arc analysis with t := s.im, γ := ρ.im. It also used ρ.re ∈ (0,1) (|re ρ| ≤ 1) for the near-axis case. Signature:\n\n```\ntheorem gapCircle_sep {k : ℕ} (hk : 4000 ≤ k) {R : ℝ} (hRlo : 4 * (k : ℝ) + 5 / 2 ≤ R)\n (hgap : ∀ ρ : ℂ, IsNontrivialZero ρ →\n 1 / (16 * C0hat (4 * (k : ℝ) + 9 / 2)) ≤ |ρ.im - R| ∨ 1 ≤ |ρ.im - R|)\n {s : ℂ} (hs : ‖s‖ = R) {ρ : ℂ} (hρ : IsNontrivialZero ρ)\n (hρnorm : R - 2 < ‖ρ‖) :\n 1 / (32 * C0hat (4 * (k : ℝ) + 9 / 2)) ≤ ‖s - ρ‖\n```\nNote: only need ‖ρ‖ > R−2 (the term bound used ‖ρ‖ > R−2 for the denominator, but the SEPARATION itself didn't use the shell range except... let me recheck hsep's proof: the strip-arc case: |t−γ| ≥ ||γ|−R| − 13/R — the hγR used hgap (any nontrivial zero) ✓ no norm range. The near-axis case: |s.re|−1 with |ρ.re| ≤ 1 ✓ no norm range. So the separation holds for ALL nontrivial ρ — no ‖ρ‖ range needed at all!! Interesting — so gapCircle_sep can drop hρnorm entirely. (In shell_crit the range was for the TERM bound, not the separation.) But careful — in shell_crit's hsep, hρRm2'/hρRp2 were obtained but... scanning my proof: hsep's strip case used only hgap + the arc bounds ✓; the near-axis case used hreρ : |ρ.re| ≤ 1 ✓. So no norm range — drop it.\n\n5. `gapCircle_sep_near`: for ρ ∈ nearZeros (s.im) with the gap circle: 1/(32Ĉ₀) ≤ ‖s−ρ‖:\n```\ntheorem gapCircle_sep_of_mem_nearZeros {k} (hk) {R} (hRlo) (hgap) {s : ℂ} (hs : ‖s‖ = R)\n {ρ : ℂ} (hρ : ρ ∈ nearZeros (s.im)) :\n 1 / (32 * C0hat (4 * (k : ℝ) + 9 / 2)) ≤ ‖s - ρ‖ := by\n -- ρ nontrivial from zeroDisc_isNontrivial\n by_cases hn : R - 2 < ‖ρ‖\n · exact gapCircle_sep hk hRlo hgap hs (nontrivial) \n · -- ‖ρ‖ ≤ R−2: ‖s−ρ‖ ≥ R−‖ρ‖ ≥ 2 ≥ 1/(32Ĉ₀)\n push Not at hn\n have h1 : (2:ℝ) ≤ ‖s - ρ‖ := by\n have h2 := abs_norm_sub_norm_le s ρ\n rw [hs, abs_of_nonneg (by linarith [hn, hRlo...] : 0 ≤ R − ‖ρ‖)] at h2\n linarith [h2, hn]\n have h3 : 1/(32*Ĉ₀) ≤ 2 := by (Ĉ₀ ≥ 2)\n exact h3.trans h1\n```\nzeroDisc_isNontrivial — need the exact signature: from session 023/024: `zeroDisc_isNontrivial : ρ ∈ zeroDiscFinset t → IsNontrivialZero ρ`? Let me check. Also whether nearZeros membership gives it: nearZeros t := (zeroDiscFinset t).filter (· |im−t| < 1): mem_nearZeros gives ρ ∈ zeroDiscFinset t ∧ |ρ.im − t| < 1 ✓.\n\n6. `nearZeros_count_le {t} (ht : 10 ≤ |t|) : ∑ ρ ∈ nearZeros t, (zeroMult ρ : ℝ) ≤ 3 * A0count * Real.log (3 * max |t-1| |t+1| + 5)`:\n```\n -- nearZeros t ⊆ (zerosIn (t−1) (t+1)).toFinset\n have hsub : nearZeros t ⊆ (Zeta23.zerosIn (t-1) (t+1)).toFinset := by\n intro ρ hρ\n rw [mem_nearZeros] at hρ\n obtain ⟨hρd, hρt⟩ := hρ\n rw [Set.Finite.mem_toFinset]\n refine ⟨zeroDisc_isNontrivial hρd, ?_, ?_⟩\n · have h1 : t - 1 < ρ.im := by\n have := (abs_lt.mp hρt).1 -- −1 < ρ.im − t\n linarith\n exact h1\n · have h2 : ρ.im ≤ t + 1 := by\n have := (abs_lt.mp hρt).2 -- ρ.im − t < 1\n linarith\n exact h2\n -- bridge to Ncount\n calc ∑ ρ ∈ nearZeros t, (zeroMult ρ : ℝ)\n ≤ ∑ ρ ∈ (zerosIn (t−1) (t+1)).toFinset, (zeroMult ρ : ℝ) :=\n Finset.sum_le_sum_of_subset_of_nonneg hsub (fun z _ _ => Nat.cast_nonneg _)\n _ = (Zeta23.Ncount (t−1) (t+1) : ℝ) := by\n rw [Zeta23.Ncount, finsum_mem_eq_finite_toFinset_sum _ (Zeta23.zerosIn_finite _ _), Nat.cast_sum]\n _ ≤ A0count * 3 * Real.log (3 * max |t−1| |t+1| + 5) := by\n have h1 := Ncount_le_of_interval_gen (a := t−1) (b := t+1) (by linarith)\n have h2 : t + 1 - (t - 1) + 1 = 3 := by ring\n rw [h2] at h1\n exact h1\n _ = 3 * A0count * Real.log (3 * max |t−1| |t+1| + 5) := by ring\n```\nHmm wait — zerosIn membership requires IsNontrivialZero ρ AND a < im ∧ im ≤ b — zerosIn's def: {ρ | IsNontrivialZero ρ ∧ a < im ∧ im ≤ b} ✓ refine ⟨nt, h1, h2⟩ — but is the finset's underlying set in that form? zerosIn_finite (a) (b) : (zerosIn a b).Finite: toFinset membership via Set.Finite.mem_toFinset ⟸ membership in the set ✓.\n\nHmm — careful: zerosIn's set-builder: check Zeta23.Ncount def: Ncount a b := ∑ᶠ ρ ∈ zerosIn a b, zeroMult ρ — zerosIn a b := {ρ : ℂ | IsNontrivialZero ρ ∧ a < ρ.im ∧ ρ.im ≤ b} — the exact field order (from Ncount_add_of_le's proof: obtain ⟨hρ, ha, hc⟩ := hρc with hρ : IsNontrivialZero, ha : a < im, hc : im ≤ c ✓).\n\nLet me check zeroDisc_isNontrivial's signature.","signature":""},{"type":"text","text":"Check `zeroDisc_isNontrivial`'s exact signature, then start building c-i."},{"type":"tool_use","id":"Grep_159","name":"Grep","input":{"pattern":"zeroDisc_isNontrivial","path":"D:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1\\LiDisc.lean","output_mode":"content","-n":true,"-B":2,"-A":4,"head_limit":20},"extra_content":null}]