Definitions/Def_Gamma0HeckeOperatorHom.lean
Hecke operators on homomorphisms out of via transfer
For natural numbers N,\ell with \ell\neq 0 and an additively written abelian group A, this module constructs an endomorphism heckeOperatorHom N ℓ A of the group of additive homomorphisms \mathrm{Hom}(\Gamma_0(N),A) (in Lean, Additive ↥(Gamma0 N) →+ A, so for trivial coefficients this is H^1(\Gamma_0(N),A)), realising the double-coset recipe for \alpha=\begin{pmatrix}1&0\\0&\ell\end{pmatrix} entirely inside \Gamma_0(N). Three ingredients are defined. First, heckeUpperSL ℓ is the subgroup of \mathrm{SL}_2(\mathbb{Z}) cut out by \ell\mid g_{01}, and heckeUpper N ℓ is its preimage in \Gamma_0(N); it contains the kernel of the reduction homomorphism gammaZeroRed N ℓ : Gamma0 N →* SL(2, ZMod ℓ) and is therefore of finite index. Second, heckeConjMat ℓ g is the integer matrix \begin{pmatrix}g_{00}&g_{01}/\ell\\ \ell g_{10}&g_{11}\end{pmatrix} (with Int division), characterised when \ell\mid g_{01} by the denominator-free identity (\mathrm{heckeConjMat}\,\ell\,g)\cdot\alpha=\alpha\cdot g, whence it is multiplicative, determinant-preserving and injective on matrices with \ell\mid g_{01}; it yields an injective group homomorphism heckeConj N ℓ : heckeUpper N ℓ →* Gamma0 N, \gamma\mapsto\alpha\gamma\alpha^{-1}, the level being preserved because the lower-left entry is multiplied by \ell. Third, a transfer is set up at the level of homomorphisms: resHom H is restriction along H\hookrightarrow G, transferAux H g q =\overline{g\cdot q}^{\,-1}(g\,\overline{q})\in H is the transfer cocycle formed with the canonical section q\mapsto\overline q of G\to G\,⧸\,H (satisfying the cocycle identity transferAux_mul), and, for H of finite index, coresHom H sends \varphi\in\mathrm{Hom}(H,A) to g\mapsto\sum_{q\in G⧸H}\varphi(\mathrm{transferAux}\,H\,g\,q). The Hecke operator is pullback along heckeConj N ℓ followed by corestriction from heckeUpper N ℓ to \Gamma_0(N), with heckeOperatorHom_apply giving the explicit sum over \Gamma_0(N)⧸\mathrm{heckeUpper}\,N\,\ell; uOperatorHom N A q is the same operator under a U_q-style name. Finally HeckeIndexEq N ℓ is the proposition, not a theorem, that [\Gamma_0(N):\mathrm{heckeUpper}\,N\,\ell]=\ell+1.
Relation to Mathlib
Built on Mathlib's congruence subgroup Gamma0 and Subgroup.subgroupOf, Subgroup.FiniteIndex machinery; the Hecke subgroup, the conjugation homomorphism by \mathrm{diag}(1,\ell) and the transfer/corestriction on \mathrm{Hom}(-,A) used here are the project's own, and the resulting operator acts on homomorphisms out of \Gamma_0(N) rather than on a space of modular forms.
Where it is used
These operators supply the Hecke (and U_q) action on \mathrm{Hom}(\Gamma_0(N),A), i.e. on degree-one cohomology of \Gamma_0(N) with trivial coefficients, which is the shape in which the Hecke action at level N is used on the modular side of the argument.
References
- G. Shimura, Introduction to the Arithmetic Theory of Automorphic Functions, Publications of the Mathematical Society of Japan 11, Princeton University Press, 1971, Chapter 3
- F. Diamond and J. Shurman, A First Course in Modular Forms, Graduate Texts in Mathematics 228, Springer, 2005, Chapter 5
- K. S. Brown, Cohomology of Groups, Graduate Texts in Mathematics 87, Springer, 1982, Chapter III
References are suggested automatically and have not been individually verified.
English text generated automatically from the Lean source; the Lean statement is authoritative.
- 305 lines
- 44 declarations
- used in the statements of 57 theorems and imported by 82 proofs
- imports 0 definition modules
Source file: Definitions/Def_Gamma0HeckeOperatorHom.lean
Imports
- only Mathlib
Declarations
- def
HeckeEis.alphaMat - theorem
HeckeEis.alphaMat_apply_zero_zero - theorem
HeckeEis.alphaMat_apply_zero_one - theorem
HeckeEis.alphaMat_apply_one_zero - theorem
HeckeEis.alphaMat_apply_one_one - theorem
HeckeEis.det_alphaMat - theorem
HeckeEis.eq_of_mul_alphaMat_eq - def
HeckeEis.heckeConjMat - theorem
HeckeEis.heckeConjMat_apply_zero_zero - theorem
HeckeEis.heckeConjMat_apply_zero_one - theorem
HeckeEis.heckeConjMat_apply_one_zero - theorem
HeckeEis.heckeConjMat_apply_one_one - theorem
HeckeEis.heckeConjMat_mul_alphaMat - theorem
HeckeEis.dvd_mul_apply_zero_one - theorem
HeckeEis.heckeConjMat_mul - theorem
HeckeEis.det_heckeConjMat - theorem
HeckeEis.heckeConjMat_one - theorem
HeckeEis.heckeConjMat_injective - def
HeckeEis.heckeUpperSL - theorem
HeckeEis.mem_heckeUpperSL - def
HeckeEis.heckeUpper - theorem
HeckeEis.mem_heckeUpper - def
HeckeEis.gammaZeroRed - theorem
HeckeEis.ker_gammaZeroRed_le_heckeUpper - instance
HeckeEis.instFiniteIndexHeckeUpper - def
HeckeEis.heckeConjSL - theorem
HeckeEis.coe_heckeConjSL - theorem
HeckeEis.heckeConjSL_mem_Gamma0 - def
HeckeEis.heckeConj - theorem
HeckeEis.coe_heckeConj - theorem
HeckeEis.heckeConj_injective - def
HeckeEis.resHom - theorem
HeckeEis.resHom_apply - def
HeckeEis.transferAux - theorem
HeckeEis.coe_transferAux - theorem
HeckeEis.transferAux_mul - def
HeckeEis.coresHom - theorem
HeckeEis.coresHom_apply - def
HeckeEis.pullbackHom - theorem
HeckeEis.pullbackHom_apply - def
HeckeEis.heckeOperatorHom - theorem
HeckeEis.heckeOperatorHom_apply - abbrev
HeckeEis.uOperatorHom - def
HeckeEis.HeckeIndexEq
Source
import Mathlib.NumberTheory.ModularForms.CongruenceSubgroups ↗ import Mathlib.GroupTheory.Index ↗ import Mathlib.GroupTheory.GroupAction.Quotient ↗ import Mathlib.Tactic.Group ↗ import Mathlib.Tactic.LinearCombination ↗ import Mathlib.Tactic.FinCases ↗ namespace HeckeEis open CongruenceSubgroup Subgroup Matrix open scoped MatrixGroups section ConjMatrix def alphaMat (ℓ : ℕ) : Matrix (Fin 2) (Fin 2) ℤ := !![1, 0; 0, (ℓ : ℤ)] @[simp] theorem alphaMat_apply_zero_zero (ℓ : ℕ) : alphaMat ℓ 0 0 = 1 := rfl @[simp] theorem alphaMat_apply_zero_one (ℓ : ℕ) : alphaMat ℓ 0 1 = 0 := rfl @[simp] theorem alphaMat_apply_one_zero (ℓ : ℕ) : alphaMat ℓ 1 0 = 0 := rfl @[simp] theorem alphaMat_apply_one_one (ℓ : ℕ) : alphaMat ℓ 1 1 = (ℓ : ℤ) := rfl theorem det_alphaMat (ℓ : ℕ) : (alphaMat ℓ).det = (ℓ : ℤ) := by rw [alphaMat, det_fin_two_of]; ring theorem eq_of_mul_alphaMat_eq {ℓ : ℕ} (hℓ : (ℓ : ℤ) ≠ 0) {A B : Matrix (Fin 2) (Fin 2) ℤ} (h : A * alphaMat ℓ = B * alphaMat ℓ) : A = B := by ext i j have h0 := congrFun (congrFun h i) 0 have h1 := congrFun (congrFun h i) 1 simp only [Matrix.mul_apply, Fin.sum_univ_two, alphaMat_apply_zero_zero, alphaMat_apply_zero_one, alphaMat_apply_one_zero, alphaMat_apply_one_one, mul_one, mul_zero, add_zero, zero_add] at h0 h1 fin_cases j · exact h0 · exact mul_right_cancel₀ hℓ h1 def heckeConjMat (ℓ : ℕ) (g : Matrix (Fin 2) (Fin 2) ℤ) : Matrix (Fin 2) (Fin 2) ℤ := !![g 0 0, g 0 1 / (ℓ : ℤ); g 1 0 * (ℓ : ℤ), g 1 1] @[simp] theorem heckeConjMat_apply_zero_zero (ℓ : ℕ) (g : Matrix (Fin 2) (Fin 2) ℤ) : heckeConjMat ℓ g 0 0 = g 0 0 := rfl @[simp] theorem heckeConjMat_apply_zero_one (ℓ : ℕ) (g : Matrix (Fin 2) (Fin 2) ℤ) : heckeConjMat ℓ g 0 1 = g 0 1 / (ℓ : ℤ) := rfl @[simp] theorem heckeConjMat_apply_one_zero (ℓ : ℕ) (g : Matrix (Fin 2) (Fin 2) ℤ) : heckeConjMat ℓ g 1 0 = g 1 0 * (ℓ : ℤ) := rfl @[simp] theorem heckeConjMat_apply_one_one (ℓ : ℕ) (g : Matrix (Fin 2) (Fin 2) ℤ) : heckeConjMat ℓ g 1 1 = g 1 1 := rfl theorem heckeConjMat_mul_alphaMat {ℓ : ℕ} {g : Matrix (Fin 2) (Fin 2) ℤ} (hg : (ℓ : ℤ) ∣ g 0 1) : heckeConjMat ℓ g * alphaMat ℓ = alphaMat ℓ * g := by ext i j fin_cases i <;> fin_cases j <;> simp only [Matrix.mul_apply, Fin.sum_univ_two, alphaMat_apply_zero_zero, alphaMat_apply_zero_one, alphaMat_apply_one_zero, alphaMat_apply_one_one, heckeConjMat_apply_zero_zero, heckeConjMat_apply_zero_one, heckeConjMat_apply_one_zero, heckeConjMat_apply_one_one, Fin.zero_eta, Fin.mk_one, Fin.isValue, mul_zero, one_mul, zero_mul, add_zero, zero_add] <;> first | exact Int.ediv_mul_cancel hg | ring1 theorem dvd_mul_apply_zero_one {ℓ : ℕ} {g h : Matrix (Fin 2) (Fin 2) ℤ} (hg : (ℓ : ℤ) ∣ g 0 1) (hh : (ℓ : ℤ) ∣ h 0 1) : (ℓ : ℤ) ∣ (g * h) 0 1 := by rw [(Matrix.two_mul_expl g h).2.1] exact dvd_add (hh.mul_left _) (hg.mul_right _) theorem heckeConjMat_mul {ℓ : ℕ} (hℓ : (ℓ : ℤ) ≠ 0) {g h : Matrix (Fin 2) (Fin 2) ℤ} (hg : (ℓ : ℤ) ∣ g 0 1) (hh : (ℓ : ℤ) ∣ h 0 1) : heckeConjMat ℓ (g * h) = heckeConjMat ℓ g * heckeConjMat ℓ h := by have key : (heckeConjMat ℓ g * heckeConjMat ℓ h) * alphaMat ℓ = alphaMat ℓ * (g * h) := by rw [mul_assoc, heckeConjMat_mul_alphaMat hh, ← mul_assoc, heckeConjMat_mul_alphaMat hg, mul_assoc] exact eq_of_mul_alphaMat_eq hℓ ((heckeConjMat_mul_alphaMat (dvd_mul_apply_zero_one hg hh)).trans key.symm) theorem det_heckeConjMat {ℓ : ℕ} (hℓ : (ℓ : ℤ) ≠ 0) {g : Matrix (Fin 2) (Fin 2) ℤ} (hg : (ℓ : ℤ) ∣ g 0 1) : (heckeConjMat ℓ g).det = g.det := by have h := congrArg Matrix.det (heckeConjMat_mul_alphaMat hg) rw [Matrix.det_mul, Matrix.det_mul, det_alphaMat] at h exact mul_right_cancel₀ hℓ (by linear_combination h) theorem heckeConjMat_one (ℓ : ℕ) : heckeConjMat ℓ (1 : Matrix (Fin 2) (Fin 2) ℤ) = 1 := by ext i j fin_cases i <;> fin_cases j <;> simp [heckeConjMat] theorem heckeConjMat_injective {ℓ : ℕ} (hℓ : (ℓ : ℤ) ≠ 0) {g h : Matrix (Fin 2) (Fin 2) ℤ} (hg : (ℓ : ℤ) ∣ g 0 1) (hh : (ℓ : ℤ) ∣ h 0 1) (e : heckeConjMat ℓ g = heckeConjMat ℓ h) : g = h := by have key : alphaMat ℓ * g = alphaMat ℓ * h := by rw [← heckeConjMat_mul_alphaMat hg, ← heckeConjMat_mul_alphaMat hh, e] ext i j have h0 := congrFun (congrFun key 0) j have h1 := congrFun (congrFun key 1) j simp only [Matrix.mul_apply, Fin.sum_univ_two, alphaMat_apply_zero_zero, alphaMat_apply_zero_one, alphaMat_apply_one_zero, alphaMat_apply_one_one, one_mul, zero_mul, add_zero, zero_add] at h0 h1 fin_cases i · exact h0 · exact mul_left_cancel₀ hℓ h1 end ConjMatrix section HeckeSubgroup def heckeUpperSL (ℓ : ℕ) : Subgroup SL(2, ℤ) where carrier := {g | (ℓ : ℤ) ∣ g 0 1} one_mem' := by simp mul_mem' := by intro a b ha hb simp only [Set.mem_setOf_eq] at * have h : (ℓ : ℤ) ∣ (a.1 * b.1) 0 1 := by rw [(Matrix.two_mul_expl a.1 b.1).2.1] exact dvd_add (hb.mul_left _) (ha.mul_right _) exact h inv_mem' := by intro a ha simp only [Set.mem_setOf_eq] at * rw [Matrix.SpecialLinearGroup.SL2_inv_expl a] simpa using ha @[simp] theorem mem_heckeUpperSL {ℓ : ℕ} {g : SL(2, ℤ)} : g ∈ heckeUpperSL ℓ ↔ (ℓ : ℤ) ∣ g 0 1 := Iff.rfl variable (N ℓ : ℕ) def heckeUpper : Subgroup (Gamma0 N) := (heckeUpperSL ℓ).subgroupOf (Gamma0 N) theorem mem_heckeUpper {γ : Gamma0 N} : γ ∈ heckeUpper N ℓ ↔ (ℓ : ℤ) ∣ (γ : SL(2, ℤ)) 0 1 := Iff.rfl def gammaZeroRed : Gamma0 N →* SL(2, ZMod ℓ) := (Matrix.SpecialLinearGroup.map (n := Fin 2) (Int.castRingHom (ZMod ℓ))).comp (Gamma0 N).subtype theorem ker_gammaZeroRed_le_heckeUpper : (gammaZeroRed N ℓ).ker ≤ heckeUpper N ℓ := by intro γ hγ rw [MonoidHom.mem_ker] at hγ rw [mem_heckeUpper] have h01 : ((((γ : SL(2, ℤ)) 0 1 : ℤ) : ZMod ℓ)) = 0 := by have h := congrArg (fun A : SL(2, ZMod ℓ) => A 0 1) hγ simpa [gammaZeroRed, Matrix.one_apply] using h exact_mod_cast (ZMod.intCast_zmod_eq_zero_iff_dvd _ ℓ).mp h01 instance instFiniteIndexHeckeUpper [NeZero ℓ] : (heckeUpper N ℓ).FiniteIndex := haveI : (gammaZeroRed N ℓ).ker.FiniteIndex := Subgroup.finiteIndex_ker _ Subgroup.finiteIndex_of_le (ker_gammaZeroRed_le_heckeUpper N ℓ) variable [NeZero ℓ] def heckeConjSL (γ : heckeUpper N ℓ) : SL(2, ℤ) := ⟨heckeConjMat ℓ ((γ : Gamma0 N) : SL(2, ℤ)), by rw [det_heckeConjMat (Int.natCast_ne_zero.mpr (NeZero.ne ℓ)) ((mem_heckeUpper N ℓ).mp γ.2)] exact ((γ : Gamma0 N) : SL(2, ℤ)).2⟩ @[simp] theorem coe_heckeConjSL (γ : heckeUpper N ℓ) : (heckeConjSL N ℓ γ : Matrix (Fin 2) (Fin 2) ℤ) = heckeConjMat ℓ ((γ : Gamma0 N) : SL(2, ℤ)) := rfl theorem heckeConjSL_mem_Gamma0 (γ : heckeUpper N ℓ) : heckeConjSL N ℓ γ ∈ Gamma0 N := by rw [Gamma0_mem] show (((heckeConjMat ℓ ((γ : Gamma0 N) : SL(2, ℤ))) 1 0 : ℤ) : ZMod N) = 0 rw [heckeConjMat_apply_one_zero, Int.cast_mul] have hc : ((((γ : Gamma0 N) : SL(2, ℤ)) 1 0 : ℤ) : ZMod N) = 0 := Gamma0_mem.mp (γ : Gamma0 N).2 rw [hc, zero_mul] def heckeConj : heckeUpper N ℓ →* Gamma0 N where toFun γ := ⟨heckeConjSL N ℓ γ, heckeConjSL_mem_Gamma0 N ℓ γ⟩ map_one' := by refine Subtype.ext (Subtype.ext ?_) show heckeConjMat ℓ (1 : Matrix (Fin 2) (Fin 2) ℤ) = (1 : Matrix (Fin 2) (Fin 2) ℤ) exact heckeConjMat_one ℓ map_mul' γ δ := by refine Subtype.ext (Subtype.ext ?_) show heckeConjMat ℓ ((((γ : Gamma0 N) : SL(2, ℤ)) : Matrix (Fin 2) (Fin 2) ℤ) * (((δ : Gamma0 N) : SL(2, ℤ)) : Matrix (Fin 2) (Fin 2) ℤ)) = heckeConjMat ℓ (((γ : Gamma0 N) : SL(2, ℤ)) : Matrix (Fin 2) (Fin 2) ℤ) * heckeConjMat ℓ (((δ : Gamma0 N) : SL(2, ℤ)) : Matrix (Fin 2) (Fin 2) ℤ) exact heckeConjMat_mul (Int.natCast_ne_zero.mpr (NeZero.ne ℓ)) ((mem_heckeUpper N ℓ).mp γ.2) ((mem_heckeUpper N ℓ).mp δ.2) @[simp] theorem coe_heckeConj (γ : heckeUpper N ℓ) : ((heckeConj N ℓ γ : Gamma0 N) : SL(2, ℤ)) = heckeConjSL N ℓ γ := rfl theorem heckeConj_injective : Function.Injective (heckeConj N ℓ) := by intro γ δ h have hmat : heckeConjMat ℓ (((γ : Gamma0 N) : SL(2, ℤ)) : Matrix (Fin 2) (Fin 2) ℤ) = heckeConjMat ℓ (((δ : Gamma0 N) : SL(2, ℤ)) : Matrix (Fin 2) (Fin 2) ℤ) := congrArg (fun x : Gamma0 N => ((x : SL(2, ℤ)) : Matrix (Fin 2) (Fin 2) ℤ)) h exact Subtype.ext (Subtype.ext (Subtype.ext (heckeConjMat_injective (Int.natCast_ne_zero.mpr (NeZero.ne ℓ)) ((mem_heckeUpper N ℓ).mp γ.2) ((mem_heckeUpper N ℓ).mp δ.2) hmat))) end HeckeSubgroup section Transfer variable {G : Type*} [Group G] (H : Subgroup G) {A : Type*} [AddCommGroup A] def resHom : (Additive G →+ A) →+ (Additive H →+ A) := AddMonoidHom.mk' (fun φ => φ.comp (MonoidHom.toAdditive H.subtype)) fun _ _ => rfl @[simp] theorem resHom_apply (φ : Additive G →+ A) (γ : H) : resHom H φ (Additive.ofMul γ) = φ (Additive.ofMul (γ : G)) := rfl noncomputable def transferAux (g : G) (q : G ⧸ H) : H := ⟨(g • q).out⁻¹ * (g * q.out), by refine QuotientGroup.eq.mp ?_ rw [QuotientGroup.out_eq'] show g • q = ((g * q.out : G) : G ⧸ H) rw [show ((g * q.out : G) : G ⧸ H) = g • ((q.out : G) : G ⧸ H) from rfl, QuotientGroup.out_eq']⟩ @[simp] theorem coe_transferAux (g : G) (q : G ⧸ H) : (transferAux H g q : G) = (g • q).out⁻¹ * (g * q.out) := rfl theorem transferAux_mul (g₁ g₂ : G) (q : G ⧸ H) : transferAux H (g₁ * g₂) q = transferAux H g₁ (g₂ • q) * transferAux H g₂ q := by ext push_cast [coe_transferAux] rw [mul_smul] group variable [H.FiniteIndex] noncomputable def coresHom : (Additive H →+ A) →+ (Additive G →+ A) := AddMonoidHom.mk' (fun φ => letI := H.fintypeQuotientOfFiniteIndex AddMonoidHom.mk' (fun g => ∑ q : G ⧸ H, φ (Additive.ofMul (transferAux H g.toMul q))) (fun g₁ g₂ => by show ∑ q : G ⧸ H, φ (Additive.ofMul (transferAux H (g₁.toMul * g₂.toMul) q)) = (∑ q : G ⧸ H, φ (Additive.ofMul (transferAux H g₁.toMul q))) + ∑ q : G ⧸ H, φ (Additive.ofMul (transferAux H g₂.toMul q)) simp_rw [transferAux_mul, ofMul_mul, map_add] rw [Finset.sum_add_distrib] exact congrArg₂ (· + ·) (Fintype.sum_bijective (g₂.toMul • ·) (MulAction.bijective g₂.toMul) (fun q => φ (Additive.ofMul (transferAux H g₁.toMul (g₂.toMul • q)))) (fun q => φ (Additive.ofMul (transferAux H g₁.toMul q))) fun q => rfl) rfl)) (fun φ ψ => by letI := H.fintypeQuotientOfFiniteIndex ext g exact Finset.sum_add_distrib) theorem coresHom_apply (φ : Additive H →+ A) (g : G) : letI := H.fintypeQuotientOfFiniteIndex coresHom H φ (Additive.ofMul g) = ∑ q : G ⧸ H, φ (Additive.ofMul (transferAux H g q)) := rfl end Transfer section Pullback variable {G K : Type*} [Group G] [Group K] {A : Type*} [AddCommGroup A] def pullbackHom (f : G →* K) : (Additive K →+ A) →+ (Additive G →+ A) := AddMonoidHom.mk' (fun φ => φ.comp (MonoidHom.toAdditive f)) fun _ _ => rfl @[simp] theorem pullbackHom_apply (f : G →* K) (φ : Additive K →+ A) (g : G) : pullbackHom f φ (Additive.ofMul g) = φ (Additive.ofMul (f g)) := rfl end Pullback section HeckeOperator variable (N ℓ : ℕ) [NeZero ℓ] (A : Type*) [AddCommGroup A] noncomputable def heckeOperatorHom : (Additive (Gamma0 N) →+ A) →+ (Additive (Gamma0 N) →+ A) := (coresHom (heckeUpper N ℓ)).comp (pullbackHom (heckeConj N ℓ)) theorem heckeOperatorHom_apply (φ : Additive (Gamma0 N) →+ A) (g : Gamma0 N) : letI := (heckeUpper N ℓ).fintypeQuotientOfFiniteIndex heckeOperatorHom N ℓ A φ (Additive.ofMul g) = ∑ q : Gamma0 N ⧸ heckeUpper N ℓ, φ (Additive.ofMul ((heckeConj N ℓ (transferAux (heckeUpper N ℓ) g q) : Gamma0 N))) := rfl noncomputable abbrev uOperatorHom (q : ℕ) [NeZero q] : (Additive (Gamma0 N) →+ A) →+ (Additive (Gamma0 N) →+ A) := heckeOperatorHom N q A def HeckeIndexEq : Prop := (heckeUpper N ℓ).index = ℓ + 1 end HeckeOperator end HeckeEis
Statements phrased using this module (57)
- Hecke operators commute with the character involution on Γ₀(N)
ModularCurve.Period.charInvolution_heckeOperatorHom0 below · depth 10 - Hecke equivariance of the period map in weight two
ModularCurve.periodMap_heckeTLin3 below · depth 10 - Period map intertwines U_q with the cohomological operator
ModularCurve.periodMap_heckeULin3 below · depth 10 - Hecke conjugation commutes with diag(ℓ,1) on binary forms
HeckeEis.binaryFormAlphaAdj_comp_binaryFormRepSL_heckeConj0 below · depth 11 - Coefficient change is Hecke-equivariant on parabolic H¹
HeckeEis.coeffH1par_map_heckeT_comm0 below · depth 11 - Existence of the induced Hecke endomorphism of H¹ₚₐᵣ
HeckeEis.exists_coeffH1par_linearMap_coeffHeckeFun4 below · depth 11 - Hecke-equivariant Eichler–Shimura decomposition of parabolic cohomology
HeckeEis.exists_eichlerShimura_coeffH1par_binaryFormRepSL_forall_prime644 below · depth 11 - Injectivity of the Eichler–Shimura period pair map
ModularCurve.periodHomPair_injective6 below · depth 11 - Cochain Hecke operator preserves coefficient coboundaries
HeckeEis.coeffHeckeFun_mem_coeffCoboundaries0 below · depth 12 - Cochain-level Hecke operator preserves 1-cocycles
HeckeEis.coeffHeckeFun_mem_coeffCocycles0 below · depth 12 - Hecke operator preserves parabolic cocycles with coefficients
HeckeEis.coeffHeckeFun_mem_coeffParabolicCocycles2 below · depth 12 - Coset-sum corestriction equals the transfer homomorphism
HeckeEis.coresHom_eq_transfer0 below · depth 12 - Corestriction after restriction is multiplication by the index
HeckeEis.coresHom_resHom_apply0 below · depth 12 - Eichler–Shimura map intertwines T_ℓ with cohomological T_ℓ
HeckeEis.eichlerShimuraMap_heckeTLin17 below · depth 12 - Eichler–Shimura map intertwines U_ℓ for ℓ ∣ N
HeckeEis.eichlerShimuraMap_heckeULin17 below · depth 12 - Mod p Hecke eigenclass in parabolic cohomology of Γ₀(N)
HeckeEis.exists_coeffH1par_binaryFormRepSL_eigenclass_of_ideal_heckeAlgebra_of_ne_two54 below · depth 12 - Split equivariant coefficient maps induce Hecke-equivariant maps on H¹ₚₐᵣ
HeckeEis.exists_coeffH1par_map_of_equivariant_retraction0 below · depth 12 - Shapiro's lemma for parabolic cohomology, Hecke-equivariantly
HeckeEis.exists_coeffH1par_projLineRepSL_equiv_parabolicHoms9 below · depth 12 - Commutativity of the Hecke operators on Hom(Γ₀(N),A)
HeckeEis.heckeOperatorHom_commute0 below · depth 12 - Kernel of level raising is Eisenstein for all T_ℓ
HeckeEis.heckeOperatorHom_eq_of_levelRaisingKernel32 below · depth 12 - Degeneracy pullback ι₀^* commutes with T_ℓ
HeckeEis.heckeOperatorHom_pullback_iota00 below · depth 12 - Hecke equivariance of the degeneracy pullback ι₁^* at ℓ ∤ q
HeckeEis.heckeOperatorHom_pullback_iota10 below · depth 12 - Naturality of `heckeOperatorHom` in the coefficient group
HeckeEis.postcomp_heckeOperatorHom0 below · depth 12 - Mod-3 kernel pairs for Γ₀(Nq) are Eisenstein
Ihara.heckeOperatorHom_eisenstein_mod_three_of_parabolic_levelRaisingKernel34 below · depth 12 - Mod p parabolic eigenclass gives maximal ideal of T₂(N)
ModularCurve.Period.exists_ideal_heckeAlgebra_two_of_int_modp_eigenclass591 below · depth 12 - Nonzero parabolic realisation of a normalised eigenform over k
ModularCurve.Period.exists_parabolicRealization30 below · depth 12 - Hecke operators preserve parabolic homomorphisms on Γ₀(N)
ModularCurve.Period.heckeOperatorHom_preserves_parabolic0 below · depth 12 - Index ℓ+1 of the upper Hecke subgroup of Γ₀(N)
ModularCurve.index_heckeUpper0 below · depth 12 - Cochain-level Hecke equivariance of the Shapiro map at ∞
HeckeEis.coeffHeckeFun_projLineAlphaAdj_apply_iota0_infty_eq_heckeOperatorHom4 below · depth 13 - Mod-p parabolic eigenclass attached to a maximal Hecke ideal
HeckeEis.exists_coeffH1par_int_modp_eigenclass_of_ideal_heckeAlgebra51 below · depth 13 - Parabolic characters of Γ₀(Np) come from parabolic cocycles
HeckeEis.exists_mem_coeffParabolicCocycles_forall_apply_infty_eq2 below · depth 13 - Eisenstein identity T_ℓ(χ∘ d)=(ℓ+1)(χ∘ d) for ℓ∤ N
HeckeEis.heckeOperatorHom_comp_gamma0UnitsChar5 below · depth 13 - Kernel pairs of level raising are Eisenstein, given Ihara
HeckeEis.heckeOperatorHom_eq_of_kernelPair6 below · depth 13 - Cocycles vanishing at ∞ on Γ₀(Np) are coboundaries
HeckeEis.mem_coeffCoboundaries_of_forall_apply_infty_eq_zero2 below · depth 13 - Hecke operator acts on the period class by a_ℓ(f)
ModularCurve.heckeOperatorHom_periodMap_of_isNormalizedEigenform21 below · depth 13 - U_q scales the period homomorphism of an eigenform by a_q
ModularCurve.heckeOperatorHom_periodMap_of_isNormalizedEigenform_of_dvd21 below · depth 13 - Period map intertwines the level-lowering trace with the transfer
ModularCurve.periodMap_traceLin4 below · depth 13 - Integral parabolic mod-p eigenclass attached to a Hecke eigenform
HeckeEis.exists_coeffH1par_int_modp_eigenclass_of_eigenform46 below · depth 14 - Every Γ₀(N)-element is Γ₀(Np)-equivalent into U_N(ℓ)
HeckeEis.exists_iota0_inv_mul_mem_heckeUpper1 below · depth 14 - The Hecke algebra of Sₙ₊₂(Γ₀(N)) is ℤ-finite
HeckeEis.finite_int_heckeAlgebra45 below · depth 14 - Eisenstein eigenvalue ℓ+1 on entry-factoring homomorphisms of Γ₀(N)
HeckeEis.heckeOperatorHom_eq_of_factorsThroughEntry4 below · depth 14 - Hecke cochain is representative-independent modulo coboundaries
HeckeEis.sum_repr_sub_coeffHeckeFun_mem_coeffCoboundaries0 below · depth 14 - Transfer and coset-sum Hecke operators agree at H=top
CohCarrier.heckeT_top_apply_eq_heckeOperatorHom1 below · depth 15 - Characters through the lower-right entry are Eisenstein for T_ℓ
HeckeEis.heckeOperatorHom_apply_of_factorsThroughEntry3 below · depth 15 - Scalar equivariance of the Hecke operator on characters
HeckeEis.heckeOperatorHom_smul0 below · depth 15 - Hecke equivariance of Eichler integrals on H¹(Γ₀(N),Symⁿ)
HeckeEis.coeffH1Mk_cocycle_heckeTLin_modularForm3 below · depth 16 - Cochain-level Hecke multiplicativity T_ℓ T_{ℓ'} ≡ T_{ℓℓ'} modulo coboundaries
HeckeEis.coeffHeckeFun_coeffHeckeFun_sub_coeffHeckeFun_mul_mem_coeffCoboundaries2 below · depth 16 - Transfer of Hecke eigenclasses from H¹(Γ₀(N),V) to Hom(Γ₀(Np),K)
HeckeEis.exists_addMonoidHom_functional_cocycle_smul_heckeOperatorHom_mul_eq2 below · depth 16 - Eigensystems in H¹(Γ₀(N),Symⁿ) arise from weight n+2 forms
HeckeEis.exists_modularForm_heckeTLin_eq_smul_of_isEigensystemH1677 below · depth 16 - Hecke operator acts by the index on conjugation-invariant characters
HeckeEis.heckeOperatorHom_apply_of_conj_invariant1 below · depth 16 - Lifting Hecke eigensystems in H¹(Γ₀(N),·) along surjections
HeckeEis.isEigensystemH1_of_isEigensystemH1_of_surjective5 below · depth 16 - Lifting a Hecke eigensystem along a surjection of coefficient modules
HeckeEis.isEigensystemH1_of_isEigensystemH1_of_surjective_of_subsingleton_H24 below · depth 16 - Eigensystem lifts along an injection of coefficients, or is Eisenstein
HeckeEis.isEigensystemH1_or_of_isEigensystemH1_of_injective3 below · depth 16 - Hecke-equivariant Eichler–Shimura decomposition of parabolic cohomology
HeckeEis.exists_eichlerShimura_coeffH1par_binaryFormRepSL645 below · depth 17 - Boundary Hecke eigensystems arise from modular forms
HeckeEis.exists_modularForm_heckeTLin_eq_smul_of_notMem_range_coeffH1parToH143 below · depth 17 - Diagonal element intertwines Hecke conjugation with reduction mod q
HeckeEis.diagElem_comp_comp_red_heckeConj_eq_comp_red_comp_diagElem_of_ne_zero0 below · depth 18 - Base change of an H¹ Hecke eigensystem along a field embedding
HeckeEis.isEigensystemH1_of_isEigensystemH1_of_isBaseChange2 below · depth 18