Paper IV · Lean source

HurwitzLattice.lean

Selected results recorded Coverage and evidence

Compiler/replay evidence is reported for a subset or bounded block. No whole-work coverage is implied.

This viewer reads the retained source; it does not run Lean or assign new claim mappings.

KomorebiPaperIV/HurwitzLattice.lean120 lines

Original source pathPaper_IV_Verification_Closeout_v1.1.0/formalization/lean/KomorebiPaperIV/HurwitzLattice.lean
Skip declarations and read code

Skip source text

1 /-
2 Copyright (c) 2026 Komorebi P. All rights reserved.
3 Authors: Komorebi P.
4 -/
5 import Mathlib.NumberTheory.LSeries.HurwitzZeta
6 import Mathlib.Analysis.Meromorphic.Order
7 import Mathlib.Analysis.Complex.RemovableSingularity
8 
9 namespace Komorebi.PaperIV
10 noncomputable section
11 open Set Filter Complex
12 open scoped Topology
13 
14 /-- The entire remainder in Mathlib's regularized Hurwitz representation. -/
15 def hurwitzRegularPart (a : UnitAddCircle) (s : ℂ) : ℂ :=
16   HurwitzZeta.hurwitzZeta a s - (s - 1)⁻¹ * (Gammaℝ s)⁻¹
17 
18 theorem hurwitzRegularPart_entire (a : UnitAddCircle) :
19     Differentiable ℂ (hurwitzRegularPart a) := by
20   unfold hurwitzRegularPart
21   intro s
22   by_cases hs : s = 1
23   · subst s
24     simpa only [one_div, div_eq_mul_inv, one_mul] using!
25       HurwitzZeta.differentiableAt_hurwitzZeta_sub_one_div a
26   · exact (HurwitzZeta.differentiableAt_hurwitzZeta a hs).sub
27       (((show DifferentiableAt ℂ (fun z : ℂ => z - 1) s by fun_prop).inv (sub_ne_zero.mpr hs)).mul
28         (differentiable_Gammaℝ_inv s))
29 
30 theorem hurwitzZeta_meromorphicAt (a : UnitAddCircle) (s : ℂ) :
31     MeromorphicAt (HurwitzZeta.hurwitzZeta a) s := by
32   have he : HurwitzZeta.hurwitzZeta a = fun z => hurwitzRegularPart a z +
33       (z - 1)⁻¹ * (Gammaℝ z)⁻¹ := by funext z; unfold hurwitzRegularPart; ring
34   rw [he]
35   exact ((hurwitzRegularPart_entire a).analyticAt s).meromorphicAt.add
36     ((((MeromorphicAt.id s).sub (MeromorphicAt.const 1 s)).inv).mul
37       ((differentiable_Gammaℝ_inv.analyticAt s).meromorphicAt))
38 
39 /-- Positive lattice model, with argument scaled by the integer d. -/
40 def hurwitzLatticeModel (A : ℝ) (d : ℕ) (s : ℂ) : ℂ :=
41   exp (-((d : ℂ) * s) * (Real.log A : ℂ)) *
42     HurwitzZeta.hurwitzZeta (1 / 2 : ℝ) ((d : ℂ) * s)
43 
44 theorem hurwitzLatticeModel_meromorphicAt (A : ℝ) (d : ℕ) (s : ℂ) :
45     MeromorphicAt (hurwitzLatticeModel A d) s := by
46   apply MeromorphicAt.mul
47   · exact (show Differentiable ℂ (fun z : ℂ => exp (-((d : ℂ) * z) * (Real.log A : ℂ))) by
48       fun_prop).analyticAt s |>.meromorphicAt
49   · exact (hurwitzZeta_meromorphicAt _ _).comp_analyticAt (by fun_prop)
50 
51 theorem hurwitzLatticeModel_differentiableAt {A : ℝ} {d : ℕ} (hd : 0 < d)
52     {s : ℂ} (hs : s ≠ 1 / (d : ℂ)) : DifferentiableAt ℂ (hurwitzLatticeModel A d) s := by
53   have hd0 : (d : ℂ) ≠ 0 := Nat.cast_ne_zero.mpr hd.ne'
54   have hds : (d : ℂ) * s ≠ 1 := by
55     intro h
56     apply hs
57     apply (eq_div_iff hd0).mpr
58     simpa only [mul_comm] using h
59   apply DifferentiableAt.mul
60   · fun_prop
61   · exact (HurwitzZeta.differentiableAt_hurwitzZeta _ hds).comp s (by fun_prop)
62 
63 theorem hurwitzLatticeModel_residue {A : ℝ} (hA : 0 < A) {d : ℕ} (hd : 0 < d) :
64     Tendsto (fun s : ℂ => (s - 1 / (d : ℂ)) * hurwitzLatticeModel A d s)
65       (𝓝[≠] (1 / (d : ℂ))) (𝓝 (1 / ((d : ℂ) * A))) := by
66   have hd0 : (d : ℂ) ≠ 0 := Nat.cast_ne_zero.mpr hd.ne'
67   have ht : Tendsto (fun s : ℂ => (d : ℂ) * s) (𝓝[≠] (1 / (d : ℂ))) (𝓝[≠] 1) := by
68     rw [tendsto_nhdsWithin_iff]
69     constructor
70     · simpa only [mul_one_div_cancel hd0] using
71         ((show Continuous (fun s : ℂ => (d : ℂ) * s) by fun_prop).tendsto (1 / (d : ℂ))).mono_left nhdsWithin_le_nhds
72     · filter_upwards [self_mem_nhdsWithin] with s hs
73       change s ≠ 1 / (d : ℂ) at hs
74       change (d : ℂ) * s ≠ 1
75       intro h
76       exact hs ((eq_div_iff hd0).mpr (by simpa only [mul_comm] using h))
77   have hz := (HurwitzZeta.hurwitzZeta_residue_one (1 / 2 : ℝ)).comp ht
78   have he : Tendsto (fun s : ℂ => exp (-((d : ℂ) * s) * (Real.log A : ℂ)))
79       (𝓝[≠] (1 / (d : ℂ))) (𝓝 ((A : ℂ)⁻¹)) := by
80     have h := (show Continuous (fun s : ℂ => exp (-((d : ℂ) * s) * (Real.log A : ℂ))) by
81       fun_prop).tendsto (1 / (d : ℂ))
82     have hv : exp (-((d : ℂ) * (1 / (d : ℂ))) * (Real.log A : ℂ)) = (A : ℂ)⁻¹ := by
83       rw [mul_one_div_cancel hd0, neg_one_mul, exp_neg, ← ofReal_exp, Real.exp_log hA]
84     rw [hv] at h
85     exact h.mono_left nhdsWithin_le_nhds
86   have h := (he.mul hz).const_mul (1 / (d : ℂ))
87   convert h using 1
88   · funext s
89     simp only [Function.comp_apply, hurwitzLatticeModel]
90     field_simp
91   · congr 1
92     field_simp
93 
94 /-- A nonzero punctured residue makes the pole genuinely simple. -/
95 theorem meromorphicOrderAt_eq_neg_one_of_residue {f : ℂ → ℂ} {p r : ℂ}
96     (hf : MeromorphicAt f p) (hd : ∀ z, z ≠ p → DifferentiableAt ℂ f z)
97     (hr : r ≠ 0)
98     (ht : Tendsto (fun z => (z - p) * f z) (𝓝[≠] p) (𝓝 r)) :
99     meromorphicOrderAt f p = (-1 : ℤ) := by
100   classical
101   let g := Function.update (fun z => (z - p) * f z) p r
102   have hg : AnalyticAt ℂ g p := by
103     apply Complex.analyticAt_of_differentiable_on_punctured_nhds_of_continuousAt
104     · filter_upwards [self_mem_nhdsWithin] with z hz
105       have hz0 : z ≠ p := hz
106       have he : g =ᶠ[𝓝 z] (fun w => (w - p) * f w) := by
107         filter_upwards [eventually_ne_nhds hz0] with w hw
108         exact Function.update_of_ne hw _ _
109       exact (((differentiableAt_id.sub_const p).mul (hd z hz0))).congr_of_eventuallyEq he
110     · exact continuousAt_update_same.mpr ht
111   apply (meromorphicOrderAt_eq_int_iff hf).mpr
112   refine ⟨g, hg, ?_, ?_⟩
113   · simpa only [g, Function.update_self] using hr
114   · filter_upwards [self_mem_nhdsWithin] with z hz
115     have hz0 : z ≠ p := hz
116     simp only [g, Function.update_of_ne hz0, zpow_neg_one, smul_eq_mul]
117     field_simp
118 
119 end
120 end Komorebi.PaperIV

Back to source controls

Original file and source record

This copy matches the recorded source file. Its publication here does not change the work’s review status.

SHA-256: 3068346d0c9566549cbec4196186b28b009916892d6d5cb22e11f8a0442393d6

Original source on GitHub

Back to Paper IV: Cyclic Analytic Functions, Reciprocal Families, and Spectral Zero Data