Current task: —

← Session 22 — ii′-1: liCoeff pairing fix + residue machinery

#1039 assistant 2026-08-22 04:53:14.594 UTC · 1298→6966 tok open ⤢
thinking (17978 chars)
BohrMollerup has `logGammaSeq` — the Euler limit form for REAL x: `tendsto_log_gamma {x : ℝ} (hx : 0 < x) : Tendsto (logGammaSeq x) atTop (𝓝 (log (Gamma x)))` presumably, with logGammaSeq x n := x·log n + log n! − Σ_{m=0}^n log(x + m)-ish. This is REAL and for log Gamma — not the derivative series. Deriving ψ's series from this: differentiating in x through the limit — the real logGammaSeq: logGammaSeq x n = x log n + log(n!) − Σ_{m=0}^n log(x+m) — its derivative: log n − Σ_{m=0}^n 1/(x+m) → ψ(x)?? For REAL x: deriv of log Gamma = ψ ✓ (Real.digamma?). The limit interchange: deriv of the limit = limit of the derivs — needs locally uniform convergence of the derivative sequence — log n − Σ_{m=0}^n 1/(x+m) — this CONVERGES uniformly on compact subsets of (0, ∞)? The terms: log n − Σ_{m=0}^n 1/(x+m) = Σ_{m=1}^n (1/m − 1/(x+m)) + (log n − Σ_{m=1}^n 1/m) − 1/x: = Σ_{m=1}^n (1/m − 1/(x+m)) − 1/x + (log n − H_n): the first part converges uniformly on compacts (|1/m − 1/(x+m)| = x/(m(x+m)) ≤ x/m² ✓ Weierstrass), the second → −γ, so the limit = Σ_{m≥1}(1/m − 1/(x+m)) − 1/x − γ = ψ(x) ✓ the partial fraction series! And the uniform convergence of derivatives justifies ψ(x) = that series for real x > 0. Then iterated: ψ^{(j)}(x) = Σ_{m≥1} (−1)^{j+1} j!/(x+m)^{j+1}·... wait derivative of (1/m − 1/(x+m)) w.r.t. x: +1/(x+m)² — sign: d/dx[−1/(x+m)] = +1/(x+m)² ✓; j-th: (−1)^{j+1} j!/(x+m)^{j+1}·... let me just: d^j/dx^j [1/m − 1/(x+m)] = −(−1)^j j!/(x+m)^{j+1}·... d/dx (x+m)^{−1} = −(x+m)^{−2}; j-th deriv: (−1)^j j! (x+m)^{−(j+1)} — so the j-th derivative of the summand = −(−1)^j j!/(x+m)^{j+1} = (−1)^{j+1}j!/(x+m)^{j+1} ✓. And of −1/x: j-th deriv = (−1)^{j+1}j!/x^{j+1}·... d/dx (−1/x) = 1/x²; j-th: (−1)^{j+1}j!/x^{j+1}?? d^j/dx^j (−x^{−1}) = −(−1)^j j! x^{−(j+1)} = (−1)^{j+1}j!x^{−(j+1)} ✓ same form. So ψ^{(j)}(x) = (−1)^{j+1} j! Σ_{m≥0} (x+m)^{−(j+1)} (including the m = 0 term from −1/x) ✓ — for real x > 0. At x = 1/2: ψ^{(j)}(1/2) = (−1)^{j+1} j! Σ_{m≥0} (m + 1/2)^{−(j+1)} ✓✓ EXACTLY what (III) needs, for REAL 1/2. And the τ-coefficients: ΓR′/ΓR(1+s) — the TAYLOR coefficients in the COMPLEX variable s. Hmm — the τ_j are complex Taylor coefficients. But: ΓR′/ΓR(1+s) is analytic near 0 (Gammaℝ(1) ≠ 0 ✓ Gammaℝ_ne_zero_of_re_pos ✓). Its Taylor coefficients are determined by iteratedDeriv j [s ↦ ΓR′/ΓR(1+s)] 0 — a COMPLEX derivative. The values: iteratedDeriv of the complex function at 0 — the real directional derivatives suffice? For an analytic function, the complex iterated derivatives at a real point are determined by the real ones: iteratedDeriv j f 0 for f analytic — f's restriction to ℝ: iteratedDeriv j (f ∘ ofReal) 0 = iteratedDeriv j f 0 (chain rule, derivative of ofReal is 1) — there's `Complex... iteratedDeriv_ofReal...`? The composition f(ofReal r): deriv = deriv f · 1 ✓ — so the complex Taylor coefficients at 0 = the real-line derivatives ✓. So it suffices to compute real-line derivatives of r ↦ ΓR′/ΓR(1+r) at r = 0 — and ΓR′/ΓR(1+r) = −(log π)/2 + (1/2)ψ((1+r)/2) with REAL ψ — hmm — need Complex.digamma of a real = Real.digamma-ish? Mathlib: Real.digamma? hmm — the Digamma.lean file is Complex. Real version: `Real.digamma`? probably not — but Complex.digamma of Real.cast: ψ(↑x) = ↑(real ψ)? — is there `Complex.digamma_ofReal`? Probably NOT directly — but derivability: Complex.digamma = logDeriv Complex.Gamma; for real x > 0, Complex.Gamma ↑x = ↑(Real.Gamma x) (`Complex.Gamma_ofReal`? there's `Complex.ofReal_Gamma`? hmm — `Complex.Gamma_ofReal : Complex.Gamma ↑r = ↑(Real.Gamma r)`? not sure of name). This real/complex bridging is mechanical-but-fiddly Lean work. OK. So the FULL ii′-3 work plan (route β1-direct, coefficient form): **Piece A (archimedean, moderate-heavy):** A1. ψ(x) = −1/x − γ + Σ_{m≥1}(1/m − 1/(x+m)) for real x > 0 — from logGammaSeq + deriv-under-locally-uniform-limit (Real analysis). Wait — actually Mathlib might have Real.digamma... let me check. If not, I need Real.digamma defined — hmm — or work with the REAL function ψ_real x := deriv (Real.log ∘ Real.Gamma) x? Define it locally in my file. A1-alt: directly prove the needed coefficient statement: for j ≥ 1, the j-th real derivative of x ↦ ΓR′/ΓR(1+x)... — hmm still needs ψ derivatives. A2. ψ^{(j)}(1/2) = (−1)^{j+1} j! Σ_{m≥0}(m+1/2)^{−(j+1)} for j ≥ 1 (termwise j-fold deriv of the A1 series; uniform-on-compacts convergence of all derivative series ✓ Weierstrass M-test with Σ m^{−2}; the deriv-limit interchange — Mathlib real: `deriv` of tsum: `hasDerivAt_sum`? hmm — for series of functions: `deriv_tsum`? there might not be a direct one — the standard: `HasSum.deriv`... For ℝ: termwise deriv of a tsum needs uniform conv of the derived series + pointwise conv of the original: Mathlib has `deriv_tsum`? or `hasDerivAt_tsum`? I recall `deriv_tsum` exists in Mathlib.Analysis.Calculus.SmoothSeries or similar — `deriv_tsum (hu : ∀ y ∈ s, Summable ...)`... There's `deriv_tsum` in Mathlib/Analysis/Calculus/SmoothSeries.lean? Something like: if Σ f'_n converges uniformly and Σ f_n converges at a point, then (Σ f_n)' = Σ f'_n — yes there are such lemmas (`deriv_tsum`, `HasSum.deriv_eq_tsum`...). For ITERATED: apply j times? or induct — each derivative series again uniformly convergent ✓ — an induction on j. Moderate.) A3. Σ_{m≥0}(m+1/2)^{−(j+1)} = 2^{j+1}·lagariasA(j+1) (the odd reindexing equiv + peels). A4. j = 0: τ₀ = −a₁ via Complex.digamma_one_half ✓ (Mathlib) + the ΓR logDeriv split. A5. The coefficient extraction: iteratedDeriv j (s ↦ ΓR′/ΓR(1+s)) 0 = j!·τ_j — via the complex-analyticity + real-restriction derivative matching. Need: s ↦ ΓR′/ΓR(1+s) analytic at 0: Gammaℝ(1+s) at s=0: Gammaℝ 1 = 1 ≠ 0 ✓ analytic ✓ (differentiable_Gammaℝ? exists? — `Differentiable ℂ Gammaℝ`? Gamma is differentiable except poles; Gammaℝ = π^{−s/2}Γ(s/2) — at 1: fine ✓). logDeriv = deriv/· ✓ analytic at 0 (quotient, denom ≠ 0 near) ✓. **Piece B (the ζ piece, mostly done):** −ζ′/ζ(1+s) = 1/s + Σ_j c_j s^j near 0 — i.e., s·(−ζ′/ζ(1+s)) = hLi(1+s) analytic with hLi(1) = 1 and Taylor coefficients lcoeff j — the coefficient extraction: iteratedDeriv j (fun s => (1+s−1)·(−ζ′/ζ(1+s))) 0 /j! ... = lcoeff j. Need: (fun s => s·(−ζ′/ζ(1+s))) =ᶠ[𝓝 0] (fun s => hLi (1+s)) — from hLi_eq_near_one transported ✓ — then iteratedDeriv j of hLi(1+·) at 0 = iteratedDeriv j hLi 1 (chain rule, derivative of s ↦ 1+s is 1 — `iteratedDeriv_comp_add_const`? — exists? iteratedDeriv_comp_add_const : iteratedDeriv n (f ∘ (· + c)) x = iteratedDeriv n f (x + c)? — likely exists similar to iteratedDeriv_comp_sub_const used in LiResidue ✓ check). Then iteratedDeriv j hLi 1 / j! = lcoeff (j−1)... — careful: lcoeff k := iteratedDeriv (k+1) hLi 1/(k+1)! — so iteratedDeriv j hLi 1 = j!·lcoeff(j−1) for j ≥ 1, and = 1 for j = 0 ✓. **Piece C (the ξ moment identity — HEAVY):** σ_k = (−1)^{k+1}·(ξ′/ξ)^{(k−1)}(1)/(k−1)! for k ≥ 1... — wait, my derivation: σ_k = −g^{(k−1)}(0)/(k−1)! with g = ξ′/ξ — for k ≥ 2 via contour; k = 1 via the symmetrized kernel. THEN g^{(k−1)}(0) = (−1)^k g^{(k−1)}(1) via FE. Hmm — actually, hold on: can I get σ_k = −g^{(k−1)}(0)/(k−1)! for ALL k ≥ 1 UNIFORMLY from the symmetrized kernel K(w) = 1/(2w(1−w))·w^{...}? — the general symmetrized moment kernel: I want Σ mult·ρ^{−k} — paired: Σ (mult/2)(ρ^{−k} + ρ̄^{−k}) — the reflect-pair version: Σ (mult/2)(ρ^{−k} + (1−ρ)^{−k}) (equal by the reindexing argument — same as before: Re parts match after reindex — hmm actually for k ≥ 2 the UNPAIRED sum converges absolutely anyway (Σ|ρ|^{−k} ≤ Σ|ρ|^{−2} < ∞ for k ≥ 2) — so for k ≥ 2, sigmaP k = Σ mult·ρ^{−k} (the conj-pairing collapses: Σ (mult/2)(ρ^{−k} + ρ̄^{−k}) = Σ mult·Re(ρ^{−k}) — and Σ mult·ρ^{−k} (absolutely convergent) is real? its conj = Σ mult·ρ̄^{−k} = itself (reindex conj bijection) — so Σ mult ρ^{−k} is real and = Σ mult Re(ρ^{−k}) ✓ equal to sigmaP k ✓). So for k ≥ 2: sigmaP k = Σ mult·ρ^{−k} with absolute convergence ✓. The kernel w^{−k}: the contour identity: (1/2πi)∮ w^{−k} g(w) dw over the rectangle [−2, 3]×[−T, T] (T zero-avoiding) = Σ_{|γ|<T} mult·ρ^{−k} + Res_0 — wait 0 is inside: residue of w^{−k}g at 0 = g^{(k−1)}(0)/(k−1)! (g analytic at 0 since ξ(0) ≠ 0 ✓). As T → ∞: top/bottom → 0 (R-bound + pigeonhole + T^{−k}, k ≥ 2 ✓); the two verticals: Re = 3 side: ∫ g(3+it)(3+it)^{−k} dt and Re = −2 side: ∫ g(−2+it)(−2+it)^{−k}dt — these CONVERGE (k ≥ 2) to nonzero values!! So the limit gives: Σ mult ρ^{−k} + Res_0 = (1/2πi)[∫_{Re=3} − ∫_{Re=−2}] — and now the vertical integrals must be evaluated: Re = 3: g(3+it) = ξ′/ξ(3+it) — decompose via (4.2): = ΓR′/ΓR(3+it) + ζ′/ζ(3+it) + 1/(3+it) + 1/(2+it): the ζ′/ζ integral: −Σ Λ(n)n^{−3−it}: ∫ (3+it)^{−k} (−Σ Λ(n)/n^{3+it}) dt — SWAP sum/integral (Λ(n)/n^3 absolutely summable ✓ dominated) — termwise: ∫_{−∞}^∞ (3+it)^{−k} n^{−it} dt — this integral: substitute: n^{−it} = e^{−it log n} — ∫ (3+it)^{−k} e^{−it log n} dt = 2π·(log n)^{k−1}/(k−1)! · n^{-3} · [indicator log n > 0]·... the standard contour evaluation: ∫_{−∞}^∞ (a+it)^{−k} e^{−itx} dt = 2π e^{−a x} x^{k−1}/(k−1)! for x > 0, 0 for x < 0 (Jordan + residue at t = ia). With x = log n > 0 (n ≥ 2; Λ nonzero only for n ≥ 2... n = 0,1 have Λ = 0 ✓): = 2π n^{−3} (log n)^{k−1}/(k−1)!. So the ζ piece of the Re=3 line = −Σ_n Λ(n) n^{−3} · 2π n^{−3}(log n)^{k−1}/(k−1)!·(1/2πi)·i·... — careful with the 1/(2πi) and the i dt parametrization: (1/2πi)∫_{vertical} f(w)dw = (1/2πi)∫ f(3+it)·i dt = (1/2π)∫ f(3+it)dt. So the ζ-piece contributes (1/2π)·(−Σ Λ(n)n^{−3})·2π n^{−3}(log n)^{k−1}/(k−1)!·... = −Σ_n Λ(n)(log n)^{k−1} n^{−6}/(k−1)!?? wait n^{−3} from the Λ series times n^{−3} from the integral = n^{−6}?? That's wrong — the classical moment formulas don't have n^{−6}. Let me recheck: the integral ∫(3+it)^{−k} n^{−it}dt — the evaluation: write w = 3+it: ∫ along Re 3: (1/i)∫ w^{−k} n^{−(w−3)}dw·... hmm n^{−it} = n^{−(w−3)} = n^3·n^{−w}·... so (3+it)^{−k}n^{−it} = w^{−k} n^{3−w}·n^{-3}... I'm making errors. Redo: with w = 3 + it: n^{−it} = e^{−it log n}; and the Laplace integral ∫_{−∞}^{∞} (3+it)^{−k} e^{−itx} dt — set u = 3+it, du = i dt: ∫_{3−i∞}^{3+i∞} u^{−k} e^{−(u−3)x} (du/i) = (e^{3x}/i)·∫_{Re 3} u^{−k} e^{−ux} du = (e^{3x}/i)·(−2πi)·Res_{u=0}[u^{−k}e^{−ux}] (close LEFT for x > 0 — the contour at infinity left: |e^{−ux}| = e^{−x Re u} → 0 for Re u → −∞ when x > 0 ✓; winding: closing left gives clockwise ⟹ minus sign...). Res_{u=0} u^{−k}e^{−ux} = (−x)^{k−1}/(k−1)! (coefficient of u^{k−1} in e^{−ux} = (−x)^{k−1}/(k−1)!). So ∫ = (e^{3x}/i)·(−2πi)·(−x)^{k−1}/(k−1)!·(−1 for clockwise?)... I always mess up these signs; the point is it's (±)2π·e^{3x}(∓x)^{k−1}/(k−1)! — with e^{3x} = n^3 — so the n^{−3} from the Λ-series CANCELS with the n^3 from e^{3x} ✓✓ leaving n^0... wait: the term was Λ(n)n^{−3}·[integral] with integral ∝ e^{3x}x^{k−1} = n^3 (log n)^{k−1} — product: Λ(n)(log n)^{k−1} ✓ NO n-power left ✓✓ phew. So the ζ-piece of the Re=3 vertical = ∝ Σ_n Λ(n)(log n)^{k−1}/(k−1)! — THE PRIME MOMENT — and THIS is the η_{k−1}-content (Lagarias's η_j = (−1)^j/j! lim [Σ_{m≤N} Λ(m)(log m)^j/m − (log N)^{j+1}/(j+1)] — the (4.14) form — has 1/m in it!). Hmm — my quick calc gave Σ Λ(n)(log n)^{k−1} without 1/n — because the vertical line should be at Re... the η's have 1/m — my kernel/placement is off — probably the vertical for σ_k should be at Re... never mind the details — the POINT stands: the contour route produces PRIME-SUM expressions, which then need separate evaluation/relation to c's (the η-formulas (4.14)) — MORE identities, each itself a contour/limit theorem. This route is a swamp. **DECISION**: the Hadamard-coefficient route (β1, Lagarias's own proof) is the right one — it directly produces the coefficient identity without prime sums. Its content: (C1) The log-product function: L(s) := Σ_ρ mult·(log(1 − s/ρ) + s/ρ) — uniformly absolutely convergent on the small zero-free disk around 0 (zero-free disk exists by continuity of ξ at 0, ξ(0) = 1/2). Analytic on the disk (Weierstrass locally-uniform-limit theorem — IN MATHLIB ✓). L(0) = 0, and termwise deriv: L′(s) = Σ mult·(−1/ρ·1/(1−s/ρ) + 1/ρ) = Σ mult·[1/ρ − 1/(ρ−s)] — hmm sign: d/ds log(1−s/ρ) = (−1/ρ)/(1−s/ρ) = −1/(ρ−s); d/ds(s/ρ) = 1/ρ. So L′(s) = Σ mult·(1/ρ − 1/(ρ−s)) = Σ mult·(−s)/(ρ(ρ−s))·... = −s·Σ mult/(ρ(ρ−s)) ✓. At 0: L′(0) = 0. Taylor coefficients of L′ at 0: (d/ds)^m [1/ρ − 1/(ρ−s)] = −m!/(ρ−s)^{m+1} — at 0: −m!/ρ^{m+1} — so L′^{(m)}(0) = −m! σ_{m+1} for m ≥ 1, L′(0) = 0. So −L′(s) = Σ_{m≥1} σ_{m+1} s^m ✓ (the Taylor series of −L′ converges on the disk since −L′ analytic there ✓ — need: analytic ⟹ Taylor series converges to the function on disks — Mathlib: `AnalyticAt.hasSum...`? there's `AnalyticOnNhd.hasFPowerSeriesOnBall` ✓ exists I'm sure). (C2) ξ·exp(−L) — wait — need exp(L) = Z the product... Define E(s) := ξ(s)·exp(−L(s)) on the disk: E is analytic (ξ analytic, exp∘L analytic), and E(0) = ξ(0) = 1/2. KEY: E′ ≡ ...? NO — the content: on the disk, is E constant?? E(s) = ξ(s)e^{−L(s)} — e^{-L} = Π (1−s/ρ)^{−mult}e^{−mult·s/ρ}-inverse-ish — the quotient ξ/Z — analytic and zero-free on the disk (Z's zeros are the ρ's — none in the disk; ξ zero-free too) — but its DERIVATIVE is unconstrained locally!! The global Hadamard argument is what forces ξ/Z = e^{A+Bs} — I keep coming back to this. The local disk analysis CANNOT conclude. The identity −ξ′/ξ = Σ σ_{m+1}s^m on the disk around 0 is FALSE to prove locally — it encodes A = −σ₁ AND the higher-coefficient relations — wait — hold on. Let me recompute. On the disk: −ξ′/ξ = −L′/Z-ish...: ξ = Z·e^g GLOBALLY (Z = exp(L) extended... no — L as I defined it only converges on the small disk?? NO — L(s) = Σ mult·(log(1−s/ρ)+s/ρ) converges for every s with... for fixed s, the terms are eventually ≤ 2|s|²/|ρ|² ✓ — but the LOG BRANCH: log(1−s/ρ) — for fixed s and large |ρ| ✓ fine — but for the finitely many ρ with |ρ| ≤ 2|s|, the branch of log(1−s/ρ) — 1−s/ρ could cross the negative real axis — branch issue AGAIN. The standard fix: L is only defined/managed on the disk |s| < min|ρ| where everything is clean. Globally the product is handled via the canonical product with the e^{s/ρ} factors as an infinite PRODUCT (not log-series): Z(s) := ∏' (via HasProd over an enumeration) — branch-free! The product of the elementary factors (1−s/ρ)e^{s/ρ} — converges (absolutely, after pairing? no — the e^{s/ρ} factors make it converge WITHOUT pairing: |1 − (1−s/ρ)e^{s/ρ}| = O(|s|²/|ρ|²) ✓ — the LOG-free bound: |(1−w)e^w − 1| ≤ 3|w|² for |w| ≤ 1/2 — elementary (power series of (1−w)e^w = 1 − Σ_{n≥2} (n−1)/n! w^n ✓). So the product Π (1−s/ρ)e^{s/ρ} converges absolutely-uniformly on compacts ✓ branch-free ✓. Mathlib: `HasProd` of complex functions; absolute convergence of products: `Summable` of (f_i − 1) ⟹ product converges: there's `Summable.hasProd...`? `Complex... multipliable_of_summable_log`? or `Multipliable` via `Summable (fun i => ‖f i − 1‖)`? — I recall `Complex.multipliable_one_add` / `Multipliable.of_...`? There IS machinery: `Multipliable.of_summable...`? Hmm — `Complex.Multipliable` from `Summable (f_i − 1)` — there's a lemma about products: `multipliable_of_summable_...`? Not sure of the name. And the locally-uniform convergence of the partial products ⟹ analytic limit (Weierstrass ✓). And the ZERO SET of Z = exactly {ρ} with mults (from the product construction — each factor's zeros... — the "zeros of an infinite product" lemma: if Π f_n converges locally uniformly absolutely and each partial product's zeros are known... — this needs: Z(s) = 0 ⟺ s ∈ {ρ} — via: Z(s) = 0 ⟺ some factor 0 (product zero iff a factor zero — for convergent products with Σ|f_i − 1| < ∞ the tail product is nonzero ✓ there's a lemma: product ≠ 0 iff all factors ≠ 0 for absolutely convergent products — `Multipliable... tprod_ne_zero`? hmm). (C3) The quotient Q := ξ/Z entire zero-free ⟹ Q = e^g for an entire g — LOGARITHM EXISTENCE — on ℂ: zero-free entire functions have entire logarithms — IN MATHLIB? — earlier grep for exists_log found NOTHING in Analysis/Complex. Let me search more broadly — `AnalyticAt.log`? `Differentiable.exists_log`? There's `Complex.log` of a function... Hmm — actually there's a slicker route avoiding the log: Q zero-free entire ⟹ Q′/Q = logDeriv Q entire — and g := the primitive of Q′/Q (entire functions have primitives on ℂ — Mathlib: `Differentiable... exists_hasDerivAt`? primitives of entire functions: ℂ is simply connected — `Complex.hasPrimitives`? — the HasPrimitives.lean file! ✓ it exists (the Morera file) — primitives exist on simply connected domains ✓). Then (Q·e^{−g})′ = 0 ⟹ Q = c·e^g ✓. So Q = e^{g+c'} ✓. (C4) g linear: from order estimates: |ξ(s)| ≤ exp(C|s|log|s|) (order ≤ 1: from the FE + the explicit form on Re ≥ 1/2: |ζ(s)| polynomial growth in strips (Mathlib: riemannZeta bounds? Zeta23 has ZetaBounds! FromPNTPlus/ZetaBounds.lean ✓) and |1/ΓR| order-1 growth (Stirling — Mathlib has Stirling for complex Gamma? `Complex.Gamma... Stirling`? there's `Real.Stirling`... complex Stirling might be partial); |Z(s)| ≤ exp(C'|s|^{1+ε}) (canonical product genus-1 bound — from the factor estimate — elementary); so |e^g| = |ξ/Z| ≤ exp(C''|s|^{1+ε}) — wait — the quotient bound needs a LOWER bound on |Z| — the canonical product's lower bound on circles avoiding zeros — THAT's the delicate Hadamard/Bringing — the minimum-modulus estimate — classical pain (the "ξ/Z has order ≤ 1" requires lower bounds for Z on large circles — via the minimum modulus theorem for canonical products). Hmm — this is the genuinely technical core of Hadamard's theorem. Mathlib: `MeromorphicOn.extract_zeros_poles` was mentioned in D-064! Let me look at that — it might encapsulate exactly this machinery (the FactorizedRational mention). If Mathlib has `MeromorphicOn.extract_zeros_poles` (f meromorphic on ℂ with finitely many... no — for infinitely many zeros it's the Weierstrass factorization — does Mathlib have the WEIERSTRASS factorization theorem?! Let me check `extract_zeros_poles`. Let me search for these.
The archimedean piece has a viable path (digamma_one_half in Mathlib; polygamma values via Bohr–Mollerup's logGammaSeq). The critical question for the Hadamard route: what factorization machinery does Mathlib have?
tool: Bash
input
{
  "command": "cd \"D:/Python/Quantum/zeta-23-lean/.lake/packages/mathlib\" && grep -rn \"extract_zeros_poles\\|extractZerosPoles\" Mathlib/ --include=\"*.lean\" -l | head -5; echo ===; grep -rn \"theorem.*extract_zeros_poles\" Mathlib/ --include=\"*.lean\" | head -5",
  "description": "Find extract_zeros_poles factorization machinery"
}
raw content_json (database row)
[{"type":"thinking","thinking":"BohrMollerup has `logGammaSeq` — the Euler limit form for REAL x: `tendsto_log_gamma {x : ℝ} (hx : 0 < x) : Tendsto (logGammaSeq x) atTop (𝓝 (log (Gamma x)))` presumably, with logGammaSeq x n := x·log n + log n! − Σ_{m=0}^n log(x + m)-ish. This is REAL and for log Gamma — not the derivative series. Deriving ψ's series from this: differentiating in x through the limit — the real logGammaSeq: logGammaSeq x n = x log n + log(n!) − Σ_{m=0}^n log(x+m) — its derivative: log n − Σ_{m=0}^n 1/(x+m) → ψ(x)?? For REAL x: deriv of log Gamma = ψ ✓ (Real.digamma?). The limit interchange: deriv of the limit = limit of the derivs — needs locally uniform convergence of the derivative sequence — log n − Σ_{m=0}^n 1/(x+m) — this CONVERGES uniformly on compact subsets of (0, ∞)? The terms: log n − Σ_{m=0}^n 1/(x+m) = Σ_{m=1}^n (1/m − 1/(x+m)) + (log n − Σ_{m=1}^n 1/m) − 1/x: = Σ_{m=1}^n (1/m − 1/(x+m)) − 1/x + (log n − H_n): the first part converges uniformly on compacts (|1/m − 1/(x+m)| = x/(m(x+m)) ≤ x/m² ✓ Weierstrass), the second → −γ, so the limit = Σ_{m≥1}(1/m − 1/(x+m)) − 1/x − γ = ψ(x) ✓ the partial fraction series! And the uniform convergence of derivatives justifies ψ(x) = that series for real x > 0. Then iterated: ψ^{(j)}(x) = Σ_{m≥1} (−1)^{j+1} j!/(x+m)^{j+1}·... wait derivative of (1/m − 1/(x+m)) w.r.t. x: +1/(x+m)² — sign: d/dx[−1/(x+m)] = +1/(x+m)² ✓; j-th: (−1)^{j+1} j!/(x+m)^{j+1}·... let me just: d^j/dx^j [1/m − 1/(x+m)] = −(−1)^j j!/(x+m)^{j+1}·... d/dx (x+m)^{−1} = −(x+m)^{−2}; j-th deriv: (−1)^j j! (x+m)^{−(j+1)} — so the j-th derivative of the summand = −(−1)^j j!/(x+m)^{j+1} = (−1)^{j+1}j!/(x+m)^{j+1} ✓. And of −1/x: j-th deriv = (−1)^{j+1}j!/x^{j+1}·... d/dx (−1/x) = 1/x²; j-th: (−1)^{j+1}j!/x^{j+1}?? d^j/dx^j (−x^{−1}) = −(−1)^j j! x^{−(j+1)} = (−1)^{j+1}j!x^{−(j+1)} ✓ same form. So ψ^{(j)}(x) = (−1)^{j+1} j! Σ_{m≥0} (x+m)^{−(j+1)} (including the m = 0 term from −1/x) ✓ — for real x > 0. At x = 1/2: ψ^{(j)}(1/2) = (−1)^{j+1} j! Σ_{m≥0} (m + 1/2)^{−(j+1)} ✓✓ EXACTLY what (III) needs, for REAL 1/2.\n\nAnd the τ-coefficients: ΓR′/ΓR(1+s) — the TAYLOR coefficients in the COMPLEX variable s. Hmm — the τ_j are complex Taylor coefficients. But: ΓR′/ΓR(1+s) is analytic near 0 (Gammaℝ(1) ≠ 0 ✓ Gammaℝ_ne_zero_of_re_pos ✓). Its Taylor coefficients are determined by iteratedDeriv j [s ↦ ΓR′/ΓR(1+s)] 0 — a COMPLEX derivative. The values: iteratedDeriv of the complex function at 0 — the real directional derivatives suffice? For an analytic function, the complex iterated derivatives at a real point are determined by the real ones: iteratedDeriv j f 0 for f analytic — f's restriction to ℝ: iteratedDeriv j (f ∘ ofReal) 0 = iteratedDeriv j f 0 (chain rule, derivative of ofReal is 1) — there's `Complex... iteratedDeriv_ofReal...`? The composition f(ofReal r): deriv = deriv f · 1 ✓ — so the complex Taylor coefficients at 0 = the real-line derivatives ✓. So it suffices to compute real-line derivatives of r ↦ ΓR′/ΓR(1+r) at r = 0 — and ΓR′/ΓR(1+r) = −(log π)/2 + (1/2)ψ((1+r)/2) with REAL ψ — hmm — need Complex.digamma of a real = Real.digamma-ish? Mathlib: Real.digamma? hmm — the Digamma.lean file is Complex. Real version: `Real.digamma`? probably not — but Complex.digamma of Real.cast: ψ(↑x) = ↑(real ψ)? — is there `Complex.digamma_ofReal`? Probably NOT directly — but derivability: Complex.digamma = logDeriv Complex.Gamma; for real x > 0, Complex.Gamma ↑x = ↑(Real.Gamma x) (`Complex.Gamma_ofReal`? there's `Complex.ofReal_Gamma`? hmm — `Complex.Gamma_ofReal : Complex.Gamma ↑r = ↑(Real.Gamma r)`? not sure of name).\n\nThis real/complex bridging is mechanical-but-fiddly Lean work. OK.\n\nSo the FULL ii′-3 work plan (route β1-direct, coefficient form):\n\n**Piece A (archimedean, moderate-heavy):** \n  A1. ψ(x) = −1/x − γ + Σ_{m≥1}(1/m − 1/(x+m)) for real x > 0 — from logGammaSeq + deriv-under-locally-uniform-limit (Real analysis).\n      Wait — actually Mathlib might have Real.digamma... let me check. If not, I need Real.digamma defined — hmm — or work with the REAL function ψ_real x := deriv (Real.log ∘ Real.Gamma) x? Define it locally in my file.\n      A1-alt: directly prove the needed coefficient statement: for j ≥ 1, the j-th real derivative of x ↦ ΓR′/ΓR(1+x)... — hmm still needs ψ derivatives.\n  A2. ψ^{(j)}(1/2) = (−1)^{j+1} j! Σ_{m≥0}(m+1/2)^{−(j+1)} for j ≥ 1 (termwise j-fold deriv of the A1 series; uniform-on-compacts convergence of all derivative series ✓ Weierstrass M-test with Σ m^{−2}; the deriv-limit interchange — Mathlib real: `deriv` of tsum: `hasDerivAt_sum`? hmm — for series of functions: `deriv_tsum`? there might not be a direct one — the standard: `HasSum.deriv`... For ℝ: termwise deriv of a tsum needs uniform conv of the derived series + pointwise conv of the original: Mathlib has `deriv_tsum`? or `hasDerivAt_tsum`? I recall `deriv_tsum` exists in Mathlib.Analysis.Calculus.SmoothSeries or similar — `deriv_tsum (hu : ∀ y ∈ s, Summable ...)`... There's `deriv_tsum` in Mathlib/Analysis/Calculus/SmoothSeries.lean? Something like: if Σ f'_n converges uniformly and Σ f_n converges at a point, then (Σ f_n)' = Σ f'_n — yes there are such lemmas (`deriv_tsum`, `HasSum.deriv_eq_tsum`...). For ITERATED: apply j times? or induct — each derivative series again uniformly convergent ✓ — an induction on j. Moderate.)\n  A3. Σ_{m≥0}(m+1/2)^{−(j+1)} = 2^{j+1}·lagariasA(j+1) (the odd reindexing equiv + peels).\n  A4. j = 0: τ₀ = −a₁ via Complex.digamma_one_half ✓ (Mathlib) + the ΓR logDeriv split.\n  A5. The coefficient extraction: iteratedDeriv j (s ↦ ΓR′/ΓR(1+s)) 0 = j!·τ_j — via the complex-analyticity + real-restriction derivative matching. Need: s ↦ ΓR′/ΓR(1+s) analytic at 0: Gammaℝ(1+s) at s=0: Gammaℝ 1 = 1 ≠ 0 ✓ analytic ✓ (differentiable_Gammaℝ? exists? — `Differentiable ℂ Gammaℝ`? Gamma is differentiable except poles; Gammaℝ = π^{−s/2}Γ(s/2) — at 1: fine ✓). logDeriv = deriv/· ✓ analytic at 0 (quotient, denom ≠ 0 near) ✓.\n\n**Piece B (the ζ piece, mostly done):** −ζ′/ζ(1+s) = 1/s + Σ_j c_j s^j near 0 — i.e., s·(−ζ′/ζ(1+s)) = hLi(1+s) analytic with hLi(1) = 1 and Taylor coefficients lcoeff j — the coefficient extraction: iteratedDeriv j (fun s => (1+s−1)·(−ζ′/ζ(1+s))) 0 /j! ... = lcoeff j. Need: (fun s => s·(−ζ′/ζ(1+s))) =ᶠ[𝓝 0] (fun s => hLi (1+s)) — from hLi_eq_near_one transported ✓ — then iteratedDeriv j of hLi(1+·) at 0 = iteratedDeriv j hLi 1 (chain rule, derivative of s ↦ 1+s is 1 — `iteratedDeriv_comp_add_const`? — exists? iteratedDeriv_comp_add_const : iteratedDeriv n (f ∘ (· + c)) x = iteratedDeriv n f (x + c)? — likely exists similar to iteratedDeriv_comp_sub_const used in LiResidue ✓ check). Then iteratedDeriv j hLi 1 / j! = lcoeff (j−1)... — careful: lcoeff k := iteratedDeriv (k+1) hLi 1/(k+1)! — so iteratedDeriv j hLi 1 = j!·lcoeff(j−1) for j ≥ 1, and = 1 for j = 0 ✓.\n\n**Piece C (the ξ moment identity — HEAVY):** σ_k = (−1)^{k+1}·(ξ′/ξ)^{(k−1)}(1)/(k−1)! for k ≥ 1... — wait, my derivation: σ_k = −g^{(k−1)}(0)/(k−1)! with g = ξ′/ξ — for k ≥ 2 via contour; k = 1 via the symmetrized kernel. THEN g^{(k−1)}(0) = (−1)^k g^{(k−1)}(1) via FE. Hmm — actually, hold on: can I get σ_k = −g^{(k−1)}(0)/(k−1)! for ALL k ≥ 1 UNIFORMLY from the symmetrized kernel K(w) = 1/(2w(1−w))·w^{...}? — the general symmetrized moment kernel: I want Σ mult·ρ^{−k} — paired: Σ (mult/2)(ρ^{−k} + ρ̄^{−k}) — the reflect-pair version: Σ (mult/2)(ρ^{−k} + (1−ρ)^{−k}) (equal by the reindexing argument — same as before: Re parts match after reindex — hmm actually for k ≥ 2 the UNPAIRED sum converges absolutely anyway (Σ|ρ|^{−k} ≤ Σ|ρ|^{−2} < ∞ for k ≥ 2) — so for k ≥ 2, sigmaP k = Σ mult·ρ^{−k} (the conj-pairing collapses: Σ (mult/2)(ρ^{−k} + ρ̄^{−k}) = Σ mult·Re(ρ^{−k}) — and Σ mult·ρ^{−k} (absolutely convergent) is real? its conj = Σ mult·ρ̄^{−k} = itself (reindex conj bijection) — so Σ mult ρ^{−k} is real and = Σ mult Re(ρ^{−k}) ✓ equal to sigmaP k ✓). So for k ≥ 2: sigmaP k = Σ mult·ρ^{−k} with absolute convergence ✓.\n  The kernel w^{−k}: the contour identity: (1/2πi)∮ w^{−k} g(w) dw over the rectangle [−2, 3]×[−T, T] (T zero-avoiding) = Σ_{|γ|<T} mult·ρ^{−k} + Res_0 — wait 0 is inside: residue of w^{−k}g at 0 = g^{(k−1)}(0)/(k−1)! (g analytic at 0 since ξ(0) ≠ 0 ✓). As T → ∞: top/bottom → 0 (R-bound + pigeonhole + T^{−k}, k ≥ 2 ✓); the two verticals: Re = 3 side: ∫ g(3+it)(3+it)^{−k} dt and Re = −2 side: ∫ g(−2+it)(−2+it)^{−k}dt — these CONVERGE (k ≥ 2) to nonzero values!! So the limit gives: Σ mult ρ^{−k} + Res_0 = (1/2πi)[∫_{Re=3} − ∫_{Re=−2}] — and now the vertical integrals must be evaluated: Re = 3: g(3+it) = ξ′/ξ(3+it) — decompose via (4.2): = ΓR′/ΓR(3+it) + ζ′/ζ(3+it) + 1/(3+it) + 1/(2+it): the ζ′/ζ integral: −Σ Λ(n)n^{−3−it}: ∫ (3+it)^{−k} (−Σ Λ(n)/n^{3+it}) dt — SWAP sum/integral (Λ(n)/n^3 absolutely summable ✓ dominated) — termwise: ∫_{−∞}^∞ (3+it)^{−k} n^{−it} dt — this integral: substitute: n^{−it} = e^{−it log n} — ∫ (3+it)^{−k} e^{−it log n} dt = 2π·(log n)^{k−1}/(k−1)! · n^{-3} · [indicator log n > 0]·... the standard contour evaluation: ∫_{−∞}^∞ (a+it)^{−k} e^{−itx} dt = 2π e^{−a x} x^{k−1}/(k−1)! for x > 0, 0 for x < 0 (Jordan + residue at t = ia). With x = log n > 0 (n ≥ 2; Λ nonzero only for n ≥ 2... n = 0,1 have Λ = 0 ✓): = 2π n^{−3} (log n)^{k−1}/(k−1)!. So the ζ piece of the Re=3 line = −Σ_n Λ(n) n^{−3} · 2π n^{−3}(log n)^{k−1}/(k−1)!·(1/2πi)·i·... — careful with the 1/(2πi) and the i dt parametrization: (1/2πi)∫_{vertical} f(w)dw = (1/2πi)∫ f(3+it)·i dt = (1/2π)∫ f(3+it)dt. So the ζ-piece contributes (1/2π)·(−Σ Λ(n)n^{−3})·2π n^{−3}(log n)^{k−1}/(k−1)!·... = −Σ_n Λ(n)(log n)^{k−1} n^{−6}/(k−1)!?? wait n^{−3} from the Λ series times n^{−3} from the integral = n^{−6}?? That's wrong — the classical moment formulas don't have n^{−6}. Let me recheck: the integral ∫(3+it)^{−k} n^{−it}dt — the evaluation: write w = 3+it: ∫ along Re 3: (1/i)∫ w^{−k} n^{−(w−3)}dw·... hmm n^{−it} = n^{−(w−3)} = n^3·n^{−w}·... so (3+it)^{−k}n^{−it} = w^{−k} n^{3−w}·n^{-3}... I'm making errors. Redo: with w = 3 + it: n^{−it} = e^{−it log n}; and the Laplace integral ∫_{−∞}^{∞} (3+it)^{−k} e^{−itx} dt — set u = 3+it, du = i dt: ∫_{3−i∞}^{3+i∞} u^{−k} e^{−(u−3)x} (du/i) = (e^{3x}/i)·∫_{Re 3} u^{−k} e^{−ux} du = (e^{3x}/i)·(−2πi)·Res_{u=0}[u^{−k}e^{−ux}] (close LEFT for x > 0 — the contour at infinity left: |e^{−ux}| = e^{−x Re u} → 0 for Re u → −∞ when x > 0 ✓; winding: closing left gives clockwise ⟹ minus sign...). Res_{u=0} u^{−k}e^{−ux} = (−x)^{k−1}/(k−1)! (coefficient of u^{k−1} in e^{−ux} = (−x)^{k−1}/(k−1)!). So ∫ = (e^{3x}/i)·(−2πi)·(−x)^{k−1}/(k−1)!·(−1 for clockwise?)... I always mess up these signs; the point is it's (±)2π·e^{3x}(∓x)^{k−1}/(k−1)! — with e^{3x} = n^3 — so the n^{−3} from the Λ-series CANCELS with the n^3 from e^{3x} ✓✓ leaving n^0... wait: the term was Λ(n)n^{−3}·[integral] with integral ∝ e^{3x}x^{k−1} = n^3 (log n)^{k−1} — product: Λ(n)(log n)^{k−1} ✓ NO n-power left ✓✓ phew. So the ζ-piece of the Re=3 vertical = ∝ Σ_n Λ(n)(log n)^{k−1}/(k−1)! — THE PRIME MOMENT — and THIS is the η_{k−1}-content (Lagarias's η_j = (−1)^j/j! lim [Σ_{m≤N} Λ(m)(log m)^j/m − (log N)^{j+1}/(j+1)] — the (4.14) form — has 1/m in it!). Hmm — my quick calc gave Σ Λ(n)(log n)^{k−1} without 1/n — because the vertical line should be at Re... the η's have 1/m — my kernel/placement is off — probably the vertical for σ_k should be at Re... never mind the details — the POINT stands: the contour route produces PRIME-SUM expressions, which then need separate evaluation/relation to c's (the η-formulas (4.14)) — MORE identities, each itself a contour/limit theorem. This route is a swamp.\n\n**DECISION**: the Hadamard-coefficient route (β1, Lagarias's own proof) is the right one — it directly produces the coefficient identity without prime sums. Its content:\n(C1) The log-product function: L(s) := Σ_ρ mult·(log(1 − s/ρ) + s/ρ) — uniformly absolutely convergent on the small zero-free disk around 0 (zero-free disk exists by continuity of ξ at 0, ξ(0) = 1/2). Analytic on the disk (Weierstrass locally-uniform-limit theorem — IN MATHLIB ✓). L(0) = 0, and termwise deriv: L′(s) = Σ mult·(−1/ρ·1/(1−s/ρ) + 1/ρ) = Σ mult·[1/ρ − 1/(ρ−s)] — hmm sign: d/ds log(1−s/ρ) = (−1/ρ)/(1−s/ρ) = −1/(ρ−s); d/ds(s/ρ) = 1/ρ. So L′(s) = Σ mult·(1/ρ − 1/(ρ−s)) = Σ mult·(−s)/(ρ(ρ−s))·... = −s·Σ mult/(ρ(ρ−s)) ✓. At 0: L′(0) = 0. Taylor coefficients of L′ at 0: (d/ds)^m [1/ρ − 1/(ρ−s)] = −m!/(ρ−s)^{m+1} — at 0: −m!/ρ^{m+1} — so L′^{(m)}(0) = −m! σ_{m+1} for m ≥ 1, L′(0) = 0. So −L′(s) = Σ_{m≥1} σ_{m+1} s^m ✓ (the Taylor series of −L′ converges on the disk since −L′ analytic there ✓ — need: analytic ⟹ Taylor series converges to the function on disks — Mathlib: `AnalyticAt.hasSum...`? there's `AnalyticOnNhd.hasFPowerSeriesOnBall` ✓ exists I'm sure).\n(C2) ξ·exp(−L) — wait — need exp(L) = Z the product... Define E(s) := ξ(s)·exp(−L(s)) on the disk: E is analytic (ξ analytic, exp∘L analytic), and E(0) = ξ(0) = 1/2. KEY: E′ ≡ ...? NO — the content: on the disk, is E constant?? E(s) = ξ(s)e^{−L(s)} — e^{-L} = Π (1−s/ρ)^{−mult}e^{−mult·s/ρ}-inverse-ish — the quotient ξ/Z — analytic and zero-free on the disk (Z's zeros are the ρ's — none in the disk; ξ zero-free too) — but its DERIVATIVE is unconstrained locally!! The global Hadamard argument is what forces ξ/Z = e^{A+Bs} — I keep coming back to this. The local disk analysis CANNOT conclude. The identity −ξ′/ξ = Σ σ_{m+1}s^m on the disk around 0 is FALSE to prove locally — it encodes A = −σ₁ AND the higher-coefficient relations — wait — hold on. Let me recompute. On the disk: −ξ′/ξ = −L′/Z-ish...: ξ = Z·e^g GLOBALLY (Z = exp(L) extended... no — L as I defined it only converges on the small disk?? NO — L(s) = Σ mult·(log(1−s/ρ)+s/ρ) converges for every s with... for fixed s, the terms are eventually ≤ 2|s|²/|ρ|² ✓ — but the LOG BRANCH: log(1−s/ρ) — for fixed s and large |ρ| ✓ fine — but for the finitely many ρ with |ρ| ≤ 2|s|, the branch of log(1−s/ρ) — 1−s/ρ could cross the negative real axis — branch issue AGAIN. The standard fix: L is only defined/managed on the disk |s| < min|ρ| where everything is clean. Globally the product is handled via the canonical product with the e^{s/ρ} factors as an infinite PRODUCT (not log-series): Z(s) := ∏' (via HasProd over an enumeration) — branch-free! The product of the elementary factors (1−s/ρ)e^{s/ρ} — converges (absolutely, after pairing? no — the e^{s/ρ} factors make it converge WITHOUT pairing: |1 − (1−s/ρ)e^{s/ρ}| = O(|s|²/|ρ|²) ✓ — the LOG-free bound: |(1−w)e^w − 1| ≤ 3|w|² for |w| ≤ 1/2 — elementary (power series of (1−w)e^w = 1 − Σ_{n≥2} (n−1)/n! w^n ✓). So the product Π (1−s/ρ)e^{s/ρ} converges absolutely-uniformly on compacts ✓ branch-free ✓. Mathlib: `HasProd` of complex functions; absolute convergence of products: `Summable` of (f_i − 1) ⟹ product converges: there's `Summable.hasProd...`? `Complex... multipliable_of_summable_log`? or `Multipliable` via `Summable (fun i => ‖f i − 1‖)`? — I recall `Complex.multipliable_one_add` / `Multipliable.of_...`? There IS machinery: `Multipliable.of_summable...`? Hmm — `Complex.Multipliable` from `Summable (f_i − 1)` — there's a lemma about products: `multipliable_of_summable_...`? Not sure of the name. And the locally-uniform convergence of the partial products ⟹ analytic limit (Weierstrass ✓). And the ZERO SET of Z = exactly {ρ} with mults (from the product construction — each factor's zeros... — the \"zeros of an infinite product\" lemma: if Π f_n converges locally uniformly absolutely and each partial product's zeros are known... — this needs: Z(s) = 0 ⟺ s ∈ {ρ} — via: Z(s) = 0 ⟺ some factor 0 (product zero iff a factor zero — for convergent products with Σ|f_i − 1| < ∞ the tail product is nonzero ✓ there's a lemma: product ≠ 0 iff all factors ≠ 0 for absolutely convergent products — `Multipliable... tprod_ne_zero`? hmm).\n(C3) The quotient Q := ξ/Z entire zero-free ⟹ Q = e^g for an entire g — LOGARITHM EXISTENCE — on ℂ: zero-free entire functions have entire logarithms — IN MATHLIB? — earlier grep for exists_log found NOTHING in Analysis/Complex. Let me search more broadly — `AnalyticAt.log`? `Differentiable.exists_log`? There's `Complex.log` of a function... Hmm — actually there's a slicker route avoiding the log: Q zero-free entire ⟹ Q′/Q = logDeriv Q entire — and g := the primitive of Q′/Q (entire functions have primitives on ℂ — Mathlib: `Differentiable... exists_hasDerivAt`? primitives of entire functions: ℂ is simply connected — `Complex.hasPrimitives`? — the HasPrimitives.lean file! ✓ it exists (the Morera file) — primitives exist on simply connected domains ✓). Then (Q·e^{−g})′ = 0 ⟹ Q = c·e^g ✓. So Q = e^{g+c'} ✓.\n(C4) g linear: from order estimates: |ξ(s)| ≤ exp(C|s|log|s|) (order ≤ 1: from the FE + the explicit form on Re ≥ 1/2: |ζ(s)| polynomial growth in strips (Mathlib: riemannZeta bounds? Zeta23 has ZetaBounds! FromPNTPlus/ZetaBounds.lean ✓) and |1/ΓR| order-1 growth (Stirling — Mathlib has Stirling for complex Gamma? `Complex.Gamma... Stirling`? there's `Real.Stirling`... complex Stirling might be partial); |Z(s)| ≤ exp(C'|s|^{1+ε}) (canonical product genus-1 bound — from the factor estimate — elementary); so |e^g| = |ξ/Z| ≤ exp(C''|s|^{1+ε}) — wait — the quotient bound needs a LOWER bound on |Z| — the canonical product's lower bound on circles avoiding zeros — THAT's the delicate Hadamard/Bringing — the minimum-modulus estimate — classical pain (the \"ξ/Z has order ≤ 1\" requires lower bounds for Z on large circles — via the minimum modulus theorem for canonical products). Hmm — this is the genuinely technical core of Hadamard's theorem. Mathlib: `MeromorphicOn.extract_zeros_poles` was mentioned in D-064! Let me look at that — it might encapsulate exactly this machinery (the FactorizedRational mention). If Mathlib has `MeromorphicOn.extract_zeros_poles` (f meromorphic on ℂ with finitely many... no — for infinitely many zeros it's the Weierstrass factorization — does Mathlib have the WEIERSTRASS factorization theorem?! Let me check `extract_zeros_poles`.\n\nLet me search for these.","signature":""},{"type":"text","text":"The archimedean piece has a viable path (digamma_one_half in Mathlib; polygamma values via Bohr–Mollerup's logGammaSeq). The critical question for the Hadamard route: what factorization machinery does Mathlib have?"},{"type":"tool_use","id":"Bash_175","name":"Bash","input":{"command":"cd \"D:/Python/Quantum/zeta-23-lean/.lake/packages/mathlib\" && grep -rn \"extract_zeros_poles\\|extractZerosPoles\" Mathlib/ --include=\"*.lean\" -l | head -5; echo ===; grep -rn \"theorem.*extract_zeros_poles\" Mathlib/ --include=\"*.lean\" | head -5","description":"Find extract_zeros_poles factorization machinery"},"extra_content":null}]