Definitions/Def_ModularForm_AtkinLehnerDatum.lean
Atkin–Lehner data and the bare Atkin–Lehner slash operator
For natural numbers M and q, the structure ModularForm.AtkinLehnerDatum M q packages, as data, a cofactor R : ℕ together with a proof that M = qR, and a pair of integers a, b together with a proof of the Bézout relation qa - Rb = 1 (such a datum exists exactly when q divides M exactly, i.e. \gcd(q,R)=1). Under a NeZero M assumption both q and R are positive. Attached to a datum W is the integral matrix
W.\mathrm{mat} = \begin{pmatrix} qa & b \\ qR & q\end{pmatrix},
whose determinant is q (det_mat) and whose lower-left entry is M (mat_lowerLeft). The square of this matrix is computed exactly: mat_sq states W.\mathrm{mat}^2 = q \cdot W.\mathrm{sqUnit}, where sqUnit is the explicit integral matrix \begin{pmatrix} qa^2 + Rb & b(a+1) \\ qR(a+1) & Rb + q\end{pmatrix}; its determinant is 1 (det_sqUnit), so it defines an element sqUnitSL of \mathrm{SL}_2(\mathbb{Z}), and its lower-left entry is M(a+1), whence sqUnitSL_mem places it in Mathlib's Gamma0 M.
The same matrix is then transported to the real and rational general linear groups: alGL : GL (Fin 2) ℝ and alGLQ : GL (Fin 2) ℚ are the entrywise images of W.\mathrm{mat}, invertible because the determinant q is nonzero; val_det_alGL records that the determinant of alGL is q as a real number, det_alGL_pos that it is positive, and consequently σ_alGL_apply that the twist \sigma of Mathlib's slash action acts as the identity on \mathbb{C} for this matrix. alGLQ_map_castHom identifies the image of alGLQ under \mathbb{Q} \hookrightarrow \mathbb{R} with alGL. Finally, for a weight k \in \mathbb{Z} and an arbitrary function f : \mathbb{H} \to \mathbb{C}, ModularForm.alSlash W k f is defined to be the weight-k slash f \mid[k] W.\mathrm{alGL}; this is additive in f and, because \sigma is trivial here, genuinely \mathbb{C}-linear: alSlash_smul gives w(c \cdot f) = c \cdot w(f) with no conjugation.
Relation to Mathlib
Mathlib supplies the ambient notions used here — the weight-k slash action of GL (Fin 2) ℝ on functions on the upper half plane together with its conjugation twist σ, and the congruence subgroup Gamma0 — but has no notion of Atkin–Lehner datum or Atkin–Lehner operator; the structure and the operator alSlash are the project's own.
Where it is used
These definitions are the basis for the Atkin–Lehner operators on M_k(\Gamma_0(M)) and S_k(\Gamma_0(M)) used in the level-lowering part of the argument: the relation W.\mathrm{mat}^2 = q\,\cdot (element of \Gamma_0(M)) yields w_q^2 = q^{k-2}, and together with the trace map from level M to level R this leads to the statement that a newform of level exactly divisible by q has a_q^2 = 1. Note that the operator here is the slash by one specific chosen matrix, so it depends on the datum as data; independence of the choice is a statement about modular forms rather than about arbitrary functions.
References
- A. O. L. Atkin and J. Lehner, Hecke operators on \Gamma_0(m), Mathematische Annalen 185 (1970), 134–160
- F. Diamond and J. Shurman, A First Course in Modular Forms, Graduate Texts in Mathematics 228, Springer, 2005
References are suggested automatically and have not been individually verified.
English text generated automatically from the Lean source; the Lean statement is authoritative.
- 158 lines
- 30 declarations
- used in the statements of 44 theorems and imported by 56 proofs
- imports 0 definition modules
Source file: Definitions/Def_ModularForm_AtkinLehnerDatum.lean
Imports
- only Mathlib
Declarations
- structure
ModularForm.AtkinLehnerDatum - field
ModularForm.AtkinLehnerDatum.R - field
ModularForm.AtkinLehnerDatum.hM - field
ModularForm.AtkinLehnerDatum.a - field
ModularForm.AtkinLehnerDatum.b - field
ModularForm.AtkinLehnerDatum.bezout - lemma
ModularForm.AtkinLehnerDatum.hM_int - lemma
ModularForm.AtkinLehnerDatum.q_pos - lemma
ModularForm.AtkinLehnerDatum.R_pos - def
ModularForm.AtkinLehnerDatum.mat - lemma
ModularForm.AtkinLehnerDatum.det_mat - lemma
ModularForm.AtkinLehnerDatum.mat_lowerLeft - def
ModularForm.AtkinLehnerDatum.sqUnit - theorem
ModularForm.AtkinLehnerDatum.mat_sq - lemma
ModularForm.AtkinLehnerDatum.det_sqUnit - def
ModularForm.AtkinLehnerDatum.sqUnitSL - lemma
ModularForm.AtkinLehnerDatum.sqUnitSL_coe - lemma
ModularForm.AtkinLehnerDatum.sqUnitSL_mem - def
ModularForm.AtkinLehnerDatum.alGL - lemma
ModularForm.AtkinLehnerDatum.alGL_coe - lemma
ModularForm.AtkinLehnerDatum.alGL_entry - lemma
ModularForm.AtkinLehnerDatum.val_det_alGL - lemma
ModularForm.AtkinLehnerDatum.det_alGL_pos - lemma
ModularForm.AtkinLehnerDatum.σ_alGL_apply - def
ModularForm.AtkinLehnerDatum.alGLQ - lemma
ModularForm.AtkinLehnerDatum.alGLQ_map_castHom - def
ModularForm.alSlash - lemma
ModularForm.alSlash_def - lemma
ModularForm.alSlash_add - lemma
ModularForm.alSlash_smul
Source
import Mathlib set_option autoImplicit false open Matrix UpperHalfPlane CongruenceSubgroup open scoped MatrixGroups ModularForm noncomputable section namespace ModularForm variable (M q : ℕ) structure AtkinLehnerDatum : Type where R : ℕ hM : M = q * R a : ℤ b : ℤ bezout : (q : ℤ) * a - (R : ℤ) * b = 1 namespace AtkinLehnerDatum variable {M q : ℕ} (W : AtkinLehnerDatum M q) lemma hM_int : (M : ℤ) = (q : ℤ) * (W.R : ℤ) := by exact_mod_cast W.hM include W in lemma q_pos [NeZero M] : 0 < q := by rcases Nat.eq_zero_or_pos q with h | h · exact absurd (W.hM.trans (Nat.mul_eq_zero.mpr (Or.inl h))) (NeZero.ne M) · exact h include W in lemma R_pos [NeZero M] : 0 < W.R := by rcases Nat.eq_zero_or_pos W.R with h | h · exact absurd (W.hM.trans (Nat.mul_eq_zero.mpr (Or.inr h))) (NeZero.ne M) · exact h def mat : Matrix (Fin 2) (Fin 2) ℤ := !![(q : ℤ) * W.a, W.b; (q : ℤ) * (W.R : ℤ), (q : ℤ)] @[simp] lemma det_mat : W.mat.det = (q : ℤ) := by rw [mat, Matrix.det_fin_two_of] linear_combination (q : ℤ) * W.bezout lemma mat_lowerLeft : W.mat 1 0 = (M : ℤ) := by rw [mat, W.hM_int] simp def sqUnit : Matrix (Fin 2) (Fin 2) ℤ := !![(q : ℤ) * W.a ^ 2 + (W.R : ℤ) * W.b, W.b * (W.a + 1); (q : ℤ) * (W.R : ℤ) * (W.a + 1), (W.R : ℤ) * W.b + (q : ℤ)] theorem mat_sq : W.mat * W.mat = (q : ℤ) • W.sqUnit := by rw [mat, sqUnit, Matrix.mul_fin_two] refine Matrix.ext fun i j => ?_ fin_cases i <;> fin_cases j · show (q : ℤ) * W.a * ((q : ℤ) * W.a) + W.b * ((q : ℤ) * (W.R : ℤ)) = (q : ℤ) * ((q : ℤ) * W.a ^ 2 + (W.R : ℤ) * W.b) ring · show (q : ℤ) * W.a * W.b + W.b * (q : ℤ) = (q : ℤ) * (W.b * (W.a + 1)) ring · show (q : ℤ) * (W.R : ℤ) * ((q : ℤ) * W.a) + (q : ℤ) * ((q : ℤ) * (W.R : ℤ)) = (q : ℤ) * ((q : ℤ) * (W.R : ℤ) * (W.a + 1)) ring · show (q : ℤ) * (W.R : ℤ) * W.b + (q : ℤ) * (q : ℤ) = (q : ℤ) * ((W.R : ℤ) * W.b + (q : ℤ)) ring @[simp] lemma det_sqUnit : W.sqUnit.det = 1 := by rw [sqUnit, Matrix.det_fin_two_of] linear_combination ((q : ℤ) * W.a - (W.R : ℤ) * W.b + 1) * W.bezout def sqUnitSL : SL(2, ℤ) := ⟨W.sqUnit, W.det_sqUnit⟩ @[simp] lemma sqUnitSL_coe : (W.sqUnitSL : Matrix (Fin 2) (Fin 2) ℤ) = W.sqUnit := rfl lemma sqUnitSL_mem : W.sqUnitSL ∈ Gamma0 M := by rw [Gamma0_mem] show (((W.sqUnit 1 0 : ℤ) : ZMod M) = 0) have h : W.sqUnit 1 0 = (M : ℤ) * (W.a + 1) := by rw [sqUnit, W.hM_int]; simp rw [h] push_cast simp def alGL [NeZero M] : GL (Fin 2) ℝ := Matrix.GeneralLinearGroup.mkOfDetNeZero (W.mat.map (algebraMap ℤ ℝ)) (by have h : ((W.mat).map (algebraMap ℤ ℝ)).det = (algebraMap ℤ ℝ) W.mat.det := by rw [← RingHom.mapMatrix_apply, ← RingHom.map_det] rw [h, W.det_mat] simpa using W.q_pos.ne') @[simp] lemma alGL_coe [NeZero M] : (W.alGL : Matrix (Fin 2) (Fin 2) ℝ) = (W.mat).map (algebraMap ℤ ℝ) := rfl lemma alGL_entry [NeZero M] (i j : Fin 2) : W.alGL i j = algebraMap ℤ ℝ (W.mat i j) := by show ((W.alGL : Matrix (Fin 2) (Fin 2) ℝ)) i j = _ rw [alGL_coe, Matrix.map_apply] lemma val_det_alGL [NeZero M] : ((W.alGL).det : ℝ) = (q : ℝ) := by rw [Matrix.GeneralLinearGroup.val_det_apply, alGL_coe] have h : ((W.mat).map (algebraMap ℤ ℝ)).det = (algebraMap ℤ ℝ) W.mat.det := by rw [← RingHom.mapMatrix_apply, ← RingHom.map_det] rw [h, W.det_mat] simp lemma det_alGL_pos [NeZero M] : 0 < ((W.alGL).det : ℝ) := by rw [val_det_alGL] exact_mod_cast W.q_pos lemma σ_alGL_apply [NeZero M] (z : ℂ) : σ W.alGL z = z := by rw [UpperHalfPlane.σ, if_pos W.det_alGL_pos] simp def alGLQ [NeZero M] : GL (Fin 2) ℚ := Matrix.GeneralLinearGroup.mkOfDetNeZero (W.mat.map (algebraMap ℤ ℚ)) (by have h : ((W.mat).map (algebraMap ℤ ℚ)).det = (algebraMap ℤ ℚ) W.mat.det := by rw [← RingHom.mapMatrix_apply, ← RingHom.map_det] rw [h, W.det_mat] simpa using W.q_pos.ne') lemma alGLQ_map_castHom [NeZero M] : (W.alGLQ).map (Rat.castHom ℝ) = W.alGL := by apply Units.ext show (Rat.castHom ℝ).mapMatrix ((W.alGLQ : Matrix (Fin 2) (Fin 2) ℚ)) = (W.alGL : Matrix (Fin 2) (Fin 2) ℝ) show (Rat.castHom ℝ).mapMatrix ((W.mat).map (algebraMap ℤ ℚ)) = (W.mat).map (algebraMap ℤ ℝ) rw [RingHom.mapMatrix_apply, Matrix.map_map] congr 1 end AtkinLehnerDatum def alSlash {M q : ℕ} (W : AtkinLehnerDatum M q) (k : ℤ) [NeZero M] (f : ℍ → ℂ) : ℍ → ℂ := f ∣[k] W.alGL lemma alSlash_def {M q : ℕ} (W : AtkinLehnerDatum M q) (k : ℤ) [NeZero M] (f : ℍ → ℂ) : alSlash W k f = f ∣[k] W.alGL := rfl lemma alSlash_add {M q : ℕ} (W : AtkinLehnerDatum M q) (k : ℤ) [NeZero M] (f g : ℍ → ℂ) : alSlash W k (f + g) = alSlash W k f + alSlash W k g := by simp only [alSlash, SlashAction.add_slash] lemma alSlash_smul {M q : ℕ} (W : AtkinLehnerDatum M q) (k : ℤ) [NeZero M] (c : ℂ) (f : ℍ → ℂ) : alSlash W k (c • f) = c • alSlash W k f := by simp only [alSlash, ModularForm.smul_slash, AtkinLehnerDatum.σ_alGL_apply] end ModularForm end
Statements phrased using this module (44)
- Existence of an Atkin–Lehner datum at a prime exactly dividing the level
ModularForm.AtkinLehnerDatum.nonempty_of_prime_of_dvd_of_not_sq_dvd0 below · depth 9 - f∣_k W is Γ₀(M)-invariant when f is
ModularForm.alSlash_slash_eq_self_of_mem_Gamma00 below · depth 9 - Boundedness at cusps is preserved by f ↦ f∣_k W_q
ModularForm.isBoundedAt_alSlash0 below · depth 9 - Weight-2 trace f+U_q(f∣ W_q) is Γ₀(R)-invariant
ModularForm.add_heckeU_alSlash_slash_eq_self_of_mem_Gamma00 below · depth 10 - Atkin–Lehner trace identity for f∣_k W_q
ModularForm.alSlash_add_heckeU_alSlash_alSlash0 below · depth 10 - Atkin–Lehner operator commutes with T_ℓ, ℓ∤ M
ModularForm.alSlash_heckeT_comm0 below · depth 10 - Vanishing at cusps of f + U_q(f∣_k W_q)
ModularForm.isZeroAt_add_heckeU_alSlash0 below · depth 10 - Holomorphy of f + U_q(f∣_k W_q)
ModularForm.mdifferentiable_add_heckeU_alSlash0 below · depth 10 - A q'-new eigenform congruent to χ₁ modulo 𝔪
LevelRaising.exists_isNormalizedEigenform_isNewAt_congr_of_qNewSupport_comap632 below · depth 11 - Trace from Γ₀(M) to Γ₀(R) of a cusp form
CuspForm.exists_coe_eq_add_smul_heckeU_alSlash0 below · depth 12 - Deligne–Serre realisation inside the q-new trace kernel
CuspForm.exists_isNormalizedEigenform_isNewAt_of_heckeAlgebra_support47 below · depth 12 - Congruence of a level-pN' cusp form to higher weight level N'
CuspForm.exists_weight_ge_qCoeff_congr_level_div_of_alSlash_p_integral10 below · depth 12 - Double Atkin–Lehner slash acts as the scalar q^{k-2}
ModularForm.alSlash_alSlash0 below · depth 12 - Vanishing twisted trace forces F∣ W_q = -U_q F
ModularForm.alSlash_eq_neg_heckeU_of_trace_alSlash_eq_zero1 below · depth 12 - T_ℓ-eigenvalue of the W_q-twisted trace combination
ModularForm.heckeT_trace_alSlash_of_eigen13 below · depth 12 - Vanishing at cusps is preserved under the Atkin–Lehner slash
ModularForm.isZeroAt_alSlash0 below · depth 13 - Holomorphy of the Atkin–Lehner slash f∣_k W
ModularForm.mdifferentiable_alSlash0 below · depth 13 - Bounded p-denominators of (⟨ d⟩ F)∣ W at 𝔪
CuspForm.exists_forall_qCoeff_alSlash_diamondLinH_p_integral_of_isIntegralQExp36 below · depth 16 - Serre's Eisenstein-trace congruence at level Γ_H(M)
CuspForm.exists_forall_weight_add_mul_qCoeff_congr_gammaH_level_div_of_alSlash_diamondLinH_p_integral16 below · depth 16 - The Atkin–Lehner prime q does not divide the cofactor R
ModularForm.AtkinLehnerDatum.not_dvd_R_of_prime0 below · depth 16 - Trace of a cusp form from Γ_H(M) to Γ_{H'}(M/p)
CuspForm.exists_GammaH_coe_eq_add_smul_heckeU_alSlash_diamondLinH6 below · depth 17 - Atkin–Lehner slash preserves cusp forms on Γ_H(M)
CuspForm.exists_GammaH_coe_eq_alSlash6 below · depth 17 - Denominator at most p for Wₚ on integral weight-two cusp forms
CuspForm.exists_int_mul_qCoeff_alSlash_of_mem_intLattice1,068 below · depth 17 - Serre's weight p+1 congruence for Uₚ of a weight-2 form
CuspForm.exists_mem_intLattice_weight_succ_qCoeff_congr_heckeU_of_alSlash_integral12 below · depth 17 - Square of the Atkin–Lehner slash equals p^{k-2}⟨ d⟩
CuspForm.alSlash_alSlash_eq_pow_smul_diamondLinH3 below · depth 18 - Atkin–Lehner slash at p has denominator dividing p
CuspForm.exists_int_mul_qCoeff_alSlash_of_mem_intLattice_of_ne_two980 below · depth 18 - Mod 3 congruence between U₃ f and a weight-4 form
CuspForm.exists_mem_intLattice_four_qCoeff_congr_heckeU_three_of_alSlash_integral9 below · depth 18 - The Atkin–Lehner slash is multiplicative up to a factor q
ModularForm.alSlash_mul0 below · depth 18 - The Atkin–Lehner matrix normalises Γ₀(M)
ModularForm.AtkinLehnerDatum.exists_mem_Gamma0_alGL_mul_eq0 below · depth 26 - Invariance of f∣ W + Uₚ f at level R
ModularForm.alSlash_add_heckeU_slash_eq_self_of_mem_GammaH0 below · depth 26 - Atkin–Lehner slash preserves rational q-coefficients in weight 2
CuspForm.exists_ratCast_qCoeff_alSlash_of_forall_qCoeff_ratCast_gammaH204 below · depth 29 - Diamond-twisted level lowering from Γ_H(M) to Γ_{H'}(M/p)
CuspForm.exists_GammaH_coe_eq_diamondLinH_add_smul_heckeU_alSlash6 below · depth 30 - Two Atkin–Lehner slashes compose to p^{k-2} times a diamond
CuspForm.exists_alSlash_alSlash_eq_pow_smul_coe_diamondLinH3 below · depth 30 - Atkin–Lehner operator at p commutes with T_ℓ
CuspForm.alSlash_coe_heckeTLinH_eq_coe_heckeTLinH8 below · depth 32 - Atkin–Lehner slash commutes with U_q on Γ_H(M)
CuspForm.alSlash_coe_heckeULinH_eq_coe_heckeULinH4 below · depth 32 - Atkin–Lehner slash as a diamond followed by diag(p,1)
ModularForm.alSlash_coe_eq_coe_diamondLinH_slash_heckeDiagMatrix3 below · depth 32 - Atkin–Lehner W_q preserves cusp forms on Γ_H(M)
CuspForm.exists_GammaH_coe_eq_alSlash_of_forall_unitsMap_atkinLehnerFactor_eq_one1 below · depth 33 - Atkin–Lehner slash intertwines diamond operators on Γ_H(M)
CuspForm.exists_alSlash_diamondLinH_eq_diamondLinH_alSlash_atkinLehnerDatum1 below · depth 33 - p-integrality of Atkin–Lehner expansions at cofactor M/p
ModularForm.exists_not_dvd_and_forall_isIntegral_mul_qExpansion_alSlash_of_isIntegralQExp_of_even358 below · depth 34 - Atkin–Lehner slash preserves cusp forms on Γ₁(M)
CuspForm.exists_gamma1_coe_eq_alSlash0 below · depth 35 - Atkin–Lehner slash preserves level-Γ_H(M) modular forms
ModularForm.exists_GammaH_coe_eq_alSlash_of_forall_unitsMap_atkinLehnerFactor_eq_one1 below · depth 35 - Trace intertwines twisted Atkin–Lehner with Fricke involution
ModularForm.exists_coe_eq_slash_mul_alGL_and_coe_trace_slash_eq_coe_trace2 below · depth 37 - Serre's valuation lemma for the level-lowering trace
ModularForm.exists_map_eq_qExpansion_smul_trace_mul_pow_and_map_eq_of_slash_alGL_inv3 below · depth 37 - Trace to level M/p equals f + Uₚ(f∣ W⁻¹)
SlashInvariantForm.coe_trace_gammaH_eq_add_heckeU_slash_alGL_inv0 below · depth 38