Definitions/Def_ModularCurve_X0.lean
Function field of inside
The module presents the modular curve X_0(N) over \mathbb{Q} by its function field, realised concretely inside the formal Laurent series field LaurentSeries ℚ =\mathbb{Q}((q)). For a coefficient ring R and N\neq 0, qExpand R N is the ring endomorphism of LaurentSeries R obtained by embedding the index domain along k\mapsto Nk, i.e. the substitution q\mapsto q^{N}; it is injective, is the identity for N=1, fixes constants, and composes as qExpand M ∘ qExpand N = qExpand (M*N). Over \mathbb{Q} the same map is packaged as the algebra endomorphism qExpandₐ N. The q-expansion of the j-invariant is built integrally: eisenstein4 is the power series with constant term 1 and n-th coefficient 240\sum_{d\mid n}d^{3}; etaProd =\prod_{n\ge 1}(1-q^{n}) (an infinite product in the product topology on power series); dedekindEtaUnit is its 24-th power, with constant term 1, and dedekindEtaUnitInv its power-series inverse. Then jNum =E_4^{3}\prod_{n\ge1}(1-q^{n})^{-24} over \mathbb{Z}, jNumQ its image over \mathbb{Q}, and jq =q^{-1}E_4^{3}\prod_{n\ge1}(1-q^{n})^{-24}; the coefficient lemmas record that jq has leading term q^{-1} with coefficient 1 and vanishes below, and that jq ≠ 0. Further, jqN N = qExpand ℚ N jq, i.e. j(q^{N}).
The fields are modularFunctionField N =\mathbb{Q}(j(q),j(q^{N})) and modularFunctionFieldFull N, the subfield generated by divisorExpansions N =\{j(q^{d}) : 0\neq d\mid N\}; there are the containments \mathbb{Q}(j)\le modularFunctionField N \le modularFunctionFieldFull N, monotonicity of the full field in N under divisibility, and (q\mapsto q^{\ell}) sends modularFunctionFieldFull N into modularFunctionFieldFull (N*ℓ). Two inputs are isolated rather than proved. ModularPolynomialData N is a structure carrying a polynomial \Phi\in(\mathbb{Z}[X])[Y] together with proofs that it is monic, that its degree in Y equals dedekindPsi N =\sum_{d\mid N,\,d\text{ squarefree}}N/d, and that \Phi(j(q),j(q^{N}))=0 under evalAtJ : ℤ[X] →+* ℚ((q)), X\mapsto j(q); only the level-one instance \Phi=Y-X is constructed. FunctionFieldGeneration M is the proposition that j(q^{d})\in\mathbb{Q}(j(q),j(q^{M})) for every nonzero d\mid M, proved here only for M=1. Auxiliary items jGen, evalAtJGen and ModularPolynomialData.toAdjoin read \Phi as a monic polynomial over \mathbb{Q}(j(q)).
Relation to Mathlib
Mathlib has no modular curve, modular polynomial or Dedekind psi function; these are the project's own definitions, built on Mathlib's HahnSeries/LaurentSeries API (embDomainRingHom, ofPowerSeries), on PowerSeries.invOfUnit and on infinite products in the product topology on power series.
Where it is used
This is the curve layer of an algebraic presentation of X_0(N) over \mathbb{Q} by its function field, on which the later construction of J_0(N) and its Hecke action rests; by itself it says nothing about Jacobians or Galois representations. The modular polynomial data and the generation predicate are carried as hypotheses by the statements that use them, with only the level-one cases constructed here.
References
- F. Diamond and J. Shurman, A First Course in Modular Forms, Graduate Texts in Mathematics 228, Springer, 2005
- G. Shimura, Introduction to the Arithmetic Theory of Automorphic Functions, Princeton University Press, 1971
- H. Darmon, F. Diamond and R. Taylor, Fermat's Last Theorem, in: Current Developments in Mathematics 1995, International Press, 1995, 1–154
References are suggested automatically and have not been individually verified.
English text generated automatically from the Lean source; the Lean statement is authoritative.
- 349 lines
- 64 declarations
- used in the statements of 325 theorems and imported by 500 proofs
- imports 0 definition modules
Source file: Definitions/Def_ModularCurve_X0.lean
Imports
- only Mathlib
Imported by
Def_ModularCurve_ArithmeticGaloisDef_ModularCurve_AtkinLehnerPartialDef_ModularCurve_ComplexPlaceDictionaryDef_ModularCurve_DRModelPackageDef_ModularCurve_GenusNumericsDef_ModularCurve_HpoolLevelRingDef_ModularCurve_IgusaSchemeDef_ModularCurve_JqCoeffDef_ModularCurve_KroneckerTransportDef_ModularCurve_LambdaSeriesDef_ModularCurve_LevelFunctionFieldDef_ModularCurve_ModularEquationQDef_ModularCurve_ModularUnitDef_ModularCurve_PhiGenDef_ModularCurve_QAdicPlaceDef_ModularCurve_RouteBCoordRingDef_ModularCurve_ShimuraGenerator
Declarations
- def
ModularCurve.qExpand - theorem
ModularCurve.qExpand_coeff_mul - theorem
ModularCurve.qExpand_coeff_of_not_dvd - theorem
ModularCurve.qExpand_single - theorem
ModularCurve.qExpand_C - theorem
ModularCurve.qExpand_injective - theorem
ModularCurve.qExpand_one_apply - theorem
ModularCurve.qExpand_congr - theorem
ModularCurve.qExpand_qExpand - theorem
ModularCurve.algebraMap_apply_eq_single - def
ModularCurve.qExpandₐ - theorem
ModularCurve.qExpandₐ_apply - def
ModularCurve.eisenstein4 - theorem
ModularCurve.constantCoeff_eisenstein4 - def
ModularCurve.etaProd - theorem
ModularCurve.constantCoeff_etaProd - def
ModularCurve.dedekindEtaUnit - theorem
ModularCurve.constantCoeff_dedekindEtaUnit - def
ModularCurve.dedekindEtaUnitInv - theorem
ModularCurve.dedekindEtaUnit_mul_inv - theorem
ModularCurve.constantCoeff_dedekindEtaUnitInv - def
ModularCurve.jNum - theorem
ModularCurve.constantCoeff_jNum - def
ModularCurve.jNumQ - theorem
ModularCurve.constantCoeff_jNumQ - def
ModularCurve.jq - theorem
ModularCurve.ofPowerSeries_coeff_of_neg - theorem
ModularCurve.jq_pow - theorem
ModularCurve.coeff_jq_pow_self - theorem
ModularCurve.coeff_jq_pow_of_lt - theorem
ModularCurve.coeff_jq_neg_one - theorem
ModularCurve.coeff_jq_of_lt - theorem
ModularCurve.jq_ne_zero - def
ModularCurve.jqN - theorem
ModularCurve.jqN_one - def
ModularCurve.dedekindPsi - theorem
ModularCurve.dedekindPsi_one - def
ModularCurve.evalAtJ - theorem
ModularCurve.evalAtJ_X - structure
ModularCurve.ModularPolynomialData - field
ModularCurve.ModularPolynomialData.monic - field
ModularCurve.ModularPolynomialData.natDegree_eq - field
ModularCurve.ModularPolynomialData.eval_eq_zero - def
ModularCurve.modularPolynomialDataOne - def
ModularCurve.FunctionFieldGeneration - theorem
ModularCurve.functionFieldGeneration_one - def
ModularCurve.modularFunctionField - theorem
ModularCurve.jq_mem - theorem
ModularCurve.jqN_mem - theorem
ModularCurve.modularFunctionField_one - theorem
ModularCurve.adjoin_jq_le - def
ModularCurve.jGen - def
ModularCurve.evalAtJGen - theorem
ModularCurve.algebraMap_comp_evalAtJGen - def
ModularCurve.ModularPolynomialData.toAdjoin - theorem
ModularCurve.ModularPolynomialData.toAdjoin_monic - def
ModularCurve.divisorExpansions - theorem
ModularCurve.mem_divisorExpansions - def
ModularCurve.modularFunctionFieldFull - theorem
ModularCurve.jqd_mem_full - theorem
ModularCurve.modularFunctionField_le_full - theorem
ModularCurve.full_degeneracy_le - theorem
ModularCurve.full_degeneracy_map_le - theorem
ModularCurve.qExpandₐ_comp
Source
import Mathlib.RingTheory.LaurentSeries ↗ import Mathlib.RingTheory.PowerSeries.PiTopology ↗ import Mathlib.RingTheory.PowerSeries.Inverse ↗ import Mathlib.FieldTheory.IntermediateField.Adjoin.Basic ↗ import Mathlib.RingTheory.Algebraic.Basic ↗ import Mathlib.NumberTheory.Divisors ↗ import Mathlib.Data.Nat.Squarefree ↗ set_option autoImplicit false noncomputable section open scoped PowerSeries.WithPiTopology open PowerSeries HahnSeries IntermediateField namespace ModularCurve section QExpand variable {R : Type*} [CommRing R] variable (R) in def qExpand (N : ℕ) [NeZero N] : LaurentSeries R →+* LaurentSeries R := HahnSeries.embDomainRingHom (AddMonoidHom.mulLeft (N : ℤ)) (mul_right_injective₀ (by exact_mod_cast NeZero.ne N)) (fun g g' => mul_le_mul_iff_of_pos_left (by exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne N))) variable (N : ℕ) [NeZero N] @[simp] theorem qExpand_coeff_mul (f : LaurentSeries R) (k : ℤ) : (qExpand R N f).coeff ((N : ℤ) * k) = f.coeff k := HahnSeries.embDomain_coeff theorem qExpand_coeff_of_not_dvd (f : LaurentSeries R) {k : ℤ} (hk : ¬ (N : ℤ) ∣ k) : (qExpand R N f).coeff k = 0 := by refine HahnSeries.embDomain_notin_range ?_ rintro ⟨m, rfl⟩ exact hk ⟨m, rfl⟩ @[simp] theorem qExpand_single (k : ℤ) (r : R) : qExpand R N (HahnSeries.single k r) = HahnSeries.single ((N : ℤ) * k) r := HahnSeries.embDomain_single @[simp] theorem qExpand_C (r : R) : qExpand R N (HahnSeries.C r) = HahnSeries.C r := HahnSeries.embDomainRingHom_C theorem qExpand_injective : Function.Injective (qExpand R N) := HahnSeries.embDomain_injective theorem qExpand_one_apply (f : LaurentSeries R) : qExpand R 1 f = f := by ext k have h : ((1 : ℕ) : ℤ) * k = k := by simp conv_lhs => rw [← h] rw [qExpand_coeff_mul] theorem qExpand_congr {M K : ℕ} [NeZero M] [NeZero K] (h : M = K) (f : LaurentSeries R) : qExpand R M f = qExpand R K f := by subst h; rfl theorem qExpand_qExpand (M : ℕ) [NeZero M] (f : LaurentSeries R) : qExpand R M (qExpand R N f) = qExpand R (M * N) f := by ext k by_cases hk : ((M : ℤ) * N) ∣ k · obtain ⟨m, rfl⟩ := hk trans f.coeff m · rw [show (M : ℤ) * N * m = (M : ℤ) * ((N : ℤ) * m) by ring, qExpand_coeff_mul, qExpand_coeff_mul] · rw [show (M : ℤ) * N * m = (((M * N : ℕ) : ℤ)) * m by push_cast; ring, qExpand_coeff_mul] · rw [qExpand_coeff_of_not_dvd (M * N) f (by push_cast; exact hk)] by_cases hkM : (M : ℤ) ∣ k · obtain ⟨m, rfl⟩ := hkM rw [qExpand_coeff_mul M _ m] refine qExpand_coeff_of_not_dvd N _ ?_ rintro ⟨c, hc⟩ exact hk ⟨c, by rw [hc]; ring⟩ · exact qExpand_coeff_of_not_dvd M _ hkM end QExpand section RatAlgebra variable (N : ℕ) [NeZero N] theorem algebraMap_apply_eq_single (c : ℚ) : algebraMap ℚ (LaurentSeries ℚ) c = HahnSeries.single 0 c := by have h1 : algebraMap ℚ (PowerSeries ℚ) c = PowerSeries.C c := by simp rw [HahnSeries.algebraMap_apply', h1, HahnSeries.ofPowerSeries_C] rfl def qExpandₐ : LaurentSeries ℚ →ₐ[ℚ] LaurentSeries ℚ where __ := qExpand ℚ N commutes' r := by show qExpand ℚ N (algebraMap ℚ (LaurentSeries ℚ) r) = algebraMap ℚ (LaurentSeries ℚ) r rw [algebraMap_apply_eq_single, qExpand_single, mul_zero] @[simp] theorem qExpandₐ_apply (f : LaurentSeries ℚ) : qExpandₐ N f = qExpand ℚ N f := rfl end RatAlgebra section JFunction def eisenstein4 : PowerSeries ℤ := PowerSeries.mk fun n => if n = 0 then 1 else 240 * ∑ d ∈ n.divisors, (d : ℤ) ^ 3 @[simp] theorem constantCoeff_eisenstein4 : PowerSeries.constantCoeff eisenstein4 = 1 := by rw [← PowerSeries.coeff_zero_eq_constantCoeff] simp [eisenstein4] def etaProd : PowerSeries ℤ := ∏' n : ℕ, (1 - PowerSeries.X ^ (n + 1)) theorem constantCoeff_etaProd : PowerSeries.constantCoeff etaProd = 1 := by rw [etaProd] simp [(PowerSeries.WithPiTopology.multipliable_one_sub_X_pow ℤ).map_tprod _ (PowerSeries.WithPiTopology.continuous_constantCoeff ℤ)] def dedekindEtaUnit : PowerSeries ℤ := etaProd ^ 24 theorem constantCoeff_dedekindEtaUnit : PowerSeries.constantCoeff dedekindEtaUnit = 1 := by rw [dedekindEtaUnit, map_pow, constantCoeff_etaProd, one_pow] def dedekindEtaUnitInv : PowerSeries ℤ := dedekindEtaUnit.invOfUnit 1 theorem dedekindEtaUnit_mul_inv : dedekindEtaUnit * dedekindEtaUnitInv = 1 := PowerSeries.mul_invOfUnit _ _ (by rw [constantCoeff_dedekindEtaUnit]; rfl) theorem constantCoeff_dedekindEtaUnitInv : PowerSeries.constantCoeff dedekindEtaUnitInv = 1 := by have h := congrArg (PowerSeries.constantCoeff (R := ℤ)) dedekindEtaUnit_mul_inv rwa [map_mul, constantCoeff_dedekindEtaUnit, one_mul, map_one] at h def jNum : PowerSeries ℤ := eisenstein4 ^ 3 * dedekindEtaUnitInv @[simp] theorem constantCoeff_jNum : PowerSeries.constantCoeff jNum = 1 := by rw [jNum, map_mul, map_pow, constantCoeff_eisenstein4, constantCoeff_dedekindEtaUnitInv, one_pow, one_mul] def jNumQ : PowerSeries ℚ := jNum.map (Int.castRingHom ℚ) @[simp] theorem constantCoeff_jNumQ : PowerSeries.constantCoeff jNumQ = 1 := by rw [← PowerSeries.coeff_zero_eq_constantCoeff, jNumQ, PowerSeries.coeff_map, PowerSeries.coeff_zero_eq_constantCoeff, constantCoeff_jNum] simp def jq : LaurentSeries ℚ := HahnSeries.single (-1 : ℤ) 1 * HahnSeries.ofPowerSeries ℤ ℚ jNumQ theorem ofPowerSeries_coeff_of_neg {R : Type*} [Semiring R] (f : PowerSeries R) {k : ℤ} (hk : k < 0) : (HahnSeries.ofPowerSeries ℤ R f).coeff k = 0 := by rw [HahnSeries.ofPowerSeries_apply] refine HahnSeries.embDomain_notin_range ?_ rintro ⟨m, rfl⟩ exact absurd hk (not_lt.mpr (Int.natCast_nonneg m)) theorem jq_pow (n : ℕ) : jq ^ n = HahnSeries.single (-(n : ℤ)) 1 * HahnSeries.ofPowerSeries ℤ ℚ (jNumQ ^ n) := by have h : n • (-1 : ℤ) = -(n : ℤ) := by simp rw [jq, mul_pow, HahnSeries.single_pow, one_pow, h, ← map_pow] theorem coeff_jq_pow_self (n : ℕ) : (jq ^ n).coeff (-(n : ℤ)) = 1 := by rw [jq_pow, HahnSeries.coeff_single_mul, one_mul, sub_neg_eq_add, neg_add_cancel, show (0 : ℤ) = ((0 : ℕ) : ℤ) from rfl, HahnSeries.ofPowerSeries_apply_coeff, PowerSeries.coeff_zero_eq_constantCoeff, map_pow, constantCoeff_jNumQ, one_pow] theorem coeff_jq_pow_of_lt {n : ℕ} {m : ℤ} (hm : m < -(n : ℤ)) : (jq ^ n).coeff m = 0 := by rw [jq_pow, HahnSeries.coeff_single_mul, one_mul] exact ofPowerSeries_coeff_of_neg _ (by omega) @[simp] theorem coeff_jq_neg_one : jq.coeff (-1 : ℤ) = 1 := by have h := coeff_jq_pow_self 1 simpa using h theorem coeff_jq_of_lt {k : ℤ} (hk : k < -1) : jq.coeff k = 0 := by have h := coeff_jq_pow_of_lt (n := 1) (m := k) (by simpa using hk) simpa using h theorem jq_ne_zero : jq ≠ 0 := fun h => by simpa [h] using coeff_jq_neg_one end JFunction def jqN (N : ℕ) [NeZero N] : LaurentSeries ℚ := qExpand ℚ N jq @[simp] theorem jqN_one : jqN 1 = jq := qExpand_one_apply jq section NamedInputs def dedekindPsi (N : ℕ) : ℕ := ∑ d ∈ N.divisors with Squarefree d, N / d @[simp] theorem dedekindPsi_one : dedekindPsi 1 = 1 := by rw [dedekindPsi, Nat.divisors_one, Finset.filter_singleton, if_pos squarefree_one] simp def evalAtJ : Polynomial ℤ →+* LaurentSeries ℚ := (Polynomial.aeval (R := ℤ) jq).toRingHom @[simp] theorem evalAtJ_X : evalAtJ Polynomial.X = jq := by simp [evalAtJ] structure ModularPolynomialData (N : ℕ) [NeZero N] : Type where Φ : Polynomial (Polynomial ℤ) monic : Φ.Monic natDegree_eq : Φ.natDegree = dedekindPsi N eval_eq_zero : Φ.eval₂ evalAtJ (jqN N) = 0 def modularPolynomialDataOne : ModularPolynomialData 1 where Φ := Polynomial.X - Polynomial.C Polynomial.X monic := Polynomial.monic_X_sub_C _ natDegree_eq := by simp eval_eq_zero := by simp only [Polynomial.eval₂_sub, Polynomial.eval₂_X, Polynomial.eval₂_C, jqN_one, evalAtJ_X, sub_self] def FunctionFieldGeneration (M : ℕ) [NeZero M] : Prop := ∀ d : ℕ, d ∣ M → ∀ (_ : NeZero d), qExpand ℚ d jq ∈ IntermediateField.adjoin ℚ {jq, qExpand ℚ M jq} theorem functionFieldGeneration_one : FunctionFieldGeneration 1 := by intro d hd hne haveI := hne rw [Nat.dvd_one] at hd subst hd exact subset_adjoin ℚ _ (Set.mem_insert_of_mem _ rfl) end NamedInputs section FunctionField variable (N : ℕ) [NeZero N] def modularFunctionField : IntermediateField ℚ (LaurentSeries ℚ) := IntermediateField.adjoin ℚ {jq, qExpand ℚ N jq} theorem jq_mem : jq ∈ modularFunctionField N := IntermediateField.subset_adjoin ℚ _ (Set.mem_insert _ _) theorem jqN_mem : qExpand ℚ N jq ∈ modularFunctionField N := IntermediateField.subset_adjoin ℚ _ (Set.mem_insert_of_mem _ rfl) theorem modularFunctionField_one : modularFunctionField 1 = ℚ⟮jq⟯ := by rw [modularFunctionField, qExpand_one_apply, Set.pair_eq_singleton] theorem adjoin_jq_le : ℚ⟮jq⟯ ≤ modularFunctionField N := by rw [IntermediateField.adjoin_le_iff] exact Set.singleton_subset_iff.mpr (jq_mem N) end FunctionField def jGen : ℚ⟮jq⟯ := ⟨jq, IntermediateField.mem_adjoin_simple_self ℚ jq⟩ def evalAtJGen : Polynomial ℤ →+* ℚ⟮jq⟯ := Polynomial.eval₂RingHom (Int.castRingHom ℚ⟮jq⟯) jGen theorem algebraMap_comp_evalAtJGen : (algebraMap ℚ⟮jq⟯ (LaurentSeries ℚ)).comp evalAtJGen = evalAtJ := by refine Polynomial.ringHom_ext' (Subsingleton.elim _ _) ?_ show algebraMap ℚ⟮jq⟯ (LaurentSeries ℚ) (evalAtJGen Polynomial.X) = evalAtJ Polynomial.X rw [evalAtJ_X] show algebraMap ℚ⟮jq⟯ (LaurentSeries ℚ) (Polynomial.eval₂ (Int.castRingHom ℚ⟮jq⟯) jGen Polynomial.X) = jq rw [Polynomial.eval₂_X] rfl namespace ModularPolynomialData variable {N : ℕ} [NeZero N] (data : ModularPolynomialData N) def toAdjoin : Polynomial ℚ⟮jq⟯ := data.Φ.map evalAtJGen theorem toAdjoin_monic : data.toAdjoin.Monic := data.monic.map _ end ModularPolynomialData section AllDivisors variable (N : ℕ) [NeZero N] def divisorExpansions : Set (LaurentSeries ℚ) := {x | ∃ (d : ℕ) (_ : NeZero d), d ∣ N ∧ x = qExpand ℚ d jq} omit [NeZero N] in theorem mem_divisorExpansions {d : ℕ} [NeZero d] (hd : d ∣ N) : qExpand ℚ d jq ∈ divisorExpansions N := ⟨d, ‹_›, hd, rfl⟩ def modularFunctionFieldFull : IntermediateField ℚ (LaurentSeries ℚ) := IntermediateField.adjoin ℚ (divisorExpansions N) omit [NeZero N] in theorem jqd_mem_full {d : ℕ} [NeZero d] (hd : d ∣ N) : qExpand ℚ d jq ∈ modularFunctionFieldFull N := subset_adjoin ℚ _ (mem_divisorExpansions N hd) theorem modularFunctionField_le_full : modularFunctionField N ≤ modularFunctionFieldFull N := by rw [modularFunctionField, adjoin_le_iff] rintro x (rfl | rfl) · have h := jqd_mem_full N (one_dvd N) rwa [qExpand_one_apply] at h · exact jqd_mem_full N dvd_rfl theorem full_degeneracy_le {N M : ℕ} [NeZero N] [NeZero M] (h : N ∣ M) : modularFunctionFieldFull N ≤ modularFunctionFieldFull M := by rw [modularFunctionFieldFull, adjoin_le_iff] rintro x ⟨d, hne, hdvd, rfl⟩ haveI := hne exact jqd_mem_full M (hdvd.trans h) omit [NeZero N] in theorem full_degeneracy_map_le (ℓ : ℕ) [NeZero ℓ] : (modularFunctionFieldFull N).map (qExpandₐ ℓ) ≤ modularFunctionFieldFull (N * ℓ) := by rw [modularFunctionFieldFull, adjoin_map, adjoin_le_iff] rintro x ⟨y, ⟨d, hne, hdvd, rfl⟩, rfl⟩ haveI := hne haveI : NeZero (ℓ * d) := ⟨Nat.mul_ne_zero (NeZero.ne ℓ) (NeZero.ne d)⟩ show qExpandₐ ℓ (qExpand ℚ d jq) ∈ _ rw [qExpandₐ_apply, qExpand_qExpand] exact jqd_mem_full (N * ℓ) ((mul_dvd_mul_left ℓ hdvd).trans (dvd_of_eq (mul_comm ℓ N))) theorem qExpandₐ_comp (ℓ ℓ' : ℕ) [NeZero ℓ] [NeZero ℓ'] : (qExpandₐ ℓ).comp (qExpandₐ ℓ') = qExpandₐ (ℓ * ℓ') := by refine AlgHom.ext fun f => ?_ simp only [AlgHom.comp_apply, qExpandₐ_apply] exact qExpand_qExpand ℓ' ℓ f end AllDivisors end ModularCurve
Statements phrased using this module (325)
- Existence of a symmetric modular polynomial Φ_ℓ
ModularCurve.exists_modularPolynomialData_evalSymm39 below · depth 8 - Generation of j(qᵈ) by j(q) and j(q^N)
ModularCurve.functionFieldGeneration69 below · depth 8 - Symmetric modular polynomials Φ_ℓ exist for every prime
ModularCurve.modularPolynomialFamily39 below · depth 8 - Symmetry of the prime-level modular polynomial
ModularCurve.ModularPolynomialData.evalSymm_of_prime44 below · depth 9 - Modular equation Φ_ℓ(j(qᵈ),j(q^{dℓ}))=0 over any base ring
ModularCurve.ModularPolynomialData.eval_jqNModC_mul_eq_zero2 below · depth 9 - Forward modular equation for odd Vélu quotients
ModularCurve.ModularPolynomialData.isRoot_map_j_veluQuotient_j_of_addOrderOf_eq96 below · depth 9 - Separability of Φₚ(j₀,Y) for non-integral j₀
ModularCurve.ModularPolynomialData.separable_map_eval2_of_not_isIntegral233 below · depth 9 - Separability of Φ̄_N over 𝔽̄_ℓ(X), prime level
ModularCurve.ModularPolynomialData.separable_map_ratFunc_of_prime_of_not_dvd47 below · depth 9 - Integrality of the descended coefficients of Φ_ℓ
ModularCurve.PhiGen.PhiGenDescends.intCoeffs0 below · depth 9 - Evaluation symmetry of a modular polynomial packet with descended coefficients
ModularCurve.PhiGen.evalSymm_of_coeff_evalAtJ_eq14 below · depth 9 - Assembling Φ_ℓ from a descended integral coefficient family
ModularCurve.PhiGen.exists_modularPolynomialData_coeff_eq10 below · depth 9 - Descent of the coefficients of Φ_ℓ to ℚ((q))
ModularCurve.PhiGen.exists_phiGenDescends1 below · depth 9 - Coefficients of the generic level-ℓ modular polynomial lie in ℚ[j]
ModularCurve.PhiGen.mem_adjoin_jq_of_phiGenDescends16 below · depth 9 - Twisted prime-level splitting of the modular polynomial Φₚ
ModularCurve.PhiGen.splits_prime_at_slot44 below · depth 9 - Coefficientwise maps commute with q↦ qⁿ
ModularCurve.coeffMap_qExpand0 below · depth 9 - Multiplicativity of the Dedekind ψ function
ModularCurve.dedekindPsi_mul_of_coprime0 below · depth 9 - Value of `dedekindPsi` at a prime: ψ(p)=p+1
ModularCurve.dedekindPsi_prime0 below · depth 9 - Dedekind ψ at a prime power
ModularCurve.dedekindPsi_prime_pow0 below · depth 9 - Irreducible modular polynomial datum from degree ψ(N)
ModularCurve.exists_phiIrreducible_of_finrank_eq42 below · depth 9 - Geometric degree of X₀(ℓ)→ X(1) is ℓ+1
ModularCurve.finrank_adjoin_jqNModC_eq_of_prime75 below · depth 9 - Level Mpᵃ⁺¹ divisor-expansion field is generated by j(q^pᵃ⁺¹)
ModularCurve.full_eq_adjoin_full_div_prime46 below · depth 9 - Generation property equals collapse of the full modular function field
ModularCurve.functionFieldGeneration_iff_full_eq0 below · depth 9 - Integrality of j(q^{dℓ}) over fields containing j(qᵈ)
ModularCurve.isIntegral_jqNModC_mul3 below · depth 9 - Non-membership of j(q^pᵃ⁺²) over prime-power levels
ModularCurve.jqN_pow_not_mem_adjoin_full45 below · depth 9 - Non-membership of j(qᵖ) in the level-M divisor-expansion field
ModularCurve.jqN_prime_not_mem_full59 below · depth 9 - Descent closure: F_N = F_N^{full} from one-prime steps
ModularCurve.modularFunctionField_eq_full_of46 below · depth 9 - Existence of a modular polynomial datum at every level N
ModularCurve.nonempty_modularPolynomialData71 below · depth 9 - Substitution q↦ qⁿ commutes with base change of Laurent subfields
ModularCurve.qExpand_mem_laurentBaseChange2 below · depth 9 - Relative degree ψ(N) of the field of divisor q-expansions
ModularCurve.relfinrank_full_eq_dedekindPsi69 below · depth 9 - Relative degree of one prime-power step in the divisor-expansion tower
ModularCurve.relfinrank_full_eq_mul48 below · depth 9 - Relative degree of ℚ(j,j_N) over ℚ(j)
ModularCurve.relfinrank_modularFunctionField0 below · depth 9 - Degree of the q↦ q^ℓ degeneracy map on ℚ(j(qᵈ):d∣ N)
ModularCurve.relfinrank_qExpand_full71 below · depth 9 - Transcendence of j(q^N) over ℚ
ModularCurve.transcendental_jqN1 below · depth 9 - Uniqueness of prime-level modular polynomial data
ModularCurve.ModularPolynomialData.eq_of_prime42 below · depth 10 - Bidegree bound deg cᵢ ≤ p(ψ(p)-i) at prime level
ModularCurve.ModularPolynomialData.natDegree_coeff_le_mul_dedekindPsi_sub48 below · depth 10 - Separability of Φₚ(j₀,Y) for non-integral j₀
ModularCurve.ModularPolynomialData.separable_map_eval2_of_not_isIntegral_of_isAlgClosed232 below · depth 10 - Transpose of Φ monic of degree ψ(N) over ℚ(j)
ModularCurve.ModularPolynomialData.transposeToAdjoin_monic_of_qExpansion5 below · depth 10 - Vanishing of descended coefficients above degree ℓ+1
ModularCurve.PhiGen.PhiGenDescends.c_eq_zero3 below · depth 10 - Descended coefficient family has top coefficient 1
ModularCurve.PhiGen.PhiGenDescends.c_top3 below · depth 10 - Formal descent data give q-expansions of the Hecke coset polynomial
ModularCurve.PhiGen.PhiGenDescends.hasSum_cosetPoly_coeff10 below · depth 10 - Pole order at most ℓ+1 for descended coefficients
ModularCurve.PhiGen.PhiGenDescends.poleOrderLE3 below · depth 10 - Descended coefficients annihilate j(q^ℓ)
ModularCurve.PhiGen.PhiGenDescends.sum_mul_jqN_pow_eq_zero3 below · depth 10 - Integrality descent for polynomials in j
ModularCurve.PhiGen.aeval_jq_intCoeffs_descent0 below · depth 10 - Injectivity of evaluation at j(q)
ModularCurve.PhiGen.evalAtJ_injective3 below · depth 10 - Symmetry of Φ_ℓ from its splitting into conjugates
ModularCurve.PhiGen.evalSymm_of_splits6 below · depth 10 - Pole bound for the non-constant coefficients of phiProd
ModularCurve.PhiGen.phiProd_conj_coeff_eq_zero_of_le0 below · depth 10 - Leading t-coefficient of the constant term of Φ_ℓ
ModularCurve.PhiGen.phiProd_conj_coeff_zero_lead0 below · depth 10 - Descended coefficients force Φ to split into conjugates
ModularCurve.PhiGen.splits_of_coeff_evalAtJ_eq0 below · depth 10 - Prime-level modular polynomial splits over any field with ζₚ
ModularCurve.PhiGen.splits_of_prime43 below · depth 10 - Base change of modular function field generated by j and j_N
ModularCurve.adjoin_jBar_jNBar_eq_top92 below · depth 10 - A rational polynomial vanishing at j(q) is zero
ModularCurve.aeval_jq_eq_zero0 below · depth 10 - Coefficient extension commutes with q↦ qⁿ
ModularCurve.coeffEmb_qExpand1 below · depth 10 - Positivity of ψ(N) for N ≠ 0
ModularCurve.dedekindPsi_pos1 below · depth 10 - Injectivity of evaluation at the formal j-invariant
ModularCurve.evalAtJGen_injective4 below · depth 10 - j(q^N) is integral over ℤ[j(q)]
ModularCurve.exists_monic_evalAtJ_jqN_eq_zero41 below · depth 10 - Existence of an irreducible symmetric modular polynomial Φ_ℓ
ModularCurve.exists_phiIrreducible_evalSymm40 below · depth 10 - Finiteness of K(j)bigl(j(q^N)bigr) over K(j)
ModularCurve.finiteDimensional_adjoin_jqNModC2 below · depth 10 - Degree bound ψ(N) for K(j)(j(q^N)) over K(j)
ModularCurve.finrank_adjoin_jqNModC_le2 below · depth 10 - Degree of ℚ(j)(j(q^N)) over ℚ(j) is ψ(N)
ModularCurve.finrank_adjoin_jqN_eq_dedekindPsi69 below · depth 10 - Degree ℓ+1 of ℚ(j)(j(q^ℓ)) over ℚ(j)
ModularCurve.finrank_adjoin_jqN_eq_of_prime41 below · depth 10 - Degree p for the next prime-power level of j
ModularCurve.finrank_adjoin_jqN_pow_succ_of_not_mem46 below · depth 10 - Degree p+1 of j(qᵖ) over a field containing j(q)
ModularCurve.finrank_adjoin_jqN_prime_of_not_mem45 below · depth 10 - At prime level the two modular function fields agree
ModularCurve.full_eq_of_prime2 below · depth 10 - Function field generation at squarefree level
ModularCurve.functionFieldGeneration_of_squarefree57 below · depth 10 - Base change of the full modular function field to L
ModularCurve.laurentBaseChange_modularFunctionFieldFull2 below · depth 10 - q-expansion principle at level one: invariance implies f∈ℚ[j]
ModularCurve.mem_adjoin_jq_of_hasSum_of_slash_invariant10 below · depth 10 - Extensionality of ℚ-algebra maps on ℚ(j(qᵈ):d∣ N)
ModularCurve.modularFunctionFieldFull_algHom_ext0 below · depth 10 - Level-N modular function field equals its full divisor field
ModularCurve.modularFunctionField_eq_full69 below · depth 10 - Kronecker's congruence for Φ_ℓ modulo ℓ
ModularCurve.modularPolynomial_kronecker48 below · depth 10 - Existence of modular polynomial data at squarefree levels
ModularCurve.nonempty_modularPolynomialData_of_squarefree40 below · depth 10 - Substitution q ↦ q^N multiplies the order by N
ModularCurve.order_qExpand0 below · depth 10 - Adjoining a new prime level multiplies the degree by ℓ+1
ModularCurve.relfinrank_full_mul_prime53 below · depth 10 - Relative degree ψ(p²) of the level-p² divisor-expansion field
ModularCurve.relfinrank_full_sq59 below · depth 10 - Transcendence of the q-expansion j(q) over ℚ
ModularCurve.transcendental_jq1 below · depth 10 - Cyclic kernel of order N forces Φ_N(j(E),j(E'))=0
WeierstrassCurve.Affine.eval_modularPolynomial_map_j_eq_zero_of_isAddCyclic_ker_pointMapOfPushforward91 below · depth 10 - Membership in the e-ramified Puiseux subfield
HahnSeries.mem_puiseuxRamSubfield_iff0 below · depth 11 - Integral kernel elements at the j-chart are constant multiples
ModularCurve.CharPModel.exists_eq_const_mul_of_modularRedLocHom_eq_zero76 below · depth 11 - Kernel elements integral at the inverted j-chart are constant multiples
ModularCurve.CharPModel.exists_eq_const_mul_of_modularRedLocHom_eq_zero_inv77 below · depth 11 - Integral closedness of the localised modular subring
ModularCurve.CharPReduction.mem_modularLocalized_of_eval2_monic4 below · depth 11 - Φ_N(j(Λ),j(Λ'))=0 for cyclic sublattices of index N
ModularCurve.ModularPolynomialData.eval_jLattice_eq_zero_of_isAddCyclic19 below · depth 11 - Swapped modular equation Φ_ℓ(j(q^{dℓ}),j(qᵈ))=0 over any ring
ModularCurve.ModularPolynomialData.eval_jqNModC_of_mul_eq_zero2 below · depth 11 - Roots of Φ_N(a+t,Y) are Laurent series for odd N
ModularCurve.ModularPolynomialData.hasRamBound_one_of_isRoot_off_zero_1728_of_odd209 below · depth 11 - Roots of Φ_N(t,Y) over ℚ̄ have ramification bound 3 (N odd)
ModularCurve.ModularPolynomialData.hasRamBound_three_of_isRoot_at_zero_of_odd209 below · depth 11 - Roots of Φ_N(1728+t,Y) have ramification bound 2 for odd N
ModularCurve.ModularPolynomialData.hasRamBound_two_of_isRoot_at_1728_of_odd209 below · depth 11 - Vélu quotient j-invariant is a root of Φ₂ₙ₊₁(j(W), · )
ModularCurve.ModularPolynomialData.isRoot_map_j_veluQuotient_j_of_addOrderOf_eq_of_isAlgClosed95 below · depth 11 - Degree bound p+1 for the coefficients of Φₚ
ModularCurve.ModularPolynomialData.natDegree_coeff_le46 below · depth 11 - Separability of Φ₂(j₀,Y) for non-integral j₀
ModularCurve.ModularPolynomialData.separable_map_eval2_of_not_isIntegral_of_isAlgClosed_two67 below · depth 11 - Irreducibility of Φ_ℓ(j,Y) over ℚ(j) from its conjugate factorisation
ModularCurve.PhiGen.phiIrreducible_of_splits6 below · depth 11 - Fricke involution sends the ∞-expansion to the 0-expansion
ModularCurve.coe_frickeInvolutionFull_eq_of_hasSum_of_gamma0_invariant58 below · depth 11 - Dedekind ψ at squarefree level
ModularCurve.dedekindPsi_of_squarefree2 below · depth 11 - Killing the pole at q=0 by a polynomial in j(q)
ModularCurve.exists_aeval_jq_sub_holomorphicAtInfty0 below · depth 11 - Elements of ℂF_N are ratios of forms on Γ₀(N)
ModularCurve.exists_modularForm_mul_qExpansion_eq_of_mem_laurentBaseChange14 below · depth 11 - Relative degree [ℚ(j)(j_N):ℚ(j)]=ψ(N) at squarefree level
ModularCurve.finrank_adjoin_jqN_eq_of_squarefree54 below · depth 11 - Degree p of j(q^{p^2}) over a field containing j(qᵖ)
ModularCurve.finrank_adjoin_jqN_sq_of_not_mem46 below · depth 11 - At squarefree level, divisor expansions are generated by prime ones
ModularCurve.full_eq_adjoin_primes46 below · depth 11 - Divisor expansions at level p² generate ℚ(j,jₚ,j_{p²})
ModularCurve.full_sq_eq_adjoin46 below · depth 11 - Divisor expansions at level p²ℓ: generation by prime chains
ModularCurve.full_sq_mul_prime_eq_adjoin46 below · depth 11 - Function field generation at prime level
ModularCurve.functionFieldGeneration_of_prime0 below · depth 11 - Formal q-series j(q) sums to E₄³/Δ
ModularCurve.hasSum_jq_qParam4 below · depth 11 - q_ℓ-expansion of F(ℓτ) is A(q^{ℓ^2})
ModularCurve.hasSum_qParam_heckeDiagMatrix_smul0 below · depth 11 - Integrality over ℚ[j] of a Γ₀(ℓ)-invariant q-expansion
ModularCurve.isIntegral_adjoin_jq_of_hasSum_of_gamma0_invariant22 below · depth 11 - j(q^r) is not rational in j and the j(qᵖ), p∈ S
ModularCurve.jqN_prime_not_mem_adjoin48 below · depth 11 - j(q^{p^2}) lies outside ℚ(j,j(qᵖ),j(q^s)_{s∈ S})
ModularCurve.jqN_sq_not_mem_adjoin49 below · depth 11 - Dedekind ψ dominates its argument
ModularCurve.le_dedekindPsi0 below · depth 11 - Every nonnegative q-coefficient of j is at least 1
ModularCurve.one_le_coeff_jq0 below · depth 11 - Degree of ℚ(j)(jₚ : p ∈ S) over ℚ(j)
ModularCurve.relfinrank_adjoin_primes53 below · depth 11 - Relative degree ψ(N) at squarefree level
ModularCurve.relfinrank_full_of_squarefree53 below · depth 11 - Non-integral j forces endomorphisms to be integer multiplications
WeierstrassCurve.Affine.IsogenyEndDatum.exists_forall_pointEnd_eq_zsmul_of_not_isIntegral_j169 below · depth 11 - Cyclic subgroups of order n number ψ(n)
WeierstrassCurve.natCard_addSubgroup_isAddCyclic_card_eq_dedekindPsi_of_isAlgClosed8 below · depth 11 - Groups with n-torsion (ℤ/n)² have ψ(n) cyclic subgroups of order n
AddCommGroup.natCard_isAddCyclic_addSubgroup_eq_dedekindPsi_of_addEquiv_torsionBy4 below · depth 12 - Coset representatives give roots of Φ_N(j(τ),·)
ModularCurve.ModularPolynomialData.eval_E4_cube_div_discriminant_coset_eq_zero15 below · depth 12 - Coset conjugates as roots of Φ_N(j(q^N),Y)
ModularCurve.ModularPolynomialData.exists_isPrimitiveRoot_forall_isRoot_cosetConj_complex18 below · depth 12 - Level-2 modular equation via Vélu quotients
ModularCurve.ModularPolynomialData.fibrePoly_j_eq_prod_veluQuotient2_j65 below · depth 12 - Diagonal modular polynomial has unit leading coefficient
ModularCurve.ModularPolynomialData.isUnit_leadingCoeff_diag72 below · depth 12 - Roots of Φ_N(j(E),Y) lie in L
ModularCurve.ModularPolynomialData.mem_of_isRoot_map_j_of_transcendental_of_odd203 below · depth 12 - Separability of Φ_N over K(X) when N≠ 0 in K
ModularCurve.ModularPolynomialData.separable_map_ratFunc_of_natCast_ne_zero24 below · depth 12 - The ℓ+1 conjugate expansions of j are distinct
ModularCurve.PhiGen.conj_injective0 below · depth 12 - A field endomorphism permutes the ℓ-th roots of unity
ModularCurve.PhiGen.exists_galoisPerm1 below · depth 12 - Coefficientwise Galois descent for Laurent series
ModularCurve.PhiGen.mem_range_coeffEmb_of_forall_coeffMap_eq1 below · depth 12 - Joint descent for q-expansions with rational coefficients
ModularCurve.PhiGen.mem_range_coeffEmb_qExpand_of_mem_inter1 below · depth 12 - j(q^N) is a root of the modular polynomial over ℚ(j)
ModularCurve.aeval_jqN_toAdjoin0 below · depth 12 - Primitive coset representatives are counted by Dedekind's ψ
ModularCurve.card_primCosetReps_eq_dedekindPsi0 below · depth 12 - Uniqueness of the coset factorisation over K((t))
ModularCurve.eq_cosetTwoVarPoly_of_forall_isRoot0 below · depth 12 - j(qᵈ) as a ratio of weight-12 forms on Γ₀(N)
ModularCurve.exists_modularForm_mul_qExpansion_eq_coeffEmb_qExpand_jq13 below · depth 12 - Existence of an irreducible modular polynomial at every level
ModularCurve.exists_phiIrreducible69 below · depth 12 - Both degeneracy embeddings have degree p+1 when p ‖ M
ModularCurve.finrankAlong_eq_add_one_and_finrankAlong_eq_add_one_of_coe_eq_qExpand247 below · depth 12 - qE₄³/Δ is the sum of its q-series
ModularCurve.hasSum_jNum_qParam3 below · depth 12 - Integrality of Y⁶̂ j⁴(̂ j-1728)³ over ℂ[̂ j]
ModularCurve.isIntegral_adjoin_coeffEmb_jq_of_mul_thetaL_eq_qExpansion82 below · depth 12 - Any algebra image of j(q^N) is a root of Φ
ModularCurve.isRoot_map_Phi_apply_jBar92 below · depth 12 - Separability of the full modular function field over L(j)
ModularCurve.isSeparable_adjoin_coeffEmb_jq_full142 below · depth 12 - Separability of j(q^N) over K(j(q)) from Φ_N over K(X)
ModularCurve.isSeparable_jqNModC_of_separable_phi_map2 below · depth 12 - Divisor-generator criterion for the base-changed modular function field
ModularCurve.laurentBaseChange_le_of_divisor_generators_mem0 below · depth 12 - Frobenius on reductions of integral Laurent series: ̄ s(q)^ℓ=̄ s(q^ℓ)
ModularCurve.map_intCast_pow_char_eq_qExpand0 below · depth 12 - Rationality of q-expansions of ratios of forms on Γ₀(N)
ModularCurve.mem_laurentBaseChange_of_coeffMap_eq_qExpansion_div101 below · depth 12 - q-expansion principle for X₀(ℓ), ℓ prime
ModularCurve.mem_modularFunctionField_of_hasSum_of_gamma0_invariant22 below · depth 12 - Φ_N(j,Y) as minimal polynomial of j(q^N) over ℚ(j)
ModularCurve.minpoly_jqN_eq_toAdjoin0 below · depth 12 - Frobenius and q ↦ qᵖ on Laurent series in characteristic p
ModularCurve.pow_char_eq_map_frobenius_qExpand0 below · depth 12 - q-expansion function field of Γ₀(M) equals ℚ(j(qᵈ):d∣ M)
ModularCurve.qExpFunctionFieldC_rat_gamma0_eq_modularFunctionFieldFull186 below · depth 12 - q-expansion of Δ as integral series qprod(1-qⁿ)²⁴
ModularCurve.qExpansion_discriminant_eq_map_X_mul_dedekindEtaUnit1 below · depth 12 - Ratios of q-expansions of Γ₀(N)-forms lie in ℂ· F_N
ModularCurve.qExpansion_div_mem_laurentBaseChange149 below · depth 12 - Cyclic index-N sublattices come from primitive coset representatives
PeriodPair.exists_mem_primCosetReps_and_jLattice_eq_of_isAddCyclic0 below · depth 12 - Degree-N endomorphism forces Φ_N(j(E),j(E))=0
WeierstrassCurve.Affine.IsogenyEndDatum.aeval_j_diag_eq_zero_of_finrankAlong_eq87 below · depth 12 - Torsion coordinates of a good-reduction model are Laurent
WeierstrassCurve.hasRamBound_one_of_nsmul_eq_zero_of_isUnit_discriminant_powerSeries2 below · depth 12 - Odd cyclic subgroups determined by the Vélu quotient's j
WeierstrassCurve.zmultiples_eq_of_veluQuotient_j_eq_of_transcendental185 below · depth 12 - Index of Γ₀(N) equals ψ(N)
ModularCurve.Gamma0_index3 below · depth 13 - Uniqueness of modular polynomial data at every level
ModularCurve.ModularPolynomialData.eq_all70 below · depth 13 - Modular equation on H: Φ_N(j(σ),j(Nσ))=0
ModularCurve.ModularPolynomialData.eval_E4_cube_div_discriminant_smul_eq_zero13 below · depth 13 - Coset roots of the modular polynomial descend from ℂ
ModularCurve.ModularPolynomialData.forall_isRoot_cosetConj_jqModC_of_complex0 below · depth 13 - Irreducibility of the modular polynomial over K(X)
ModularCurve.ModularPolynomialData.irreducible_map_ratFunc_of_natCast_ne_zero113 below · depth 13 - j(q^N) is integral over ℚ(j(q))
ModularCurve.ModularPolynomialData.isIntegral_jqN0 below · depth 13
… and 175 more statements (search for the module name to find them).