← Session 31 — ii′-5f: tight R-bound 10.5/48 (piece 3 + pinch)
thinking (7054 chars)
No conj-multiplicity bridge exists. I need `zeroMult (conj ρ) = zeroMult ρ` for nontrivial zeros (or in general).
How to prove analyticOrderAt ζ (conj z) = analyticOrderAt ζ z?
Approach: use the completed function or a local normal form. Alternative approach — AVOID needing mult-conj:
For the left-tail fiber count: fiber_ℓ = {ρ subtype : γ < 0, ⌊|γ|⌋₊ = ℓ}. I want Σ_{fiber} zeroMult ≤ C0hat(ℓ+1).
Alternative: map fiber → subtype-fiber' via the CONJ on the SUBTYPE: σ(ρ) := ⟨conj ρ.1, isNontrivialZero_conj ρ.2⟩. Then σ is an involution on the subtype. The fiber_ℓ maps to {ρ' : γ' > 0, ⌊γ'⌋₊ = ℓ} =: fiber'_ℓ. And Σ_{fiber_ℓ} zeroMult ρ = Σ_{fiber'_ℓ} zeroMult (σ⁻¹ ρ') = Σ_{fiber'_ℓ} zeroMult (conj ρ') — STILL needs zeroMult(conj ρ') = zeroMult(ρ').
So the conj-mult lemma is unavoidable for the left tail. Alternatives:
(a) Prove `analyticOrderAt riemannZeta (conj z) = analyticOrderAt riemannZeta z` — doable via: the ζ conj identity. Let me think about how analyticOrderAt is defined in Mathlib: `analyticOrderAt f z = (analyticOrderAt f z : ℕ∞).toNat`? No wait — in this Mathlib, zeroMult ρ := (analyticOrderAt riemannZeta ρ).toNat probably. analyticOrderAt f z : ℕ∞ := the order. There's `analyticOrderAt_comp` (for composition with analytic equivalences)? For conj: not analytic. Hmm.
But — ζ(conj s) = conj(ζ(s)) (riemannZeta_conj — used in isNontrivialZero_conj). Consider g(s) := conj(ζ(conj s)) — g = ζ by the identity. g is analytic (conj ∘ ζ ∘ conj: conj is ℂ-linear... no, conj is ANTI-linear but conj ∘ (analytic) ∘ conj IS analytic — there's `Complex.conjCLE` and analyticity of the sandwich: AnalyticAt ℂ (conj ∘ f ∘ conj) — hmm, does Mathlib have that? There's `Complex.analyticAt_conj`? conj itself is not analytic. But the SANDWICH is: the Taylor series of conj(f(conj s)) at conj z has coefficients conj(aₙ) — analytic! Mathlib might have `AnalyticAt.conj` : AnalyticAt ℂ (fun z => conj (f (conj z))) (conj z) — I recall something like `analyticAt_conj_conj`... Let me search Mathlib.
Actually, the order argument: analyticOrderAt g (conj z) where g(s) = conj(ζ(conj s)): g = ζ pointwise ⟹ analyticOrderAt g (conj z) = analyticOrderAt ζ (conj z). And analyticOrderAt g (conj z): g vanishes to order n at conj z ⟺ ζ vanishes to order n at z (since conj is a local bijection preserving the first-nonzero-coefficient order — |coefficients| are conjugated, zero-ness preserved).
Formally: analyticOrderAt via `analyticOrderAt_eq_natCast` or the characterization with iterated derivatives: order = min n with iteratedDeriv n f z ≠ 0. iteratedDeriv n g (conj z) = conj(iteratedDeriv n ζ z)?? If that holds: g's first nonzero deriv at conj z has the same index as ζ's at z ✓. iteratedDeriv of the conj-sandwich: deriv g (conj z) = conj(deriv ζ z) — plausibly provable via hasDerivAt of the sandwich with derivative conj of the original (the Fréchet deriv of conj∘ζ∘conj as a ℂ-linear map: conj(deriv ζ z • ·)-ish — the deriv of conj∘f∘conj at conj z applied to h = conj(deriv f z · conj(h)) = conj(deriv f z)·h... so g'(conj z) = conj(f'(z)) as a SCALAR (the ℂ-linear map h ↦ conj(f'(z))·h ✓ since conj(a·conj h) = conj a · h ✓). So deriv g (conj z) = conj(deriv ζ z) ✓ and iterating: iteratedDeriv n g (conj z) = conj(iteratedDeriv n ζ z) ✓. Then analyticOrderAt_eq: there's `analyticOrderAt_eq_natCast`/`analyticOrderAt_eq_iff` in terms of iterated derivatives? There's the API `AnalyticAt.analyticOrderAt_eq_natCast` ... or `analyticOrderAt_eq_of_...`. Hmm.
zeroMult is defined how? Let me check: probably `zeroMult ρ := (analyticOrderAt riemannZeta ρ).toNat`.
This could be a 100-line side quest. Alternatively — a slicker route avoiding conj-mult:
**Route via Ncount/zerosIn directly:** the fiber mult-sum Σ_{fiber_ℓ} zeroMult(ρ) — bridge via the SUBTYPE-to-ℂ image: = Σ over the ℂ-image (zeros with γ ∈ [−(ℓ+1), −ℓ)) of zeroMult ≤ Zeta23.Ncount(−(ℓ+1), −ℓ)? NO — Ncount counts with zeroMult too (Ncount is mult-weighted? Let me check: Zeta23.Ncount a b = finsum over zerosIn a b of zeroMult? From the LiCircleBound usage: `Zeta23.Ncount, finsum_mem_eq_finite_toFinset_sum` and the sums are zeroMult-weighted ✓ YES mult-weighted). So the fiber image ⊆ zerosIn(−(ℓ+1), −ℓ) and Σ ≤ Ncount(−(ℓ+1), −ℓ). Then: Ncount(−(ℓ+1), −ℓ) = Ncount(ℓ, ℓ+1)?? — via conj on the SET level: zerosIn(−(ℓ+1), −ℓ) = conj '' zerosIn(ℓ, ℓ+1) (as sets — via riemannZeta_conj + im conj = −im ✓). And the MULT-weighted finsum over the set: Σ_{zerosIn(−(ℓ+1),−ℓ)} zeroMult = Σ_{zerosIn(ℓ,ℓ+1)} zeroMult ∘ conj = Σ zeroMult — STILL needs zeroMult ∘ conj = zeroMult. ARGH. Everything routes through zeroMult_conj.
OK so prove `zeroMult_conj` properly. Actually — wait, maybe there's an even simpler approach for the LEFT TAIL avoiding mults: since I only need the count bound, use `one_le_zeroMult`: Σ_{fiber} zeroMult ≥ card... no, wrong direction — I need an UPPER bound on Σ mult. Hmm.
OR use the two-sided band lemma? sum_zeroMult_le_of_im_band uses A₀ — no.
OK, prove the conj lemma. Let me think about the cleanest Lean path:
zeroMult ρ := (analyticOrderAt riemannZeta ρ).toNat (check def).
Goal: analyticOrderAt riemannZeta ((starRingEnd ℂ) ρ) = analyticOrderAt riemannZeta ρ.
Plan: set g := fun s => conj (riemannZeta (conj s)).
1. riemannZeta =ᶠ[𝓝 (conj ρ)] g? NO — g s = conj(ζ(conj s)) = ζ(s) EVERYWHERE (riemannZeta_conj: ζ(conj s) = conj(ζ(s)) ⟹ conj(ζ(conj s)) = conj(conj(ζ s)) = ζ s ✓). So g = ζ pointwise ✓.
2. analyticOrderAt g (conj ρ) = analyticOrderAt ζ ρ:
g is the conj-sandwich. Its analyticOrderAt at conj ρ: use the characterization `AnalyticAt.analyticOrderAt_eq_natCast_iff` or compute via the order of g at conj ρ = order of ζ∘conj at conj ρ (conj of the values doesn't change zero-ness/order...).
Hmm — cleanest might be via `analyticOrderAt_comp` with the equivalence... conj isn't analytic so composition lemmas don't apply directly.
Alternative characterization: analyticOrderAt f z = n (finite) ⟺ f = (s−z)ⁿ·h near z with h(z) ≠ 0 (the "analyticOrderNatAt" normal form — used in LiDisc: `analyticOrderNatAt_...` family exists). For g at conj ρ: g(s) = conj(ζ(conj s)): write ζ(w) = (w−ρ)ⁿ·H(w) near ρ (H analytic, H(ρ) ≠ 0). Then with w = conj s: ζ(conj s) = (conj s − ρ)ⁿ·H(conj s) = conj((s − conj ρ)ⁿ · conj(H(conj s)))·... conj(ζ(conj s)) = conj((conj s − ρ)ⁿ·H(conj s)) = (s − conj ρ)ⁿ·conj(H(conj s)). And conj(H(conj s)) is analytic in s with value conj(H(ρ)) ≠ 0 at s = conj ρ ✓. So g = (s − conj ρ)ⁿ·H̃ near conj ρ with H̃(conj ρ) ≠ 0 ⟹ order g at conj ρ = n = order ζ at ρ ✓.
In Lean: use `AnalyticAt.analyticOrderNatAt_eq_of_...`? There were lemmas `analyticOrderNatAt_riemannZeta_affine/const_mul/scaledZeta` in LiDisc — maybe a general `analyticOrderNatAt` API: `AnalyticAt.analyticOrderNatAt_eq` : order = n ⟺ ∃ g analytic, g z ≠ 0 ∧ f =ᶠ (s−z)ⁿ·g. Let me check what exists — grep analyticOrderNatAt in the package.
Actually, let me look at how LiDisc proved `analyticOrderNatAt_riemannZeta_affine` — that would give me the pattern for moving the order under a map.
The left tail needs a conj-multiplicity bridge. Let me check the LiDisc pattern for moving `analyticOrderNatAt` under maps.
tool: Grep
input
{
"pattern": "analyticOrderNatAt|analyticOrderAt_eq|def zeroMult",
"path": "D:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1",
"output_mode": "content",
"-n": true,
"head_limit": 40
}
raw content_json (database row)
[{"type":"thinking","thinking":"No conj-multiplicity bridge exists. I need `zeroMult (conj ρ) = zeroMult ρ` for nontrivial zeros (or in general). \n\nHow to prove analyticOrderAt ζ (conj z) = analyticOrderAt ζ z? \n\nApproach: use the completed function or a local normal form. Alternative approach — AVOID needing mult-conj:\n\nFor the left-tail fiber count: fiber_ℓ = {ρ subtype : γ < 0, ⌊|γ|⌋₊ = ℓ}. I want Σ_{fiber} zeroMult ≤ C0hat(ℓ+1).\n\nAlternative: map fiber → subtype-fiber' via the CONJ on the SUBTYPE: σ(ρ) := ⟨conj ρ.1, isNontrivialZero_conj ρ.2⟩. Then σ is an involution on the subtype. The fiber_ℓ maps to {ρ' : γ' > 0, ⌊γ'⌋₊ = ℓ} =: fiber'_ℓ. And Σ_{fiber_ℓ} zeroMult ρ = Σ_{fiber'_ℓ} zeroMult (σ⁻¹ ρ') = Σ_{fiber'_ℓ} zeroMult (conj ρ') — STILL needs zeroMult(conj ρ') = zeroMult(ρ').\n\nSo the conj-mult lemma is unavoidable for the left tail. Alternatives:\n(a) Prove `analyticOrderAt riemannZeta (conj z) = analyticOrderAt riemannZeta z` — doable via: the ζ conj identity. Let me think about how analyticOrderAt is defined in Mathlib: `analyticOrderAt f z = (analyticOrderAt f z : ℕ∞).toNat`? No wait — in this Mathlib, zeroMult ρ := (analyticOrderAt riemannZeta ρ).toNat probably. analyticOrderAt f z : ℕ∞ := the order. There's `analyticOrderAt_comp` (for composition with analytic equivalences)? For conj: not analytic. Hmm.\n\nBut — ζ(conj s) = conj(ζ(s)) (riemannZeta_conj — used in isNontrivialZero_conj). Consider g(s) := conj(ζ(conj s)) — g = ζ by the identity. g is analytic (conj ∘ ζ ∘ conj: conj is ℂ-linear... no, conj is ANTI-linear but conj ∘ (analytic) ∘ conj IS analytic — there's `Complex.conjCLE` and analyticity of the sandwich: AnalyticAt ℂ (conj ∘ f ∘ conj) — hmm, does Mathlib have that? There's `Complex.analyticAt_conj`? conj itself is not analytic. But the SANDWICH is: the Taylor series of conj(f(conj s)) at conj z has coefficients conj(aₙ) — analytic! Mathlib might have `AnalyticAt.conj` : AnalyticAt ℂ (fun z => conj (f (conj z))) (conj z) — I recall something like `analyticAt_conj_conj`... Let me search Mathlib.\n\nActually, the order argument: analyticOrderAt g (conj z) where g(s) = conj(ζ(conj s)): g = ζ pointwise ⟹ analyticOrderAt g (conj z) = analyticOrderAt ζ (conj z). And analyticOrderAt g (conj z): g vanishes to order n at conj z ⟺ ζ vanishes to order n at z (since conj is a local bijection preserving the first-nonzero-coefficient order — |coefficients| are conjugated, zero-ness preserved).\n\nFormally: analyticOrderAt via `analyticOrderAt_eq_natCast` or the characterization with iterated derivatives: order = min n with iteratedDeriv n f z ≠ 0. iteratedDeriv n g (conj z) = conj(iteratedDeriv n ζ z)?? If that holds: g's first nonzero deriv at conj z has the same index as ζ's at z ✓. iteratedDeriv of the conj-sandwich: deriv g (conj z) = conj(deriv ζ z) — plausibly provable via hasDerivAt of the sandwich with derivative conj of the original (the Fréchet deriv of conj∘ζ∘conj as a ℂ-linear map: conj(deriv ζ z • ·)-ish — the deriv of conj∘f∘conj at conj z applied to h = conj(deriv f z · conj(h)) = conj(deriv f z)·h... so g'(conj z) = conj(f'(z)) as a SCALAR (the ℂ-linear map h ↦ conj(f'(z))·h ✓ since conj(a·conj h) = conj a · h ✓). So deriv g (conj z) = conj(deriv ζ z) ✓ and iterating: iteratedDeriv n g (conj z) = conj(iteratedDeriv n ζ z) ✓. Then analyticOrderAt_eq: there's `analyticOrderAt_eq_natCast`/`analyticOrderAt_eq_iff` in terms of iterated derivatives? There's the API `AnalyticAt.analyticOrderAt_eq_natCast` ... or `analyticOrderAt_eq_of_...`. Hmm.\n\nzeroMult is defined how? Let me check: probably `zeroMult ρ := (analyticOrderAt riemannZeta ρ).toNat`. \n\nThis could be a 100-line side quest. Alternatively — a slicker route avoiding conj-mult: \n\n**Route via Ncount/zerosIn directly:** the fiber mult-sum Σ_{fiber_ℓ} zeroMult(ρ) — bridge via the SUBTYPE-to-ℂ image: = Σ over the ℂ-image (zeros with γ ∈ [−(ℓ+1), −ℓ)) of zeroMult ≤ Zeta23.Ncount(−(ℓ+1), −ℓ)? NO — Ncount counts with zeroMult too (Ncount is mult-weighted? Let me check: Zeta23.Ncount a b = finsum over zerosIn a b of zeroMult? From the LiCircleBound usage: `Zeta23.Ncount, finsum_mem_eq_finite_toFinset_sum` and the sums are zeroMult-weighted ✓ YES mult-weighted). So the fiber image ⊆ zerosIn(−(ℓ+1), −ℓ) and Σ ≤ Ncount(−(ℓ+1), −ℓ). Then: Ncount(−(ℓ+1), −ℓ) = Ncount(ℓ, ℓ+1)?? — via conj on the SET level: zerosIn(−(ℓ+1), −ℓ) = conj '' zerosIn(ℓ, ℓ+1) (as sets — via riemannZeta_conj + im conj = −im ✓). And the MULT-weighted finsum over the set: Σ_{zerosIn(−(ℓ+1),−ℓ)} zeroMult = Σ_{zerosIn(ℓ,ℓ+1)} zeroMult ∘ conj = Σ zeroMult — STILL needs zeroMult ∘ conj = zeroMult. ARGH. Everything routes through zeroMult_conj.\n\nOK so prove `zeroMult_conj` properly. Actually — wait, maybe there's an even simpler approach for the LEFT TAIL avoiding mults: since I only need the count bound, use `one_le_zeroMult`: Σ_{fiber} zeroMult ≥ card... no, wrong direction — I need an UPPER bound on Σ mult. Hmm.\n\nOR use the two-sided band lemma? sum_zeroMult_le_of_im_band uses A₀ — no.\n\nOK, prove the conj lemma. Let me think about the cleanest Lean path:\n\nzeroMult ρ := (analyticOrderAt riemannZeta ρ).toNat (check def). \n\nGoal: analyticOrderAt riemannZeta ((starRingEnd ℂ) ρ) = analyticOrderAt riemannZeta ρ.\n\nPlan: set g := fun s => conj (riemannZeta (conj s)). \n1. riemannZeta =ᶠ[𝓝 (conj ρ)] g? NO — g s = conj(ζ(conj s)) = ζ(s) EVERYWHERE (riemannZeta_conj: ζ(conj s) = conj(ζ(s)) ⟹ conj(ζ(conj s)) = conj(conj(ζ s)) = ζ s ✓). So g = ζ pointwise ✓.\n2. analyticOrderAt g (conj ρ) = analyticOrderAt ζ ρ: \n g is the conj-sandwich. Its analyticOrderAt at conj ρ: use the characterization `AnalyticAt.analyticOrderAt_eq_natCast_iff` or compute via the order of g at conj ρ = order of ζ∘conj at conj ρ (conj of the values doesn't change zero-ness/order...). \n Hmm — cleanest might be via `analyticOrderAt_comp` with the equivalence... conj isn't analytic so composition lemmas don't apply directly.\n \n Alternative characterization: analyticOrderAt f z = n (finite) ⟺ f = (s−z)ⁿ·h near z with h(z) ≠ 0 (the \"analyticOrderNatAt\" normal form — used in LiDisc: `analyticOrderNatAt_...` family exists). For g at conj ρ: g(s) = conj(ζ(conj s)): write ζ(w) = (w−ρ)ⁿ·H(w) near ρ (H analytic, H(ρ) ≠ 0). Then with w = conj s: ζ(conj s) = (conj s − ρ)ⁿ·H(conj s) = conj((s − conj ρ)ⁿ · conj(H(conj s)))·... conj(ζ(conj s)) = conj((conj s − ρ)ⁿ·H(conj s)) = (s − conj ρ)ⁿ·conj(H(conj s)). And conj(H(conj s)) is analytic in s with value conj(H(ρ)) ≠ 0 at s = conj ρ ✓. So g = (s − conj ρ)ⁿ·H̃ near conj ρ with H̃(conj ρ) ≠ 0 ⟹ order g at conj ρ = n = order ζ at ρ ✓. \n \n In Lean: use `AnalyticAt.analyticOrderNatAt_eq_of_...`? There were lemmas `analyticOrderNatAt_riemannZeta_affine/const_mul/scaledZeta` in LiDisc — maybe a general `analyticOrderNatAt` API: `AnalyticAt.analyticOrderNatAt_eq` : order = n ⟺ ∃ g analytic, g z ≠ 0 ∧ f =ᶠ (s−z)ⁿ·g. Let me check what exists — grep analyticOrderNatAt in the package.\n\nActually, let me look at how LiDisc proved `analyticOrderNatAt_riemannZeta_affine` — that would give me the pattern for moving the order under a map.","signature":""},{"type":"text","text":"The left tail needs a conj-multiplicity bridge. Let me check the LiDisc pattern for moving `analyticOrderNatAt` under maps."},{"type":"tool_use","id":"Grep_30","name":"Grep","input":{"pattern":"analyticOrderNatAt|analyticOrderAt_eq|def zeroMult","path":"D:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1","output_mode":"content","-n":true,"head_limit":40},"extra_content":null}]