Definitions/Def_ModularCurve_HeckeSeam.lean
Hecke action on differentials and its comparison with
Fix N\ge 1 and write F_N^L for the base-changed modular function field laurentBaseChange L (modularFunctionFieldFull N), a subfield of the Laurent series over L, with L a field of characteristic zero containing \mathbb{Q}. For a prime \ell, heckeOmegaAlong is the L-linear endomorphism of \Omega_{F_N^L/L} obtained by pulling differentials back along the L-algebra map heckeAlphaBar from level N to level N\ell and then applying the trace map traceDiff for the F_N^L-algebra structure on F_{N\ell}^L supplied by heckeBetaBar; heckeOmegaAlongT is the same construction with the two legs interchanged. Specialising L to \overline{\mathbb{Q}} gives heckeOmegaBar and heckeOmegaBarT. The predicates HeckeOmegaPreservesBar and HeckeOmegaPreservesBarT say that these operators carry the submodule regularDiffs (the span of the differentials with non-negative order at every place) into itself; granted this, heckeOmegaRegBar (as a \mathbb{Z}-linear map) and heckeOmegaRegBarQ, heckeOmegaRegBarQT (as \overline{\mathbb{Q}}-linear maps) are the restrictions, and are set to 0 otherwise. Under the corresponding pairwise-commutation predicates the \mathbb{Z}-subalgebra generated by the family is commutative, so the abstract Hecke algebra HeckeAlg =\mathbb{Z}[X_\ell] evaluates into it; this yields the ring maps heckeEvalOmegaBar, heckeEvalOmegaBarQ, heckeEvalOmegaBarQT (the latter two totalised with a zero fallback) and a HeckeAlg-module structure heckeOmegaModuleBar on the regular differentials, again with a constant-coefficient fallback.
Two annihilator ideals of HeckeAlg are then compared: heckeKerJ, the annihilator of J_0(N)=\mathrm{Pic}^0 of the level-N function field over \overline{\mathbb{Q}} for the divisorial Hecke module, and heckeKerOmega, the annihilator of the regular differentials. A theorem identifies heckeKerJ with the kernel of heckeEvalBar when the divisorial operators commute. The Prop-valued structure HeckeSeam carries three fields as data: the two inclusions between these ideals, and, for every prime p, every n and every t:\mathrm{Fin}\,n\to HeckeAlg, the passage from \mathbb{Z}-linear independence of the classes of t modulo heckeKerJ to \mathbb{Q}_p-linear independence of their images under rationalHeckeRep on the rational p-adic Tate module of J_0(N).
The HeckeWord section provides the letter calculus used to compare the two actions. HeckeInputsAlongT asserts the existence of integrality witnesses for both legs, the principal-divisor property at level N\ell, finiteness along heckeBetaBar, the fundamental identity along heckeAlphaBar and the norm formula along heckeBetaBar. letterKey conjoins HeckeInputsAlong and HeckeInputsAlongT over \overline{\mathbb{Q}} with the two preservation predicates. Indexed by \mathrm{Primes}\sqcup\mathrm{Primes} (an operator and its transpose), letterJ gives endomorphisms of J_0(N) built from heckePic0Bar and heckePic0BarTranspose, and letterO the corresponding restrictions of heckeOmegaBar and heckeOmegaBarT, each replaced by 0 when letterKey fails. wordJ multiplies the J-letters along a word, wordO multiplies the \Omega-letters along the reversed word, wordTr reverses a word and swaps each letter's orientation, and vpEnd sends an endomorphism of J_0(N) to the induced \mathbb{Q}_p-linear endomorphism of the rational Tate module.
Relation to Mathlib
Kähler differentials \Omega_{F/K}, Laurent series, Module.annihilator and Module.End are Mathlib's; the Hecke algebra here is the project's free commutative ring MvPolynomial Nat.Primes ℤ, and the regular differentials, the trace map on differentials, the modular function field as an intermediate field of Laurent series and the Hecke action on either side are project notions with no Mathlib counterpart.
Where it is used
The two annihilator ideals and the independence clause of HeckeSeam form the interface through which the Eichler–Shimura comparison between the cotangent space of J_0(N) (regular differentials, i.e. weight-two cusp forms) and the p-adic Tate module of J_0(N) is stated, feeding the construction of the Galois representations attached to Hecke eigensystems that the level-lowering and modularity-lifting steps consume.
References
- G. Shimura, Introduction to the Arithmetic Theory of Automorphic Functions, Iwanami Shoten and Princeton University Press, 1971
- F. Diamond and J. Shurman, A First Course in Modular Forms, Graduate Texts in Mathematics 228, Springer, 2005
- H. Darmon, F. Diamond and R. Taylor, Fermat's Last Theorem, in: Current Developments in Mathematics 1995, International Press, 1995, 1–154, §1
References are suggested automatically and have not been individually verified.
English text generated automatically from the Lean source; the Lean statement is authoritative.
- 328 lines
- 40 declarations
- used in the statements of 0 theorems and imported by 0 proofs
- imports 4 definition modules
Source file: Definitions/Def_ModularCurve_HeckeSeam.lean
Imports
Imported by
Declarations
- def
ModularCurve.heckeOmegaAlong - def
ModularCurve.heckeOmegaBar - def
ModularCurve.HeckeOmegaPreservesBar - def
ModularCurve.heckeOmegaRegBar - def
ModularCurve.HeckeOmegaCommuteBar - theorem
ModularCurve.isMulCommutative_adjoin_heckeOmegaRegBar - def
ModularCurve.heckeEvalOmegaBarAux - def
ModularCurve.heckeEvalOmegaBar - def
ModularCurve.heckeOmegaModuleBar - def
ModularCurve.heckeKerJ - theorem
ModularCurve.heckeKerJ_eq_ker - def
ModularCurve.heckeKerOmega - structure
ModularCurve.HeckeSeam - field
ModularCurve.HeckeSeam.omega_le_J - field
ModularCurve.HeckeSeam.J_le_omega - field
ModularCurve.HeckeSeam.tate - field
ModularCurve.HeckeSeam.letI - def
ModularCurve.heckeOmegaAlongT - def
ModularCurve.heckeOmegaBarT - def
ModularCurve.HeckeOmegaPreservesBarT - def
ModularCurve.heckeOmegaRegBarQ - def
ModularCurve.heckeOmegaRegBarQT - def
ModularCurve.HeckeOmegaCommuteBarQ - def
ModularCurve.HeckeOmegaCommuteBarQT - theorem
ModularCurve.isMulCommutative_adjoin_heckeOmegaRegBarQ - theorem
ModularCurve.isMulCommutative_adjoin_heckeOmegaRegBarQT - def
ModularCurve.heckeEvalOmegaBarAuxQ - def
ModularCurve.heckeEvalOmegaBarQ - def
ModularCurve.heckeEvalOmegaBarAuxQT - def
ModularCurve.heckeEvalOmegaBarQT - def
ModularCurve.heckeEvalOmegaBarQTotal - def
ModularCurve.heckeEvalOmegaBarQTTotal - def
ModularCurve.HeckeWord.HeckeInputsAlongT - def
ModularCurve.HeckeWord.letterKey - def
ModularCurve.HeckeWord.letterJ - def
ModularCurve.HeckeWord.letterO - def
ModularCurve.HeckeWord.wordJ - def
ModularCurve.HeckeWord.wordO - def
ModularCurve.HeckeWord.wordTr - def
ModularCurve.HeckeWord.vpEnd
Source
import Definitions.Def_ModularCurve_HeckeModule import Definitions.Def_AlgebraicCurve_Differentials import Definitions.Def_ModularCurve_QExpansionDiff import Definitions.Def_ModularCurve_JZeroTateModule set_option autoImplicit false noncomputable section namespace ModularCurve open AlgebraicCurve section OmegaAlong variable (L : Type*) [Field L] [Algebra ℚ L] (N ℓ : ℕ) [NeZero N] [NeZero ℓ] def heckeOmegaAlong : Ω[↥(laurentBaseChange L (modularFunctionFieldFull N))⁄L] →ₗ[L] Ω[↥(laurentBaseChange L (modularFunctionFieldFull N))⁄L] := letI := algebraAlong (heckeBetaBar L N ℓ) haveI := isScalarTower_along (heckeBetaBar L N ℓ) haveI : SMulCommClass L ↥(laurentBaseChange L (modularFunctionFieldFull N)) ↥(laurentBaseChange L (modularFunctionFieldFull (N * ℓ))) := ⟨fun k f x => by simp only [Algebra.smul_def]; exact mul_left_comm _ _ _⟩ ((traceDiff L ↥(laurentBaseChange L (modularFunctionFieldFull N)) ↥(laurentBaseChange L (modularFunctionFieldFull (N * ℓ)))).restrictScalars L).comp (pullbackDiff (heckeAlphaBar L N ℓ)) end OmegaAlong section OmegaModule variable (N : ℕ) [NeZero N] def heckeOmegaBar (ℓ : Nat.Primes) : Ω[↥(modularFunctionFieldBar N)⁄AlgebraicClosure ℚ] →ₗ[AlgebraicClosure ℚ] Ω[↥(modularFunctionFieldBar N)⁄AlgebraicClosure ℚ] := haveI : NeZero (ℓ : ℕ) := ⟨ℓ.2.ne_zero⟩ heckeOmegaAlong (AlgebraicClosure ℚ) N ℓ def HeckeOmegaPreservesBar : Prop := ∀ (ℓ : Nat.Primes) (ω : Ω[↥(modularFunctionFieldBar N)⁄AlgebraicClosure ℚ]), ω ∈ regularDiffs (AlgebraicClosure ℚ) ↥(modularFunctionFieldBar N) → heckeOmegaBar N ℓ ω ∈ regularDiffs (AlgebraicClosure ℚ) ↥(modularFunctionFieldBar N) open Classical in def heckeOmegaRegBar (ℓ : Nat.Primes) : Module.End ℤ ↥(regularDiffs (AlgebraicClosure ℚ) ↥(modularFunctionFieldBar N)) := if h : HeckeOmegaPreservesBar N then ((heckeOmegaBar N ℓ).restrict (fun ω hω => h ℓ ω hω)).toAddMonoidHom.toIntLinearMap else 0 def HeckeOmegaCommuteBar : Prop := ∀ ℓ ℓ' : Nat.Primes, heckeOmegaRegBar N ℓ * heckeOmegaRegBar N ℓ' = heckeOmegaRegBar N ℓ' * heckeOmegaRegBar N ℓ theorem isMulCommutative_adjoin_heckeOmegaRegBar (h : HeckeOmegaCommuteBar N) : IsMulCommutative (Algebra.adjoin ℤ (Set.range (heckeOmegaRegBar N))) := Algebra.isMulCommutative_adjoin ℤ (by rintro _ ⟨ℓ, rfl⟩ _ ⟨ℓ', rfl⟩ exact h ℓ ℓ') open scoped IsMulCommutative in def heckeEvalOmegaBarAux (h : HeckeOmegaCommuteBar N) : HeckeAlg →ₐ[ℤ] (Algebra.adjoin ℤ (Set.range (heckeOmegaRegBar N)) : Subalgebra ℤ (Module.End ℤ ↥(regularDiffs (AlgebraicClosure ℚ) ↥(modularFunctionFieldBar N)))) := haveI := isMulCommutative_adjoin_heckeOmegaRegBar N h MvPolynomial.aeval fun ℓ => (⟨heckeOmegaRegBar N ℓ, Algebra.subset_adjoin (Set.mem_range_self ℓ)⟩ : Algebra.adjoin ℤ (Set.range (heckeOmegaRegBar N))) def heckeEvalOmegaBar (h : HeckeOmegaCommuteBar N) : HeckeAlg →+* Module.End ℤ ↥(regularDiffs (AlgebraicClosure ℚ) ↥(modularFunctionFieldBar N)) := ((Algebra.adjoin ℤ (Set.range (heckeOmegaRegBar N))).val.comp (heckeEvalOmegaBarAux N h)).toRingHom open Classical in @[implicit_reducible] def heckeOmegaModuleBar : Module HeckeAlg ↥(regularDiffs (AlgebraicClosure ℚ) ↥(modularFunctionFieldBar N)) := if h : HeckeOmegaCommuteBar N then Module.compHom _ (heckeEvalOmegaBar N h) else Module.compHom _ (MvPolynomial.eval₂Hom (Int.castRingHom ℤ) (0 : Nat.Primes → ℤ)) end OmegaModule section Seam variable (N : ℕ) [NeZero N] def heckeKerJ : Ideal HeckeAlg := letI := heckeModuleBar N Module.annihilator HeckeAlg (JZero N) theorem heckeKerJ_eq_ker (h : HeckeOperatorsCommuteBar N) : heckeKerJ N = RingHom.ker (heckeEvalBar h) := by letI := heckeModuleBar N ext t rw [heckeKerJ, RingHom.mem_ker, Module.mem_annihilator] constructor · intro ht ext x simpa [heckeModuleBar_smul_def h] using ht x · intro ht x rw [heckeModuleBar_smul_def h, ht] rfl def heckeKerOmega : Ideal HeckeAlg := letI := heckeOmegaModuleBar N Module.annihilator HeckeAlg ↥(regularDiffs (AlgebraicClosure ℚ) ↥(modularFunctionFieldBar N)) structure HeckeSeam : Prop where omega_le_J : heckeKerOmega N ≤ heckeKerJ N J_le_omega : heckeKerJ N ≤ heckeKerOmega N tate : ∀ (p : ℕ) [Fact p.Prime] (n : ℕ) (t : Fin n → HeckeAlg), letI := heckeModuleBar N LinearIndependent ℤ (Ideal.Quotient.mk (heckeKerJ N) ∘ t) → LinearIndependent ℚ_[p] (rationalHeckeRep p (JZero N) ∘ t) end Seam section OmegaAlong variable (L : Type*) [Field L] [Algebra ℚ L] (N ℓ : ℕ) [NeZero N] [NeZero ℓ] def heckeOmegaAlongT : Ω[↥(laurentBaseChange L (modularFunctionFieldFull N))⁄L] →ₗ[L] Ω[↥(laurentBaseChange L (modularFunctionFieldFull N))⁄L] := letI := algebraAlong (heckeAlphaBar L N ℓ) haveI := isScalarTower_along (heckeAlphaBar L N ℓ) haveI : SMulCommClass L ↥(laurentBaseChange L (modularFunctionFieldFull N)) ↥(laurentBaseChange L (modularFunctionFieldFull (N * ℓ))) := ⟨fun k f x => by simp only [Algebra.smul_def]; exact mul_left_comm _ _ _⟩ ((traceDiff L ↥(laurentBaseChange L (modularFunctionFieldFull N)) ↥(laurentBaseChange L (modularFunctionFieldFull (N * ℓ)))).restrictScalars L).comp (pullbackDiff (heckeBetaBar L N ℓ)) end OmegaAlong section OmegaModule variable (N : ℕ) [NeZero N] def heckeOmegaBarT (ℓ : Nat.Primes) : Ω[↥(modularFunctionFieldBar N)⁄AlgebraicClosure ℚ] →ₗ[AlgebraicClosure ℚ] Ω[↥(modularFunctionFieldBar N)⁄AlgebraicClosure ℚ] := haveI : NeZero (ℓ : ℕ) := ⟨ℓ.2.ne_zero⟩ heckeOmegaAlongT (AlgebraicClosure ℚ) N ℓ def HeckeOmegaPreservesBarT : Prop := ∀ (ℓ : Nat.Primes) (ω : Ω[↥(modularFunctionFieldBar N)⁄AlgebraicClosure ℚ]), ω ∈ regularDiffs (AlgebraicClosure ℚ) ↥(modularFunctionFieldBar N) → heckeOmegaBarT N ℓ ω ∈ regularDiffs (AlgebraicClosure ℚ) ↥(modularFunctionFieldBar N) open Classical in def heckeOmegaRegBarQ (ℓ : Nat.Primes) : Module.End (AlgebraicClosure ℚ) ↥(regularDiffs (AlgebraicClosure ℚ) ↥(modularFunctionFieldBar N)) := if h : HeckeOmegaPreservesBar N then (heckeOmegaBar N ℓ).restrict (fun ω hω => h ℓ ω hω) else 0 open Classical in def heckeOmegaRegBarQT (ℓ : Nat.Primes) : Module.End (AlgebraicClosure ℚ) ↥(regularDiffs (AlgebraicClosure ℚ) ↥(modularFunctionFieldBar N)) := if h : HeckeOmegaPreservesBarT N then (heckeOmegaBarT N ℓ).restrict (fun ω hω => h ℓ ω hω) else 0 def HeckeOmegaCommuteBarQ : Prop := ∀ ℓ ℓ' : Nat.Primes, heckeOmegaRegBarQ N ℓ * heckeOmegaRegBarQ N ℓ' = heckeOmegaRegBarQ N ℓ' * heckeOmegaRegBarQ N ℓ def HeckeOmegaCommuteBarQT : Prop := ∀ ℓ ℓ' : Nat.Primes, heckeOmegaRegBarQT N ℓ * heckeOmegaRegBarQT N ℓ' = heckeOmegaRegBarQT N ℓ' * heckeOmegaRegBarQT N ℓ theorem isMulCommutative_adjoin_heckeOmegaRegBarQ (h : HeckeOmegaCommuteBarQ N) : IsMulCommutative (Algebra.adjoin ℤ (Set.range (heckeOmegaRegBarQ N))) := Algebra.isMulCommutative_adjoin ℤ (by rintro _ ⟨ℓ, rfl⟩ _ ⟨ℓ', rfl⟩ exact h ℓ ℓ') theorem isMulCommutative_adjoin_heckeOmegaRegBarQT (h : HeckeOmegaCommuteBarQT N) : IsMulCommutative (Algebra.adjoin ℤ (Set.range (heckeOmegaRegBarQT N))) := Algebra.isMulCommutative_adjoin ℤ (by rintro _ ⟨ℓ, rfl⟩ _ ⟨ℓ', rfl⟩ exact h ℓ ℓ') open scoped IsMulCommutative in def heckeEvalOmegaBarAuxQ (h : HeckeOmegaCommuteBarQ N) : HeckeAlg →ₐ[ℤ] (Algebra.adjoin ℤ (Set.range (heckeOmegaRegBarQ N)) : Subalgebra ℤ (Module.End (AlgebraicClosure ℚ) ↥(regularDiffs (AlgebraicClosure ℚ) ↥(modularFunctionFieldBar N)))) := haveI := isMulCommutative_adjoin_heckeOmegaRegBarQ N h MvPolynomial.aeval fun ℓ => (⟨heckeOmegaRegBarQ N ℓ, Algebra.subset_adjoin (Set.mem_range_self ℓ)⟩ : Algebra.adjoin ℤ (Set.range (heckeOmegaRegBarQ N))) def heckeEvalOmegaBarQ (h : HeckeOmegaCommuteBarQ N) : HeckeAlg →+* Module.End (AlgebraicClosure ℚ) ↥(regularDiffs (AlgebraicClosure ℚ) ↥(modularFunctionFieldBar N)) := ((Algebra.adjoin ℤ (Set.range (heckeOmegaRegBarQ N))).val.comp (heckeEvalOmegaBarAuxQ N h)).toRingHom open scoped IsMulCommutative in def heckeEvalOmegaBarAuxQT (h : HeckeOmegaCommuteBarQT N) : HeckeAlg →ₐ[ℤ] (Algebra.adjoin ℤ (Set.range (heckeOmegaRegBarQT N)) : Subalgebra ℤ (Module.End (AlgebraicClosure ℚ) ↥(regularDiffs (AlgebraicClosure ℚ) ↥(modularFunctionFieldBar N)))) := haveI := isMulCommutative_adjoin_heckeOmegaRegBarQT N h MvPolynomial.aeval fun ℓ => (⟨heckeOmegaRegBarQT N ℓ, Algebra.subset_adjoin (Set.mem_range_self ℓ)⟩ : Algebra.adjoin ℤ (Set.range (heckeOmegaRegBarQT N))) def heckeEvalOmegaBarQT (h : HeckeOmegaCommuteBarQT N) : HeckeAlg →+* Module.End (AlgebraicClosure ℚ) ↥(regularDiffs (AlgebraicClosure ℚ) ↥(modularFunctionFieldBar N)) := ((Algebra.adjoin ℤ (Set.range (heckeOmegaRegBarQT N))).val.comp (heckeEvalOmegaBarAuxQT N h)).toRingHom open Classical in def heckeEvalOmegaBarQTotal : HeckeAlg →+* Module.End (AlgebraicClosure ℚ) ↥(regularDiffs (AlgebraicClosure ℚ) ↥(modularFunctionFieldBar N)) := if h : HeckeOmegaCommuteBarQ N then heckeEvalOmegaBarQ N h else (Int.castRingHom _).comp (MvPolynomial.eval₂Hom (Int.castRingHom ℤ) (0 : Nat.Primes → ℤ)) open Classical in def heckeEvalOmegaBarQTTotal : HeckeAlg →+* Module.End (AlgebraicClosure ℚ) ↥(regularDiffs (AlgebraicClosure ℚ) ↥(modularFunctionFieldBar N)) := if h : HeckeOmegaCommuteBarQT N then heckeEvalOmegaBarQT N h else (Int.castRingHom _).comp (MvPolynomial.eval₂Hom (Int.castRingHom ℤ) (0 : Nat.Primes → ℤ)) end OmegaModule namespace HeckeWord def HeckeInputsAlongT (L : Type*) [Field L] [Algebra ℚ L] (N ℓ : ℕ) [NeZero N] [NeZero ℓ] : Prop := ∃ (hα : HeckeAlphaBarIntegral L N ℓ) (_ : HeckeBetaBarIntegral L N ℓ) (_ : HasPrincipalDivisors L (laurentBaseChange L (modularFunctionFieldFull (N * ℓ)))) (hfin : FiniteAlong L (heckeBetaBar L N ℓ)), FundamentalIdentityAlong L (heckeAlphaBar L N ℓ) hα ∧ NormFormulaAlong L (heckeBetaBar L N ℓ) hfin variable (N : ℕ) [NeZero N] def letterKey (ℓ : Nat.Primes) : Prop := letI : NeZero (ℓ : ℕ) := ⟨ℓ.2.ne_zero⟩ (HeckeInputsAlong (AlgebraicClosure ℚ) N ℓ ∧ HeckeInputsAlongT (AlgebraicClosure ℚ) N ℓ) ∧ HeckeOmegaPreservesBar N ∧ HeckeOmegaPreservesBarT N open Classical in def letterJ : Nat.Primes ⊕ Nat.Primes → Module.End ℤ (JZero N) := Sum.elim (fun ℓ => letI : NeZero (ℓ : ℕ) := ⟨ℓ.2.ne_zero⟩ if h : letterKey N ℓ then haveI := h.1.1.snd.snd.fst (heckePic0Bar h.1.1.fst h.1.1.snd.fst h.1.1.snd.snd.snd.snd.1 h.1.1.snd.snd.snd.fst h.1.1.snd.snd.snd.snd.2).toIntLinearMap else 0) (fun ℓ => letI : NeZero (ℓ : ℕ) := ⟨ℓ.2.ne_zero⟩ if h : letterKey N ℓ then haveI := h.1.2.snd.snd.fst (heckePic0BarTranspose h.1.2.fst h.1.2.snd.fst h.1.2.snd.snd.snd.snd.1 h.1.2.snd.snd.snd.fst h.1.2.snd.snd.snd.snd.2).toIntLinearMap else 0) open Classical in def letterO : Nat.Primes ⊕ Nat.Primes → Module.End (AlgebraicClosure ℚ) ↥(regularDiffs (AlgebraicClosure ℚ) ↥(modularFunctionFieldBar N)) := Sum.elim (fun ℓ => if h : letterKey N ℓ then (heckeOmegaBar N ℓ).restrict (fun ω hω => h.2.1 ℓ ω hω) else 0) (fun ℓ => if h : letterKey N ℓ then (heckeOmegaBarT N ℓ).restrict (fun ω hω => h.2.2 ℓ ω hω) else 0) def wordJ (w : List (Nat.Primes ⊕ Nat.Primes)) : Module.End ℤ (JZero N) := (w.map (letterJ N)).prod def wordO (w : List (Nat.Primes ⊕ Nat.Primes)) : Module.End (AlgebraicClosure ℚ) ↥(regularDiffs (AlgebraicClosure ℚ) ↥(modularFunctionFieldBar N)) := (w.reverse.map (letterO N)).prod def wordTr (w : List (Nat.Primes ⊕ Nat.Primes)) : List (Nat.Primes ⊕ Nat.Primes) := (w.map Sum.swap).reverse def vpEnd (p : ℕ) [Fact p.Prime] (f : Module.End ℤ (JZero N)) : Module.End ℚ_[p] (RationalTateModule p (JZero N)) := Module.End.baseChangeHom ℤ_[p] ℚ_[p] (TateModule p (JZero N)) (TateModule.rep p (JZero N) (Module.End ℤ (JZero N)) f) end HeckeWord end ModularCurve end
Statements phrased using this module (0)
No statement module imports it directly (it is used through other definition modules or by proofs).