← Session 24 — ii′-2…4: swaps, (4.10) design, contour + website roadmap fixes
thinking (14000 chars)
Now the Jensen count. The ZerosBound application:
```lean
/-! ## 4. The Jensen count -/
/-- The mult-weighted count of zeros of the scaled function in the closed
ball of radius 23/25: via ZerosBound (Jensen) with B = (9/4)|t|². -/
theorem scaledZeta_count_le {t : ℝ} (ht : 10 ≤ |t|) :
∑ ρ ∈ (finiteSetOfZeros_mono (r := 23/25) (R := 24/25) ... ).toFinset, ...
```
Hmm — the ZerosBound signature: {B r R : ℝ} {f : ℂ → ℂ} (r_pos : 0 < r) (r_lt_one : r < 1) (r_lt_R : r < R) (R_lt_one : R < 1) (hfAnalytic : AnalyticOnNhd ℂ f (closedBall 0 1)) (hf0_eq_one : f 0 = 1) (finiteZeros : (SetOfZeros 1 f).Finite) (fz_bound : ∀ z, ‖z‖ ≤ R → ‖f z‖ ≤ B) : ∑ ρ ∈ (finiteSetOfZeros_mono r_lt_one finiteZeros).toFinset, analyticOrderNatAt f ρ ≤ 1/log(R/r) * log B.
So the conclusion is about analyticOrderNatAt F ρ — and analyticOrderNatAt (scaledZeta t) w = analyticOrderNatAt (fun w => ζ(aff w)) w (the /ζ(s₀) constant doesn't change the order: analyticOrderAt (c * f) with c ≠ 0: = order f — via analyticOrderAt_smul with the const's order 0... or analyticOrderAt_const_mul? Let me handle: scaledZeta t = fun w => ζ(aff w) / ζ(s₀) = fun w => (1/ζ(s₀)) * ζ(aff w) (div by const = mul by inverse): analyticOrderAt ((fun w => C) • (ζ∘aff))? the smul form: analyticOrderAt_smul (hf : AnalyticAt f) (hg : AnalyticAt g) : analyticOrderAt (f • g) = order f + order g: with f = const C: order (const C) at w₀ = 0 iff C ≠ 0 (analyticOrderAt_eq_zero — `analyticOrderAt_eq_zero : analyticOrderAt f z₀ = 0 ↔ f z₀ ≠ 0`? let me check that name — hmm — earlier in ZeroFactorization's proof: `rw[analyticOrderAt_eq_zero]; exact Or.symm ...` — so analyticOrderAt_eq_zero exists ✓). So order(F, w) = order(ζ∘aff, w) + 0 = ... wait smul is f • g with f scalar — (fun w => C) • (ζ∘aff) — = C • (ζ∘aff w) = C * (ζ∘aff w) ✓ = (ζ∘aff w)/ζ(s₀) iff C = 1/ζ(s₀) ✓. So analyticOrderAt (scaledZeta t) w = 0 + analyticOrderAt (ζ∘aff) w = analyticOrderAt ζ (aff w) (via my affine-invariance lemma — which was stated for (fun w => riemannZeta (discCenter t + (5/2)*w)) = ζ∘aff ✓ defeq).
So: analyticOrderNatAt (scaledZeta t) w = analyticOrderNatAt ζ (aff w) for ‖w‖ ≤ 1 (the invariance lemma's range). Chain:
analyticOrderNatAt (scaledZeta t) w = analyticOrderNatAt (ζ∘aff) w (constant factor) = analyticOrderNatAt ζ (aff w) (my lemma, needs ‖w‖ ≤ 1 and ht).
For the constant-factor step: analyticOrderNatAt (fun w => C * X w) w₀ = analyticOrderNatAt X w₀ for C ≠ 0:
```lean
theorem analyticOrderNatAt_const_mul {C : ℂ} (hC : C ≠ 0) {X : ℂ → ℂ} {w₀ : ℂ}
(hX : AnalyticAt ℂ X w₀) :
analyticOrderNatAt (fun w => C * X w) w₀ = analyticOrderNatAt X w₀ := by
by_cases htop : analyticOrderAt X w₀ = ⊤
· rw [analyticOrderAt... the smul version gives ⊤ + ... = ⊤ hmm — analyticOrderAt_smul : order(f • g) = order f + order g — needs AnalyticAt of both. order(const C) = 0 (C ≠ 0, analyticOrderAt_eq_zero — check the exact form: `analyticOrderAt_eq_zero : analyticOrderAt f z₀ = 0 ↔ f z₀ ≠ 0`? from the ZeroFactorization usage: `rw[analyticOrderAt_eq_zero]` then `exact Or.symm (Decidable.not_or_of_imp ...)` — so analyticOrderAt_eq_zero : analyticOrderAt f z₀ = 0 ↔ (f z₀ ≠ 0 ...)?? — the Or.symm/Decidable stuff suggests it's an `Decidable`-flavored iff. Let me just use: (analyticAt_const : AnalyticAt ℂ (fun _ => C) w₀).analyticOrderAt_eq_zero.mpr? — `AnalyticAt.analyticOrderAt_eq_zero : analyticOrderAt f z₀ = 0 ↔ f z₀ ≠ 0`? — ZeroFactorization used analyticOrderAt_eq_zero (root-level? `analyticOrderAt_eq_zero`). I'll check.
So: analyticOrderAt (fun w => C * X w) w₀ = analyticOrderAt (const) + analyticOrderAt X = 0 + m: via analyticOrderAt_smul (const • X = C * X pointwise: smul_eq_mul ✓)... the smul form: (fun w => C) • X — (f • g) w = f w • g w = C * X w ✓. Then analyticOrderAt_smul (analyticAt_const) hX : analyticOrderAt ((fun _ => C) • X) w₀ = analyticOrderAt (fun _ => C) w₀ + analyticOrderAt X w₀ = 0 + m (const order 0 via analyticOrderAt_eq_zero.mpr (of hC)). Then toNat both sides: (0 + m).toNat = m.toNat... — with m ≠ ⊤ (from zeta_order_ne_top_of_ne ✓ for the ζ-side): analyticOrderNatAt F w = analyticOrderNatAt X w via the natCast injectivity (like before).
```
OK — the pieces are clear. But I realize the structure is getting deep. Let me write the full §2/§4 (Jensen count + gap) as one block with all these helpers, compile, iterate.
Actually — wait. Let me reconsider scope. For the LOOSE bound's use in the growth argument, I need the R-bound with ANY constants. The count's tightness doesn't matter AT ALL for the growth input (only that it's O(polylog)). So maybe... the simplest possible count: even M ≤ C|t|^{1/2} would do. But the Jensen count is the natural one and it's already assembled. Fine.
Hmm — but actually, hold on. Do I even need the R-gap for the loose bound? The R-gap gives the outer-circle clearance for the |g| bound. Without a gap, |s−ρₖ| on the circle could be small → |g| blows up. So yes, needed. But the CLEARANCE can be tiny: 1/(2(k+1)) with k = card bound — from the Jensen count (distinct ≤ mult-count): k := ⌈M-bound⌉. The gap R ∈ [2.4, 2.5] — wait — with the scaled disc, the R-gap is on the ORIGINAL scale: R_real ∈ [2.4, 2.5] — avoiding the distance-values of zeros in the 5/2-disc. The count for the gap: the distinct zeros in the 5/2-disc ≤ M (mult-count) ≤ M_bound. Hmm — M_bound from Jensen is for zeros within |ρ−s₀| ≤ 2.3 — the 5/2-disc zeros (|ρ−s₀| ≤ 2.5) — need the count at 2.5 hmm — the ZerosBound count at r = 23/25-scaled = |ρ−s₀| ≤ 2.3. For the 5/2-disc: could use r = 1 (the full unit disc): ZerosBound with r → R... r < R < 1: r = 0.92 (2.3-disc) vs r closer to 1: r = 0.98: |ρ−s₀| ≤ 2.45: count ≤ log B / log(0.99/0.98)-ish ≈ log B/0.0101 — bigger constant but fine. Let me just use r₀ := 0.92 for the count (covers |ρ−s₀| ≤ 2.3) — and for the R-gap I need the count of zeros with |ρ−s₀| ≤ 2.5 — use a second ZerosBound at r = 0.99 (|ρ−s₀| ≤ 2.475)? hmm — or just bound: zeros with |ρ−s₀| ≤ 2.5 = ALL of the unit-disc zeros (SetOfZeros 1 F) — count via ZerosBound with r... ZerosBound's conclusion is over the SetOfZeros r finset for r < R < 1: use r = 0.96, R = 0.99: count ≤ log B/log(0.99/0.96) ≈ log B/0.0308 ≈ 32·log B. Covers |ρ−s₀| ≤ 2.4. Hmm — I want the distance-value count for zeros with |ρ−s₀| ≤ 2.5 (all of them): |ρ−s₀| ≤ 2.5 ⟺ w ∈ closedBall 0 1 ✓ SetOfZeros 1 — but ZerosBound only counts within r < 1. The zeros with |ρ−s₀| ∈ (2.475, 2.5] — uncounted by the r-versions. Ugh.
Simpler for the gap: the distance-value set is the image of the FINITE zero set (finiteness via the compactness machinery — `scaledZeta_zeros_finite` ✓ — it's finite, period). For the midpoint pigeonhole I need card ≤ k for an EXPLICIT k. Get k from the Jensen count at r = 0.96 covering |ρ−s₀| ≤ 2.4: the distance values of ALL 5/2-disc zeros: those with |ρ−s₀| ∈ (2.4, 2.5] aren't covered... — hmm — but those zeros have distance > 2.4 — for R ∈ [2.4, 2.5] hmm wait — I want R ∈ [2.4, 2.5] avoiding the distances of ALL disc-zeros. The distances of zeros with |ρ−s₀| ∈ (2.4, 2.5] MATTER (they're in the R-window!). So the count for the gap must cover |ρ−s₀| ≤ 2.5: use ZerosBound r = 0.995?? r < R < 1: r = 0.995 needs R ∈ (0.995, 1): R = 0.998: log(0.998/0.995) ≈ 0.003: constant ~300·log B — fine (loose). Ugh — or just note: ALL unit-disc zeros = SetOfZeros 1 F — and count THAT via... ZerosBound needs r < 1. Hmm — the zeros with ‖w‖ = 1 exactly (|ρ−s₀| = 2.5) — boundary. My disc for |ζ| is closedBall(s₀, 5/2) — the zeros on the boundary circle — for the R-gap I only care about zeros with distance in [2.4, 2.5]...
OK let me simplify: choose R ∈ [2.2, 2.4] hmm — wait — R must EXCEED the collection radius for the |γ−t|<1 zeros: those have |ρ−s₀| ≤ √5 ≈ 2.236: so R must be > 2.236: R ∈ [2.3, 2.4]? — but then the |ζ| disc bound was proved for closedBall(s₀, 5/2) — any R ≤ 5/2 ✓ fine. And the gap window [2.3, 2.4]: zeros with distance in [2.3, 2.4]: covered by the count at r = 0.96 (|ρ−s₀| ≤ 2.4) ✓✓. So:
- Collection: zeros with |ρ−s₀| ≤ 2.3 (includes all |γ−t|<1 zeros since √5 < 2.3 ✓).
- R ∈ [2.3, 2.4] avoiding all zero-distances by ≥ 1/(2(k+1)) where k = count-bound at 2.4 (Jensen r = 0.96, R = 0.99).
- Outer circle clearance: zeros within |ρ−s₀| ≤ 2.3 have |s−ρ| ≥ R − 2.3 ≥ ... hmm — on the circle |s−s₀| = R: |s−ρ| ≥ R − |ρ−s₀| ≥ R − 2.3 ≥ 0... wait the GAP gives |R − d| ≥ 1/(2(k+1)) for ALL zero-distances d (collected or not — all disc zeros). For collected (d ≤ 2.3 < R): |s−ρ| ≥ |R − d| ≥ gap ✓. For uncollected (d > 2.3): they don't appear in g's product — fine.
Hmm wait — actually the uncollected zeros with d ∈ (2.3, R): they're INSIDE the outer circle — then g = ζ/∏_{collected} would VANISH at them (ζ zero, product nonzero)!! g must be nonvanishing on the full closed disc closedBall(s₀, R)!! So the collection must be ALL zeros with |ρ−s₀| ≤ R — not just ≤ 2.3. Then g nonvanishing on closedBall(s₀, R) ⟺ all R-disc zeros collected ✓. And the outer-circle clearance: collected zeros have |ρ−s₀| ≤ R... on the circle |s−s₀| = R, a collected zero with |ρ−s₀| = R exactly would be ON the circle — |s−ρ| could be 0!! The gap avoids this: no zero has d ∈ (R−δ, R+δ) ⟹ collected zeros have d ≤ R − δ ⟹ on the circle |s−ρ| ≥ ||s−s₀| − d| = R − d ≥ δ ✓✓.
So: collection = zeros with |ρ−s₀| ≤ R (all of them, where R ∈ [2.3, 2.4] is the gap-selected radius). And:
- the count (Jensen at r covering 2.4): k := count at 2.4 (r = 0.96).
- the R-gap: R ∈ [2.3, 2.4] avoiding distances by 1/(2(k+1)).
- collection: |ρ−s₀| ≤ R — count ≤ count at 2.4 ✓ (R ≤ 2.4).
- extras in the R-sum: collected zeros with |γ−t| ≥ 1: ≤ count ✓.
And the |γ−t|<1 zeros are collected since their distance ≤ √5 ≈ 2.236 ≤ 2.3 ≤ R ✓.
OK. Now the mult-count via Jensen: apply ZerosBound to F with r := 24/25 (0.96), R := 99/100 (0.99): Σ_{|w|≤0.96} mult(F, w) ≤ log B / log(99/96) = log B / log(33/32) ≈ log B / 0.0308 ≤ 33 log B. With B = (9/4)|t|²: log B = log(9/4) + 2 log|t| ≤ 0.81 + 2 log|t|: M ≤ 33·(2 log|t| + 0.81) ≈ 66 log|t| + 27.
Then the extras/collection counts (mult-weighted) ≤ M. And the distinct count for the gap ≤ M.
The order-transfer: ZerosBound gives Σ_{w ∈ SetOfZeros(24/25) F} analyticOrderNatAt F w. I need Σ_{ρ ∈ collection} zeroMult ρ where zeroMult ρ = analyticOrderNatAt ζ ρ... — wait zeroMult ρ := (analyticOrderAt riemannZeta ρ).toNat — and analyticOrderNatAt ζ ρ — relation: analyticOrderNatAt f z₀ = (analyticOrderAt f z₀).toNat when order ≠ ⊤ — `Nat.cast_analyticOrderNatAt` showed (analyticOrderNatAt f z₀ : ℕ∞) = analyticOrderAt f z₀ — so analyticOrderNatAt = the toNat when finite ✓ they coincide where finite. For the transfer:
Σ_{w ∈ W} analyticOrderNatAt F w = Σ_{ρ ∈ image} analyticOrderNatAt ζ ρ via the affine bijection + the invariance lemmas (const-factor + affine). The Finset.sum over the mapped finset: `Finset.sum_image` (injOn ✓).
OK this is all assembleable. It's a lot of Lean. Let me write §4 (Jensen count + gap) now — being pragmatic: I'll aim for the count in the form "Σ_{ρ ∈ Zc} zeroMult ρ ≤ 33·log((9/4)·|t|²)" hmm — wait — but for downstream (5e/5f), the mult-weighted Trudgian count (perimeter) will replace the Jensen count for tightness. For 5c-loose, Jensen suffices. Fine.
Hmm, honestly — this session is very long already and 5c's remaining assembly (g + bounds + BC + the R-sum split) is still ~300+ lines of fiddly Lean. Let me get the count + gap done and committed as WIP2, then continue with §3 (g) as WIP3, then §4. Let me write the count + gap now.
Actually — let me reconsider ONE more time whether there's a shortcut that skips the Jensen count for the loose bound. The loose bound's pieces needing counts:
1. R-gap selection: needs card(distinct zeros in disc) ≤ k explicit.
2. |g| outer-circle: ∏|s−ρ|^{−mₖ} ≤ δ^{−M}: M = Σ mₖ mult-weighted.
3. extras in R-sum: Σ_extras mₖ ≤ M.
4. center: −log|g(s₀)| = −log|ζ(s₀)| + Σ mₖ log|s₀−ρₖ| ≤ log 3 + M·log(2.4) ✓ M.
All four need M (mult-weighted) and #1 needs the distinct count ≤ M ✓ (distinct ≤ mult-weighted: each mₖ ≥ 1 for a zero ✓ — mₖ ≥ 1 since ζ(ρ) = 0 and order ≠ ⊤: analyticOrderNatAt ≥ 1 ⟺ f(ρ) = 0 with finite order: `analyticOrderNatAt_pos_iff`? — there's `analyticOrderNatAt_pos`? hmm — the fact: f z₀ = 0 with finite order ⟹ order ≥ 1: from the characterization (order 0 ⟺ f z₀ ≠ 0) ✓ so mₖ ≥ 1 ⟹ distinct-count ≤ M ✓).
So everything flows from ONE Jensen count. OK let me write it. The chain:
```lean
/-! ## 4. The Jensen count and the R-gap -/
/-- The affine order-invariance through the constant division: orders of
the scaled function and of ζ agree. -/
theorem analyticOrderNatAt_scaledZeta {t : ℝ} (ht : 10 ≤ |t|) {w₀ : ℂ} (hw₀ : ‖w₀‖ ≤ 1) :
analyticOrderNatAt (scaledZeta t) w₀
= analyticOrderNatAt riemannZeta (discCenter t + (5 / 2 : ℂ) * w₀) := by
-- scaledZeta t = (fun w => (1/ζ(s₀)) * ζ(aff w)) — const factor doesn't change order
...
```
Hmm — scaledZeta t w := ζ(aff w)/ζ(s₀): as a function: fun w => ζ(aff w)/ζ(s₀): = fun w => (ζ(s₀))⁻¹ * ζ(aff w): the constant (ζ(s₀))⁻¹ ≠ 0 (ζ(s₀) ≠ 0 ✓). The const-mul order invariance:
```lean
theorem analyticOrderNatAt_const_mul {C : ℂ} (hC : C ≠ 0) {X : ℂ → ℂ} {w₀ : ℂ}
(hX : AnalyticAt ℂ X w₀) :
analyticOrderNatAt (fun w => C * X w) w₀ = analyticOrderNatAt X w₀ := by
have horder : analyticOrderAt (fun w => C * X w) w₀ = analyticOrderAt X w₀ := by
rw [show (fun w => C * X w) = (fun _ => C) • X from funext fun w => by simp [smul_eq_mul]]
rw [analyticOrderAt_smul analyticAt_const hX]
rw [show analyticOrderAt (fun _ => C) w₀ = 0 from by
rw [analyticOrderAt_eq_zero] -- hmm check form
...]
simp
...
```
The const order zero: analyticOrderAt (fun _ => C) w₀ = 0 ⟺ C ≠ 0: `analyticOrderAt_eq_zero` — let me check its exact statement. From ZeroFactorization's usage: `rw[analyticOrderAt_eq_zero]; exact Or.symm (Decidable.not_or_of_imp fun a a_1 ↦ hf_neq_zero_at_zero a)` — hmm — that suggests analyticOrderAt_eq_zero's RHS is a DECIDABLE disjunction?! Odd. Let me check the statement.
Checking `analyticOrderAt_eq_zero`'s exact form for the const-mul step.
tool: Bash
input
{
"command": "cd D:/Python/Quantum/zeta-23-lean/.lake/packages/mathlib && grep -rn \"analyticOrderAt_eq_zero\" Mathlib/Analysis/Analytic/Order.lean | head -4 && sed -n \"$(grep -n 'analyticOrderAt_eq_zero' Mathlib/Analysis/Analytic/Order.lean | head -1 | cut -d: -f1),+4p\" Mathlib/Analysis/Analytic/Order.lean",
"description": "Read analyticOrderAt_eq_zero"
}
raw content_json (database row)
[{"type":"thinking","thinking":"Now the Jensen count. The ZerosBound application:\n\n```lean\n/-! ## 4. The Jensen count -/\n\n/-- The mult-weighted count of zeros of the scaled function in the closed\nball of radius 23/25: via ZerosBound (Jensen) with B = (9/4)|t|². -/\ntheorem scaledZeta_count_le {t : ℝ} (ht : 10 ≤ |t|) :\n ∑ ρ ∈ (finiteSetOfZeros_mono (r := 23/25) (R := 24/25) ... ).toFinset, ...\n```\n\nHmm — the ZerosBound signature: {B r R : ℝ} {f : ℂ → ℂ} (r_pos : 0 < r) (r_lt_one : r < 1) (r_lt_R : r < R) (R_lt_one : R < 1) (hfAnalytic : AnalyticOnNhd ℂ f (closedBall 0 1)) (hf0_eq_one : f 0 = 1) (finiteZeros : (SetOfZeros 1 f).Finite) (fz_bound : ∀ z, ‖z‖ ≤ R → ‖f z‖ ≤ B) : ∑ ρ ∈ (finiteSetOfZeros_mono r_lt_one finiteZeros).toFinset, analyticOrderNatAt f ρ ≤ 1/log(R/r) * log B.\n\nSo the conclusion is about analyticOrderNatAt F ρ — and analyticOrderNatAt (scaledZeta t) w = analyticOrderNatAt (fun w => ζ(aff w)) w (the /ζ(s₀) constant doesn't change the order: analyticOrderAt (c * f) with c ≠ 0: = order f — via analyticOrderAt_smul with the const's order 0... or analyticOrderAt_const_mul? Let me handle: scaledZeta t = fun w => ζ(aff w) / ζ(s₀) = fun w => (1/ζ(s₀)) * ζ(aff w) (div by const = mul by inverse): analyticOrderAt ((fun w => C) • (ζ∘aff))? the smul form: analyticOrderAt_smul (hf : AnalyticAt f) (hg : AnalyticAt g) : analyticOrderAt (f • g) = order f + order g: with f = const C: order (const C) at w₀ = 0 iff C ≠ 0 (analyticOrderAt_eq_zero — `analyticOrderAt_eq_zero : analyticOrderAt f z₀ = 0 ↔ f z₀ ≠ 0`? let me check that name — hmm — earlier in ZeroFactorization's proof: `rw[analyticOrderAt_eq_zero]; exact Or.symm ...` — so analyticOrderAt_eq_zero exists ✓). So order(F, w) = order(ζ∘aff, w) + 0 = ... wait smul is f • g with f scalar — (fun w => C) • (ζ∘aff) — = C • (ζ∘aff w) = C * (ζ∘aff w) ✓ = (ζ∘aff w)/ζ(s₀) iff C = 1/ζ(s₀) ✓. So analyticOrderAt (scaledZeta t) w = 0 + analyticOrderAt (ζ∘aff) w = analyticOrderAt ζ (aff w) (via my affine-invariance lemma — which was stated for (fun w => riemannZeta (discCenter t + (5/2)*w)) = ζ∘aff ✓ defeq).\n\nSo: analyticOrderNatAt (scaledZeta t) w = analyticOrderNatAt ζ (aff w) for ‖w‖ ≤ 1 (the invariance lemma's range). Chain:\nanalyticOrderNatAt (scaledZeta t) w = analyticOrderNatAt (ζ∘aff) w (constant factor) = analyticOrderNatAt ζ (aff w) (my lemma, needs ‖w‖ ≤ 1 and ht).\n\nFor the constant-factor step: analyticOrderNatAt (fun w => C * X w) w₀ = analyticOrderNatAt X w₀ for C ≠ 0:\n```lean\ntheorem analyticOrderNatAt_const_mul {C : ℂ} (hC : C ≠ 0) {X : ℂ → ℂ} {w₀ : ℂ}\n (hX : AnalyticAt ℂ X w₀) :\n analyticOrderNatAt (fun w => C * X w) w₀ = analyticOrderNatAt X w₀ := by\n by_cases htop : analyticOrderAt X w₀ = ⊤\n · rw [analyticOrderAt... the smul version gives ⊤ + ... = ⊤ hmm — analyticOrderAt_smul : order(f • g) = order f + order g — needs AnalyticAt of both. order(const C) = 0 (C ≠ 0, analyticOrderAt_eq_zero — check the exact form: `analyticOrderAt_eq_zero : analyticOrderAt f z₀ = 0 ↔ f z₀ ≠ 0`? from the ZeroFactorization usage: `rw[analyticOrderAt_eq_zero]` then `exact Or.symm (Decidable.not_or_of_imp ...)` — so analyticOrderAt_eq_zero : analyticOrderAt f z₀ = 0 ↔ (f z₀ ≠ 0 ...)?? — the Or.symm/Decidable stuff suggests it's an `Decidable`-flavored iff. Let me just use: (analyticAt_const : AnalyticAt ℂ (fun _ => C) w₀).analyticOrderAt_eq_zero.mpr? — `AnalyticAt.analyticOrderAt_eq_zero : analyticOrderAt f z₀ = 0 ↔ f z₀ ≠ 0`? — ZeroFactorization used analyticOrderAt_eq_zero (root-level? `analyticOrderAt_eq_zero`). I'll check.\n So: analyticOrderAt (fun w => C * X w) w₀ = analyticOrderAt (const) + analyticOrderAt X = 0 + m: via analyticOrderAt_smul (const • X = C * X pointwise: smul_eq_mul ✓)... the smul form: (fun w => C) • X — (f • g) w = f w • g w = C * X w ✓. Then analyticOrderAt_smul (analyticAt_const) hX : analyticOrderAt ((fun _ => C) • X) w₀ = analyticOrderAt (fun _ => C) w₀ + analyticOrderAt X w₀ = 0 + m (const order 0 via analyticOrderAt_eq_zero.mpr (of hC)). Then toNat both sides: (0 + m).toNat = m.toNat... — with m ≠ ⊤ (from zeta_order_ne_top_of_ne ✓ for the ζ-side): analyticOrderNatAt F w = analyticOrderNatAt X w via the natCast injectivity (like before).\n```\n\nOK — the pieces are clear. But I realize the structure is getting deep. Let me write the full §2/§4 (Jensen count + gap) as one block with all these helpers, compile, iterate.\n\nActually — wait. Let me reconsider scope. For the LOOSE bound's use in the growth argument, I need the R-bound with ANY constants. The count's tightness doesn't matter AT ALL for the growth input (only that it's O(polylog)). So maybe... the simplest possible count: even M ≤ C|t|^{1/2} would do. But the Jensen count is the natural one and it's already assembled. Fine.\n\nHmm — but actually, hold on. Do I even need the R-gap for the loose bound? The R-gap gives the outer-circle clearance for the |g| bound. Without a gap, |s−ρₖ| on the circle could be small → |g| blows up. So yes, needed. But the CLEARANCE can be tiny: 1/(2(k+1)) with k = card bound — from the Jensen count (distinct ≤ mult-count): k := ⌈M-bound⌉. The gap R ∈ [2.4, 2.5] — wait — with the scaled disc, the R-gap is on the ORIGINAL scale: R_real ∈ [2.4, 2.5] — avoiding the distance-values of zeros in the 5/2-disc. The count for the gap: the distinct zeros in the 5/2-disc ≤ M (mult-count) ≤ M_bound. Hmm — M_bound from Jensen is for zeros within |ρ−s₀| ≤ 2.3 — the 5/2-disc zeros (|ρ−s₀| ≤ 2.5) — need the count at 2.5 hmm — the ZerosBound count at r = 23/25-scaled = |ρ−s₀| ≤ 2.3. For the 5/2-disc: could use r = 1 (the full unit disc): ZerosBound with r → R... r < R < 1: r = 0.92 (2.3-disc) vs r closer to 1: r = 0.98: |ρ−s₀| ≤ 2.45: count ≤ log B / log(0.99/0.98)-ish ≈ log B/0.0101 — bigger constant but fine. Let me just use r₀ := 0.92 for the count (covers |ρ−s₀| ≤ 2.3) — and for the R-gap I need the count of zeros with |ρ−s₀| ≤ 2.5 — use a second ZerosBound at r = 0.99 (|ρ−s₀| ≤ 2.475)? hmm — or just bound: zeros with |ρ−s₀| ≤ 2.5 = ALL of the unit-disc zeros (SetOfZeros 1 F) — count via ZerosBound with r... ZerosBound's conclusion is over the SetOfZeros r finset for r < R < 1: use r = 0.96, R = 0.99: count ≤ log B/log(0.99/0.96) ≈ log B/0.0308 ≈ 32·log B. Covers |ρ−s₀| ≤ 2.4. Hmm — I want the distance-value count for zeros with |ρ−s₀| ≤ 2.5 (all of them): |ρ−s₀| ≤ 2.5 ⟺ w ∈ closedBall 0 1 ✓ SetOfZeros 1 — but ZerosBound only counts within r < 1. The zeros with |ρ−s₀| ∈ (2.475, 2.5] — uncounted by the r-versions. Ugh.\n\nSimpler for the gap: the distance-value set is the image of the FINITE zero set (finiteness via the compactness machinery — `scaledZeta_zeros_finite` ✓ — it's finite, period). For the midpoint pigeonhole I need card ≤ k for an EXPLICIT k. Get k from the Jensen count at r = 0.96 covering |ρ−s₀| ≤ 2.4: the distance values of ALL 5/2-disc zeros: those with |ρ−s₀| ∈ (2.4, 2.5] aren't covered... — hmm — but those zeros have distance > 2.4 — for R ∈ [2.4, 2.5] hmm wait — I want R ∈ [2.4, 2.5] avoiding the distances of ALL disc-zeros. The distances of zeros with |ρ−s₀| ∈ (2.4, 2.5] MATTER (they're in the R-window!). So the count for the gap must cover |ρ−s₀| ≤ 2.5: use ZerosBound r = 0.995?? r < R < 1: r = 0.995 needs R ∈ (0.995, 1): R = 0.998: log(0.998/0.995) ≈ 0.003: constant ~300·log B — fine (loose). Ugh — or just note: ALL unit-disc zeros = SetOfZeros 1 F — and count THAT via... ZerosBound needs r < 1. Hmm — the zeros with ‖w‖ = 1 exactly (|ρ−s₀| = 2.5) — boundary. My disc for |ζ| is closedBall(s₀, 5/2) — the zeros on the boundary circle — for the R-gap I only care about zeros with distance in [2.4, 2.5]... \n\nOK let me simplify: choose R ∈ [2.2, 2.4] hmm — wait — R must EXCEED the collection radius for the |γ−t|<1 zeros: those have |ρ−s₀| ≤ √5 ≈ 2.236: so R must be > 2.236: R ∈ [2.3, 2.4]? — but then the |ζ| disc bound was proved for closedBall(s₀, 5/2) — any R ≤ 5/2 ✓ fine. And the gap window [2.3, 2.4]: zeros with distance in [2.3, 2.4]: covered by the count at r = 0.96 (|ρ−s₀| ≤ 2.4) ✓✓. So:\n- Collection: zeros with |ρ−s₀| ≤ 2.3 (includes all |γ−t|<1 zeros since √5 < 2.3 ✓).\n- R ∈ [2.3, 2.4] avoiding all zero-distances by ≥ 1/(2(k+1)) where k = count-bound at 2.4 (Jensen r = 0.96, R = 0.99).\n- Outer circle clearance: zeros within |ρ−s₀| ≤ 2.3 have |s−ρ| ≥ R − 2.3 ≥ ... hmm — on the circle |s−s₀| = R: |s−ρ| ≥ R − |ρ−s₀| ≥ R − 2.3 ≥ 0... wait the GAP gives |R − d| ≥ 1/(2(k+1)) for ALL zero-distances d (collected or not — all disc zeros). For collected (d ≤ 2.3 < R): |s−ρ| ≥ |R − d| ≥ gap ✓. For uncollected (d > 2.3): they don't appear in g's product — fine.\n\nHmm wait — actually the uncollected zeros with d ∈ (2.3, R): they're INSIDE the outer circle — then g = ζ/∏_{collected} would VANISH at them (ζ zero, product nonzero)!! g must be nonvanishing on the full closed disc closedBall(s₀, R)!! So the collection must be ALL zeros with |ρ−s₀| ≤ R — not just ≤ 2.3. Then g nonvanishing on closedBall(s₀, R) ⟺ all R-disc zeros collected ✓. And the outer-circle clearance: collected zeros have |ρ−s₀| ≤ R... on the circle |s−s₀| = R, a collected zero with |ρ−s₀| = R exactly would be ON the circle — |s−ρ| could be 0!! The gap avoids this: no zero has d ∈ (R−δ, R+δ) ⟹ collected zeros have d ≤ R − δ ⟹ on the circle |s−ρ| ≥ ||s−s₀| − d| = R − d ≥ δ ✓✓.\n\nSo: collection = zeros with |ρ−s₀| ≤ R (all of them, where R ∈ [2.3, 2.4] is the gap-selected radius). And:\n- the count (Jensen at r covering 2.4): k := count at 2.4 (r = 0.96).\n- the R-gap: R ∈ [2.3, 2.4] avoiding distances by 1/(2(k+1)).\n- collection: |ρ−s₀| ≤ R — count ≤ count at 2.4 ✓ (R ≤ 2.4).\n- extras in the R-sum: collected zeros with |γ−t| ≥ 1: ≤ count ✓.\n\nAnd the |γ−t|<1 zeros are collected since their distance ≤ √5 ≈ 2.236 ≤ 2.3 ≤ R ✓.\n\nOK. Now the mult-count via Jensen: apply ZerosBound to F with r := 24/25 (0.96), R := 99/100 (0.99): Σ_{|w|≤0.96} mult(F, w) ≤ log B / log(99/96) = log B / log(33/32) ≈ log B / 0.0308 ≤ 33 log B. With B = (9/4)|t|²: log B = log(9/4) + 2 log|t| ≤ 0.81 + 2 log|t|: M ≤ 33·(2 log|t| + 0.81) ≈ 66 log|t| + 27.\n\nThen the extras/collection counts (mult-weighted) ≤ M. And the distinct count for the gap ≤ M.\n\nThe order-transfer: ZerosBound gives Σ_{w ∈ SetOfZeros(24/25) F} analyticOrderNatAt F w. I need Σ_{ρ ∈ collection} zeroMult ρ where zeroMult ρ = analyticOrderNatAt ζ ρ... — wait zeroMult ρ := (analyticOrderAt riemannZeta ρ).toNat — and analyticOrderNatAt ζ ρ — relation: analyticOrderNatAt f z₀ = (analyticOrderAt f z₀).toNat when order ≠ ⊤ — `Nat.cast_analyticOrderNatAt` showed (analyticOrderNatAt f z₀ : ℕ∞) = analyticOrderAt f z₀ — so analyticOrderNatAt = the toNat when finite ✓ they coincide where finite. For the transfer:\nΣ_{w ∈ W} analyticOrderNatAt F w = Σ_{ρ ∈ image} analyticOrderNatAt ζ ρ via the affine bijection + the invariance lemmas (const-factor + affine). The Finset.sum over the mapped finset: `Finset.sum_image` (injOn ✓).\n\nOK this is all assembleable. It's a lot of Lean. Let me write §4 (Jensen count + gap) now — being pragmatic: I'll aim for the count in the form \"Σ_{ρ ∈ Zc} zeroMult ρ ≤ 33·log((9/4)·|t|²)\" hmm — wait — but for downstream (5e/5f), the mult-weighted Trudgian count (perimeter) will replace the Jensen count for tightness. For 5c-loose, Jensen suffices. Fine.\n\nHmm, honestly — this session is very long already and 5c's remaining assembly (g + bounds + BC + the R-sum split) is still ~300+ lines of fiddly Lean. Let me get the count + gap done and committed as WIP2, then continue with §3 (g) as WIP3, then §4. Let me write the count + gap now.\n\nActually — let me reconsider ONE more time whether there's a shortcut that skips the Jensen count for the loose bound. The loose bound's pieces needing counts:\n1. R-gap selection: needs card(distinct zeros in disc) ≤ k explicit. \n2. |g| outer-circle: ∏|s−ρ|^{−mₖ} ≤ δ^{−M}: M = Σ mₖ mult-weighted.\n3. extras in R-sum: Σ_extras mₖ ≤ M.\n4. center: −log|g(s₀)| = −log|ζ(s₀)| + Σ mₖ log|s₀−ρₖ| ≤ log 3 + M·log(2.4) ✓ M.\n\nAll four need M (mult-weighted) and #1 needs the distinct count ≤ M ✓ (distinct ≤ mult-weighted: each mₖ ≥ 1 for a zero ✓ — mₖ ≥ 1 since ζ(ρ) = 0 and order ≠ ⊤: analyticOrderNatAt ≥ 1 ⟺ f(ρ) = 0 with finite order: `analyticOrderNatAt_pos_iff`? — there's `analyticOrderNatAt_pos`? hmm — the fact: f z₀ = 0 with finite order ⟹ order ≥ 1: from the characterization (order 0 ⟺ f z₀ ≠ 0) ✓ so mₖ ≥ 1 ⟹ distinct-count ≤ M ✓).\n\nSo everything flows from ONE Jensen count. OK let me write it. The chain:\n\n```lean\n/-! ## 4. The Jensen count and the R-gap -/\n\n/-- The affine order-invariance through the constant division: orders of\nthe scaled function and of ζ agree. -/\ntheorem analyticOrderNatAt_scaledZeta {t : ℝ} (ht : 10 ≤ |t|) {w₀ : ℂ} (hw₀ : ‖w₀‖ ≤ 1) :\n analyticOrderNatAt (scaledZeta t) w₀\n = analyticOrderNatAt riemannZeta (discCenter t + (5 / 2 : ℂ) * w₀) := by\n -- scaledZeta t = (fun w => (1/ζ(s₀)) * ζ(aff w)) — const factor doesn't change order\n ...\n```\n\nHmm — scaledZeta t w := ζ(aff w)/ζ(s₀): as a function: fun w => ζ(aff w)/ζ(s₀): = fun w => (ζ(s₀))⁻¹ * ζ(aff w): the constant (ζ(s₀))⁻¹ ≠ 0 (ζ(s₀) ≠ 0 ✓). The const-mul order invariance:\n\n```lean\ntheorem analyticOrderNatAt_const_mul {C : ℂ} (hC : C ≠ 0) {X : ℂ → ℂ} {w₀ : ℂ}\n (hX : AnalyticAt ℂ X w₀) :\n analyticOrderNatAt (fun w => C * X w) w₀ = analyticOrderNatAt X w₀ := by\n have horder : analyticOrderAt (fun w => C * X w) w₀ = analyticOrderAt X w₀ := by\n rw [show (fun w => C * X w) = (fun _ => C) • X from funext fun w => by simp [smul_eq_mul]]\n rw [analyticOrderAt_smul analyticAt_const hX]\n rw [show analyticOrderAt (fun _ => C) w₀ = 0 from by\n rw [analyticOrderAt_eq_zero] -- hmm check form\n ...]\n simp\n ...\n```\nThe const order zero: analyticOrderAt (fun _ => C) w₀ = 0 ⟺ C ≠ 0: `analyticOrderAt_eq_zero` — let me check its exact statement. From ZeroFactorization's usage: `rw[analyticOrderAt_eq_zero]; exact Or.symm (Decidable.not_or_of_imp fun a a_1 ↦ hf_neq_zero_at_zero a)` — hmm — that suggests analyticOrderAt_eq_zero's RHS is a DECIDABLE disjunction?! Odd. Let me check the statement.","signature":""},{"type":"text","text":"Checking `analyticOrderAt_eq_zero`'s exact form for the const-mul step."},{"type":"tool_use","id":"Bash_372","name":"Bash","input":{"command":"cd D:/Python/Quantum/zeta-23-lean/.lake/packages/mathlib && grep -rn \"analyticOrderAt_eq_zero\" Mathlib/Analysis/Analytic/Order.lean | head -4 && sed -n \"$(grep -n 'analyticOrderAt_eq_zero' Mathlib/Analysis/Analytic/Order.lean | head -1 | cut -d: -f1),+4p\" Mathlib/Analysis/Analytic/Order.lean","description":"Read analyticOrderAt_eq_zero"},"extra_content":null}]