The theta-product layer: functional-equation pairs, Eisenstein parity pairs, and the Hecke theta lattice L-functions
DefinitionSEF_thetaThe first definition bundle of the mission: the theta-product layer transcribed verbatim from the source file. The definition carries: the product and the rescaling constructions for Mathlib's WeakFEPair, the abstract framework of functional-equation pairs - the product of two pairs, with the rapid-decay estimates for the deviations of the factors from their limiting values, and the rescaling of a pair by a positive factor acting on the f-component and by its inverse on the g-component, with the shifted exponent carried into the epsilon factor; the pairs built from the Hurwitz zeta even kernel: the shifted pair of two kernels, the scaled pair at positive scales, and the rectangular pair combining two scaled pairs; the Eisenstein parity pairs: the x-shift and the y-shift of the parity construction over the two-element index, producing a pair of weight L^2 and 3 L^2 from two points of the additive circle and a positive L; and the Hecke theta layer: the finite weighted pair (a finite weighted sum of pairs of weight one), the period-grid pair of an N x N coefficient array over the parity pairs, its completed L-function (the completed transform of the pair), and the normalized lattice L-function latticeL (pi^s times the inverse of the Gamma function times the completed L-function).
import Mathlib
/-!
# SEF_theta: the theta-product layer of the seven-eighths zero-free line program
The first of the two definition bundles of the mission on the $7/8$ zero-free line.
This module transcribes, verbatim, the theta-product layer of the user-supplied
Lean 4 statement file `HeckeSevenEighths.lean.txt` (namespaces
`OAI.SevenEighths.ThetaProduct`, `OAI.SevenEighths.EisensteinTheta`, and
`OAI.SevenEighths.HeckeTheta`): the product and rescaling constructions for
Mathlib's `WeakFEPair` (the abstract functional-equation framework of
`Mathlib.NumberTheory.LSeries.AbstractFuncEq`), the shifted, scaled, and
rectangular pairs built from the Hurwitz zeta even kernel
(`HurwitzZeta.hurwitzEvenFEPair`), the Eisenstein parity pairs of
`xShift`/`yShift`, and the Hecke theta layer: finite weighted sums of parity
pairs (`finitePair`), the period-grid pair of an `N x N` coefficient array
(`pair`), its completed L-function (`completed`), and the normalized lattice
L-function `latticeL` ($\pi^s \Gamma(s)^{-1} \Lambda(s)$).
Source: user-supplied Lean 4 statement file `HeckeSevenEighths.lean.txt`,
transcribed verbatim; the framework lemmas `HurwitzZeta.hurwitzEvenFEPair` and
the `WeakFEPair` interface are from Mathlib (D. Loeffler).
-/
namespace OAI
noncomputable section
open Filter Asymptotics Set MeasureTheory
open scoped Topology BigOperators
namespace SevenEighths.ThetaProduct
theorem rapid_product_sub (f g : ℝ → ℂ) (a b : ℂ)
(hf : ∀ r : ℝ, (fun x => f x - a) =O[atTop] (fun x : ℝ => x ^ r))
(hg : ∀ r : ℝ, (fun x => g x - b) =O[atTop] (fun x : ℝ => x ^ r))
(r : ℝ) :
(fun x => f x * g x - a * b) =O[atTop] (fun x : ℝ => x ^ r) := by
have hg0 : g =O[atTop] (fun _ : ℝ => (1 : ℝ)) := by
have hc : (fun _ : ℝ => b) =O[atTop] (fun x : ℝ => x ^ (0 : ℝ)) := by
simpa using (isBigO_const_one ℝ b (atTop : Filter ℝ))
have h := (hg 0).add hc
simpa using h
have h₁ := (hf r).mul hg0
have h₂ := (hg r).const_mul_left a
have hid : (fun x => f x * g x - a * b) =
fun x => (f x - a) * g x + a * (g x - b) := by
funext x
ring
rw [hid]
have h₁' : (fun x => (f x - a) * g x) =O[atTop] (fun x : ℝ => x ^ r) := by
simpa using h₁
exact h₁'.add h₂
def product (P Q : WeakFEPair ℂ)
(hPf : ContinuousOn P.f (Ioi 0)) (hPg : ContinuousOn P.g (Ioi 0))
(hQf : ContinuousOn Q.f (Ioi 0)) (hQg : ContinuousOn Q.g (Ioi 0)) :
WeakFEPair ℂ where
f := fun x => P.f x * Q.f x
g := fun x => P.g x * Q.g x
k := P.k + Q.k
ε := P.ε * Q.ε
f₀ := P.f₀ * Q.f₀
g₀ := P.g₀ * Q.g₀
hf_int := (hPf.mul hQf).locallyIntegrableOn measurableSet_Ioi
hg_int := (hPg.mul hQg).locallyIntegrableOn measurableSet_Ioi
hk := add_pos P.hk Q.hk
hε := mul_ne_zero P.hε Q.hε
h_feq x hx := by
rw [P.h_feq x hx, Q.h_feq x hx, Real.rpow_add hx]
simp only [smul_eq_mul, Complex.ofReal_mul]
ring
hf_top := rapid_product_sub P.f Q.f P.f₀ Q.f₀ P.hf_top Q.hf_top
hg_top := rapid_product_sub P.g Q.g P.g₀ Q.g₀ P.hg_top Q.hg_top
theorem rapid_rescale (f : ℝ → ℂ) (a : ℂ)
(hf : ∀ r : ℝ, (fun x => f x - a) =O[atTop] (fun x : ℝ => x ^ r))
{u : ℝ} (hu : 0 < u) (r : ℝ) :
(fun x => f (u * x) - a) =O[atTop] (fun x : ℝ => x ^ r) := by
have ht : Tendsto (fun x : ℝ => u * x) atTop atTop :=
(tendsto_const_mul_atTop_of_pos hu).2 tendsto_id
have h := (hf r).comp_tendsto ht
have heq : (fun x : ℝ => (u * x) ^ r) =ᶠ[atTop]
(fun x : ℝ => u ^ r * x ^ r) := by
filter_upwards [eventually_ge_atTop (0 : ℝ)] with x hx
exact Real.mul_rpow hu.le hx
exact h.trans (heq.isBigO.trans ((isBigO_refl (fun x : ℝ => x ^ r) atTop).const_mul_left _))
def rescale (P : WeakFEPair ℂ)
(hPf : ContinuousOn P.f (Ioi 0)) (hPg : ContinuousOn P.g (Ioi 0))
(u : ℝ) (hu : 0 < u) : WeakFEPair ℂ where
f := fun x => P.f (u * x)
g := fun x => P.g (u⁻¹ * x)
k := P.k
ε := P.ε * (u ^ (-P.k) : ℝ)
f₀ := P.f₀
g₀ := P.g₀
hf_int := (hPf.comp (by fun_prop) (fun x hx => mul_pos hu hx)).locallyIntegrableOn
measurableSet_Ioi
hg_int := (hPg.comp (by fun_prop) (fun x hx => mul_pos (inv_pos.mpr hu) hx)).locallyIntegrableOn
measurableSet_Ioi
hk := P.hk
hε := mul_ne_zero P.hε (Complex.ofReal_ne_zero.mpr (Real.rpow_pos_of_pos hu _).ne')
h_feq x hx := by
have heq : u * (1 / x) = 1 / (u⁻¹ * x) := by field_simp
rw [heq, P.h_feq _ (mul_pos (inv_pos.mpr hu) hx),
Real.mul_rpow (inv_pos.mpr hu).le hx.le, Real.inv_rpow hu.le,
← Real.rpow_neg hu.le]
simp only [smul_eq_mul, Complex.ofReal_mul]
ring
hf_top := rapid_rescale P.f P.f₀ P.hf_top hu
hg_top := rapid_rescale P.g P.g₀ P.hg_top (inv_pos.mpr hu)
def shiftedPair (a b : UnitAddCircle) : WeakFEPair ℂ :=
product (HurwitzZeta.hurwitzEvenFEPair a) (HurwitzZeta.hurwitzEvenFEPair b)
(Complex.continuous_ofReal.comp_continuousOn (HurwitzZeta.continuousOn_evenKernel a))
(Complex.continuous_ofReal.comp_continuousOn (HurwitzZeta.continuousOn_cosKernel a))
(Complex.continuous_ofReal.comp_continuousOn (HurwitzZeta.continuousOn_evenKernel b))
(Complex.continuous_ofReal.comp_continuousOn (HurwitzZeta.continuousOn_cosKernel b))
@[simp] theorem shiftedPair_k (a b : UnitAddCircle) : (shiftedPair a b).k = 1 := by
norm_num [shiftedPair, product, HurwitzZeta.hurwitzEvenFEPair]
@[simp] theorem shiftedPair_f (a b : UnitAddCircle) (t : ℝ) :
(shiftedPair a b).f t =
(HurwitzZeta.evenKernel a t : ℂ) * (HurwitzZeta.evenKernel b t : ℂ) := rfl
theorem shiftedPair_differentiableAt (a b : UnitAddCircle) {s : ℂ}
(hs₀ : s ≠ 0) (hs₁ : s ≠ 1) :
DifferentiableAt ℂ (shiftedPair a b).Λ s := by
exact (shiftedPair a b).differentiableAt_Λ (Or.inl hs₀)
(Or.inl (by simpa using hs₁))
def scaledEvenPair (a : UnitAddCircle) (u : ℝ) (hu : 0 < u) : WeakFEPair ℂ :=
rescale (HurwitzZeta.hurwitzEvenFEPair a)
(Complex.continuous_ofReal.comp_continuousOn (HurwitzZeta.continuousOn_evenKernel a))
(Complex.continuous_ofReal.comp_continuousOn (HurwitzZeta.continuousOn_cosKernel a)) u hu
theorem scaledEvenPair_f_continuous (a : UnitAddCircle) (u : ℝ) (hu : 0 < u) :
ContinuousOn (scaledEvenPair a u hu).f (Ioi 0) :=
(Complex.continuous_ofReal.comp_continuousOn
(HurwitzZeta.continuousOn_evenKernel a)).comp (by fun_prop)
(fun x hx => mul_pos hu hx)
theorem scaledEvenPair_g_continuous (a : UnitAddCircle) (u : ℝ) (hu : 0 < u) :
ContinuousOn (scaledEvenPair a u hu).g (Ioi 0) :=
(Complex.continuous_ofReal.comp_continuousOn
(HurwitzZeta.continuousOn_cosKernel a)).comp (by fun_prop)
(fun x hx => mul_pos (inv_pos.mpr hu) hx)
def rectangularPair (a b : UnitAddCircle) (u v : ℝ) (hu : 0 < u) (hv : 0 < v) :
WeakFEPair ℂ :=
product (scaledEvenPair a u hu) (scaledEvenPair b v hv)
(scaledEvenPair_f_continuous a u hu) (scaledEvenPair_g_continuous a u hu)
(scaledEvenPair_f_continuous b v hv) (scaledEvenPair_g_continuous b v hv)
@[simp] theorem rectangularPair_k (a b : UnitAddCircle) (u v : ℝ)
(hu : 0 < u) (hv : 0 < v) : (rectangularPair a b u v hu hv).k = 1 := by
norm_num [rectangularPair, scaledEvenPair, rescale, product, HurwitzZeta.hurwitzEvenFEPair]
end SevenEighths.ThetaProduct
namespace SevenEighths.EisensteinTheta
open ThetaProduct
def xShift (a b L : ℝ) (e : Fin 2) : ℝ := (2 * a - b - L * e) / (2 * L)
def yShift (b L : ℝ) (e : Fin 2) : ℝ := (b + L * e) / (2 * L)
def parityPair (a b L : ℝ) (hL : 0 < L) (e : Fin 2) : WeakFEPair ℂ :=
rectangularPair (xShift a b L e) (yShift b L e) (L ^ 2) (3 * L ^ 2)
(sq_pos_of_pos hL) (mul_pos (by norm_num) (sq_pos_of_pos hL))
end SevenEighths.EisensteinTheta
namespace SevenEighths.HeckeTheta
open EisensteinTheta
theorem locallyIntegrableOn_sum {ι : Type*} (s : Finset ι)
(f : ι → ℝ → ℂ) (hf : ∀ i ∈ s, LocallyIntegrableOn (f i) (Ioi 0)) :
LocallyIntegrableOn (∑ i ∈ s, f i) (Ioi 0) := by
exact Finset.sum_induction f (fun g => LocallyIntegrableOn g (Ioi 0))
(fun _ _ => LocallyIntegrableOn.add) (locallyIntegrableOn_const 0) hf
def finitePair {ι : Type*} [Fintype ι] (P : ι → WeakFEPair ℂ)
(hk : ∀ i, (P i).k = 1) (w : ι → ℂ) : WeakFEPair ℂ where
f := ∑ i, w i • (P i).f
g := ∑ i, (w i * (P i).ε) • (P i).g
k := 1
ε := 1
f₀ := ∑ i, w i * (P i).f₀
g₀ := ∑ i, w i * (P i).ε * (P i).g₀
hf_int := locallyIntegrableOn_sum Finset.univ _
(fun i _ => (P i).hf_int.smul (w i))
hg_int := locallyIntegrableOn_sum Finset.univ _
(fun i _ => (P i).hg_int.smul (w i * (P i).ε))
hk := by norm_num
hε := one_ne_zero
h_feq x hx := by
simp only [Finset.sum_apply, Pi.smul_apply, smul_eq_mul, one_mul]
rw [Finset.mul_sum]
apply Finset.sum_congr rfl
intro i _
rw [(P i).h_feq x hx, hk i]
simp only [smul_eq_mul]
ring
hf_top r := by
have h := Asymptotics.IsBigO.fun_sum (s := Finset.univ)
(fun i _ => ((P i).hf_top r).const_mul_left (w i))
simpa only [Finset.sum_apply, Pi.smul_apply, smul_eq_mul, ← Finset.sum_sub_distrib,
mul_sub] using h
hg_top r := by
have h := Asymptotics.IsBigO.fun_sum (s := Finset.univ)
(fun i _ => ((P i).hg_top r).const_mul_left (w i * (P i).ε))
simpa only [Finset.sum_apply, Pi.smul_apply, smul_eq_mul, ← Finset.sum_sub_distrib,
mul_sub] using h
def pair {N : ℕ} [NeZero N] (w : Fin N × Fin N → ℂ) : WeakFEPair ℂ :=
finitePair (fun p : (Fin N × Fin N) × Fin 2 =>
parityPair p.1.1 p.1.2 N (Nat.cast_pos.mpr (NeZero.pos N)) p.2)
(fun _ => ThetaProduct.rectangularPair_k ..) (fun p => w p.1)
def completed {N : ℕ} [NeZero N] (w : Fin N × Fin N → ℂ) : ℂ → ℂ := (pair w).Λ
def latticeL {N : ℕ} [NeZero N] (w : Fin N × Fin N → ℂ) (s : ℂ) : ℂ :=
(Real.pi : ℂ) ^ s * (Complex.Gamma s)⁻¹ * completed w s
end SevenEighths.HeckeTheta
end
end OAI