← Session 25 — ii′-5 R-bound: design + level-2 EM disc bound
thinking (53476 chars)
Excellent — Zeta23's `Cf r f` is EXACTLY the g function (f divided by the zero-product over the radius-r zero set), with:
- `CfAnalytic` (r < R < 1): Cf r f analytic on closedBall(0, R)
- `BlaschkeB r R f z = Cf r f z * ∏ (R − z·conj ρ/R)^m` and `BlaschkeNonzero` on closedBall(0, r)
- `DiskBound`: ‖BlaschkeB r R f z‖ ≤ B on closedBall(0, R)
Hmm, but what about nonvanishing of Cf itself? On closedBall(0,r), BlaschkeB is nonzero AND the product factor ∏(R − z·conjρ/R)^m is nonzero (that's hBProd inside BlaschkeNonzero's proof) — so Cf is nonzero on closedBall(0, r) too (as a factor of a nonzero product... wait, BlaschkeB = Cf * prod, both factors... actually from the proof, BlaschkeNonzero shows Cf z ≠ 0 AND prod ≠ 0 separately — the mul_ne_zero requires both. Actually reading more carefully: in the case z ∈ zeros, it shows `ZeroFactor f z / ∏... ≠ 0` (that's Cf z) times hBProd. So yes both factors are nonzero on closedBall(0, r). But that nonvanishing of Cf is only on closedBall(0, r), not on the full closedBall(0, R).
Hmm, wait. For my application: g should be nonvanishing on the disc where we take the log. Let me re-think the geometry.
Design per STATE.md:
- Disc center s₀ = 2+it, outer radius R = 5/2.
- Zero-collection radius r_c = 2.3 (all |γ−t|<1 zeros have |ρ−s₀| ≤ √5 ≈ 2.236 < 2.3).
- R-gap: choose R ∈ [2.3, 2.4]?? Wait STATE.md says "exists_avoiding_midpoint SCALED to window [2.3, 2.4]". Hmm, but the outer radius in ii′-5b's bound is 5/2. Let me re-read.
From STATE.md NEXT ACTION:
1. R-gap selection: the distance-value finset (zeroDiscFinset).image (·−s₀‖-distances); exists_avoiding_midpoint SCALED to window [2.3, 2.4] (add an ℓ-parameterized variant — reuse ii′-4's proof); k from scaledZeta_jensen_count (distinct ≤ mult-weighted since each zeroMult ≥ 1). Collection := zeros with |ρ−s₀| ≤ R.
Hmm, so the outer radius R is chosen in [2.3, 2.4] (not 2.5!) avoiding the zero-distance values, with clearance δ = 1/(2(k+1)). The zeros are collected with |ρ − s₀| ≤ R. The collection radius r_c = R ∈ [2.3, 2.4]. Then:
- On the outer circle |s−s₀| = R: every zero of ζ in the closed disc B(s₀, 5/2)... wait no. Hmm, but we need |ζ| bounded on the outer circle. We have ‖ζ‖ ≤ (3/4)|t|² on B(s₀, 5/2) ⊇ B(s₀, R) since R ≤ 2.4 < 2.5. Good.
- g(s) := ζ(s)/∏ₖ(s−ρₖ)^{mₖ} where the product is over zeros in B(s₀, R)... The point of choosing R in a gap: on the circle |s−s₀| = R there are NO zeros, and moreover every zero ρₖ of ζ with |ρₖ−s₀| ≤ R satisfies |ρₖ−s₀| ≤ R − δ where δ = 1/(2(k+1)) — the clearance. So on the circle, |s−ρₖ| ≥ δ, giving |g| ≤ |ζ|·δ^{−M} on the circle, hence on the closed disc by maximum principle...
Wait, but is g analytic on the closed disc B(s₀, R)? g = ζ/∏(s−ρₖ)^{mₖ} where ρₖ ranges over zeros in the OPEN disc |ρ−s₀| < R (equivalently ≤ R − δ... hmm, since R avoids all distance values, {|ρ−s₀| ≤ R} = {|ρ−s₀| < R} = {|ρ−s₀| ≤ R−δ}). At each zero ρₖ of multiplicity mₖ, ζ has the local factorization ζ(s) = (s−ρₖ)^{mₖ}·hₖ(s) with hₖ analytic and nonzero at ρₖ. Since all zeros in the disc are collected, g is analytic and nonvanishing on B(s₀, R) (need care at the boundary but since no zeros on the circle and the zeros inside are removed, g is analytic on a neighborhood of the closed ball — hmm, actually ζ is analytic on B(s₀, 5/2 minus {1})... and g is analytic on the open disc B(s₀, R') for some R' slightly bigger than R? No wait — the zeros at exactly distance R don't exist, and zeros with distance in (R, R + ε) for small ε... the next zero distance is at least R + δ' for some δ' > 0? Actually the distance values form a finite set (finitely many zeros in B(s₀, 5/2)), so there's a gap around R: no zero has distance in (R−δ, R+δ') where δ' = distance to the next value. So g is in fact analytic on B(s₀, R + δ') which is a neighborhood of closedBall(s₀, R).
But careful: zeros OUTSIDE the disc but at distance < 5/2 exist possibly; g only divides by the inside zeros; outside zeros at distance > R are fine since (s − ρ) ≠ 0 on B(s₀, R) for those. So g analytic + nonvanishing on B(s₀, R + δ') ⊇ closedBall(s₀, R).
Approach in Lean: rather than building g directly via local factorizations myself, maybe I can reuse the scaled picture and Zeta23's `Cf`! In the scaled variable w (F(w) = ζ(s₀ + (5/2)w)/ζ(s₀) on unit disc), the zeros of F in {|w| ≤ r} correspond to zeros of ζ in {|s−s₀| ≤ (5/2)r}. The collection radius r_c = 2.3 → scaled 2.3/2.5 = 0.92. R-gap chosen in [2.3, 2.4] → scaled [0.92, 0.96].
Zeta23's `Cf r f` with r = R_scaled = R/2.5 ∈ [0.92, 0.96], R'(second arg) = 0.99: `CfAnalytic (r<R') (R'<1)` gives Cf analytic on closedBall(0, R'). And BlaschkeNonzero gives BlaschkeB ≠ 0 on closedBall(0, r) — and BlaschkeB = Cf · ∏(Blaschke factors); the Blaschke factors (R − z conj ρ/R) for |z| ≤ r < R... each factor has norm ≥ R − |z||ρ|/R·... For |z| ≤ r and |ρ| ≤ r: |R − z conjρ/R| ≥ R − |z||ρ|/R ≥ R − r²/R = (R²−r²)/R > 0. So Cf ≠ 0 on closedBall(0, r) as well (quotient of nonzero by nonzero... actually BlaschkeNonzero's proof itself establishes both factors nonzero — hBProd and the Cf part. But it's not split into a separate lemma. Hmm — but I can prove `Cf r f z ≠ 0` on closedBall(0,r) myself: BlaschkeB r R f z ≠ 0 (BlaschkeNonzero) and BlaschkeB = Cf * prod with prod ≠ 0 (re-derive hBProd) ⟹ Cf ≠ 0. That's easy.
Wait, actually for LogOfAnalyticFunction I need B nonvanishing on closedBall(0, R) where R is the outer radius and J_B analytic on ball(0, R), deriv identity on closedBall(0, r) with r < R. So: use B := Cf r_coll F where r_coll = the scaled collection radius (= R_gap/2.5, with R_gap ∈ [2.3,2.4] the gap radius)... hmm wait. Let me set up the scaled geometry precisely.
Unscaled: center s₀, zeros collected with |ρ−s₀| ≤ R_c where R_c ∈ [2.3, 2.4] chosen in a gap with clearance δ from all zero-distances. Application radius r_a = 3/2 (σ ∈ [1/2, 7/2] region: |s−s₀| ≤ 3/2 covers it).
Scaled by 5/2: F(w) = ζ(s₀+(5/2)w)/ζ(s₀). Collection radius in w: r_c = R_c/(5/2) ∈ [0.92, 0.96]. Clearance in w: δ_w = δ/(5/2). Application radius: r_aw = (3/2)/(5/2) = 0.6.
Plan with Zeta23 machinery:
- B := Cf r_c F — analytic on closedBall(0, R') for any R' < 1 with r_c < R', e.g. R' = 0.99 (CfAnalytic). F's zeros in {|w| ≤ r_c} = scaled zeros of ζ in {|s−s₀| ≤ R_c}... wait need F zero ⟺ ζ zero: F = ζ(aff)/ζ(s₀), ζ(s₀) ≠ 0, so yes, zeros of F in the ball correspond exactly.
Hmm wait, actually — is Cf's zero set exactly the zeros with |w| ≤ r_c? Cf r F divides by zeros in SetOfZeros r F = {‖ρ‖ ≤ r ∧ F ρ = 0}. Yes.
- B nonvanishing on closedBall(0, r_c): from BlaschkeNonzero + product nonvanishing as above. Actually hold on — I want B nonvanishing on closedBall(0, R'') for some R'' > r_c up to the next zero-distance. But since R_c was chosen in a gap: zeros of F have norms outside (r_c, r_c + δ'_w). Actually the NEXT zero beyond R_c: the finite set of distances in B(s₀, 5/2) has a gap after R_c... but zeros exactly at distance in (R_c, next) — there are none until the next distance value d_next > R_c. And d_next ≥ R_c + something? The midpoint pigeonhole gives clearance δ below R_c from the values ≤ R_c... hmm, let me think about what exists_avoiding_midpoint gives: S = finset of distances, T with |x − T| ≥ 1/(2(k+1)) for ALL x ∈ S (all distances, not just those ≤ T). So with T = R_c: every zero in B(s₀, 5/2) has |‖ρ−s₀‖ − R_c| ≥ δ where δ = 1/(2(k+1)). So zeros are all at distance ≤ R_c − δ or ≥ R_c + δ.
So in fact B = Cf r_c F is analytic AND nonvanishing on closedBall(0, r_c + δ_w)... well, on the region up to the next zero. Nonvanishing on closedBall(0, r_c): yes. Actually for LogOfAnalyticFunction I need nonvanishing on the SAME closedBall(0, R_log) where analyticity holds, with R_log being the radius where I bound Re J on the ball(0, R_log). Hmm.
Let me re-read LogOfAnalyticFunction signature:
```
theorem LogOfAnalyticFunction {r R : ℝ} {B : ℂ → ℂ}
(zero_lt_r: 0 < r) (r_lt_R : r < R)
(BanalyticOnNhdOfDR: AnalyticOnNhd ℂ B (Metric.closedBall (0 : ℂ) R))
(Bnonzero: ∀ z ∈ Metric.closedBall (0 : ℂ) R, B z ≠ 0) :
∃ (J_B: ℂ → ℂ), (AnalyticOnNhd ℂ J_B (Metric.ball 0 R)) ∧
(J_B 0 = 0) ∧
(∀ z ∈ Metric.closedBall 0 r, (deriv J_B) z = (deriv B) z / (B z)) ∧
(∀ z ∈ Metric.ball 0 R, Real.log ‖B z‖ - Real.log ‖B 0‖ = (J_B z).re)
```
So: B analytic on closedBall(0, R) and NONZERO on all of closedBall(0, R). Then J_B analytic on ball(0, R), deriv J_B = B'/B on closedBall(0, r) (the smaller radius), and Re J_B = log‖B‖ − log‖B(0)‖ on ball(0, R).
Then BorelCaratheodoryDeriv: f analytic on ball(0, R), f(0) = 0, Re f ≤ M on ball(0, R), z ∈ closedBall(0, r) ⟹ ‖deriv f z‖ ≤ 16MR²/(R−r)³.
So for the scaled picture:
- B := Cf r_c F, analytic on closedBall(0, R_out) with R_out := 0.99 (say), and NONVANISHING on closedBall(0, R_out)?? Is Cf r_c F nonvanishing on all of closedBall(0, 0.99)? NO — Cf removes only zeros with ‖ρ‖ ≤ r_c; zeros with r_c < ‖ρ‖ ≤ 0.99 remain zeros of Cf! (Cf z = F z / ∏... for z not in the zero set, which vanishes when F z = 0.)
Hmm. So Cf r_c F has zeros in the annulus r_c < ‖w‖ ≤ 0.99 potentially. So I can't apply LogOfAnalyticFunction with R = 0.99.
Resolution: apply LogOfAnalyticFunction with R = R_log where R_log is chosen such that closedBall(0, R_log) contains no zeros beyond r_c. Since the distances have a gap: all zeros satisfy ‖ρ‖ ≤ r_c − δ_w or ‖ρ‖ ≥ r_c + δ_w (in scaled units, δ_w = (2/5)·δ). Hmm wait: zeros with distance ≥ R_c + δ in unscaled ⟹ ‖ρ_w‖ ≥ r_c + δ_w. So on closedBall(0, r_c + δ_w/2) (say), the only zeros are those with ‖ρ‖ ≤ r_c − δ_w < r_c, all collected. So B = Cf r_c F is analytic + nonvanishing on closedBall(0, r_c + δ_w/2) ⊇ closedBall(0, r_c).
But hold on — is B nonvanishing at the collected zeros themselves? Yes — Cf's whole point: at z ∈ zero set, Cf z = ZeroFactor f z / ∏_{ρ ≠ z}(z−ρ)^m, nonzero by ZeroFactorization. That's what CfAnalytic's proof and BlaschkeNonzero handle.
So: apply LogOfAnalyticFunction with:
- R_log := r_c + δ_w/2 (or anything in (r_c, r_c + δ_w))
- B := Cf r_c F
- B analytic on closedBall(0, R_log): need R_log < 1 for CfAnalytic... r_c ≤ 0.96, δ_w = (2/5)·δ where δ = 1/(2(k+1)), k = zero count ~ log t². For t large δ is tiny; for small t... δ ≤ 1/2 so δ_w ≤ 0.2. r_c + δ_w/2 ≤ 0.96 + 0.1 = 1.06?? Could exceed 1!
Hmm. Problem: CfAnalytic requires R < 1 (analyticity only on closedBall(0,1) from scaledZeta_analytic). If r_c = 0.96 and δ_w/2 pushes past 1, trouble. Fix: shrink the window. Choose R_c ∈ [2.3, 2.35] maybe. Actually the scaled window: the midpoint pigeonhole works on a window [a, a+ℓ] of length ℓ with midpoints spaced ℓ/(k+1), clearance ℓ/(2(k+1)).
Generalized midpoint lemma (ℓ-parameterized): S finset of reals, card ≤ k, window [a, a+ℓ]: ∃ T ∈ [a, a+ℓ] with |x−T| ≥ ℓ/(2(k+1)) for all x ∈ S.
Take window [2.3, 2.4], ℓ = 0.1: clearance δ = 0.1/(2(k+1)) = 1/(20(k+1)). r_c = R_c/2.5 ∈ [0.92, 0.96]. δ_w = δ/2.5 = 1/(50(k+1)). R_log = r_c + δ_w/2 ≤ 0.96 + 1/(100(k+1)) ≤ 0.96 + 0.01 = 0.97 < 1.
And BorelCaratheodory: need f = J_B on ball(0, R_log), Re f ≤ M there, then deriv on closedBall(0, r_a_scaled) where r_a_scaled = 0.6. Factor: 16·R_log²/(R_log − r_a)³ ≤ 16·0.97²/(0.92−0.6)³ ≤ 16·0.941/0.0328 ≈ 459. Loose but fine (we only need SOME C·(log|t|)²).
Hmm wait, but actually I realize I should double check whether B = Cf r_c F is nonvanishing on closedBall(0, R_log): zeros of Cf r_c F = ? For z ∈ ball with ‖z‖ ≤ R_log < next zero distance: if F z ≠ 0 then Cf z = F z/prod ≠ 0 (prod nonzero since each factor (z−ρ) ≠ 0 for ‖ρ‖ ≤ r_c − δ_w... wait ‖z−ρ‖: z could equal ρ? No: if F z ≠ 0, z ≠ ρ for all zeros ρ. Fine.) If F z = 0 then z is a zero with ‖z‖ ≤ R_log, so ‖z‖ ≤ r_c − δ_w < r_c (by the gap), so z ∈ SetOfZeros r_c F, and Cf z = ZeroFactor/prod_{ρ≠z} ≠ 0 by ZeroFactorization + the product nonzero (each (z−ρ) ≠ 0 for ρ ≠ z since zeros are distinct points in the finset).
OK so the nonvanishing argument needs: for z with ‖z‖ ≤ R_log and F z = 0: z ∈ SetOfZeros r_c F, i.e. ‖z‖ ≤ r_c. From the gap: ‖z‖ is a distance value (z zero of F ⟹ ζ(s₀+(5/2)z) = 0 ⟹ ‖(5/2)z‖ = (5/2)‖z‖ is a zero-distance; if ‖z‖ > r_c then ‖z‖ ≥ r_c + δ_w > R_log contradiction). Good.
And ZeroFactor nonvanishing: ZeroFactorization gives ZeroFactor f z = h_z z with h_z z ≠ 0 (its conclusion includes `ZeroFactor f ρ = h_ρ ρ ∧ h_ρ ρ ≠ 0`). It needs RleOne : R < 1 where the zero is in SetOfZeros R f — take R = r_c < 1 ✓, hfAnalytic on closedBall(0,1) ✓ (scaledZeta_analytic), f 0 ≠ 0 ✓ (scaledZeta_zero: F 0 = 1).
Great — so actually I might not even need to construct g myself at all: `Cf r_c F` IS g (up to the constant ζ(s₀) factor... wait: F = ζ(aff)/ζ(s₀), and Cf r_c F = F/∏(w−ρ_w)^{m} off the zero set = ζ(aff)/(ζ(s₀)·∏(w−ρ_w)^m). The unscaled g(s) = ζ(s)/∏(s−ρₖ)^{mₖ} = ζ(s₀+(5/2)w)/∏((5/2)(w−ρ_w))^{m} = ζ(s₀)·F(w)·... hmm: g(s₀+(5/2)w) = ζ(s₀+(5/2)w)/∏(s₀+(5/2)w−ρₖ)^{mₖ} = ζ(s₀)·F(w)/∏((5/2)(w−ρ_{wₖ}))^{mₖ} = [ζ(s₀)/(5/2)^{Σm}]·Cf r_c F (w) (off zeros). Constants don't matter for log derivatives. I can just work with B := Cf r_c F entirely in the scaled picture, then translate back: deriv of log... Let me think about what the final statement needs.
FINAL TARGET (loose R-bound): for s = σ+it, σ ∈ [1/2, 7/2], |t| ≥ 10, ζ(s) ≠ 0:
‖logDeriv ζ s − Σ_{ρ ∈ nearZeros t} (zeroMult ρ)/(s−ρ)‖ ≤ C·(log|t|)²
where nearZeros t = zeros with |γ−t| < 1 (as a finset — from ii′-4's zeroWindow at windows [t−1, t] etc., or via zeroDiscFinset filtered).
Proof chain:
1. R-gap: R_c ∈ [2.3, 2.4] with clearance δ = 1/(20(k+1)) from all zero-distances in B(s₀, 5/2); k = card of distance finset ≤ mult-weighted Jensen count (each zeroMult ≥ 1 ⟹ distinct count ≤ weighted count). Hmm: the distance finset = image of zeroDiscFinset under (· − s₀) norm; card of image ≤ card of zeroDiscFinset ≤ Σ mult (since each mult ≥ 1) ≤ Jensen bound. So k := (zeroDiscFinset t).card works: distances image card ≤ card ≤ Σρ mult.
Wait, actually for exists_avoiding_midpoint I need card S ≤ k for S = distance finset. I can just take k := (zeroDiscFinset t).card and S := image, card S ≤ card = k. Clearance δ = 1/(20(k+1))... hmm wait, ℓ/(2(k+1)) with ℓ = 1/10: δ = (1/10)/(2(k+1)) = 1/(20(k+1)). OK.
2. Collection: zeros with |ρ−s₀| ≤ R_c (equivalently < R_c, same by gap). In scaled: SetOfZeros r_c F.
3. B := Cf r_c F: analytic on closedBall(0, R_log), R_log := r_c + δ_w/2; nonvanishing there.
4. LogOfAnalyticFunction (r := r_a' = 0.6, R := R_log): J_B analytic on ball(0, R_log), J_B 0 = 0, deriv J_B = B'/B on closedBall(0, 0.6), Re J_B = log‖B‖ − log‖B 0‖ on ball(0, R_log).
5. Bound Re J_B on ball(0, R_log): need ‖B‖ on... Re J_B(w) = log‖B w‖ − log‖B 0‖.
- Upper bound log‖B w‖ for ‖w‖ < R_log: B = F/prod (off zeros) — but at zeros use continuity... Bound via maximum modulus on the circle ‖w‖ = r' for r' slightly less than R_log? Since B analytic on closedBall(0, R_log), max on closedBall = max on boundary sphere ‖w‖ = R_log. On ‖w‖ = R_log: ‖B w‖ = ‖F w‖/∏‖w−ρ‖^m ≤ ‖F w‖·(δ_w/2)^{−M} (each ‖w−ρ‖ ≥ ‖w‖ − ‖ρ‖ ≥ R_log − (r_c − δ_w) = δ_w/2 + δ_w = 3δ_w/2... wait: ‖ρ‖ ≤ r_c − δ_w, ‖w‖ = R_log = r_c + δ_w/2 ⟹ ‖w−ρ‖ ≥ R_log − (r_c − δ_w) = 3δ_w/2.) And ‖F w‖ ≤ (9/4)|t|² (Jensen hB from ii′-5c: bound holds for ‖w‖ ≤ 99/100; R_log ≤ 0.97 ≤ 0.99 ✓).
- So log‖B w‖ ≤ log((9/4)|t|²) + M·log(2/(3δ_w)) where M = Σ mult ≤ Jensen count ≤ log((9/4)|t|²)/log(33/32).
- log‖B 0‖: B 0 = Cf r_c F 0 = F 0/∏(0−ρ)^m = 1/∏(−ρ)^m. ‖B 0‖ = 1/∏‖ρ‖^m ≥ 1 (since ‖ρ‖ ≤ r_c < 1... ∏‖ρ‖^m ≤ r_c^M ≤ 1) so −log‖B 0‖ ≤ 0... wait Re J_B = log‖B w‖ − log‖B 0‖, and log‖B 0‖ = −Σm log‖ρ‖ ≥ 0 since ‖ρ‖ < 1... hmm log‖ρ‖ < 0 so −Σm·log‖ρ‖ > 0, so log‖B 0‖ = +Σm·(−log‖ρ‖) ≥ 0. So Re J_B(w) ≤ log‖B w‖ ≤ the bound. Fine — I just need an upper bound on Re J_B.
Hmm wait, actually the maximum modulus principle for ‖B‖ on closedBall(0, R_log): `AnalyticOn.norm_le_of_norm_le_on_sphere` (used in DiskBound). B analytic on closedBall(0, R_log) needs R_log < 1 for CfAnalytic ✓ (0.97 < 1).
So M_bound := log((9/4)|t|²) + M·log(2/(3δ_w)) and Re J_B ≤ M_bound on ball(0, R_log). Note log(2/(3δ_w)) = log(2·50(k+1)/3) = log(100(k+1)/3) — grows like log k ~ log log |t|. And M ≤ log((9/4)|t|²)/log(33/32) ~ 2·log|t|/0.0308 ≈ 65·log|t|. So M_bound ≈ log((9/4)|t|²)·[1 + log(100(k+1)/3)/log(33/32)] ~ (log|t|)·(log log|t|)-ish... times BC factor 459... The final bound is C·(log|t|)·loglog|t|?? Hmm, that's worse than (log|t|)²? No wait: M·log(1/δ_w) where M ~ 65 log|t| (for large t; actually log((9/4)t²)/log(33/32)) and log(1/δ_w) = log(50(k+1)) with k ≤ M. So M_bound ~ 65·log|t| + 65·log|t|·log(50·65·log|t|)... = O(log|t| · log log|t| · ...) hmm, M·log(1/δ) = 65 log|t| · (log(50(k+1))) and k+1 ≤ M+1 ~ 65 log|t| + 1, so log(50(k+1)) ~ log(3250 log|t|) = log 3250 + log log |t|. So M_bound ~ 65·log|t|·(8.1 + log log|t|) + ... — this is O(log|t|·loglog|t|), which is o((log|t|)²).
So the final loose bound C·(log|t|)² works with room to spare. For the Lean statement I should pick something clean and provable. Options: state with an explicit constant like ‖R(s)‖ ≤ 1000·(log|t|)² for |t| ≥ 10? Need to verify the chain delivers that with all the factors. Or state it as ≤ C·(log|t|)² with C explicit-but-huge. Since it's purely existential growth input for 5e, a cleaner formulation might be:
‖logDeriv ζ s − Σ_{ρ ∈ nearZeros t} zeroMult ρ/(s−ρ)‖ ≤ C·(Real.log |t|)^2 for |t| ≥ 10, σ∈[1/2,7/2], with C := some explicit number (like 10^6) that the proof delivers.
Actually — for ii′-5e what do we actually need? |F| = o(R) on γ-gap circles where F = ζ′/ζ − (series + elementary terms). On a big circle of radius R (in the γ-gap), |ζ′/ζ(s)| ≤ C(log R)²-ish for s on the circle (via 5c on right + 5d on left — reflection). The series terms on the circle are O((log R)²). So F = O((log R)²) = o(R). Any explicit C works. So the cleanest: state the loose bound as an EXISTENTIAL: ∃ C > 0, ∀ t, |t| ≥ 10, ∀ σ ∈ [1/2, 7/2]... ‖...‖ ≤ C·(log|t|)². That avoids me having to track constants carefully!
Hmm, but honest mathematics: an existential with an uncomputated constant is fine as a growth input. But wait — D-067 §6 says "constants deliberately loose". An existential constant theorem `∃ C, ...` is cleaner and truly loose. But it does weaken auditability slightly. Let me think… For the formalization effort, tracking an explicit C through max-modulus + BC + Jensen is doable but adds ~30% work and risk. The two-stage plan only needs existence. D-067's revised ii′-5c says "the LOOSE disc R-bound (any A < ∞)". So `∃ C : ℝ, 0 < C ∧ ∀ ...` is explicitly sanctioned by the design.
Hmm, but hold on — there's a subtlety: the sum in the target is over nearZeros t = zeros with |γ − t| < 1 (im-window), but the disc collects zeros with |ρ − s₀| ≤ R_c (which includes zeros with |γ−t| up to R_c ≈ 2.4 and β ∈ [−1/2... wait β ∈ (0,1) since nontrivial; |ρ−s₀| ≤ 2.4 with s₀ = 2+it means γ−t ∈ [−2.4, 2.4]). The deriv J_B = B′/B = F′/F − Σ_{collected} mₖ/(w−ρ_wₖ). Translating back: logDeriv ζ s = (2/5)·(F′/F)(w) where s = s₀+(5/2)w... let me redo: F(w) = ζ(s₀+(5/2)w)/ζ(s₀), F′(w) = (5/2)ζ′(s₀+(5/2)w)/ζ(s₀), so F′/F = (5/2)·ζ′/ζ(s₀+(5/2)w) = (5/2) logDeriv ζ s. And B = F/∏(w−ρ_w)^m ⟹ B′/B = F′/F − Σ m/(w−ρ_w). So (5/2)·logDeriv ζ s = (B′/B)(w) + Σ m/(w−ρ_w) = (B′/B)(w) + Σ (5/2)·m/(s−ρ). So logDeriv ζ s − Σ_{collected} m/(s−ρ) = (2/5)(B′/B)(w). Then:
R(s) = logDeriv ζ s − Σ_{near} m/(s−ρ) = (2/5)(B′/B)(w) + Σ_{collected, not near} m/(s−ρ).
The collected-not-near zeros: |γ−t| ≥ 1 ⟹ |s−ρ| ≥ 1, so each term ≤ m, and total ≤ Σ m ≤ M ≤ Jensen. So ‖R(s)‖ ≤ (2/5)·‖B′/B‖(w) + M ≤ (2/5)·16·M_bound·R_log²/(R_log−0.6)³ + M.
With R_log − 0.6 ≥ 0.92 − 0.6 = 0.32 (r_c ≥ 0.92), R_log ≤ 0.97: factor 16·0.97²/0.32³ ≈ 16·0.9409/0.032768 ≈ 459. So ‖R‖ ≤ (2/5)·459·M_bound + M ≤ 184·M_bound + M.
M_bound = log((9/4)|t|²) + M·log(2/(3δ_w)) where δ_w = δ/(5/2) = (2/5)·(1/(20(k+1))) = 1/(50(k+1)), so 2/(3δ_w) = 100(k+1)/3. With k ≤ M ≤ log((9/4)|t|²)/log(33/32):
For |t| ≥ 10: log((9/4)|t|²) = 2log|t| + log(9/4) ≤ 2log|t| + 0.811. And log(33/32) = log(1.03125) ≈ 0.03077. So M ≤ (2log|t|+0.811)/0.03077 ≈ 65·log|t| + 26.4. k+1 ≤ M+1. log(100(k+1)/3) ≤ log(100(M+1)/3).
M_bound ≤ L₁ + M·log(100(M+1)/3) where L₁ = 2log|t|+0.811.
For |t| ≥ 10, log|t| ≥ 2.303. M ≤ 65L+26.4 where L = log|t|. log(100(M+1)/3) ≤ log(100(65L+27.4)/3) ≤ log(2167L + 913). For L ≥ 2.303: 2167L+913 ≤ 2167L + 396L... hmm 913/2.303 ≈ 396, so ≤ 2563L... that gives log ≤ log 2563 + log L = 7.85 + log L. So M·log(...) ≤ (65L+26.4)(7.85+log L). With log L ≤ L/e... log L ≤ L − 1 (for L ≥ 1... log L ≤ L−1 yes). So ≤ (65L+26.4)(L+6.85) = 65L² + 445L + 26.4L + 181 ≈ 65L² + 471L + 181. For L ≥ 2.303: 471L ≤ 205L², 181 ≤ 34L² ⟹ ≤ 304L². So M_bound ≤ L₁ + 304L² ≤ (L+0.811... ≤ 0.35L² + ...) let's say M_bound ≤ 305L² for L ≥ 2.303 (very loose). Then ‖R‖ ≤ 184·305L² + (65L+26.4) ≤ 56120L² + 65L + 26.4 ≤ 56120L² + 34L² ≤ 56154L². So C = 60000, say. These are silly-loose constants — fine for the growth input, and I can actually prove them in Lean with enough linarith/nlinarith slack.
Hmm, but actually proving such a chain in Lean requires many steps of real-inequality grunt work (log monotonicity, etc.). The existential formulation `∃ C : ℝ, ∀ ...` lets me... no, it doesn't help — I still need to prove the chain for SOME explicit C internally. OK whatever, it's mechanical.
Actually wait. Let me reconsider: do I even need the max-modulus detour for Re J_B? LogOfAnalyticFunction gives Re J_B(w) = log‖B w‖ − log‖B 0‖ directly on ball(0, R_log). And ‖B w‖ for w ∈ ball(0, R_log): B is continuous on the compact closedBall(0, R_log)... but I need an explicit bound. Max-modulus on sphere: AnalyticOn.norm_le_of_norm_le_on_sphere — B analytic on closedBall(0, R_log) (needs AnalyticOn on the ball + the sphere bound; DiskBound used exactly this). On the sphere ‖w‖ = R_log, no zeros (gap), so B = F/prod there pointwise, giving the norm bound. So:
∀ w ∈ closedBall(0, R_log): ‖B w‖ ≤ (9/4)|t|²·(3δ_w/2)^{−M} where the exponent M is... careful: ∏‖w−ρ‖^{m_ρ} ≥ (3δ_w/2)^{Σm} requires each factor ‖w−ρ‖ ≥ 3δ_w/2 — yes on the sphere. And Σm over the collected finset = the Jensen-counted sum. So ‖B w‖ ≤ (9/4)|t|²·(3δ_w/2)^{−M_J} where M_J := the actual sum (bounded by the Jensen RHS). To avoid real-power headaches, keep it as `(3*δ_w/2)^(-(M_J : ℤ))`? or just rpow... Better: `(2/(3δ_w))^(M_J)` with M_J : ℕ cast — natural power of a positive real, fine.
Then log‖B w‖ ≤ log((9/4)|t|²) + M_J·log(2/(3δ_w)) via Real.log_le_log, log_mul, log_pow (Nat cast). And Re J_B(w) = log‖B w‖ − log‖B 0‖ ≤ log‖B w‖ + |log‖B 0‖|... need −log‖B 0‖ bounded. B 0 = 1/∏(−ρ)^m. log‖B 0‖ = −Σm log‖ρ‖. ‖ρ‖ ≤ r_c − δ_w < 1 so log‖ρ‖ < 0, so log‖B 0‖ > 0, so Re J_B ≤ log‖B w‖ directly. Need log‖B 0‖ ≥ 0: = −Σ m_ρ log‖ρ‖ ≥ 0 since each log‖ρ‖ ≤ log(r_c−δ_w) < 0... need ‖ρ‖ ≤ r_c − δ_w for collected zeros: from the gap, collected zeros (‖ρ_w‖ ≤ r_c) actually satisfy ‖ρ_w‖ ≤ r_c − δ_w. Wait — the gap is on DISTANCES: |d − R_c| ≥ δ for all zero-distances d in B(s₀,5/2). Collected zeros: d ≤ R_c ⟹ d ≤ R_c − δ. In scaled: ‖ρ_w‖ ≤ r_c − δ_w. ✓.
Hmm wait, one more check — the zeros of F in the unit ball are EXACTLY the scaled zeros of ζ in B(s₀, 5/2) (F zero ⟺ ζ(aff w) zero since ζ(s₀) ≠ 0). And zeroDiscFinset = zeros in closedBall(s₀, 5/2). The distance finset S := (zeroDiscFinset t).image (fun ρ => ‖ρ − discCenter t‖). exists_avoiding_midpoint needs S : Finset ℝ — ✓.
But careful: SetOfZeros r_c F uses ‖ρ_w‖ ≤ r_c where ρ_w is the SCALED zero (w-coordinate). The affine map w ↦ s₀+(5/2)w: ζ-zero ρ ↔ F-zero w = (ρ−s₀)/(5/2), ‖w‖ = ‖ρ−s₀‖/(5/2). The collected set {‖w‖ ≤ r_c} = {‖ρ−s₀‖ ≤ (5/2)r_c = R_c}. ✓. And multiplicities match by analyticOrderNatAt_scaledZeta. ✓ (needed for the deriv-J_B translation: deriv of the product uses m_ρ = analyticOrderNatAt F at the scaled zero = zeroMult at the ζ-zero — actually zeroMult ρ := analyticOrderNatAt riemannZeta ρ? Let me check LiSides/LiSkeleton for zeroMult def. In LiSides: zeroMult ρ — I recall `zeroMult` is defined in LiSkeleton or LiSides as analyticOrderNatAt riemannZeta ρ. Let me check.)
Also `logDeriv` — Mathlib's logDeriv f = deriv f / f. The final statement uses logDeriv riemannZeta s. And deriv B/B... For the translation (2/5)(B′/B)(w) = logDeriv ζ s − Σ m/(s−ρ), I need:
- deriv F w = (5/2)·(deriv ζ)(s₀+(5/2)w)/ζ(s₀): deriv of comp with affine — deriv_congr / deriv.scomp / HasDerivAt. Since everything is analytic, deriv (F) w = deriv (ζ ∘ aff) w /ζ(s₀) = (deriv ζ (aff w))·(5/2)/ζ(s₀) via deriv.comp (needs differentiableAt).
- B = F/P where P(w) = ∏(w−ρ)^{m_ρ} (off the zero set; but as FUNCTIONS B = Cf — the identity B w = F w/P w holds only for w ∉ zero set. For the deriv identity I need it in a NEIGHBORHOOD of the evaluation point w. The evaluation points w (for s in the application region) have ζ(s) ≠ 0 (hypothesis) so w is not a zero, and there's a neighborhood avoiding the finite zero set where B = F/P as functions. Good: deriv B w = (F′P − FP′)/P² at w, and B′/B = F′/F − P′/P with P′/P = Σ m_ρ/(w−ρ) (logDeriv of a product of powers — need deriv of ∏(w−ρ)^{m_ρ}: deriv_prod + deriv_pow... `HasDerivAt.prod`? There's `deriv_prod` in Mathlib? There's `HasDerivAt.sum`/... For finite products: `HasDerivAt.list_prod`? I recall `deriv_prod` exists for Finset: `HasDerivAt.prod`? Hmm — in LiResidue/LiSides we did logDeriv-NF residues; there may be existing product logDeriv machinery. In Mathlib: `logDeriv_prod`? Let me check later: there's `HasStrictDerivAt.list_prod'`... I'll search at build time. Worst case: induction on the finset with deriv_mul.
Let me now also confirm the application region maps into closedBall(0, 0.6): s = σ+it with σ ∈ [1/2, 7/2]: w = (s−s₀)/(5/2) = (2/5)(σ−2), so ‖w‖ = (2/5)|σ−2| ≤ (2/5)(3/2) = 0.6 ✓ (|σ−2| ≤ 3/2 for σ∈[1/2,7/2] ✓).
And nearZeros t: I need it as a Finset ℂ with membership ⟺ IsNontrivialZero ρ ∧ |ρ.im − t| < 1. From ii′-4: zeroWindow a = {IsNontrivialZero ∧ a ≤ im ≤ a+1} finite. nearZeros t = zeroWindow-ish with open bounds. Finiteness: subset of zerosIn_finite (t−2)(t+1) or use zeroDiscFinset filtered: nearZeros t ⊆ zeroDiscFinset? |γ−t| < 1, β ∈ (0,1): ‖ρ−s₀‖ = √( (β−2)² + (γ−t)² ) ≤ √(4+1) = √5 ≈ 2.236 < 2.5 ✓. So nearZeros t ⊆ zeroDiscFinset t — finiteness free. Define nearZeros t := (zeroDiscFinset t).filter (fun ρ => |ρ.im − t| < 1). zeroDisc_isNontrivial gives IsNontrivialZero for members. ✓
The "extras" bound: collected (in the disc R_c) but not near: |γ−t| ≥ 1... wait the collected zeros in the sum from deriv J_B are zeros with ‖ρ−s₀‖ ≤ R_c, i.e. the scaled-zero finset. The final sum is over nearZeros. extras = collected ∖ near: for those, |γₖ−t| ≥ 1 hmm — careful: "not near" means |ρ.im − t| ≥ 1, and ‖s−ρ‖ ≥ |im s − im ρ| = |t − γ| ≥ 1 ✓. So each extra term ‖m/(s−ρ)‖ ≤ m, sum ≤ Σ_{collected} m = M_J ≤ Jensen RHS. ✓
But there's a subtlety: the collected finset in the scaled picture is `(finiteSetOfZeros_mono (r := r_c) ...).toFinset` — a finset of w-points. The final statement wants a sum over nearZeros t (ζ-zeros). So I need to push the sum over scaled zeros through the affine bijection w ↦ s₀+(5/2)w to a sum over ζ-zeros in closedBall(s₀, R_c), with m matching (analyticOrderNatAt_scaledZeta ✓). Finset.sum_image with InjOn (the affine map is injective globally). Let me define collectedZeros t R_c := (zeroDiscFinset t).filter (‖· − s₀‖ ≤ R_c)... and establish a bijection with the scaled finset.
Actually — alternative cleaner approach: maybe avoid Cf and the scaled picture for g, and instead directly build g on the s-side? The Cf machinery is heavily unit-disc-oriented (SetOfZeros r f requires ‖ρ‖ ≤ r ≤ R < 1, analytic on closedBall(0,1)). The scaled picture fits it perfectly and ii′-5c already built scaledZeta + its Jensen count + multiplicity invariance precisely for this. Stick with the plan: work in w, translate at the end.
Now the structure of the remaining work in LiDisc.lean:
§5 R-gap selection:
```lean
theorem exists_disc_radius_gap {t : ℝ} (ht : 10 ≤ |t|) :
∃ R_c : ℝ, 2.3 ≤ R_c ∧ R_c ≤ 2.4 ∧
∀ ρ ∈ zeroDiscFinset t, 1/(20*((zeroDiscFinset t).card + 1)) ≤ |‖ρ − discCenter t‖ − R_c|
```
via exists_avoiding_midpoint scaled. But exists_avoiding_midpoint is stated for window [a, a+1] (length 1) with clearance 1/(2(k+1)). I need length ℓ = 1/10. Options: (a) prove a generalized ℓ-version (copy-paste the proof with w := ℓ/(2(k+1))) — STATE.md explicitly suggests "add an ℓ-parameterized variant — reuse ii′-4's proof". (b) rescale S by 10: apply the length-1 lemma to S' = {10x} in window [23, 24]: get T' with |10x − T'| ≥ 1/(2(k+1)), then R_c = T'/10 ∈ [2.3, 2.4], |x − R_c| ≥ 1/(20(k+1)). Option (b) reuses the EXISTING lemma with zero new pigeonhole code — just image under (10·). Much cheaper!
k := (zeroDiscFinset t).card; S := (zeroDiscFinset t).image (fun ρ => ‖ρ − discCenter t‖); S.card ≤ k via card_image_le. S10 := S.image (· * 10)... or image (fun x => x * 10) — need InjOn for card: mul_right_injective₀. Then apply exists_avoiding_midpoint (a := 23) (S := S10) with card ≤ k. Get T' ∈ [23,24] with clearance. R_c := T'/10. |x − R_c| = |10x − T'|/10 ≥ 1/(20(k+1)). ✓
§6 g nonvanishing etc. Define in scaled coords:
- r_c := R_c/(5/2) = R_c·(2/5) ∈ [0.92, 0.96].
- δ := 1/(20(k+1)), δ_w := (2/5)·δ = 1/(50(k+1)).
- R_log := r_c + δ_w/2.
- Scaled zero finset: ZW := (finiteSetOfZeros_mono (r := r_c) (f := scaledZeta t) h_lt scaledZeta_zeros_finite).toFinset. Note: finiteSetOfZeros_mono needs r_c < 1 ✓. Wait — but the Jensen count was stated for r = 24/25 = 0.96 and the collection uses r_c ≤ 0.96. Hmm: finiteSetOfZeros_mono with r = r_c gives the finset for radius r_c; the mult-weighted sum over it ≤ sum over the 0.96-finset (monotone: r_c ≤ 0.96 ⟹ SetOfZeros r_c ⊆ SetOfZeros 0.96... need r_c ≤ 24/25: r_c ≤ 0.96 = 24/25 ✓; and both toFinsets: sum over subset ≤ sum since terms nonnegative (analyticOrderNatAt ≥ 0 ✓). And by scaledZeta_jensen_count the 0.96-sum ≤ log((9/4)|t|²)/log(33/32). So M_c := Σ_{ρ ∈ ZW} analyticOrderNatAt (scaledZeta t) ρ ≤ Jensen bound. ✓ (Need the monotonicity lemma: SetOfZeros r ⊆ SetOfZeros r' for r ≤ r' — easy; and Set.Finite.toFinset subset for the sum — Finset.sum_le_sum_of_subset_of_nonneg.)
- B := Cf r_c (scaledZeta t).
- B analytic on closedBall(0, R_log): CfAnalytic (r_lt_R : r_c < R_log) (R_log < 1) scaledZeta_analytic (F 0 ≠ 0). ✓
- B nonvanishing on closedBall(0, R_log): as argued. This is a real lemma to prove:
For w with ‖w‖ ≤ R_log: by_cases F w = 0.
- If F w = 0: then w ∈ SetOfZeros 1 F... ‖w‖ ≤ R_log ≤ 0.97 < 1 ✓ so w ∈ zeroDisc... the corresponding ζ-zero ρ = s₀+(5/2)w ∈ closedBall(s₀, 5/2·0.97) ⊂ closedBall(s₀, 5/2) hmm need (5/2)‖w‖ ≤ (5/2)R_log < 5/2 ✓. So ρ ∈ zeroDiscFinset, its distance d = ‖ρ−s₀‖ = (5/2)‖w‖ ∈ S, gap: |d − R_c| ≥ δ. If d ≥ R_c: d ≥ R_c + δ ⟹ ‖w‖ ≥ r_c + δ_w > R_log, contradiction. So d ≤ R_c − δ, ‖w‖ ≤ r_c − δ_w < r_c, so w ∈ SetOfZeros r_c F, i.e. w ∈ ZW (via mem_toFinset). Then Cf w = ZeroFactor F w / ∏_{ρ ∈ ZW\{w}} (w−ρ)^m. ZeroFactorization (needs R < 1 version: hρ ∈ SetOfZeros R F with R := r_c < 1 ✓): ZeroFactor F w = h_w w ≠ 0. Product: each (w−ρ) ≠ 0 since ρ ∈ ZW \ {w} means ρ ≠ w. So B w ≠ 0.
- If F w ≠ 0: Cf w = F w / ∏_{ρ ∈ ZW} (w−ρ)^m. Each factor: ρ ∈ ZW ⟹ ‖ρ‖ ≤ r_c and F ρ = 0; if w = ρ then F w = 0 contradiction; so w ≠ ρ, factor ≠ 0. Product ≠ 0. So B w = F w/prod ≠ 0.
Wait — the Cf definition: `if z ∈ SetOfZeros r f then ZeroFactor f z / ∏ over (toFinset \ {z}) else f z / ∏ over toFinset`. The membership condition `z ∈ SetOfZeros r f` is by `if` with Classical decidability. At w with F w = 0 and ‖w‖ ≤ r_c: dif_pos. At w with F w ≠ 0: dif_neg (need w ∉ SetOfZeros: F w ≠ 0 ⟹ not member ✓).
Also note: Cf requires `if finite_zeros_mono : (SetOfZeros r f).Finite` — dif_pos with our finiteness proof. When unfolding Cf I'll need to handle the dite with the right instance. The Zeta23 proofs do `unfold Cf; by_cases ...; simp only [finite_zeros_mono, ↓reduceDite]`. I'll mirror that. Note: our finiteness proof `scaledZeta_zeros_finite` is for SetOfZeros 1; finiteSetOfZeros_mono gives SetOfZeros r_c finite. The `if` in Cf uses a Classical instance so any proof works (proof irrelevance).
§7 bounds:
- hB0: B 0 = 1/∏(−ρ)^m, and log‖B 0‖ ≥ 0. Actually compute: Cf 0: 0 ∈ SetOfZeros r_c F? F 0 = 1 ≠ 0 so no. So B 0 = F 0/∏(0−ρ)^m = 1/∏(−ρ)^m. ‖B 0‖ = 1/∏‖ρ‖^m. Each ‖ρ‖ ≤ r_c − δ_w < 1 ⟹ log‖ρ‖ < 0 ⟹ log‖B 0‖ = −Σ m log‖ρ‖ > 0. Need: ρ ∈ ZW ⟹ ‖ρ‖ ≤ r_c − δ_w — wait, ZW = SetOfZeros r_c F, members have ‖ρ‖ ≤ r_c; the gap argument (as in §6) upgrades to ‖ρ‖ ≤ r_c − δ_w. Hmm, but the gap argument needs the corresponding ζ-zero in zeroDiscFinset — ρ ∈ ZW ⟹ F ρ = 0 ⟹ (scaledZeta_zeros_finite's hsub) ρ ∈ affine preimage of (closedBall(s₀,5/2) ∩ zeros) — I proved that subset relation already in scaledZeta_zeros_finite (hsub). Extract: ζ(s₀+(5/2)ρ) = 0 and ‖(5/2)ρ‖ ≤ 5/2 ⟹ s₀+(5/2)ρ ∈ zeroDiscFinset, distance (5/2)‖ρ‖ ∈ S, gap applies. But wait the gap argument requires |d − R_c| ≥ δ, and we know d ≤ R_c (since ‖ρ‖ ≤ r_c ⟹ d ≤ (5/2)r_c = R_c) ⟹ d ≤ R_c − δ. ✓ So a lemma: ∀ ρ ∈ ZW, ‖ρ‖ ≤ r_c − δ_w.
Hmm wait — actually I realize the gap applies to ALL members of zeroDiscFinset, including zeros at distance in (R_c, 2.5]; those have d ≥ R_c + δ. Fine.
- hBsphere: ∀ w, ‖w‖ = R_log ⟹ ‖B w‖ ≤ (9/4)*|t|² * (2/(3δ_w))^M_c... let me recompute: ‖w−ρ‖ ≥ ‖w‖ − ‖ρ‖ ≥ R_log − (r_c − δ_w) = δ_w/2 + δ_w = 3δ_w/2. So ∏‖w−ρ‖^m ≥ (3δ_w/2)^{M_c} where M_c = Σ m. So ‖B w‖ = ‖F w‖/∏ ≤ (9/4)|t|²·(2/(3δ_w))^{M_c}. Need F w ≠ 0 on the sphere for the Cf = F/prod branch: sphere ‖w‖ = R_log, if F w = 0 then w ∈ ZW (by gap, ‖w‖ ≤ r_c − δ_w < R_log) contradiction with ‖w‖ = R_log. ✓ so the else-branch applies. And ‖F w‖ ≤ (9/4)|t|² needs ‖w‖ ≤ 99/100: R_log ≤ 0.96 + δ_w/2; δ_w = 1/(50(k+1)) ≤ 1/50 ⟹ R_log ≤ 0.96 + 0.01 = 0.97 ≤ 0.99 ✓.
- hBball: ∀ w ∈ closedBall(0, R_log), ‖B w‖ ≤ that bound — via AnalyticOn.norm_le_of_norm_le_on_sphere (B analytic on closedBall(0, R_log) from CfAnalytic with R := R_log... wait CfAnalytic gives AnalyticOnNhd on closedBall(0, R) for R < 1 with r_c < R. Take R = R_log ✓ (R_log < 0.97 < 1). AnalyticOnNhd ⟹ AnalyticOn on the closed ball? norm_le_of_norm_le_on_sphere signature (from DiskBound usage): `AnalyticOn.norm_le_of_norm_le_on_sphere (le_refl R) (AnalyticOnNhd.analyticOn ...) (sphere bound) (hz ∈ closedBall)`. ✓.
§8 J_B and BC:
- obtain ⟨J_B, hJ_an, hJ0, hJderiv, hJre⟩ := LogOfAnalyticFunction (r := 3/5) (R := R_log) ... — r = 0.6 = 3/5 < R_log (R_log ≥ r_c = 0.92 > 0.6 ✓). B nonvanishing on closedBall(0, R_log) from §6. Note LogOfAnalyticFunction needs nonvanishing on closedBall(0, R) = closedBall(0, R_log) ✓ and analytic on closedBall(0, R_log) ✓.
- Re J_B bound: ∀ w ∈ ball(0, R_log), (J_B w).re ≤ M_bound where M_bound := Real.log ((9/4)*|t|²) + M_c * Real.log (2/(3δ_w)). From hJre: (J_B w).re = log‖B w‖ − log‖B 0‖ ≤ log‖B w‖ (since log‖B 0‖ ≥ 0) ≤ M_bound via hBball (ball ⊆ closedBall) + Real.log_le_log (need ‖B w‖ > 0: B w ≠ 0 ✓) + log_mul + log_pow... (9/4)|t|² > 0 ✓, (2/(3δ_w)) > 0 ✓. log((9/4)|t|² · X) = log((9/4)|t|²) + log X needs both pos ✓.
- M_bound > 0: log((9/4)|t|²) ≥ log((9/4)·100) = log 225 > 0 ✓, second term ≥ 0 (M_c ≥ 0, log(2/(3δ_w)) ≥ log(2·50/3) > 0 ✓). Actually need Mpos : 0 < M for BC — ✓.
- BC: for w ∈ closedBall(0, 3/5): ‖deriv J_B w‖ ≤ 16·M_bound·R_log²/(R_log − 3/5)³. R_log − 3/5 ≥ r_c − 3/5 ≥ 0.92 − 0.6 = 0.32. R_log ≤ 0.97. So the factor ≤ 16·0.97²/(0.32)³ — but in the proof keep symbolic then bound at the end.
§9 deriv identity + translation:
- At w with F w ≠ 0 (i.e. ζ(s) ≠ 0 for s = aff w): deriv B w / B w = deriv F w / F w − Σ_{ρ∈ZW} m_ρ/(w−ρ).
Need: B =ᶠ[𝓝 w] F/P where P = ∏(·−ρ)^m — from Cf's else-branch on the open set {F ≠ 0} ∩ ... Actually simpler: B and F/P are both analytic on a punctured neighborhood... no — get EventuallyEq: on the complement of ZW (finite, closed), if F w ≠ 0 then in a neighborhood: F z ≠ 0 (continuity) and z ∉ ZW (ZW finite ⟹ closed... ZW is a finset so its carrier is closed; w ∉ carrier ⟹ neighborhood avoiding it). On that neighborhood Cf z = F z/P z by the else-branch. So B =ᶠ[𝓝 w] F/P. Then deriv B w = deriv (F/P) w (deriv_congr of EventuallyEq — `Filter.EventuallyEq.deriv` ✓ exists). And B w = F w/P w directly. So deriv B w/B w = (F/P)′(w)/(F/P)(w) = logDeriv (F/P) w = logDeriv F w − logDeriv P w (Mathlib: logDeriv_div — needs F w ≠ 0, P w ≠ 0, differentiableAts ✓). logDeriv P w = Σ m_ρ/(w−ρ): P = ∏(·−ρ)^{m_ρ}, logDeriv of product — Mathlib has `logDeriv_prod`? Let me think... there's `logDeriv_fun_mul`, `logDeriv_fun_div`, `logDeriv_fun_pow`? I believe Mathlib has `logDeriv_mul`, `logDeriv_pow`... In recent Mathlib: `logDeriv_fun_pow : logDeriv (f ^ n) x = n * logDeriv f x`? and `logDeriv_prod`? Let me search at build time. Worst case induction.
Also deriv J_B w = deriv B w / B w (from hJderiv, needs w ∈ closedBall(0, 3/5) ✓ for application region).
And logDeriv F w = (5/2)·logDeriv ζ (aff w): F = (ζ ∘ aff)·(1/ζ(s₀)) — logDeriv (c·g) = logDeriv g (logDeriv_const_mul, c ≠ 0); logDeriv (ζ ∘ aff) w: logDeriv_comp? deriv (ζ∘aff) w = deriv ζ (aff w) · deriv aff w = deriv ζ (aff w)·(5/2) (deriv.comp w (differentiableAt ζ) (affine)). So logDeriv F w = (5/2)·deriv ζ(aff w)/ζ(aff w) = (5/2)·logDeriv ζ s. There should be a `logDeriv_comp` lemma... or do it manually with deriv.comp.
§10 assemble the R-bound:
For s with σ ∈ [1/2, 7/2], |t| ≥ 10, ζ s ≠ 0: w := (s − s₀)·(2/5), ‖w‖ = (2/5)|σ−2| ≤ 3/5 ✓. Then:
logDeriv ζ s = (2/5)·logDeriv F w = (2/5)·[deriv J_B w + Σ m_ρ/(w−ρ)].
‖logDeriv ζ s − Σ_{nearZeros} m/(s−ρ)‖ = ‖(2/5)deriv J_B w + (2/5)Σ_{ZW} m_ρ/(w−ρ) − Σ_{near} m/(s−ρ)‖.
Now (2/5)·m_ρ/(w−ρ) = m/(s−ρ_s) where ρ_s = s₀+(5/2)ρ (check: w−ρ = (2/5)(s−ρ_s) since w = (2/5)(s−s₀) and ρ_s = s₀+(5/2)ρ ⟹ s−ρ_s = (5/2)(w−ρ) ✓). So (2/5)Σ_{ZW} m/(w−ρ) = Σ_{ZW} m/(s−ρ_s) = Σ_{collected_s} m/(s−ρ) via the affine bijection (Finset.sum_image, inj). collected_s = ZW.image aff = zeros in closedBall(s₀, R_c) — I should prove collected_s = (zeroDiscFinset t).filter (‖·−s₀‖ ≤ R_c) or just work with the image directly. Then split collected_s into nearZeros and extras (Finset.sum_sdiff / sum over union): Σ_collected = Σ_near + Σ_extra (need nearZeros ⊆ collected_s: |γ−t| < 1 ⟹ ‖ρ−s₀‖ ≤ √5 ≤ 2.3 ≤ R_c ✓ — √5 ≤ 2.3: 5 ≤ 5.29 ✓, needs ‖ρ−s₀‖ computation: ‖ρ−s₀‖² = (β−2)² + (γ−t)² with β ∈ (0,1) ⟹ (β−2)² ≤ 4 (|β−2| ≤ 2 hmm β ∈ (0,1) ⟹ β−2 ∈ (−2,−1) ⟹ (β−2)² ≤ 4) and (γ−t)² ≤ 1 ⟹ ‖·‖² ≤ 5 ⟹ ‖·‖ ≤ √5. Need IsNontrivialZero for β ∈ (0,1) — nearZeros members are in zeroDiscFinset ⟹ zeroDisc_isNontrivial ✓.)
So ‖R(s)‖ ≤ (2/5)‖deriv J_B w‖ + Σ_extra m/(s−ρ) ≤ (2/5)·16·M_bound·R_log²/(R_log−3/5)³ + M_c (each extra term ≤ m since ‖s−ρ‖ ≥ |t−γ| ≥ 1, and Σ_extra m ≤ Σ_collected m = M_c).
Then the final numeric chain: show (2/5)·16·R_log²/(R_log−3/5)³·M_bound + M_c ≤ C·(log|t|)² for an explicit C with |t| ≥ 10.
Given M_bound ≤ ~305L² (L = log|t|) from my scratch estimate and the BC factor ≤ (2/5)·16·0.97²/0.32³ ≈ 183.6 ≤ 184, and M_c ≤ 65L + 27 ≤ 305L²-ish... total ≤ 184·305L² + small = 56120L² → C := 60000. In Lean, proving M_bound ≤ 305·(log|t|)² requires careful real-number estimates. Let me redo this more carefully to have a clean certifiable chain.
Let L := Real.log |t|, so L ≥ log 10 > 2.302. Facts needed:
- log((9/4)|t|²) = 2L + log(9/4). log(9/4) = 2log(3/2) ≤ 2·(1/2)·... cleanest: 9/4 ≤ e ⟹ log(9/4) ≤ 1 (since 9/4 = 2.25 < e ≈ 2.718). Is 9/4 ≤ e available? `Real.exp_one_gt_d9` : 2.718281828 < e? There are bounds e > 2.718... so 9/4 < e ✓ via norm_num + that lemma. So log((9/4)|t|²) ≤ 2L + 1.
- log(33/32) ≥ ? 33/32 = 1.03125. log(1.03125) ≥ 0.03? Use log(1+x) ≥ x/(1+x)... Real.log_le_sub_one_of_pos? The handy ones: `Real.log_le_sub_one_of_pos : 0 < x → log x ≤ x − 1` (upper). Lower: `Real.one_sub_inv_le_log_of_pos`? Hmm: log x ≥ 1 − 1/x (for x > 0)? That's `Real.one_sub_inv_le_log`... something like that exists: log x ≥ (x−1)/x. For x = 33/32: (1/32)/(33/32) = 1/33 ≈ 0.0303. So log(33/32) ≥ 1/33. Then M ≤ (2L+1)·33 = 66L + 33. (matches Jensen: log((9/4)t²)/log(33/32) ≤ 33(2L+1)).
- k+1 ≤ M_c + 1 ≤ 66L + 34. 100(k+1)/3 ≤ 100(66L+34)/3 = (6600L + 3400)/3 = 2200L + 1133.33 ≤ 2200L + 1134. For L ≥ 2.302: 2200L + 1134 ≤ 2200L + 493L = 2693L. So log(100(k+1)/3) ≤ log 2693 + log L. log 2693 ≤ 8 (e⁸ = 2981 ≥ 2693 ✓ — need e⁸ ≥ 2693: e > 2.718, 2.718⁸ = ? 2.718² = 7.387; ⁴ = 54.57; ⁸ = 2978. Hmm 2978 > 2693 ✓ but proving 2.718⁸ ≥ 2693 in Lean: norm_num with Real.exp_one_gt_d9... messy but doable; alternatively use log 2693 ≤ log e^8 = 8 via Real.log_le_log and a computed bound. Or be lazier: 2693L ≤ L⁴ for L ≥ ... L³ ≥ 2693 ⟺ L ≥ 13.9 — no, L can be 2.3. Alternative: log(2693L) = log 2693 + log L ≤ 8 + log L, and log L ≤ L/e ≤ L − 1? Actually log L ≤ L − 1 only for... log L ≤ L − 1 for all L > 0 ✓ (Real.log_le_sub_one_of_pos: log L ≤ L − 1). So log(2693L) ≤ 7 + L.
Hmm wait, I need an upper bound on log of stuff; log(2693L) ≤ log 2693 + log L requires 2693 > 0, L > 0 ✓ (Real.log_mul). log 2693 ≤ 8: 2693 ≤ e⁸: since e ≥ 2.718281828 (Real.exp_one_gt_d9 gives 2.7182818283 < e? something like that), e⁸ ≥ 2.718281828⁸. Computing 2.718281828⁸ ≥ 2693 by norm_num: 2.718281828⁸ is a specific rational... norm_num can evaluate (2.718281828 : ℝ)^8 ≈ 2980.96 > 2693 ✓. And e⁸ = (e¹)⁸ via Real.exp_nat_mul or ← Real.exp_one_pow? e⁸ = Real.exp 8 = (Real.exp 1)^8? Real.exp 8 = Real.exp (1*8) = (Real.exp 1)^8 by Real.exp_nat_mul... `Real.exp_nat_mul : exp (n * x) = (exp x)^n`? So exp 8 = exp (8*1) = (exp 1)^8 ≥ 2.718...⁸ ≥ 2693. OK.
- So log(2/(3δ_w)) = log(100(k+1)/3) ≤ 7 + L (loose). Wait let me double check δ_w: δ = 1/(20(k+1)); δ_w = (2/5)δ = 2/(100(k+1)) = 1/(50(k+1)). 3δ_w/2 = 3/(100(k+1)). 2/(3δ_w) = 200(k+1)/6·... 2/(3/(100(k+1))) = 200(k+1)/3 ≈ 66.67(k+1). Hmm I previously wrote 100(k+1)/3 — recompute: (3δ_w/2) = 3/(100(k+1)); reciprocal times... (2/(3δ_w)) = 2·100(k+1)/3 = 200(k+1)/3. OK so 200(k+1)/3 ≤ 200(66L+34)/3 = (13200L + 6800)/3 = 4400L + 2266.67 ≤ 4400L + 2267 ≤ 4400L + 985L = 5385L (for L ≥ 2.302). log(5385L) = log 5385 + log L ≤ 9 + (L−1) = 8 + L (log 5385 ≤ 9: e⁹ = 8103 ≥ 5385 ✓ via 2.71828⁹ ≈ 8100 — norm_num check).
- M_bound = log((9/4)|t|²) + M_c·log(2/(3δ_w)) ≤ (2L+1) + (66L+33)(8+L) = 2L+1 + 66L² + 528L + 33L·8... let me expand: (66L+33)(L+8) = 66L² + 528L + 33L + 264 = 66L² + 561L + 264. So M_bound ≤ 66L² + 563L + 265. For L ≥ 2.302: 563L ≤ 244.6L², 265 ≤ 50L² ⟹ M_bound ≤ 361L².
- BC factor: (2/5)·16·R_log²/(R_log−0.6)³. R_log ≤ 0.97 ⟹ R_log² ≤ 0.9409 ≤ 1. R_log − 0.6 ≥ 0.32 ⟹ (R_log−0.6)³ ≥ 0.032768 ≥ 0.03. So factor ≤ (2/5)·16·1/0.03 = (2/5)·533.33 = 213.34. Hmm: 16/0.032768 = 488.28; times 0.9409 = 459.4; times 2/5 = 183.8. With the looser 0.03: 16/0.03 = 533.3, ×(2/5) = 213.3. To be safe: factor ≤ 214. (In Lean: R_log² ≤ 1 needs R_log ≤ 1 ✓ 0.97; (R_log−3/5)³ ≥ (8/25)³: 0.32 = 8/25 ✓; 16·1/(8/25)³ = 16·15625/512 = 488.28; ·(2/5) = 195.3. Use fractions: R_log ≥ 23/25 (r_c ≥ 2.3·(2/5) = 0.92 = 23/25 ✓), R_log − 3/5 ≥ 23/25 − 15/25 = 8/25 ✓. R_log ≤ 97/100. So BC factor = 16·M·R²/(R−r)³ ≤ 16·M·(97/100)²/(8/25)³ = 16·M·(9409/10000)·(15625/512) = 16·9409·15625/(10000·512)·M = 2352250000/5120000·M ≈ 459.42·M. Times 2/5: ≈ 183.77·M ≤ 184M.)
- ‖R(s)‖ ≤ 184·M_bound + M_c ≤ 184·361L² + (66L+33) ≤ 66224L² + 66L + 33 ≤ 66224L² + 29L² + ... 66·2.302 ≈ 152; 66L ≤ 28.7L²... so ≤ 66253L² + tiny ≤ 66260L². Take C := 70000.
So the final theorem: ‖logDeriv ζ s − Σ_{nearZeros t} m/(s−ρ)‖ ≤ 70000·(Real.log|t|)². Hmm wait — (Real.log |t|)^2. Or should I state it with log(|t|+2)? For 5e the circle growth uses |t| up to R+1 on the circle... any form works. Simplest: (Real.log |t|)^2 with |t| ≥ 10. Hmm, but actually for 5d (reflection) and 5e it might be cleaner to have log(|t|+2) ≥ ... whatever — the loose form C·(log|t|)² for |t| ≥ 10 is fine; 5e can convert (log|t| ≤ log(R+1)+1 etc.).
Hmm, actually — let me reconsider whether to even keep M_c symbolic vs concrete. The final numeric fold has several irreducibly tedious steps (log(33/32) ≥ 1/33, e⁸ ≥ 2693, etc.). All doable. Total estimate: this is a LOT of Lean code — maybe 600–900 lines for §5–§10. That fits the "~1 session" estimate but it's ambitious. Let me be strategic: build in order, compile frequently with `lake env lean NguyenRH1/LiDisc.lean`.
One design decision to reduce pain: instead of tracking M_c · log(2/(3δ_w)) with δ_w defined from k = card... note 2/(3δ_w) = 200(k+1)/3. And k+1 = card+1 ≤ M_c+1 (since card ≤ Σm = M_c as each m ≥ 1). Wait — do I have card zeroDiscFinset ≤ M_c (the mult sum over the SCALED 0.96-finset)? zeroDiscFinset = zeros in closedBall(s₀, 5/2) — corresponds to scaled zeros in closedBall(0,1) — SetOfZeros 1 F. The Jensen count is over SetOfZeros (24/25) — the zeros with 0.96 < ‖w‖ ≤ 1 are NOT counted by Jensen. Hmm! So k = card(zeroDiscFinset) could exceed M(0.96-sum).
Uh oh. The clearance δ must come from a count bound on ALL zeros in the 5/2-disc (since S includes distances of all of them), but Jensen only counts those within 0.96·(5/2) = 2.4. Zeros in the annulus 2.4 < d ≤ 2.5 are not Jensen-counted.
Fix options: (a) bound card(zeroDiscFinset) via the perimeter ZeroCountProp instead (the disc B(s₀, 5/2) is covered by ~5 unit windows: γ ∈ [t−2.5, t+2.5] ⟹ 5 windows [t−3, t+2]... plus the perimeter needs a ≥ 2: t ≥ 10 ⟹ t−3 ≥ 7 ✓; for t ≤ −10 symmetric — hmm, ZeroCountProp is stated for t ≥ 2 with window [t, t+1]. For negative ordinates use the conjugate symmetry of zeros: IsNontrivialZero ρ ⟹ conj ρ also? That's a Zeta23 seam (zeros come in conjugate pairs). Might be annoying. (b) Apply Jensen with a bigger r: r = 1? SetOfZeros 1 F is finite, but ZerosBound needs r < 1. Use r = 0.995: then the sum over SetOfZeros(0.995) covers d ≤ 2.4875 — still not 2.5. Hmm r < 1 strictly, so never covers the boundary ‖w‖ = 1 exactly (d = 2.5). But zeroDiscFinset uses closedBall(s₀, 5/2) — includes the boundary.
Hmm. Option (c): shrink zeroDiscFinset to closedBall(s₀, 49/20) = 2.45 and use Jensen r = 0.98 = 24.5/25... but zeroDiscFinset was already committed in ii′-5c part 1 with 5/2 (and used in scaledZeta_zeros_finite, zeroDisc_isNontrivial). Redefining it would touch existing proved code (zeroDisc_isNontrivial used 5/2 geometry: re ∈ [−1/2, 9/2]; 49/20 gives re ≥ 2 − 2.45 = −0.45 — the re ≤ 0 exclusion argument used re ≥ −1/2 hmm: with radius 2.45, re ρ ∈ [−0.45, 4.45]; the ΓR-pole argument: re ≤ 0 ⟹ ρ = −2n with re = −2n ≤ −2 < −0.45 for n ≥ 1 ✓ still works, n = 0: ρ = 0 excluded by ζ(0) ≠ 0 ✓. So changing 5/2 → 49/20 in zeroDiscFinset would still let zeroDisc_isNontrivial go through (re ≤ 9/2 → re ≤ 4.45+... the proof structure is the same, constants change). But freeze protocol says existing proofs untouched except liCoeff fix... well, ii′-5c is THIS session's sub-stage, in progress — LiDisc.lean from session 023 is committed though. Modifying the definition would require re-proving zeroDisc_isNontrivial with new constants. Eh.
Option (d): keep S as the distances of the 0.96-disc zeros only! I.e., choose the gap R_c ∈ [2.3, 2.4] avoiding distances of zeros within 2.4 only... but then zeros with d ∈ (R_c, 2.4] could be closer than δ to R_c?? No wait — if S includes ALL zeros with d ≤ 2.4, and R_c ∈ [2.3, 2.4] avoids all of them by δ, then collected zeros (d ≤ R_c) have d ≤ R_c − δ, and zeros with d ∈ (R_c, 2.4] have d ≥ R_c + δ. Zeros with d ∈ (2.4, 2.5]: NOT in S, could be at any distance > 2.4 ≥ R_c... but they're at d > 2.4 > R_c + δ? δ = 1/(20(k+1)) could exceed 0.1 for small k... k = card of the ≤2.4-zero finset... hmm δ ≤ 1/20 = 0.05 (k ≥ 0) — wait for k=0, δ = 1/20, R_c + δ ≤ 2.4 + 0.05 = 2.45 < ... a zero at d = 2.44 exists? If k=0 there are no zeros with d ≤ 2.4 but one at 2.44 — its distance to R_c: 2.44 − 2.4 ≥ ... R_c ≤ 2.4 so d − R_c ≥ 0.04 < δ = 0.05. PROBLEM: that zero is at distance < δ above R_c. Does it matter? What do we need the gap for?
(i) Collected zeros (in ZW, ‖w‖ ≤ r_c) satisfy ‖w‖ ≤ r_c − δ_w: needs gap below R_c among... the zero at 2.44 is NOT collected (d > R_c), fine — but for ZW members, their d ≤ R_c AND they're in S (d ≤ 2.4 ✓ since R_c ≤ 2.4) so d ≤ R_c − δ ✓. Good — no problem for (i).
(ii) B nonvanishing on closedBall(0, R_log): need no zeros with r_c < ‖w‖ ≤ R_log, i.e. no ζ-zeros with d ∈ (R_c, R_c + δ/2... R_log = r_c + δ_w/2 ⟹ d ∈ (R_c, R_c + δ/2). Zeros with d ≤ 2.4: in S ⟹ d ≥ R_c + δ > R_c + δ/2 ✓. Zeros with d ∈ (2.4, 2.5]: d > 2.4 ≥ R_c; is 2.4 > R_c + δ/2? R_c ≤ 2.4 and δ/2 ≤ 1/40 = 0.025, so R_c + δ/2 could be 2.4125, and a zero at d = 2.41?? If d = 2.41 > 2.4 not in S, and R_c = 2.4, R_log·2.5 = 2.4 + δ/4 = 2.4125·... wait R_log = r_c + δ_w/2 ⟹ (5/2)R_log = R_c + (5/2)δ_w/2 = R_c + δ/2 = 2.4125. A zero at d = 2.41 ∈ (2.4, 2.4125): B would vanish at the corresponding w (‖w‖ = 0.964 ≤ R_log = 0.965)!! PROBLEM.
So option (d) breaks (ii) unless S includes the annulus zeros. Hmm.
Option (e): make R_log smaller: R_log = r_c + min(δ_w/2, (2.4 − R_c)·(2/5)/2)... ugly. Actually: the constraint is zeros with d ≤ 2.4 are δ-away; zeros with d > 2.4 are at d > 2.4. So any R_log' := min(r_c + δ_w/2, corresponding to R_c + (2.4−R_c)/2 = (R_c+2.4)/2)... i.e. choose R_c' := R_c + min(δ/2, (2.4−R_c)/2). Then no zeros in (R_c, R_c']. And R_c' − R_c could be as small as... if R_c = 2.4, min(δ/2, 0) = 0!! R_c' = R_c, no room. Ugh — if R_c = 2.4 exactly, zeros at 2.4+ε arbitrary close. But wait — do we need room above R_c at all? B = Cf r_c F is analytic on closedBall(0, R) for any R < 1 regardless (CfAnalytic) — analyticity is fine. NONVANISHING on closedBall(0, R_log) needs no zeros in the annulus. If there's no room, take R_log := r_c exactly? But then the sphere ‖w‖ = r_c... zeros ON the sphere ‖w‖ = r_c? Collected zeros satisfy ‖w‖ ≤ r_c − δ_w < r_c, and uncollected have ‖w‖ > r_c (strictly, since ‖w‖ = r_c ⟹ d = R_c ∈ S... wait d = R_c: is d ∈ S then |d − R_c| = 0 < δ contradiction — so no zero at exactly d = R_c). So on the closed ball closedBall(0, r_c): zeros w have ‖w‖ ≤ r_c − δ_w (if in S... every zero with ‖w‖ ≤ r_c has d ≤ R_c ≤ 2.4 so IS in S ⟹ ‖w‖ ≤ r_c − δ_w ✓). So B nonvanishing on closedBall(0, r_c)? At w with F w = 0 and ‖w‖ ≤ r_c: w ∈ ZW... the Cf def: at a zero w ∈ SetOfZeros r_c, Cf w = ZeroFactor/prod ≠ 0 ✓. At w with F w ≠ 0: else-branch, B w = F w/prod, prod: factors (w−ρ), ρ ∈ ZW, w ≠ ρ since F w ≠ 0 ≠ F ρ... ✓ nonzero. YES — B is nonvanishing on closedBall(0, r_c), no extra room needed!
But LogOfAnalyticFunction needs B nonvanishing on closedBall(0, R) where R > r (r = application radius 3/5) and analyticity on closedBall(0, R) — I can take R = r_c! B analytic on closedBall(0, R') for R' ∈ (r_c, 1) via CfAnalytic, hence on closedBall(0, r_c) by mono ✓. Nonvanishing on closedBall(0, r_c) ✓ as just argued. So apply LogOfAnalyticFunction with r := 3/5, R := r_c: J_B analytic on ball(0, r_c), Re J_B = log‖B‖ − log‖B 0‖ on ball(0, r_c), deriv on closedBall(0, 3/5) ✓.
Then Re J_B bound on ball(0, r_c): need ‖B‖ bound on ball(0, r_c) — via max-modulus on sphere ‖w‖ = r_c: sphere points have no zeros (shown above: no zero at ‖w‖ = r_c), else-branch: ‖B w‖ = ‖F w‖/∏‖w−ρ‖^m with ‖w−ρ‖ ≥ ‖w‖−‖ρ‖ ≥ r_c − (r_c−δ_w) = δ_w. So ‖B w‖ ≤ (9/4)|t|²·(1/δ_w)^{M_c} where 1/δ_w = 50(k+1). Slightly different constant than before (50 vs 200/3·...): log(1/δ_w) = log(50(k+1)). Even better.
Wait — is r_c ≤ 99/100 for the F bound? r_c ≤ 0.96 ≤ 0.99 ✓. And BC: R = r_c ∈ [0.92, 0.96], r = 3/5: R − r ≥ 0.32 = 8/25 ✓, R² ≤ 0.96² = 0.9216. BC factor: 16·0.9216/(8/25)³ = 16·0.9216·15625/512 = 450. Times 2/5 = 180. ✓
Also the M_c count: collected zeros = SetOfZeros r_c with r_c ≤ 0.96 = 24/25 — Jensen applies to the 24/25-finset; monotonicity: SetOfZeros r_c ⊆ SetOfZeros (24/25) (r_c ≤ 24/25 ✓), sum over toFinset subset ≤ since orders ≥ 0. ✓ And k := card of the distance finset S where S := distances of zeros with d ≤ 2.4 = image of (SetOfZeros (24/25) F).toFinset under affine+norm... Let me define S directly as image of the scaled 24/25-finset ZW96 under (5/2)·‖·‖: S := ZW96.toFinset.image (fun w => (5/2)*‖w‖)? Distances of ζ-zeros with d ≤ 2.4 = {(5/2)‖w‖ : w zero of F, ‖w‖ ≤ 24/25}. Note: (5/2)·‖w‖ = ‖s₀ + (5/2)w − s₀‖ ✓ exactly the distances. So S := (ZW96).image (fun w => (5/2) * ‖w‖), card S ≤ card ZW96 ≤ M96 ≤ Jensen. So k := (ZW96).card and card S ≤ k ✓. δ := 1/(20(k+1)) (after the ×10 rescale trick). Clearance applies to every w ∈ ZW96: |(5/2)‖w‖ − R_c| ≥ δ ⟹ |‖w‖ − r_c| ≥ δ_w (δ_w = (2/5)δ = 1/(50(k+1))).
And zeroDiscFinset stays as-is (5/2); zeroDisc_isNontrivial used for: nearZeros members are nontrivial (for β ∈ (0,1) in the nearZeros ⊆ collected argument). ✓
Hmm wait, one thing to double check: for ZW members (collected, ‖w‖ ≤ r_c): the gap argument gives ‖w‖ ≤ r_c − δ_w — this requires (5/2)‖w‖ ∈ S, i.e. w ∈ ZW96: ‖w‖ ≤ r_c ≤ 24/25 ⟹ w ∈ SetOfZeros (24/25) ✓ (F w = 0 by ZW membership). ✓
Also for §9 translation: the collected ζ-zeros finset = ZW.image (fun w => s₀ + (5/2)w). Sum over ZW of m_ρ/(s − ρ_s) via sum_image (inj: affine injective ✓). m values: analyticOrderNatAt F w = analyticOrderNatAt ζ (aff w) (analyticOrderNatAt_scaledZeta ✓ needs ‖w‖ ≤ 1 ✓ r_c < 1). zeroMult ρ := analyticOrderNatAt riemannZeta ρ? Let me check the definition of zeroMult in LiSides/LiSkeleton.
Let me check zeroMult def and nearZeros plan, then also check what logDeriv lemmas exist in Mathlib. Let me grep.
Context absorbed. Now checking `zeroMult`'s definition and the Mathlib `logDeriv` API before writing code.
tool: Grep
input
{
"pattern": "(def zeroMult|zeroMult :=|noncomputable def zeroMult)",
"path": "D:\\Python\\Quantum\\research\\lean\\NguyenRH1",
"output_mode": "content",
"-B": 3,
"-A": 3
}
tool: Grep
input
{
"pattern": "theorem logDeriv_(fun_)?(mul|prod|pow|div|comp|const_mul)",
"path": "D:\\Python\\Quantum\\zeta-23-lean\\.lake\\packages\\mathlib\\Mathlib\\Analysis\\Calculus\\LogDeriv.lean",
"output_mode": "content",
"-A": 6
}
raw content_json (database row)
[{"type":"thinking","thinking":"Excellent — Zeta23's `Cf r f` is EXACTLY the g function (f divided by the zero-product over the radius-r zero set), with:\n- `CfAnalytic` (r < R < 1): Cf r f analytic on closedBall(0, R)\n- `BlaschkeB r R f z = Cf r f z * ∏ (R − z·conj ρ/R)^m` and `BlaschkeNonzero` on closedBall(0, r)\n- `DiskBound`: ‖BlaschkeB r R f z‖ ≤ B on closedBall(0, R)\n\nHmm, but what about nonvanishing of Cf itself? On closedBall(0,r), BlaschkeB is nonzero AND the product factor ∏(R − z·conjρ/R)^m is nonzero (that's hBProd inside BlaschkeNonzero's proof) — so Cf is nonzero on closedBall(0, r) too (as a factor of a nonzero product... wait, BlaschkeB = Cf * prod, both factors... actually from the proof, BlaschkeNonzero shows Cf z ≠ 0 AND prod ≠ 0 separately — the mul_ne_zero requires both. Actually reading more carefully: in the case z ∈ zeros, it shows `ZeroFactor f z / ∏... ≠ 0` (that's Cf z) times hBProd. So yes both factors are nonzero on closedBall(0, r). But that nonvanishing of Cf is only on closedBall(0, r), not on the full closedBall(0, R).\n\nHmm, wait. For my application: g should be nonvanishing on the disc where we take the log. Let me re-think the geometry.\n\nDesign per STATE.md:\n- Disc center s₀ = 2+it, outer radius R = 5/2. \n- Zero-collection radius r_c = 2.3 (all |γ−t|<1 zeros have |ρ−s₀| ≤ √5 ≈ 2.236 < 2.3).\n- R-gap: choose R ∈ [2.3, 2.4]?? Wait STATE.md says \"exists_avoiding_midpoint SCALED to window [2.3, 2.4]\". Hmm, but the outer radius in ii′-5b's bound is 5/2. Let me re-read.\n\nFrom STATE.md NEXT ACTION:\n1. R-gap selection: the distance-value finset (zeroDiscFinset).image (·−s₀‖-distances); exists_avoiding_midpoint SCALED to window [2.3, 2.4] (add an ℓ-parameterized variant — reuse ii′-4's proof); k from scaledZeta_jensen_count (distinct ≤ mult-weighted since each zeroMult ≥ 1). Collection := zeros with |ρ−s₀| ≤ R.\n\nHmm, so the outer radius R is chosen in [2.3, 2.4] (not 2.5!) avoiding the zero-distance values, with clearance δ = 1/(2(k+1)). The zeros are collected with |ρ − s₀| ≤ R. The collection radius r_c = R ∈ [2.3, 2.4]. Then:\n\n- On the outer circle |s−s₀| = R: every zero of ζ in the closed disc B(s₀, 5/2)... wait no. Hmm, but we need |ζ| bounded on the outer circle. We have ‖ζ‖ ≤ (3/4)|t|² on B(s₀, 5/2) ⊇ B(s₀, R) since R ≤ 2.4 < 2.5. Good.\n\n- g(s) := ζ(s)/∏ₖ(s−ρₖ)^{mₖ} where the product is over zeros in B(s₀, R)... The point of choosing R in a gap: on the circle |s−s₀| = R there are NO zeros, and moreover every zero ρₖ of ζ with |ρₖ−s₀| ≤ R satisfies |ρₖ−s₀| ≤ R − δ where δ = 1/(2(k+1)) — the clearance. So on the circle, |s−ρₖ| ≥ δ, giving |g| ≤ |ζ|·δ^{−M} on the circle, hence on the closed disc by maximum principle... \n\nWait, but is g analytic on the closed disc B(s₀, R)? g = ζ/∏(s−ρₖ)^{mₖ} where ρₖ ranges over zeros in the OPEN disc |ρ−s₀| < R (equivalently ≤ R − δ... hmm, since R avoids all distance values, {|ρ−s₀| ≤ R} = {|ρ−s₀| < R} = {|ρ−s₀| ≤ R−δ}). At each zero ρₖ of multiplicity mₖ, ζ has the local factorization ζ(s) = (s−ρₖ)^{mₖ}·hₖ(s) with hₖ analytic and nonzero at ρₖ. Since all zeros in the disc are collected, g is analytic and nonvanishing on B(s₀, R) (need care at the boundary but since no zeros on the circle and the zeros inside are removed, g is analytic on a neighborhood of the closed ball — hmm, actually ζ is analytic on B(s₀, 5/2 minus {1})... and g is analytic on the open disc B(s₀, R') for some R' slightly bigger than R? No wait — the zeros at exactly distance R don't exist, and zeros with distance in (R, R + ε) for small ε... the next zero distance is at least R + δ' for some δ' > 0? Actually the distance values form a finite set (finitely many zeros in B(s₀, 5/2)), so there's a gap around R: no zero has distance in (R−δ, R+δ') where δ' = distance to the next value. So g is in fact analytic on B(s₀, R + δ') which is a neighborhood of closedBall(s₀, R). \n\nBut careful: zeros OUTSIDE the disc but at distance < 5/2 exist possibly; g only divides by the inside zeros; outside zeros at distance > R are fine since (s − ρ) ≠ 0 on B(s₀, R) for those. So g analytic + nonvanishing on B(s₀, R + δ') ⊇ closedBall(s₀, R). \n\nApproach in Lean: rather than building g directly via local factorizations myself, maybe I can reuse the scaled picture and Zeta23's `Cf`! In the scaled variable w (F(w) = ζ(s₀ + (5/2)w)/ζ(s₀) on unit disc), the zeros of F in {|w| ≤ r} correspond to zeros of ζ in {|s−s₀| ≤ (5/2)r}. The collection radius r_c = 2.3 → scaled 2.3/2.5 = 0.92. R-gap chosen in [2.3, 2.4] → scaled [0.92, 0.96]. \n\nZeta23's `Cf r f` with r = R_scaled = R/2.5 ∈ [0.92, 0.96], R'(second arg) = 0.99: `CfAnalytic (r<R') (R'<1)` gives Cf analytic on closedBall(0, R'). And BlaschkeNonzero gives BlaschkeB ≠ 0 on closedBall(0, r) — and BlaschkeB = Cf · ∏(Blaschke factors); the Blaschke factors (R − z conj ρ/R) for |z| ≤ r < R... each factor has norm ≥ R − |z||ρ|/R·... For |z| ≤ r and |ρ| ≤ r: |R − z conjρ/R| ≥ R − |z||ρ|/R ≥ R − r²/R = (R²−r²)/R > 0. So Cf ≠ 0 on closedBall(0, r) as well (quotient of nonzero by nonzero... actually BlaschkeNonzero's proof itself establishes both factors nonzero — hBProd and the Cf part. But it's not split into a separate lemma. Hmm — but I can prove `Cf r f z ≠ 0` on closedBall(0,r) myself: BlaschkeB r R f z ≠ 0 (BlaschkeNonzero) and BlaschkeB = Cf * prod with prod ≠ 0 (re-derive hBProd) ⟹ Cf ≠ 0. That's easy.\n\nWait, actually for LogOfAnalyticFunction I need B nonvanishing on closedBall(0, R) where R is the outer radius and J_B analytic on ball(0, R), deriv identity on closedBall(0, r) with r < R. So: use B := Cf r_coll F where r_coll = the scaled collection radius (= R_gap/2.5, with R_gap ∈ [2.3,2.4] the gap radius)... hmm wait. Let me set up the scaled geometry precisely.\n\nUnscaled: center s₀, zeros collected with |ρ−s₀| ≤ R_c where R_c ∈ [2.3, 2.4] chosen in a gap with clearance δ from all zero-distances. Application radius r_a = 3/2 (σ ∈ [1/2, 7/2] region: |s−s₀| ≤ 3/2 covers it).\n\nScaled by 5/2: F(w) = ζ(s₀+(5/2)w)/ζ(s₀). Collection radius in w: r_c = R_c/(5/2) ∈ [0.92, 0.96]. Clearance in w: δ_w = δ/(5/2). Application radius: r_aw = (3/2)/(5/2) = 0.6.\n\nPlan with Zeta23 machinery:\n- B := Cf r_c F — analytic on closedBall(0, R') for any R' < 1 with r_c < R', e.g. R' = 0.99 (CfAnalytic). F's zeros in {|w| ≤ r_c} = scaled zeros of ζ in {|s−s₀| ≤ R_c}... wait need F zero ⟺ ζ zero: F = ζ(aff)/ζ(s₀), ζ(s₀) ≠ 0, so yes, zeros of F in the ball correspond exactly.\n\nHmm wait, actually — is Cf's zero set exactly the zeros with |w| ≤ r_c? Cf r F divides by zeros in SetOfZeros r F = {‖ρ‖ ≤ r ∧ F ρ = 0}. Yes.\n\n- B nonvanishing on closedBall(0, r_c): from BlaschkeNonzero + product nonvanishing as above. Actually hold on — I want B nonvanishing on closedBall(0, R'') for some R'' > r_c up to the next zero-distance. But since R_c was chosen in a gap: zeros of F have norms outside (r_c, r_c + δ'_w). Actually the NEXT zero beyond R_c: the finite set of distances in B(s₀, 5/2) has a gap after R_c... but zeros exactly at distance in (R_c, next) — there are none until the next distance value d_next > R_c. And d_next ≥ R_c + something? The midpoint pigeonhole gives clearance δ below R_c from the values ≤ R_c... hmm, let me think about what exists_avoiding_midpoint gives: S = finset of distances, T with |x − T| ≥ 1/(2(k+1)) for ALL x ∈ S (all distances, not just those ≤ T). So with T = R_c: every zero in B(s₀, 5/2) has |‖ρ−s₀‖ − R_c| ≥ δ where δ = 1/(2(k+1)). So zeros are all at distance ≤ R_c − δ or ≥ R_c + δ. \n\nSo in fact B = Cf r_c F is analytic AND nonvanishing on closedBall(0, r_c + δ_w)... well, on the region up to the next zero. Nonvanishing on closedBall(0, r_c): yes. Actually for LogOfAnalyticFunction I need nonvanishing on the SAME closedBall(0, R_log) where analyticity holds, with R_log being the radius where I bound Re J on the ball(0, R_log). Hmm.\n\nLet me re-read LogOfAnalyticFunction signature:\n```\ntheorem LogOfAnalyticFunction {r R : ℝ} {B : ℂ → ℂ}\n (zero_lt_r: 0 < r) (r_lt_R : r < R)\n (BanalyticOnNhdOfDR: AnalyticOnNhd ℂ B (Metric.closedBall (0 : ℂ) R))\n (Bnonzero: ∀ z ∈ Metric.closedBall (0 : ℂ) R, B z ≠ 0) :\n ∃ (J_B: ℂ → ℂ), (AnalyticOnNhd ℂ J_B (Metric.ball 0 R)) ∧\n (J_B 0 = 0) ∧\n (∀ z ∈ Metric.closedBall 0 r, (deriv J_B) z = (deriv B) z / (B z)) ∧\n (∀ z ∈ Metric.ball 0 R, Real.log ‖B z‖ - Real.log ‖B 0‖ = (J_B z).re)\n```\n\nSo: B analytic on closedBall(0, R) and NONZERO on all of closedBall(0, R). Then J_B analytic on ball(0, R), deriv J_B = B'/B on closedBall(0, r) (the smaller radius), and Re J_B = log‖B‖ − log‖B(0)‖ on ball(0, R).\n\nThen BorelCaratheodoryDeriv: f analytic on ball(0, R), f(0) = 0, Re f ≤ M on ball(0, R), z ∈ closedBall(0, r) ⟹ ‖deriv f z‖ ≤ 16MR²/(R−r)³.\n\nSo for the scaled picture:\n- B := Cf r_c F, analytic on closedBall(0, R_out) with R_out := 0.99 (say), and NONVANISHING on closedBall(0, R_out)?? Is Cf r_c F nonvanishing on all of closedBall(0, 0.99)? NO — Cf removes only zeros with ‖ρ‖ ≤ r_c; zeros with r_c < ‖ρ‖ ≤ 0.99 remain zeros of Cf! (Cf z = F z / ∏... for z not in the zero set, which vanishes when F z = 0.)\n\nHmm. So Cf r_c F has zeros in the annulus r_c < ‖w‖ ≤ 0.99 potentially. So I can't apply LogOfAnalyticFunction with R = 0.99.\n\nResolution: apply LogOfAnalyticFunction with R = R_log where R_log is chosen such that closedBall(0, R_log) contains no zeros beyond r_c. Since the distances have a gap: all zeros satisfy ‖ρ‖ ≤ r_c − δ_w or ‖ρ‖ ≥ r_c + δ_w (in scaled units, δ_w = (2/5)·δ). Hmm wait: zeros with distance ≥ R_c + δ in unscaled ⟹ ‖ρ_w‖ ≥ r_c + δ_w. So on closedBall(0, r_c + δ_w/2) (say), the only zeros are those with ‖ρ‖ ≤ r_c − δ_w < r_c, all collected. So B = Cf r_c F is analytic + nonvanishing on closedBall(0, r_c + δ_w/2) ⊇ closedBall(0, r_c).\n\nBut hold on — is B nonvanishing at the collected zeros themselves? Yes — Cf's whole point: at z ∈ zero set, Cf z = ZeroFactor f z / ∏_{ρ ≠ z}(z−ρ)^m, nonzero by ZeroFactorization. That's what CfAnalytic's proof and BlaschkeNonzero handle.\n\nSo: apply LogOfAnalyticFunction with:\n- R_log := r_c + δ_w/2 (or anything in (r_c, r_c + δ_w))\n- B := Cf r_c F\n- B analytic on closedBall(0, R_log): need R_log < 1 for CfAnalytic... r_c ≤ 0.96, δ_w = (2/5)·δ where δ = 1/(2(k+1)), k = zero count ~ log t². For t large δ is tiny; for small t... δ ≤ 1/2 so δ_w ≤ 0.2. r_c + δ_w/2 ≤ 0.96 + 0.1 = 1.06?? Could exceed 1!\n\nHmm. Problem: CfAnalytic requires R < 1 (analyticity only on closedBall(0,1) from scaledZeta_analytic). If r_c = 0.96 and δ_w/2 pushes past 1, trouble. Fix: shrink the window. Choose R_c ∈ [2.3, 2.35] maybe. Actually the scaled window: the midpoint pigeonhole works on a window [a, a+ℓ] of length ℓ with midpoints spaced ℓ/(k+1), clearance ℓ/(2(k+1)). \n\nGeneralized midpoint lemma (ℓ-parameterized): S finset of reals, card ≤ k, window [a, a+ℓ]: ∃ T ∈ [a, a+ℓ] with |x−T| ≥ ℓ/(2(k+1)) for all x ∈ S.\n\nTake window [2.3, 2.4], ℓ = 0.1: clearance δ = 0.1/(2(k+1)) = 1/(20(k+1)). r_c = R_c/2.5 ∈ [0.92, 0.96]. δ_w = δ/2.5 = 1/(50(k+1)). R_log = r_c + δ_w/2 ≤ 0.96 + 1/(100(k+1)) ≤ 0.96 + 0.01 = 0.97 < 1. \n\nAnd BorelCaratheodory: need f = J_B on ball(0, R_log), Re f ≤ M there, then deriv on closedBall(0, r_a_scaled) where r_a_scaled = 0.6. Factor: 16·R_log²/(R_log − r_a)³ ≤ 16·0.97²/(0.92−0.6)³ ≤ 16·0.941/0.0328 ≈ 459. Loose but fine (we only need SOME C·(log|t|)²).\n\nHmm wait, but actually I realize I should double check whether B = Cf r_c F is nonvanishing on closedBall(0, R_log): zeros of Cf r_c F = ? For z ∈ ball with ‖z‖ ≤ R_log < next zero distance: if F z ≠ 0 then Cf z = F z/prod ≠ 0 (prod nonzero since each factor (z−ρ) ≠ 0 for ‖ρ‖ ≤ r_c − δ_w... wait ‖z−ρ‖: z could equal ρ? No: if F z ≠ 0, z ≠ ρ for all zeros ρ. Fine.) If F z = 0 then z is a zero with ‖z‖ ≤ R_log, so ‖z‖ ≤ r_c − δ_w < r_c (by the gap), so z ∈ SetOfZeros r_c F, and Cf z = ZeroFactor/prod_{ρ≠z} ≠ 0 by ZeroFactorization + the product nonzero (each (z−ρ) ≠ 0 for ρ ≠ z since zeros are distinct points in the finset).\n\nOK so the nonvanishing argument needs: for z with ‖z‖ ≤ R_log and F z = 0: z ∈ SetOfZeros r_c F, i.e. ‖z‖ ≤ r_c. From the gap: ‖z‖ is a distance value (z zero of F ⟹ ζ(s₀+(5/2)z) = 0 ⟹ ‖(5/2)z‖ = (5/2)‖z‖ is a zero-distance; if ‖z‖ > r_c then ‖z‖ ≥ r_c + δ_w > R_log contradiction). Good.\n\nAnd ZeroFactor nonvanishing: ZeroFactorization gives ZeroFactor f z = h_z z with h_z z ≠ 0 (its conclusion includes `ZeroFactor f ρ = h_ρ ρ ∧ h_ρ ρ ≠ 0`). It needs RleOne : R < 1 where the zero is in SetOfZeros R f — take R = r_c < 1 ✓, hfAnalytic on closedBall(0,1) ✓ (scaledZeta_analytic), f 0 ≠ 0 ✓ (scaledZeta_zero: F 0 = 1).\n\nGreat — so actually I might not even need to construct g myself at all: `Cf r_c F` IS g (up to the constant ζ(s₀) factor... wait: F = ζ(aff)/ζ(s₀), and Cf r_c F = F/∏(w−ρ_w)^{m} off the zero set = ζ(aff)/(ζ(s₀)·∏(w−ρ_w)^m). The unscaled g(s) = ζ(s)/∏(s−ρₖ)^{mₖ} = ζ(s₀+(5/2)w)/∏((5/2)(w−ρ_w))^{m} = ζ(s₀)·F(w)·... hmm: g(s₀+(5/2)w) = ζ(s₀+(5/2)w)/∏(s₀+(5/2)w−ρₖ)^{mₖ} = ζ(s₀)·F(w)/∏((5/2)(w−ρ_{wₖ}))^{mₖ} = [ζ(s₀)/(5/2)^{Σm}]·Cf r_c F (w) (off zeros). Constants don't matter for log derivatives. I can just work with B := Cf r_c F entirely in the scaled picture, then translate back: deriv of log... Let me think about what the final statement needs.\n\nFINAL TARGET (loose R-bound): for s = σ+it, σ ∈ [1/2, 7/2], |t| ≥ 10, ζ(s) ≠ 0:\n‖logDeriv ζ s − Σ_{ρ ∈ nearZeros t} (zeroMult ρ)/(s−ρ)‖ ≤ C·(log|t|)²\n\nwhere nearZeros t = zeros with |γ−t| < 1 (as a finset — from ii′-4's zeroWindow at windows [t−1, t] etc., or via zeroDiscFinset filtered). \n\nProof chain:\n1. R-gap: R_c ∈ [2.3, 2.4] with clearance δ = 1/(20(k+1)) from all zero-distances in B(s₀, 5/2); k = card of distance finset ≤ mult-weighted Jensen count (each zeroMult ≥ 1 ⟹ distinct count ≤ weighted count). Hmm: the distance finset = image of zeroDiscFinset under (· − s₀) norm; card of image ≤ card of zeroDiscFinset ≤ Σ mult (since each mult ≥ 1) ≤ Jensen bound. So k := (zeroDiscFinset t).card works: distances image card ≤ card ≤ Σρ mult.\n\nWait, actually for exists_avoiding_midpoint I need card S ≤ k for S = distance finset. I can just take k := (zeroDiscFinset t).card and S := image, card S ≤ card = k. Clearance δ = 1/(20(k+1))... hmm wait, ℓ/(2(k+1)) with ℓ = 1/10: δ = (1/10)/(2(k+1)) = 1/(20(k+1)). OK.\n\n2. Collection: zeros with |ρ−s₀| ≤ R_c (equivalently < R_c, same by gap). In scaled: SetOfZeros r_c F.\n\n3. B := Cf r_c F: analytic on closedBall(0, R_log), R_log := r_c + δ_w/2; nonvanishing there.\n\n4. LogOfAnalyticFunction (r := r_a' = 0.6, R := R_log): J_B analytic on ball(0, R_log), J_B 0 = 0, deriv J_B = B'/B on closedBall(0, 0.6), Re J_B = log‖B‖ − log‖B 0‖ on ball(0, R_log).\n\n5. Bound Re J_B on ball(0, R_log): need ‖B‖ on... Re J_B(w) = log‖B w‖ − log‖B 0‖. \n - Upper bound log‖B w‖ for ‖w‖ < R_log: B = F/prod (off zeros) — but at zeros use continuity... Bound via maximum modulus on the circle ‖w‖ = r' for r' slightly less than R_log? Since B analytic on closedBall(0, R_log), max on closedBall = max on boundary sphere ‖w‖ = R_log. On ‖w‖ = R_log: ‖B w‖ = ‖F w‖/∏‖w−ρ‖^m ≤ ‖F w‖·(δ_w/2)^{−M} (each ‖w−ρ‖ ≥ ‖w‖ − ‖ρ‖ ≥ R_log − (r_c − δ_w) = δ_w/2 + δ_w = 3δ_w/2... wait: ‖ρ‖ ≤ r_c − δ_w, ‖w‖ = R_log = r_c + δ_w/2 ⟹ ‖w−ρ‖ ≥ R_log − (r_c − δ_w) = 3δ_w/2.) And ‖F w‖ ≤ (9/4)|t|² (Jensen hB from ii′-5c: bound holds for ‖w‖ ≤ 99/100; R_log ≤ 0.97 ≤ 0.99 ✓).\n - So log‖B w‖ ≤ log((9/4)|t|²) + M·log(2/(3δ_w)) where M = Σ mult ≤ Jensen count ≤ log((9/4)|t|²)/log(33/32).\n - log‖B 0‖: B 0 = Cf r_c F 0 = F 0/∏(0−ρ)^m = 1/∏(−ρ)^m. ‖B 0‖ = 1/∏‖ρ‖^m ≥ 1 (since ‖ρ‖ ≤ r_c < 1... ∏‖ρ‖^m ≤ r_c^M ≤ 1) so −log‖B 0‖ ≤ 0... wait Re J_B = log‖B w‖ − log‖B 0‖, and log‖B 0‖ = −Σm log‖ρ‖ ≥ 0 since ‖ρ‖ < 1... hmm log‖ρ‖ < 0 so −Σm·log‖ρ‖ > 0, so log‖B 0‖ = +Σm·(−log‖ρ‖) ≥ 0. So Re J_B(w) ≤ log‖B w‖ ≤ the bound. Fine — I just need an upper bound on Re J_B. \n \n Hmm wait, actually the maximum modulus principle for ‖B‖ on closedBall(0, R_log): `AnalyticOn.norm_le_of_norm_le_on_sphere` (used in DiskBound). B analytic on closedBall(0, R_log) needs R_log < 1 for CfAnalytic ✓ (0.97 < 1). \n\n So M_bound := log((9/4)|t|²) + M·log(2/(3δ_w)) and Re J_B ≤ M_bound on ball(0, R_log). Note log(2/(3δ_w)) = log(2·50(k+1)/3) = log(100(k+1)/3) — grows like log k ~ log log |t|. And M ≤ log((9/4)|t|²)/log(33/32) ~ 2·log|t|/0.0308 ≈ 65·log|t|. So M_bound ≈ log((9/4)|t|²)·[1 + log(100(k+1)/3)/log(33/32)] ~ (log|t|)·(log log|t|)-ish... times BC factor 459... The final bound is C·(log|t|)·loglog|t|?? Hmm, that's worse than (log|t|)²? No wait: M·log(1/δ_w) where M ~ 65 log|t| (for large t; actually log((9/4)t²)/log(33/32)) and log(1/δ_w) = log(50(k+1)) with k ≤ M. So M_bound ~ 65·log|t| + 65·log|t|·log(50·65·log|t|)... = O(log|t| · log log|t| · ...) hmm, M·log(1/δ) = 65 log|t| · (log(50(k+1))) and k+1 ≤ M+1 ~ 65 log|t| + 1, so log(50(k+1)) ~ log(3250 log|t|) = log 3250 + log log |t|. So M_bound ~ 65·log|t|·(8.1 + log log|t|) + ... — this is O(log|t|·loglog|t|), which is o((log|t|)²). \n\n So the final loose bound C·(log|t|)² works with room to spare. For the Lean statement I should pick something clean and provable. Options: state with an explicit constant like ‖R(s)‖ ≤ 1000·(log|t|)² for |t| ≥ 10? Need to verify the chain delivers that with all the factors. Or state it as ≤ C·(log|t|)² with C explicit-but-huge. Since it's purely existential growth input for 5e, a cleaner formulation might be:\n\n ‖logDeriv ζ s − Σ_{ρ ∈ nearZeros t} zeroMult ρ/(s−ρ)‖ ≤ C·(Real.log |t|)^2 for |t| ≥ 10, σ∈[1/2,7/2], with C := some explicit number (like 10^6) that the proof delivers.\n\n Actually — for ii′-5e what do we actually need? |F| = o(R) on γ-gap circles where F = ζ′/ζ − (series + elementary terms). On a big circle of radius R (in the γ-gap), |ζ′/ζ(s)| ≤ C(log R)²-ish for s on the circle (via 5c on right + 5d on left — reflection). The series terms on the circle are O((log R)²). So F = O((log R)²) = o(R). Any explicit C works. So the cleanest: state the loose bound as an EXISTENTIAL: ∃ C > 0, ∀ t, |t| ≥ 10, ∀ σ ∈ [1/2, 7/2]... ‖...‖ ≤ C·(log|t|)². That avoids me having to track constants carefully!\n\n Hmm, but honest mathematics: an existential with an uncomputated constant is fine as a growth input. But wait — D-067 §6 says \"constants deliberately loose\". An existential constant theorem `∃ C, ...` is cleaner and truly loose. But it does weaken auditability slightly. Let me think… For the formalization effort, tracking an explicit C through max-modulus + BC + Jensen is doable but adds ~30% work and risk. The two-stage plan only needs existence. D-067's revised ii′-5c says \"the LOOSE disc R-bound (any A < ∞)\". So `∃ C : ℝ, 0 < C ∧ ∀ ...` is explicitly sanctioned by the design.\n\n Hmm, but hold on — there's a subtlety: the sum in the target is over nearZeros t = zeros with |γ − t| < 1 (im-window), but the disc collects zeros with |ρ − s₀| ≤ R_c (which includes zeros with |γ−t| up to R_c ≈ 2.4 and β ∈ [−1/2... wait β ∈ (0,1) since nontrivial; |ρ−s₀| ≤ 2.4 with s₀ = 2+it means γ−t ∈ [−2.4, 2.4]). The deriv J_B = B′/B = F′/F − Σ_{collected} mₖ/(w−ρ_wₖ). Translating back: logDeriv ζ s = (2/5)·(F′/F)(w) where s = s₀+(5/2)w... let me redo: F(w) = ζ(s₀+(5/2)w)/ζ(s₀), F′(w) = (5/2)ζ′(s₀+(5/2)w)/ζ(s₀), so F′/F = (5/2)·ζ′/ζ(s₀+(5/2)w) = (5/2) logDeriv ζ s. And B = F/∏(w−ρ_w)^m ⟹ B′/B = F′/F − Σ m/(w−ρ_w). So (5/2)·logDeriv ζ s = (B′/B)(w) + Σ m/(w−ρ_w) = (B′/B)(w) + Σ (5/2)·m/(s−ρ). So logDeriv ζ s − Σ_{collected} m/(s−ρ) = (2/5)(B′/B)(w). Then:\n R(s) = logDeriv ζ s − Σ_{near} m/(s−ρ) = (2/5)(B′/B)(w) + Σ_{collected, not near} m/(s−ρ).\n The collected-not-near zeros: |γ−t| ≥ 1 ⟹ |s−ρ| ≥ 1, so each term ≤ m, and total ≤ Σ m ≤ M ≤ Jensen. So ‖R(s)‖ ≤ (2/5)·‖B′/B‖(w) + M ≤ (2/5)·16·M_bound·R_log²/(R_log−0.6)³ + M. \n\n With R_log − 0.6 ≥ 0.92 − 0.6 = 0.32 (r_c ≥ 0.92), R_log ≤ 0.97: factor 16·0.97²/0.32³ ≈ 16·0.9409/0.032768 ≈ 459. So ‖R‖ ≤ (2/5)·459·M_bound + M ≤ 184·M_bound + M.\n\n M_bound = log((9/4)|t|²) + M·log(2/(3δ_w)) where δ_w = δ/(5/2) = (2/5)·(1/(20(k+1))) = 1/(50(k+1)), so 2/(3δ_w) = 100(k+1)/3. With k ≤ M ≤ log((9/4)|t|²)/log(33/32):\n\n For |t| ≥ 10: log((9/4)|t|²) = 2log|t| + log(9/4) ≤ 2log|t| + 0.811. And log(33/32) = log(1.03125) ≈ 0.03077. So M ≤ (2log|t|+0.811)/0.03077 ≈ 65·log|t| + 26.4. k+1 ≤ M+1. log(100(k+1)/3) ≤ log(100(M+1)/3). \n\n M_bound ≤ L₁ + M·log(100(M+1)/3) where L₁ = 2log|t|+0.811.\n\n For |t| ≥ 10, log|t| ≥ 2.303. M ≤ 65L+26.4 where L = log|t|. log(100(M+1)/3) ≤ log(100(65L+27.4)/3) ≤ log(2167L + 913). For L ≥ 2.303: 2167L+913 ≤ 2167L + 396L... hmm 913/2.303 ≈ 396, so ≤ 2563L... that gives log ≤ log 2563 + log L = 7.85 + log L. So M·log(...) ≤ (65L+26.4)(7.85+log L). With log L ≤ L/e... log L ≤ L − 1 (for L ≥ 1... log L ≤ L−1 yes). So ≤ (65L+26.4)(L+6.85) = 65L² + 445L + 26.4L + 181 ≈ 65L² + 471L + 181. For L ≥ 2.303: 471L ≤ 205L², 181 ≤ 34L² ⟹ ≤ 304L². So M_bound ≤ L₁ + 304L² ≤ (L+0.811... ≤ 0.35L² + ...) let's say M_bound ≤ 305L² for L ≥ 2.303 (very loose). Then ‖R‖ ≤ 184·305L² + (65L+26.4) ≤ 56120L² + 65L + 26.4 ≤ 56120L² + 34L² ≤ 56154L². So C = 60000, say. These are silly-loose constants — fine for the growth input, and I can actually prove them in Lean with enough linarith/nlinarith slack. \n\n Hmm, but actually proving such a chain in Lean requires many steps of real-inequality grunt work (log monotonicity, etc.). The existential formulation `∃ C : ℝ, ∀ ...` lets me... no, it doesn't help — I still need to prove the chain for SOME explicit C internally. OK whatever, it's mechanical.\n\n Actually wait. Let me reconsider: do I even need the max-modulus detour for Re J_B? LogOfAnalyticFunction gives Re J_B(w) = log‖B w‖ − log‖B 0‖ directly on ball(0, R_log). And ‖B w‖ for w ∈ ball(0, R_log): B is continuous on the compact closedBall(0, R_log)... but I need an explicit bound. Max-modulus on sphere: AnalyticOn.norm_le_of_norm_le_on_sphere — B analytic on closedBall(0, R_log) (needs AnalyticOn on the ball + the sphere bound; DiskBound used exactly this). On the sphere ‖w‖ = R_log, no zeros (gap), so B = F/prod there pointwise, giving the norm bound. So:\n\n ∀ w ∈ closedBall(0, R_log): ‖B w‖ ≤ (9/4)|t|²·(3δ_w/2)^{−M} where the exponent M is... careful: ∏‖w−ρ‖^{m_ρ} ≥ (3δ_w/2)^{Σm} requires each factor ‖w−ρ‖ ≥ 3δ_w/2 — yes on the sphere. And Σm over the collected finset = the Jensen-counted sum. So ‖B w‖ ≤ (9/4)|t|²·(3δ_w/2)^{−M_J} where M_J := the actual sum (bounded by the Jensen RHS). To avoid real-power headaches, keep it as `(3*δ_w/2)^(-(M_J : ℤ))`? or just rpow... Better: `(2/(3δ_w))^(M_J)` with M_J : ℕ cast — natural power of a positive real, fine.\n\n Then log‖B w‖ ≤ log((9/4)|t|²) + M_J·log(2/(3δ_w)) via Real.log_le_log, log_mul, log_pow (Nat cast). And Re J_B(w) = log‖B w‖ − log‖B 0‖ ≤ log‖B w‖ + |log‖B 0‖|... need −log‖B 0‖ bounded. B 0 = 1/∏(−ρ)^m. log‖B 0‖ = −Σm log‖ρ‖. ‖ρ‖ ≤ r_c − δ_w < 1 so log‖ρ‖ < 0, so log‖B 0‖ > 0, so Re J_B ≤ log‖B w‖ directly. Need log‖B 0‖ ≥ 0: = −Σ m_ρ log‖ρ‖ ≥ 0 since each log‖ρ‖ ≤ log(r_c−δ_w) < 0... need ‖ρ‖ ≤ r_c − δ_w for collected zeros: from the gap, collected zeros (‖ρ_w‖ ≤ r_c) actually satisfy ‖ρ_w‖ ≤ r_c − δ_w. Wait — the gap is on DISTANCES: |d − R_c| ≥ δ for all zero-distances d in B(s₀,5/2). Collected zeros: d ≤ R_c ⟹ d ≤ R_c − δ. In scaled: ‖ρ_w‖ ≤ r_c − δ_w. ✓.\n\n Hmm wait, one more check — the zeros of F in the unit ball are EXACTLY the scaled zeros of ζ in B(s₀, 5/2) (F zero ⟺ ζ(aff w) zero since ζ(s₀) ≠ 0). And zeroDiscFinset = zeros in closedBall(s₀, 5/2). The distance finset S := (zeroDiscFinset t).image (fun ρ => ‖ρ − discCenter t‖). exists_avoiding_midpoint needs S : Finset ℝ — ✓.\n\n But careful: SetOfZeros r_c F uses ‖ρ_w‖ ≤ r_c where ρ_w is the SCALED zero (w-coordinate). The affine map w ↦ s₀+(5/2)w: ζ-zero ρ ↔ F-zero w = (ρ−s₀)/(5/2), ‖w‖ = ‖ρ−s₀‖/(5/2). The collected set {‖w‖ ≤ r_c} = {‖ρ−s₀‖ ≤ (5/2)r_c = R_c}. ✓. And multiplicities match by analyticOrderNatAt_scaledZeta. ✓ (needed for the deriv-J_B translation: deriv of the product uses m_ρ = analyticOrderNatAt F at the scaled zero = zeroMult at the ζ-zero — actually zeroMult ρ := analyticOrderNatAt riemannZeta ρ? Let me check LiSides/LiSkeleton for zeroMult def. In LiSides: zeroMult ρ — I recall `zeroMult` is defined in LiSkeleton or LiSides as analyticOrderNatAt riemannZeta ρ. Let me check.)\n\nAlso `logDeriv` — Mathlib's logDeriv f = deriv f / f. The final statement uses logDeriv riemannZeta s. And deriv B/B... For the translation (2/5)(B′/B)(w) = logDeriv ζ s − Σ m/(s−ρ), I need:\n- deriv F w = (5/2)·(deriv ζ)(s₀+(5/2)w)/ζ(s₀): deriv of comp with affine — deriv_congr / deriv.scomp / HasDerivAt. Since everything is analytic, deriv (F) w = deriv (ζ ∘ aff) w /ζ(s₀) = (deriv ζ (aff w))·(5/2)/ζ(s₀) via deriv.comp (needs differentiableAt). \n- B = F/P where P(w) = ∏(w−ρ)^{m_ρ} (off the zero set; but as FUNCTIONS B = Cf — the identity B w = F w/P w holds only for w ∉ zero set. For the deriv identity I need it in a NEIGHBORHOOD of the evaluation point w. The evaluation points w (for s in the application region) have ζ(s) ≠ 0 (hypothesis) so w is not a zero, and there's a neighborhood avoiding the finite zero set where B = F/P as functions. Good: deriv B w = (F′P − FP′)/P² at w, and B′/B = F′/F − P′/P with P′/P = Σ m_ρ/(w−ρ) (logDeriv of a product of powers — need deriv of ∏(w−ρ)^{m_ρ}: deriv_prod + deriv_pow... `HasDerivAt.prod`? There's `deriv_prod` in Mathlib? There's `HasDerivAt.sum`/... For finite products: `HasDerivAt.list_prod`? I recall `deriv_prod` exists for Finset: `HasDerivAt.prod`? Hmm — in LiResidue/LiSides we did logDeriv-NF residues; there may be existing product logDeriv machinery. In Mathlib: `logDeriv_prod`? Let me check later: there's `HasStrictDerivAt.list_prod'`... I'll search at build time. Worst case: induction on the finset with deriv_mul.\n\nLet me now also confirm the application region maps into closedBall(0, 0.6): s = σ+it with σ ∈ [1/2, 7/2]: w = (s−s₀)/(5/2) = (2/5)(σ−2), so ‖w‖ = (2/5)|σ−2| ≤ (2/5)(3/2) = 0.6 ✓ (|σ−2| ≤ 3/2 for σ∈[1/2,7/2] ✓). \n\nAnd nearZeros t: I need it as a Finset ℂ with membership ⟺ IsNontrivialZero ρ ∧ |ρ.im − t| < 1. From ii′-4: zeroWindow a = {IsNontrivialZero ∧ a ≤ im ≤ a+1} finite. nearZeros t = zeroWindow-ish with open bounds. Finiteness: subset of zerosIn_finite (t−2)(t+1) or use zeroDiscFinset filtered: nearZeros t ⊆ zeroDiscFinset? |γ−t| < 1, β ∈ (0,1): ‖ρ−s₀‖ = √( (β−2)² + (γ−t)² ) ≤ √(4+1) = √5 ≈ 2.236 < 2.5 ✓. So nearZeros t ⊆ zeroDiscFinset t — finiteness free. Define nearZeros t := (zeroDiscFinset t).filter (fun ρ => |ρ.im − t| < 1). zeroDisc_isNontrivial gives IsNontrivialZero for members. ✓\n\nThe \"extras\" bound: collected (in the disc R_c) but not near: |γ−t| ≥ 1... wait the collected zeros in the sum from deriv J_B are zeros with ‖ρ−s₀‖ ≤ R_c, i.e. the scaled-zero finset. The final sum is over nearZeros. extras = collected ∖ near: for those, |γₖ−t| ≥ 1 hmm — careful: \"not near\" means |ρ.im − t| ≥ 1, and ‖s−ρ‖ ≥ |im s − im ρ| = |t − γ| ≥ 1 ✓. So each extra term ‖m/(s−ρ)‖ ≤ m, sum ≤ Σ_{collected} m = M_J ≤ Jensen RHS. ✓\n\nBut there's a subtlety: the collected finset in the scaled picture is `(finiteSetOfZeros_mono (r := r_c) ...).toFinset` — a finset of w-points. The final statement wants a sum over nearZeros t (ζ-zeros). So I need to push the sum over scaled zeros through the affine bijection w ↦ s₀+(5/2)w to a sum over ζ-zeros in closedBall(s₀, R_c), with m matching (analyticOrderNatAt_scaledZeta ✓). Finset.sum_image with InjOn (the affine map is injective globally). Let me define collectedZeros t R_c := (zeroDiscFinset t).filter (‖· − s₀‖ ≤ R_c)... and establish a bijection with the scaled finset. \n\nActually — alternative cleaner approach: maybe avoid Cf and the scaled picture for g, and instead directly build g on the s-side? The Cf machinery is heavily unit-disc-oriented (SetOfZeros r f requires ‖ρ‖ ≤ r ≤ R < 1, analytic on closedBall(0,1)). The scaled picture fits it perfectly and ii′-5c already built scaledZeta + its Jensen count + multiplicity invariance precisely for this. Stick with the plan: work in w, translate at the end.\n\nNow the structure of the remaining work in LiDisc.lean:\n\n§5 R-gap selection:\n```lean\ntheorem exists_disc_radius_gap {t : ℝ} (ht : 10 ≤ |t|) :\n ∃ R_c : ℝ, 2.3 ≤ R_c ∧ R_c ≤ 2.4 ∧\n ∀ ρ ∈ zeroDiscFinset t, 1/(20*((zeroDiscFinset t).card + 1)) ≤ |‖ρ − discCenter t‖ − R_c|\n```\nvia exists_avoiding_midpoint scaled. But exists_avoiding_midpoint is stated for window [a, a+1] (length 1) with clearance 1/(2(k+1)). I need length ℓ = 1/10. Options: (a) prove a generalized ℓ-version (copy-paste the proof with w := ℓ/(2(k+1))) — STATE.md explicitly suggests \"add an ℓ-parameterized variant — reuse ii′-4's proof\". (b) rescale S by 10: apply the length-1 lemma to S' = {10x} in window [23, 24]: get T' with |10x − T'| ≥ 1/(2(k+1)), then R_c = T'/10 ∈ [2.3, 2.4], |x − R_c| ≥ 1/(20(k+1)). Option (b) reuses the EXISTING lemma with zero new pigeonhole code — just image under (10·). Much cheaper! \n\nk := (zeroDiscFinset t).card; S := (zeroDiscFinset t).image (fun ρ => ‖ρ − discCenter t‖); S.card ≤ k via card_image_le. S10 := S.image (· * 10)... or image (fun x => x * 10) — need InjOn for card: mul_right_injective₀. Then apply exists_avoiding_midpoint (a := 23) (S := S10) with card ≤ k. Get T' ∈ [23,24] with clearance. R_c := T'/10. |x − R_c| = |10x − T'|/10 ≥ 1/(20(k+1)). ✓\n\n§6 g nonvanishing etc. Define in scaled coords:\n- r_c := R_c/(5/2) = R_c·(2/5) ∈ [0.92, 0.96].\n- δ := 1/(20(k+1)), δ_w := (2/5)·δ = 1/(50(k+1)).\n- R_log := r_c + δ_w/2.\n- Scaled zero finset: ZW := (finiteSetOfZeros_mono (r := r_c) (f := scaledZeta t) h_lt scaledZeta_zeros_finite).toFinset. Note: finiteSetOfZeros_mono needs r_c < 1 ✓. Wait — but the Jensen count was stated for r = 24/25 = 0.96 and the collection uses r_c ≤ 0.96. Hmm: finiteSetOfZeros_mono with r = r_c gives the finset for radius r_c; the mult-weighted sum over it ≤ sum over the 0.96-finset (monotone: r_c ≤ 0.96 ⟹ SetOfZeros r_c ⊆ SetOfZeros 0.96... need r_c ≤ 24/25: r_c ≤ 0.96 = 24/25 ✓; and both toFinsets: sum over subset ≤ sum since terms nonnegative (analyticOrderNatAt ≥ 0 ✓). And by scaledZeta_jensen_count the 0.96-sum ≤ log((9/4)|t|²)/log(33/32). So M_c := Σ_{ρ ∈ ZW} analyticOrderNatAt (scaledZeta t) ρ ≤ Jensen bound. ✓ (Need the monotonicity lemma: SetOfZeros r ⊆ SetOfZeros r' for r ≤ r' — easy; and Set.Finite.toFinset subset for the sum — Finset.sum_le_sum_of_subset_of_nonneg.)\n\n- B := Cf r_c (scaledZeta t).\n- B analytic on closedBall(0, R_log): CfAnalytic (r_lt_R : r_c < R_log) (R_log < 1) scaledZeta_analytic (F 0 ≠ 0). ✓\n- B nonvanishing on closedBall(0, R_log): as argued. This is a real lemma to prove:\n For w with ‖w‖ ≤ R_log: by_cases F w = 0.\n - If F w = 0: then w ∈ SetOfZeros 1 F... ‖w‖ ≤ R_log ≤ 0.97 < 1 ✓ so w ∈ zeroDisc... the corresponding ζ-zero ρ = s₀+(5/2)w ∈ closedBall(s₀, 5/2·0.97) ⊂ closedBall(s₀, 5/2) hmm need (5/2)‖w‖ ≤ (5/2)R_log < 5/2 ✓. So ρ ∈ zeroDiscFinset, its distance d = ‖ρ−s₀‖ = (5/2)‖w‖ ∈ S, gap: |d − R_c| ≥ δ. If d ≥ R_c: d ≥ R_c + δ ⟹ ‖w‖ ≥ r_c + δ_w > R_log, contradiction. So d ≤ R_c − δ, ‖w‖ ≤ r_c − δ_w < r_c, so w ∈ SetOfZeros r_c F, i.e. w ∈ ZW (via mem_toFinset). Then Cf w = ZeroFactor F w / ∏_{ρ ∈ ZW\\{w}} (w−ρ)^m. ZeroFactorization (needs R < 1 version: hρ ∈ SetOfZeros R F with R := r_c < 1 ✓): ZeroFactor F w = h_w w ≠ 0. Product: each (w−ρ) ≠ 0 since ρ ∈ ZW \\ {w} means ρ ≠ w. So B w ≠ 0.\n - If F w ≠ 0: Cf w = F w / ∏_{ρ ∈ ZW} (w−ρ)^m. Each factor: ρ ∈ ZW ⟹ ‖ρ‖ ≤ r_c and F ρ = 0; if w = ρ then F w = 0 contradiction; so w ≠ ρ, factor ≠ 0. Product ≠ 0. So B w = F w/prod ≠ 0.\n Wait — the Cf definition: `if z ∈ SetOfZeros r f then ZeroFactor f z / ∏ over (toFinset \\ {z}) else f z / ∏ over toFinset`. The membership condition `z ∈ SetOfZeros r f` is by `if` with Classical decidability. At w with F w = 0 and ‖w‖ ≤ r_c: dif_pos. At w with F w ≠ 0: dif_neg (need w ∉ SetOfZeros: F w ≠ 0 ⟹ not member ✓).\n \n Also note: Cf requires `if finite_zeros_mono : (SetOfZeros r f).Finite` — dif_pos with our finiteness proof. When unfolding Cf I'll need to handle the dite with the right instance. The Zeta23 proofs do `unfold Cf; by_cases ...; simp only [finite_zeros_mono, ↓reduceDite]`. I'll mirror that. Note: our finiteness proof `scaledZeta_zeros_finite` is for SetOfZeros 1; finiteSetOfZeros_mono gives SetOfZeros r_c finite. The `if` in Cf uses a Classical instance so any proof works (proof irrelevance).\n\n§7 bounds:\n- hB0: B 0 = 1/∏(−ρ)^m, and log‖B 0‖ ≥ 0. Actually compute: Cf 0: 0 ∈ SetOfZeros r_c F? F 0 = 1 ≠ 0 so no. So B 0 = F 0/∏(0−ρ)^m = 1/∏(−ρ)^m. ‖B 0‖ = 1/∏‖ρ‖^m. Each ‖ρ‖ ≤ r_c − δ_w < 1 ⟹ log‖ρ‖ < 0 ⟹ log‖B 0‖ = −Σ m log‖ρ‖ > 0. Need: ρ ∈ ZW ⟹ ‖ρ‖ ≤ r_c − δ_w — wait, ZW = SetOfZeros r_c F, members have ‖ρ‖ ≤ r_c; the gap argument (as in §6) upgrades to ‖ρ‖ ≤ r_c − δ_w. Hmm, but the gap argument needs the corresponding ζ-zero in zeroDiscFinset — ρ ∈ ZW ⟹ F ρ = 0 ⟹ (scaledZeta_zeros_finite's hsub) ρ ∈ affine preimage of (closedBall(s₀,5/2) ∩ zeros) — I proved that subset relation already in scaledZeta_zeros_finite (hsub). Extract: ζ(s₀+(5/2)ρ) = 0 and ‖(5/2)ρ‖ ≤ 5/2 ⟹ s₀+(5/2)ρ ∈ zeroDiscFinset, distance (5/2)‖ρ‖ ∈ S, gap applies. But wait the gap argument requires |d − R_c| ≥ δ, and we know d ≤ R_c (since ‖ρ‖ ≤ r_c ⟹ d ≤ (5/2)r_c = R_c) ⟹ d ≤ R_c − δ. ✓ So a lemma: ∀ ρ ∈ ZW, ‖ρ‖ ≤ r_c − δ_w. \n\n Hmm wait — actually I realize the gap applies to ALL members of zeroDiscFinset, including zeros at distance in (R_c, 2.5]; those have d ≥ R_c + δ. Fine.\n\n- hBsphere: ∀ w, ‖w‖ = R_log ⟹ ‖B w‖ ≤ (9/4)*|t|² * (2/(3δ_w))^M_c... let me recompute: ‖w−ρ‖ ≥ ‖w‖ − ‖ρ‖ ≥ R_log − (r_c − δ_w) = δ_w/2 + δ_w = 3δ_w/2. So ∏‖w−ρ‖^m ≥ (3δ_w/2)^{M_c} where M_c = Σ m. So ‖B w‖ = ‖F w‖/∏ ≤ (9/4)|t|²·(2/(3δ_w))^{M_c}. Need F w ≠ 0 on the sphere for the Cf = F/prod branch: sphere ‖w‖ = R_log, if F w = 0 then w ∈ ZW (by gap, ‖w‖ ≤ r_c − δ_w < R_log) contradiction with ‖w‖ = R_log. ✓ so the else-branch applies. And ‖F w‖ ≤ (9/4)|t|² needs ‖w‖ ≤ 99/100: R_log ≤ 0.96 + δ_w/2; δ_w = 1/(50(k+1)) ≤ 1/50 ⟹ R_log ≤ 0.96 + 0.01 = 0.97 ≤ 0.99 ✓.\n\n- hBball: ∀ w ∈ closedBall(0, R_log), ‖B w‖ ≤ that bound — via AnalyticOn.norm_le_of_norm_le_on_sphere (B analytic on closedBall(0, R_log) from CfAnalytic with R := R_log... wait CfAnalytic gives AnalyticOnNhd on closedBall(0, R) for R < 1 with r_c < R. Take R = R_log ✓ (R_log < 0.97 < 1). AnalyticOnNhd ⟹ AnalyticOn on the closed ball? norm_le_of_norm_le_on_sphere signature (from DiskBound usage): `AnalyticOn.norm_le_of_norm_le_on_sphere (le_refl R) (AnalyticOnNhd.analyticOn ...) (sphere bound) (hz ∈ closedBall)`. ✓.\n\n§8 J_B and BC:\n- obtain ⟨J_B, hJ_an, hJ0, hJderiv, hJre⟩ := LogOfAnalyticFunction (r := 3/5) (R := R_log) ... — r = 0.6 = 3/5 < R_log (R_log ≥ r_c = 0.92 > 0.6 ✓). B nonvanishing on closedBall(0, R_log) from §6. Note LogOfAnalyticFunction needs nonvanishing on closedBall(0, R) = closedBall(0, R_log) ✓ and analytic on closedBall(0, R_log) ✓.\n- Re J_B bound: ∀ w ∈ ball(0, R_log), (J_B w).re ≤ M_bound where M_bound := Real.log ((9/4)*|t|²) + M_c * Real.log (2/(3δ_w)). From hJre: (J_B w).re = log‖B w‖ − log‖B 0‖ ≤ log‖B w‖ (since log‖B 0‖ ≥ 0) ≤ M_bound via hBball (ball ⊆ closedBall) + Real.log_le_log (need ‖B w‖ > 0: B w ≠ 0 ✓) + log_mul + log_pow... (9/4)|t|² > 0 ✓, (2/(3δ_w)) > 0 ✓. log((9/4)|t|² · X) = log((9/4)|t|²) + log X needs both pos ✓.\n- M_bound > 0: log((9/4)|t|²) ≥ log((9/4)·100) = log 225 > 0 ✓, second term ≥ 0 (M_c ≥ 0, log(2/(3δ_w)) ≥ log(2·50/3) > 0 ✓). Actually need Mpos : 0 < M for BC — ✓.\n- BC: for w ∈ closedBall(0, 3/5): ‖deriv J_B w‖ ≤ 16·M_bound·R_log²/(R_log − 3/5)³. R_log − 3/5 ≥ r_c − 3/5 ≥ 0.92 − 0.6 = 0.32. R_log ≤ 0.97. So the factor ≤ 16·0.97²/(0.32)³ — but in the proof keep symbolic then bound at the end.\n\n§9 deriv identity + translation:\n- At w with F w ≠ 0 (i.e. ζ(s) ≠ 0 for s = aff w): deriv B w / B w = deriv F w / F w − Σ_{ρ∈ZW} m_ρ/(w−ρ).\n Need: B =ᶠ[𝓝 w] F/P where P = ∏(·−ρ)^m — from Cf's else-branch on the open set {F ≠ 0} ∩ ... Actually simpler: B and F/P are both analytic on a punctured neighborhood... no — get EventuallyEq: on the complement of ZW (finite, closed), if F w ≠ 0 then in a neighborhood: F z ≠ 0 (continuity) and z ∉ ZW (ZW finite ⟹ closed... ZW is a finset so its carrier is closed; w ∉ carrier ⟹ neighborhood avoiding it). On that neighborhood Cf z = F z/P z by the else-branch. So B =ᶠ[𝓝 w] F/P. Then deriv B w = deriv (F/P) w (deriv_congr of EventuallyEq — `Filter.EventuallyEq.deriv` ✓ exists). And B w = F w/P w directly. So deriv B w/B w = (F/P)′(w)/(F/P)(w) = logDeriv (F/P) w = logDeriv F w − logDeriv P w (Mathlib: logDeriv_div — needs F w ≠ 0, P w ≠ 0, differentiableAts ✓). logDeriv P w = Σ m_ρ/(w−ρ): P = ∏(·−ρ)^{m_ρ}, logDeriv of product — Mathlib has `logDeriv_prod`? Let me think... there's `logDeriv_fun_mul`, `logDeriv_fun_div`, `logDeriv_fun_pow`? I believe Mathlib has `logDeriv_mul`, `logDeriv_pow`... In recent Mathlib: `logDeriv_fun_pow : logDeriv (f ^ n) x = n * logDeriv f x`? and `logDeriv_prod`? Let me search at build time. Worst case induction.\n \n Also deriv J_B w = deriv B w / B w (from hJderiv, needs w ∈ closedBall(0, 3/5) ✓ for application region).\n And logDeriv F w = (5/2)·logDeriv ζ (aff w): F = (ζ ∘ aff)·(1/ζ(s₀)) — logDeriv (c·g) = logDeriv g (logDeriv_const_mul, c ≠ 0); logDeriv (ζ ∘ aff) w: logDeriv_comp? deriv (ζ∘aff) w = deriv ζ (aff w) · deriv aff w = deriv ζ (aff w)·(5/2) (deriv.comp w (differentiableAt ζ) (affine)). So logDeriv F w = (5/2)·deriv ζ(aff w)/ζ(aff w) = (5/2)·logDeriv ζ s. There should be a `logDeriv_comp` lemma... or do it manually with deriv.comp.\n\n§10 assemble the R-bound:\nFor s with σ ∈ [1/2, 7/2], |t| ≥ 10, ζ s ≠ 0: w := (s − s₀)·(2/5), ‖w‖ = (2/5)|σ−2| ≤ 3/5 ✓. Then:\nlogDeriv ζ s = (2/5)·logDeriv F w = (2/5)·[deriv J_B w + Σ m_ρ/(w−ρ)].\n‖logDeriv ζ s − Σ_{nearZeros} m/(s−ρ)‖ = ‖(2/5)deriv J_B w + (2/5)Σ_{ZW} m_ρ/(w−ρ) − Σ_{near} m/(s−ρ)‖.\nNow (2/5)·m_ρ/(w−ρ) = m/(s−ρ_s) where ρ_s = s₀+(5/2)ρ (check: w−ρ = (2/5)(s−ρ_s) since w = (2/5)(s−s₀) and ρ_s = s₀+(5/2)ρ ⟹ s−ρ_s = (5/2)(w−ρ) ✓). So (2/5)Σ_{ZW} m/(w−ρ) = Σ_{ZW} m/(s−ρ_s) = Σ_{collected_s} m/(s−ρ) via the affine bijection (Finset.sum_image, inj). collected_s = ZW.image aff = zeros in closedBall(s₀, R_c) — I should prove collected_s = (zeroDiscFinset t).filter (‖·−s₀‖ ≤ R_c) or just work with the image directly. Then split collected_s into nearZeros and extras (Finset.sum_sdiff / sum over union): Σ_collected = Σ_near + Σ_extra (need nearZeros ⊆ collected_s: |γ−t| < 1 ⟹ ‖ρ−s₀‖ ≤ √5 ≤ 2.3 ≤ R_c ✓ — √5 ≤ 2.3: 5 ≤ 5.29 ✓, needs ‖ρ−s₀‖ computation: ‖ρ−s₀‖² = (β−2)² + (γ−t)² with β ∈ (0,1) ⟹ (β−2)² ≤ 4 (|β−2| ≤ 2 hmm β ∈ (0,1) ⟹ β−2 ∈ (−2,−1) ⟹ (β−2)² ≤ 4) and (γ−t)² ≤ 1 ⟹ ‖·‖² ≤ 5 ⟹ ‖·‖ ≤ √5. Need IsNontrivialZero for β ∈ (0,1) — nearZeros members are in zeroDiscFinset ⟹ zeroDisc_isNontrivial ✓.)\n\nSo ‖R(s)‖ ≤ (2/5)‖deriv J_B w‖ + Σ_extra m/(s−ρ) ≤ (2/5)·16·M_bound·R_log²/(R_log−3/5)³ + M_c (each extra term ≤ m since ‖s−ρ‖ ≥ |t−γ| ≥ 1, and Σ_extra m ≤ Σ_collected m = M_c).\n\nThen the final numeric chain: show (2/5)·16·R_log²/(R_log−3/5)³·M_bound + M_c ≤ C·(log|t|)² for an explicit C with |t| ≥ 10.\n\nGiven M_bound ≤ ~305L² (L = log|t|) from my scratch estimate and the BC factor ≤ (2/5)·16·0.97²/0.32³ ≈ 183.6 ≤ 184, and M_c ≤ 65L + 27 ≤ 305L²-ish... total ≤ 184·305L² + small = 56120L² → C := 60000. In Lean, proving M_bound ≤ 305·(log|t|)² requires careful real-number estimates. Let me redo this more carefully to have a clean certifiable chain.\n\nLet L := Real.log |t|, so L ≥ log 10 > 2.302. Facts needed:\n- log((9/4)|t|²) = 2L + log(9/4). log(9/4) = 2log(3/2) ≤ 2·(1/2)·... cleanest: 9/4 ≤ e ⟹ log(9/4) ≤ 1 (since 9/4 = 2.25 < e ≈ 2.718). Is 9/4 ≤ e available? `Real.exp_one_gt_d9` : 2.718281828 < e? There are bounds e > 2.718... so 9/4 < e ✓ via norm_num + that lemma. So log((9/4)|t|²) ≤ 2L + 1.\n- log(33/32) ≥ ? 33/32 = 1.03125. log(1.03125) ≥ 0.03? Use log(1+x) ≥ x/(1+x)... Real.log_le_sub_one_of_pos? The handy ones: `Real.log_le_sub_one_of_pos : 0 < x → log x ≤ x − 1` (upper). Lower: `Real.one_sub_inv_le_log_of_pos`? Hmm: log x ≥ 1 − 1/x (for x > 0)? That's `Real.one_sub_inv_le_log`... something like that exists: log x ≥ (x−1)/x. For x = 33/32: (1/32)/(33/32) = 1/33 ≈ 0.0303. So log(33/32) ≥ 1/33. Then M ≤ (2L+1)·33 = 66L + 33. (matches Jensen: log((9/4)t²)/log(33/32) ≤ 33(2L+1)).\n- k+1 ≤ M_c + 1 ≤ 66L + 34. 100(k+1)/3 ≤ 100(66L+34)/3 = (6600L + 3400)/3 = 2200L + 1133.33 ≤ 2200L + 1134. For L ≥ 2.302: 2200L + 1134 ≤ 2200L + 493L = 2693L. So log(100(k+1)/3) ≤ log 2693 + log L. log 2693 ≤ 8 (e⁸ = 2981 ≥ 2693 ✓ — need e⁸ ≥ 2693: e > 2.718, 2.718⁸ = ? 2.718² = 7.387; ⁴ = 54.57; ⁸ = 2978. Hmm 2978 > 2693 ✓ but proving 2.718⁸ ≥ 2693 in Lean: norm_num with Real.exp_one_gt_d9... messy but doable; alternatively use log 2693 ≤ log e^8 = 8 via Real.log_le_log and a computed bound. Or be lazier: 2693L ≤ L⁴ for L ≥ ... L³ ≥ 2693 ⟺ L ≥ 13.9 — no, L can be 2.3. Alternative: log(2693L) = log 2693 + log L ≤ 8 + log L, and log L ≤ L/e ≤ L − 1? Actually log L ≤ L − 1 only for... log L ≤ L − 1 for all L > 0 ✓ (Real.log_le_sub_one_of_pos: log L ≤ L − 1). So log(2693L) ≤ 7 + L. \n Hmm wait, I need an upper bound on log of stuff; log(2693L) ≤ log 2693 + log L requires 2693 > 0, L > 0 ✓ (Real.log_mul). log 2693 ≤ 8: 2693 ≤ e⁸: since e ≥ 2.718281828 (Real.exp_one_gt_d9 gives 2.7182818283 < e? something like that), e⁸ ≥ 2.718281828⁸. Computing 2.718281828⁸ ≥ 2693 by norm_num: 2.718281828⁸ is a specific rational... norm_num can evaluate (2.718281828 : ℝ)^8 ≈ 2980.96 > 2693 ✓. And e⁸ = (e¹)⁸ via Real.exp_nat_mul or ← Real.exp_one_pow? e⁸ = Real.exp 8 = (Real.exp 1)^8? Real.exp 8 = Real.exp (1*8) = (Real.exp 1)^8 by Real.exp_nat_mul... `Real.exp_nat_mul : exp (n * x) = (exp x)^n`? So exp 8 = exp (8*1) = (exp 1)^8 ≥ 2.718...⁸ ≥ 2693. OK.\n- So log(2/(3δ_w)) = log(100(k+1)/3) ≤ 7 + L (loose). Wait let me double check δ_w: δ = 1/(20(k+1)); δ_w = (2/5)δ = 2/(100(k+1)) = 1/(50(k+1)). 3δ_w/2 = 3/(100(k+1)). 2/(3δ_w) = 200(k+1)/6·... 2/(3/(100(k+1))) = 200(k+1)/3 ≈ 66.67(k+1). Hmm I previously wrote 100(k+1)/3 — recompute: (3δ_w/2) = 3/(100(k+1)); reciprocal times... (2/(3δ_w)) = 2·100(k+1)/3 = 200(k+1)/3. OK so 200(k+1)/3 ≤ 200(66L+34)/3 = (13200L + 6800)/3 = 4400L + 2266.67 ≤ 4400L + 2267 ≤ 4400L + 985L = 5385L (for L ≥ 2.302). log(5385L) = log 5385 + log L ≤ 9 + (L−1) = 8 + L (log 5385 ≤ 9: e⁹ = 8103 ≥ 5385 ✓ via 2.71828⁹ ≈ 8100 — norm_num check).\n- M_bound = log((9/4)|t|²) + M_c·log(2/(3δ_w)) ≤ (2L+1) + (66L+33)(8+L) = 2L+1 + 66L² + 528L + 33L·8... let me expand: (66L+33)(L+8) = 66L² + 528L + 33L + 264 = 66L² + 561L + 264. So M_bound ≤ 66L² + 563L + 265. For L ≥ 2.302: 563L ≤ 244.6L², 265 ≤ 50L² ⟹ M_bound ≤ 361L².\n- BC factor: (2/5)·16·R_log²/(R_log−0.6)³. R_log ≤ 0.97 ⟹ R_log² ≤ 0.9409 ≤ 1. R_log − 0.6 ≥ 0.32 ⟹ (R_log−0.6)³ ≥ 0.032768 ≥ 0.03. So factor ≤ (2/5)·16·1/0.03 = (2/5)·533.33 = 213.34. Hmm: 16/0.032768 = 488.28; times 0.9409 = 459.4; times 2/5 = 183.8. With the looser 0.03: 16/0.03 = 533.3, ×(2/5) = 213.3. To be safe: factor ≤ 214. (In Lean: R_log² ≤ 1 needs R_log ≤ 1 ✓ 0.97; (R_log−3/5)³ ≥ (8/25)³: 0.32 = 8/25 ✓; 16·1/(8/25)³ = 16·15625/512 = 488.28; ·(2/5) = 195.3. Use fractions: R_log ≥ 23/25 (r_c ≥ 2.3·(2/5) = 0.92 = 23/25 ✓), R_log − 3/5 ≥ 23/25 − 15/25 = 8/25 ✓. R_log ≤ 97/100. So BC factor = 16·M·R²/(R−r)³ ≤ 16·M·(97/100)²/(8/25)³ = 16·M·(9409/10000)·(15625/512) = 16·9409·15625/(10000·512)·M = 2352250000/5120000·M ≈ 459.42·M. Times 2/5: ≈ 183.77·M ≤ 184M.)\n- ‖R(s)‖ ≤ 184·M_bound + M_c ≤ 184·361L² + (66L+33) ≤ 66224L² + 66L + 33 ≤ 66224L² + 29L² + ... 66·2.302 ≈ 152; 66L ≤ 28.7L²... so ≤ 66253L² + tiny ≤ 66260L². Take C := 70000. \n\nSo the final theorem: ‖logDeriv ζ s − Σ_{nearZeros t} m/(s−ρ)‖ ≤ 70000·(Real.log|t|)². Hmm wait — (Real.log |t|)^2. Or should I state it with log(|t|+2)? For 5e the circle growth uses |t| up to R+1 on the circle... any form works. Simplest: (Real.log |t|)^2 with |t| ≥ 10. Hmm, but actually for 5d (reflection) and 5e it might be cleaner to have log(|t|+2) ≥ ... whatever — the loose form C·(log|t|)² for |t| ≥ 10 is fine; 5e can convert (log|t| ≤ log(R+1)+1 etc.).\n\nHmm, actually — let me reconsider whether to even keep M_c symbolic vs concrete. The final numeric fold has several irreducibly tedious steps (log(33/32) ≥ 1/33, e⁸ ≥ 2693, etc.). All doable. Total estimate: this is a LOT of Lean code — maybe 600–900 lines for §5–§10. That fits the \"~1 session\" estimate but it's ambitious. Let me be strategic: build in order, compile frequently with `lake env lean NguyenRH1/LiDisc.lean`.\n\nOne design decision to reduce pain: instead of tracking M_c · log(2/(3δ_w)) with δ_w defined from k = card... note 2/(3δ_w) = 200(k+1)/3. And k+1 = card+1 ≤ M_c+1 (since card ≤ Σm = M_c as each m ≥ 1). Wait — do I have card zeroDiscFinset ≤ M_c (the mult sum over the SCALED 0.96-finset)? zeroDiscFinset = zeros in closedBall(s₀, 5/2) — corresponds to scaled zeros in closedBall(0,1) — SetOfZeros 1 F. The Jensen count is over SetOfZeros (24/25) — the zeros with 0.96 < ‖w‖ ≤ 1 are NOT counted by Jensen. Hmm! So k = card(zeroDiscFinset) could exceed M(0.96-sum).\n\nUh oh. The clearance δ must come from a count bound on ALL zeros in the 5/2-disc (since S includes distances of all of them), but Jensen only counts those within 0.96·(5/2) = 2.4. Zeros in the annulus 2.4 < d ≤ 2.5 are not Jensen-counted.\n\nFix options: (a) bound card(zeroDiscFinset) via the perimeter ZeroCountProp instead (the disc B(s₀, 5/2) is covered by ~5 unit windows: γ ∈ [t−2.5, t+2.5] ⟹ 5 windows [t−3, t+2]... plus the perimeter needs a ≥ 2: t ≥ 10 ⟹ t−3 ≥ 7 ✓; for t ≤ −10 symmetric — hmm, ZeroCountProp is stated for t ≥ 2 with window [t, t+1]. For negative ordinates use the conjugate symmetry of zeros: IsNontrivialZero ρ ⟹ conj ρ also? That's a Zeta23 seam (zeros come in conjugate pairs). Might be annoying. (b) Apply Jensen with a bigger r: r = 1? SetOfZeros 1 F is finite, but ZerosBound needs r < 1. Use r = 0.995: then the sum over SetOfZeros(0.995) covers d ≤ 2.4875 — still not 2.5. Hmm r < 1 strictly, so never covers the boundary ‖w‖ = 1 exactly (d = 2.5). But zeroDiscFinset uses closedBall(s₀, 5/2) — includes the boundary.\n\nHmm. Option (c): shrink zeroDiscFinset to closedBall(s₀, 49/20) = 2.45 and use Jensen r = 0.98 = 24.5/25... but zeroDiscFinset was already committed in ii′-5c part 1 with 5/2 (and used in scaledZeta_zeros_finite, zeroDisc_isNontrivial). Redefining it would touch existing proved code (zeroDisc_isNontrivial used 5/2 geometry: re ∈ [−1/2, 9/2]; 49/20 gives re ≥ 2 − 2.45 = −0.45 — the re ≤ 0 exclusion argument used re ≥ −1/2 hmm: with radius 2.45, re ρ ∈ [−0.45, 4.45]; the ΓR-pole argument: re ≤ 0 ⟹ ρ = −2n with re = −2n ≤ −2 < −0.45 for n ≥ 1 ✓ still works, n = 0: ρ = 0 excluded by ζ(0) ≠ 0 ✓. So changing 5/2 → 49/20 in zeroDiscFinset would still let zeroDisc_isNontrivial go through (re ≤ 9/2 → re ≤ 4.45+... the proof structure is the same, constants change). But freeze protocol says existing proofs untouched except liCoeff fix... well, ii′-5c is THIS session's sub-stage, in progress — LiDisc.lean from session 023 is committed though. Modifying the definition would require re-proving zeroDisc_isNontrivial with new constants. Eh.\n\nOption (d): keep S as the distances of the 0.96-disc zeros only! I.e., choose the gap R_c ∈ [2.3, 2.4] avoiding distances of zeros within 2.4 only... but then zeros with d ∈ (R_c, 2.4] could be closer than δ to R_c?? No wait — if S includes ALL zeros with d ≤ 2.4, and R_c ∈ [2.3, 2.4] avoids all of them by δ, then collected zeros (d ≤ R_c) have d ≤ R_c − δ, and zeros with d ∈ (R_c, 2.4] have d ≥ R_c + δ. Zeros with d ∈ (2.4, 2.5]: NOT in S, could be at any distance > 2.4 ≥ R_c... but they're at d > 2.4 > R_c + δ? δ = 1/(20(k+1)) could exceed 0.1 for small k... k = card of the ≤2.4-zero finset... hmm δ ≤ 1/20 = 0.05 (k ≥ 0) — wait for k=0, δ = 1/20, R_c + δ ≤ 2.4 + 0.05 = 2.45 < ... a zero at d = 2.44 exists? If k=0 there are no zeros with d ≤ 2.4 but one at 2.44 — its distance to R_c: 2.44 − 2.4 ≥ ... R_c ≤ 2.4 so d − R_c ≥ 0.04 < δ = 0.05. PROBLEM: that zero is at distance < δ above R_c. Does it matter? What do we need the gap for?\n (i) Collected zeros (in ZW, ‖w‖ ≤ r_c) satisfy ‖w‖ ≤ r_c − δ_w: needs gap below R_c among... the zero at 2.44 is NOT collected (d > R_c), fine — but for ZW members, their d ≤ R_c AND they're in S (d ≤ 2.4 ✓ since R_c ≤ 2.4) so d ≤ R_c − δ ✓. Good — no problem for (i).\n (ii) B nonvanishing on closedBall(0, R_log): need no zeros with r_c < ‖w‖ ≤ R_log, i.e. no ζ-zeros with d ∈ (R_c, R_c + δ/2... R_log = r_c + δ_w/2 ⟹ d ∈ (R_c, R_c + δ/2). Zeros with d ≤ 2.4: in S ⟹ d ≥ R_c + δ > R_c + δ/2 ✓. Zeros with d ∈ (2.4, 2.5]: d > 2.4 ≥ R_c; is 2.4 > R_c + δ/2? R_c ≤ 2.4 and δ/2 ≤ 1/40 = 0.025, so R_c + δ/2 could be 2.4125, and a zero at d = 2.41?? If d = 2.41 > 2.4 not in S, and R_c = 2.4, R_log·2.5 = 2.4 + δ/4 = 2.4125·... wait R_log = r_c + δ_w/2 ⟹ (5/2)R_log = R_c + (5/2)δ_w/2 = R_c + δ/2 = 2.4125. A zero at d = 2.41 ∈ (2.4, 2.4125): B would vanish at the corresponding w (‖w‖ = 0.964 ≤ R_log = 0.965)!! PROBLEM.\n\n So option (d) breaks (ii) unless S includes the annulus zeros. Hmm.\n\nOption (e): make R_log smaller: R_log = r_c + min(δ_w/2, (2.4 − R_c)·(2/5)/2)... ugly. Actually: the constraint is zeros with d ≤ 2.4 are δ-away; zeros with d > 2.4 are at d > 2.4. So any R_log' := min(r_c + δ_w/2, corresponding to R_c + (2.4−R_c)/2 = (R_c+2.4)/2)... i.e. choose R_c' := R_c + min(δ/2, (2.4−R_c)/2). Then no zeros in (R_c, R_c']. And R_c' − R_c could be as small as... if R_c = 2.4, min(δ/2, 0) = 0!! R_c' = R_c, no room. Ugh — if R_c = 2.4 exactly, zeros at 2.4+ε arbitrary close. But wait — do we need room above R_c at all? B = Cf r_c F is analytic on closedBall(0, R) for any R < 1 regardless (CfAnalytic) — analyticity is fine. NONVANISHING on closedBall(0, R_log) needs no zeros in the annulus. If there's no room, take R_log := r_c exactly? But then the sphere ‖w‖ = r_c... zeros ON the sphere ‖w‖ = r_c? Collected zeros satisfy ‖w‖ ≤ r_c − δ_w < r_c, and uncollected have ‖w‖ > r_c (strictly, since ‖w‖ = r_c ⟹ d = R_c ∈ S... wait d = R_c: is d ∈ S then |d − R_c| = 0 < δ contradiction — so no zero at exactly d = R_c). So on the closed ball closedBall(0, r_c): zeros w have ‖w‖ ≤ r_c − δ_w (if in S... every zero with ‖w‖ ≤ r_c has d ≤ R_c ≤ 2.4 so IS in S ⟹ ‖w‖ ≤ r_c − δ_w ✓). So B nonvanishing on closedBall(0, r_c)? At w with F w = 0 and ‖w‖ ≤ r_c: w ∈ ZW... the Cf def: at a zero w ∈ SetOfZeros r_c, Cf w = ZeroFactor/prod ≠ 0 ✓. At w with F w ≠ 0: else-branch, B w = F w/prod, prod: factors (w−ρ), ρ ∈ ZW, w ≠ ρ since F w ≠ 0 ≠ F ρ... ✓ nonzero. YES — B is nonvanishing on closedBall(0, r_c), no extra room needed!\n\n But LogOfAnalyticFunction needs B nonvanishing on closedBall(0, R) where R > r (r = application radius 3/5) and analyticity on closedBall(0, R) — I can take R = r_c! B analytic on closedBall(0, R') for R' ∈ (r_c, 1) via CfAnalytic, hence on closedBall(0, r_c) by mono ✓. Nonvanishing on closedBall(0, r_c) ✓ as just argued. So apply LogOfAnalyticFunction with r := 3/5, R := r_c: J_B analytic on ball(0, r_c), Re J_B = log‖B‖ − log‖B 0‖ on ball(0, r_c), deriv on closedBall(0, 3/5) ✓.\n \n Then Re J_B bound on ball(0, r_c): need ‖B‖ bound on ball(0, r_c) — via max-modulus on sphere ‖w‖ = r_c: sphere points have no zeros (shown above: no zero at ‖w‖ = r_c), else-branch: ‖B w‖ = ‖F w‖/∏‖w−ρ‖^m with ‖w−ρ‖ ≥ ‖w‖−‖ρ‖ ≥ r_c − (r_c−δ_w) = δ_w. So ‖B w‖ ≤ (9/4)|t|²·(1/δ_w)^{M_c} where 1/δ_w = 50(k+1). Slightly different constant than before (50 vs 200/3·...): log(1/δ_w) = log(50(k+1)). Even better.\n \n Wait — is r_c ≤ 99/100 for the F bound? r_c ≤ 0.96 ≤ 0.99 ✓. And BC: R = r_c ∈ [0.92, 0.96], r = 3/5: R − r ≥ 0.32 = 8/25 ✓, R² ≤ 0.96² = 0.9216. BC factor: 16·0.9216/(8/25)³ = 16·0.9216·15625/512 = 450. Times 2/5 = 180. ✓\n\n Also the M_c count: collected zeros = SetOfZeros r_c with r_c ≤ 0.96 = 24/25 — Jensen applies to the 24/25-finset; monotonicity: SetOfZeros r_c ⊆ SetOfZeros (24/25) (r_c ≤ 24/25 ✓), sum over toFinset subset ≤ since orders ≥ 0. ✓ And k := card of the distance finset S where S := distances of zeros with d ≤ 2.4 = image of (SetOfZeros (24/25) F).toFinset under affine+norm... Let me define S directly as image of the scaled 24/25-finset ZW96 under (5/2)·‖·‖: S := ZW96.toFinset.image (fun w => (5/2)*‖w‖)? Distances of ζ-zeros with d ≤ 2.4 = {(5/2)‖w‖ : w zero of F, ‖w‖ ≤ 24/25}. Note: (5/2)·‖w‖ = ‖s₀ + (5/2)w − s₀‖ ✓ exactly the distances. So S := (ZW96).image (fun w => (5/2) * ‖w‖), card S ≤ card ZW96 ≤ M96 ≤ Jensen. So k := (ZW96).card and card S ≤ k ✓. δ := 1/(20(k+1)) (after the ×10 rescale trick). Clearance applies to every w ∈ ZW96: |(5/2)‖w‖ − R_c| ≥ δ ⟹ |‖w‖ − r_c| ≥ δ_w (δ_w = (2/5)δ = 1/(50(k+1))).\n\n And zeroDiscFinset stays as-is (5/2); zeroDisc_isNontrivial used for: nearZeros members are nontrivial (for β ∈ (0,1) in the nearZeros ⊆ collected argument). ✓ \n\n Hmm wait, one thing to double check: for ZW members (collected, ‖w‖ ≤ r_c): the gap argument gives ‖w‖ ≤ r_c − δ_w — this requires (5/2)‖w‖ ∈ S, i.e. w ∈ ZW96: ‖w‖ ≤ r_c ≤ 24/25 ⟹ w ∈ SetOfZeros (24/25) ✓ (F w = 0 by ZW membership). ✓\n\nAlso for §9 translation: the collected ζ-zeros finset = ZW.image (fun w => s₀ + (5/2)w). Sum over ZW of m_ρ/(s − ρ_s) via sum_image (inj: affine injective ✓). m values: analyticOrderNatAt F w = analyticOrderNatAt ζ (aff w) (analyticOrderNatAt_scaledZeta ✓ needs ‖w‖ ≤ 1 ✓ r_c < 1). zeroMult ρ := analyticOrderNatAt riemannZeta ρ? Let me check the definition of zeroMult in LiSides/LiSkeleton.\n\nLet me check zeroMult def and nearZeros plan, then also check what logDeriv lemmas exist in Mathlib. Let me grep.","signature":""},{"type":"text","text":"Context absorbed. Now checking `zeroMult`'s definition and the Mathlib `logDeriv` API before writing code."},{"type":"tool_use","id":"Grep_17","name":"Grep","input":{"pattern":"(def zeroMult|zeroMult :=|noncomputable def zeroMult)","path":"D:\\Python\\Quantum\\research\\lean\\NguyenRH1","output_mode":"content","-B":3,"-A":3},"extra_content":null},{"type":"tool_use","id":"Grep_18","name":"Grep","input":{"pattern":"theorem logDeriv_(fun_)?(mul|prod|pow|div|comp|const_mul)","path":"D:\\Python\\Quantum\\zeta-23-lean\\.lake\\packages\\mathlib\\Mathlib\\Analysis\\Calculus\\LogDeriv.lean","output_mode":"content","-A":6},"extra_content":null}]