Definitions/Def_ModularCurve_PhiGen.lean
Coset substitutions and the generic modular polynomial
Working with formal Laurent series (Hahn series over \mathbb{Z}), the module sets up the substitution calculus behind the modular equation. For a commutative ring R and a unit u \in R^\times, qTwist u is the ring endomorphism of R((t)) with (\mathrm{qTwist}\,u\,f)_k = u^k f_k, i.e. the substitution t \mapsto ut; helper lemmas record its effect on monomials, that it preserves supports, is injective, that \mathrm{qTwist}\,u \circ \mathrm{qTwist}\,v = \mathrm{qTwist}(uv), and that it commutes with the N-fold expansion qExpand at the cost of replacing u by u^N. Over a field K, cosetSubst ζ a b is qTwist (ζ ^ (a * b)) followed by qExpand K (a * a), the formal substitution q \mapsto \zeta^{ab} t^{a^2}. With \ell prime, K a \mathbb{Q}-algebra field and \zeta \in K^\times, the index functions cosetA, cosetB encode the pairs (a,b) = (\ell,0) at index 0 and (1,b) at index b+1, and conj ℓ ζ i applies cosetSubst ζ (cosetA ℓ i) (cosetB ℓ i) to the base change coeffEmb K jq of j(q); its normal forms are j expanded in t^{\ell^2} at index 0 and \mathrm{qTwist}(\zeta^b) of j at index b+1. phiProd ℓ conj is \prod_{i \in \mathrm{Fin}(\ell+1)}(X - C(\mathrm{conj}\,i)) in K((t))[X], shown monic of degree \ell+1, nonzero, and vanishing at each \mathrm{conj}\,i. Several predicates pin down the expected shape of this product: PhiGenDescends c says each coefficient of phiProd ℓ (conj ℓ ζ) is the base change of the \ell-fold expansion of c_k \in \mathbb{Q}((q)); PoleOrderLE/TPoleOrderLE (vanishing of all coefficients in degrees < -n), JSimplePole and IntCoeffs (every coefficient lies in \mathbb{Z}) are the pole and integrality conditions. Further auxiliary notions: evalAtJqN N, evaluation of \mathbb{Z}[X] at j(q^N); EvalSymm Φ, the assertion that the bivariate \Phi \in \mathbb{Z}[X][Y] takes the same value on (x,y) and (y,x) for all x,y \in \mathbb{Q}((q)); ModularPolynomialFamily, the existence, for every prime \ell, of a ModularPolynomialData ℓ (a monic \Phi of degree \psi(\ell) with \Phi(j, j(q^\ell)) = 0) whose \Phi is EvalSymm; PhiIrreducible data, irreducibility of \Phi pushed into \mathbb{Q}(j(q))[X]; the subalgebra \mathbb{Q}[j(q)] \subseteq \mathbb{Q}((q)) with its distinguished element and evaluation map; and swapBivar, the involution of \mathbb{Z}[X][Y] interchanging the two variables.
Relation to Mathlib
Mathlib supplies the Laurent series ring as Hahn series over \mathbb{Z} together with aeval/eval₂ evaluation; the substitutions t \mapsto ut and q \mapsto \zeta^{ab}t^{a^2}, the family of conjugates of j, and modular polynomials are the project's own.
Where it is used
These definitions provide the formal q-expansion vocabulary in which the modular equation \Phi_\ell(X,Y) is produced, with its degree, symmetry, integrality and irreducibility properties, for the theory of the modular curves X_0(N) entering the modularity and level-lowering steps.
References
- S. Lang, Elliptic Functions, 2nd ed., Graduate Texts in Mathematics 112, Springer, 1987
- D. A. Cox, Primes of the Form x^2+ny^2: Fermat, Class Field Theory, and Complex Multiplication, Wiley, 1989
References are suggested automatically and have not been individually verified.
English text generated automatically from the Lean source; the Lean statement is authoritative.
- 310 lines
- 50 declarations
- used in the statements of 132 theorems and imported by 323 proofs
- imports 2 definition modules
Source file: Definitions/Def_ModularCurve_PhiGen.lean
Declarations
- def
ModularCurve.qTwistFun - theorem
ModularCurve.qTwistFun_coeff - theorem
ModularCurve.support_qTwistFun - def
ModularCurve.qTwist - theorem
ModularCurve.qTwist_coeff - theorem
ModularCurve.support_qTwist - theorem
ModularCurve.qTwist_single - theorem
ModularCurve.qTwist_one_apply - theorem
ModularCurve.qTwist_qTwist - theorem
ModularCurve.qTwist_injective - theorem
ModularCurve.qTwist_qExpand - def
ModularCurve.cosetSubst - def
ModularCurve.evalAtJqN - theorem
ModularCurve.evalAtJqN_X - theorem
ModularCurve.evalAtJqN_def - theorem
ModularCurve.evalAtJ_def - theorem
ModularCurve.evalAtJqN_one - def
ModularCurve.EvalSymm - theorem
ModularCurve.aeval_toRingHom_X - def
ModularCurve.PoleOrderLE - def
ModularCurve.ModularPolynomialFamily - def
ModularCurve.PhiIrreducible - abbrev
ModularCurve.adjoinJq - def
ModularCurve.jAdj - def
ModularCurve.evalAtJAdj - def
ModularCurve.swapInner - def
ModularCurve.swapBivar - theorem
ModularCurve.swapBivar_X - theorem
ModularCurve.swapBivar_C_X - def
ModularCurve.PhiGen.cosetA - def
ModularCurve.PhiGen.cosetB - theorem
ModularCurve.PhiGen.cosetA_zero - theorem
ModularCurve.PhiGen.cosetB_zero - theorem
ModularCurve.PhiGen.cosetA_succ - theorem
ModularCurve.PhiGen.cosetB_succ - instance
ModularCurve.PhiGen.instNeZeroPhiGenCosetA - theorem
ModularCurve.PhiGen.cosetSubst_congr - def
ModularCurve.PhiGen.conj - theorem
ModularCurve.PhiGen.conj_zero - theorem
ModularCurve.PhiGen.conj_succ - def
ModularCurve.PhiGen.phiProd - theorem
ModularCurve.PhiGen.phiProd_monic - theorem
ModularCurve.PhiGen.phiProd_natDegree - theorem
ModularCurve.PhiGen.phiProd_ne_zero - theorem
ModularCurve.PhiGen.phiProd_eval_conj - def
ModularCurve.PhiGen.TPoleOrderLE - theorem
ModularCurve.PhiGen.tPoleOrderLE_iff_poleOrderLE - def
ModularCurve.PhiGen.JSimplePole - def
ModularCurve.PhiGen.IntCoeffs - def
ModularCurve.PhiGen.PhiGenDescends
Source
import Definitions.Def_ModularCurve_X0 import Definitions.Def_ModularCurve_LaurentCoeff import Mathlib.Algebra.Polynomial.BigOperators ↗ set_option autoImplicit false noncomputable section open scoped PowerSeries.WithPiTopology open PowerSeries HahnSeries IntermediateField Polynomial namespace ModularCurve section QTwist variable {R : Type*} [CommRing R] def qTwistFun (u : Rˣ) (f : LaurentSeries R) : LaurentSeries R where coeff k := (u ^ k : Rˣ) * f.coeff k isPWO_support' := f.isPWO_support'.mono fun k hk => by simp only [Function.mem_support] at hk ⊢ exact fun h => hk (by rw [h, mul_zero]) @[simp] theorem qTwistFun_coeff (u : Rˣ) (f : LaurentSeries R) (k : ℤ) : (qTwistFun u f).coeff k = (u ^ k : Rˣ) * f.coeff k := rfl theorem support_qTwistFun (u : Rˣ) (f : LaurentSeries R) : (qTwistFun u f).support = f.support := by ext k rw [HahnSeries.mem_support, HahnSeries.mem_support, qTwistFun_coeff] exact not_congr (Units.mul_right_eq_zero _) open Finset renaming antidiagonal → pwoAntidiagonal, mem_antidiagonal → mem_pwoAntidiagonal in def qTwist (u : Rˣ) : LaurentSeries R →+* LaurentSeries R where toFun := qTwistFun u map_one' := by ext k rw [qTwistFun_coeff, HahnSeries.coeff_one] split_ifs with h · subst h; simp · rw [mul_zero] map_mul' f g := by ext k have hset : pwoAntidiagonal (qTwistFun u f).isPWO_support (qTwistFun u g).isPWO_support k = pwoAntidiagonal f.isPWO_support g.isPWO_support k := by ext ij simp only [mem_pwoAntidiagonal, support_qTwistFun] rw [qTwistFun_coeff, HahnSeries.coeff_mul, HahnSeries.coeff_mul, hset, Finset.mul_sum] refine Finset.sum_congr rfl fun ij hij => ?_ obtain ⟨-, -, hsum⟩ := mem_pwoAntidiagonal.mp hij rw [qTwistFun_coeff, qTwistFun_coeff, mul_mul_mul_comm, ← Units.val_mul, ← zpow_add, hsum] map_zero' := by ext k rw [qTwistFun_coeff, HahnSeries.coeff_zero, mul_zero] map_add' f g := by ext k rw [HahnSeries.coeff_add] show (qTwistFun u (f + g)).coeff k = (qTwistFun u f).coeff k + (qTwistFun u g).coeff k rw [qTwistFun_coeff, qTwistFun_coeff, qTwistFun_coeff, HahnSeries.coeff_add, mul_add] @[simp] theorem qTwist_coeff (u : Rˣ) (f : LaurentSeries R) (k : ℤ) : (qTwist u f).coeff k = (u ^ k : Rˣ) * f.coeff k := rfl theorem support_qTwist (u : Rˣ) (f : LaurentSeries R) : (qTwist u f).support = f.support := support_qTwistFun u f @[simp] theorem qTwist_single (u : Rˣ) (k : ℤ) (r : R) : qTwist u (HahnSeries.single k r) = HahnSeries.single k ((u ^ k : Rˣ) * r) := by ext m rw [qTwist_coeff, HahnSeries.coeff_single, HahnSeries.coeff_single] split_ifs with h · subst h; rfl · rw [mul_zero] theorem qTwist_one_apply (f : LaurentSeries R) : qTwist (1 : Rˣ) f = f := by ext k rw [qTwist_coeff, one_zpow, Units.val_one, one_mul] theorem qTwist_qTwist (u v : Rˣ) (f : LaurentSeries R) : qTwist u (qTwist v f) = qTwist (u * v) f := by ext k rw [qTwist_coeff, qTwist_coeff, qTwist_coeff, ← mul_assoc, ← Units.val_mul, ← mul_zpow] theorem qTwist_injective (u : Rˣ) : Function.Injective (qTwist u) := by intro f g h have := congrArg (qTwist u⁻¹) h rwa [qTwist_qTwist, qTwist_qTwist, inv_mul_cancel, qTwist_one_apply, qTwist_one_apply] at this theorem qTwist_qExpand (v : Rˣ) (N : ℕ) [NeZero N] (f : LaurentSeries R) : qTwist v (qExpand R N f) = qExpand R N (qTwist (v ^ (N : ℤ)) f) := by ext k by_cases hk : (N : ℤ) ∣ k · obtain ⟨m, rfl⟩ := hk rw [qTwist_coeff, qExpand_coeff_mul, qExpand_coeff_mul, qTwist_coeff, ← zpow_mul] · rw [qTwist_coeff, qExpand_coeff_of_not_dvd N f hk, mul_zero, qExpand_coeff_of_not_dvd N _ hk] end QTwist section CosetSubst variable {K : Type*} [Field K] def cosetSubst (ζ : Kˣ) (a b : ℕ) [NeZero a] : LaurentSeries K →+* LaurentSeries K := haveI : NeZero (a * a) := ⟨Nat.mul_ne_zero (NeZero.ne a) (NeZero.ne a)⟩ (qExpand K (a * a)).comp (qTwist (ζ ^ (a * b))) end CosetSubst section EvalAtJqN variable (N : ℕ) [NeZero N] def evalAtJqN : Polynomial ℤ →+* LaurentSeries ℚ := (Polynomial.aeval (R := ℤ) (jqN N)).toRingHom @[simp] theorem evalAtJqN_X : evalAtJqN N Polynomial.X = jqN N := by simp [evalAtJqN] theorem evalAtJqN_def : evalAtJqN N = (Polynomial.aeval (R := ℤ) (jqN N)).toRingHom := rfl theorem evalAtJ_def : evalAtJ = (Polynomial.aeval (R := ℤ) jq).toRingHom := rfl theorem evalAtJqN_one : evalAtJqN 1 = evalAtJ := by rw [evalAtJqN_def, evalAtJ_def, jqN_one] end EvalAtJqN section Symmetry def EvalSymm (Φ : Polynomial (Polynomial ℤ)) : Prop := ∀ x y : LaurentSeries ℚ, Φ.eval₂ (Polynomial.aeval (R := ℤ) x).toRingHom y = Φ.eval₂ (Polynomial.aeval (R := ℤ) y).toRingHom x @[simp] theorem aeval_toRingHom_X (x : LaurentSeries ℚ) : (Polynomial.aeval (R := ℤ) x).toRingHom Polynomial.X = x := by simp end Symmetry def PoleOrderLE (f : LaurentSeries ℚ) (n : ℕ) : Prop := ∀ k : ℤ, k < -(n : ℤ) → f.coeff k = 0 def ModularPolynomialFamily : Prop := ∀ (ℓ : ℕ) [NeZero ℓ], ℓ.Prime → ∃ data : ModularPolynomialData ℓ, EvalSymm data.Φ section Named variable {N : ℕ} [NeZero N] def PhiIrreducible (data : ModularPolynomialData N) : Prop := Irreducible data.toAdjoin end Named section AdjoinRing abbrev adjoinJq : Subalgebra ℚ (LaurentSeries ℚ) := Algebra.adjoin ℚ {jq} def jAdj : adjoinJq := ⟨jq, Algebra.self_mem_adjoin_singleton ℚ jq⟩ def evalAtJAdj : Polynomial ℤ →+* adjoinJq := Polynomial.eval₂RingHom (Int.castRingHom adjoinJq) jAdj end AdjoinRing section SwapBivar def swapInner : Polynomial ℤ →+* Polynomial (Polynomial ℤ) := (Polynomial.aeval (R := ℤ) (Polynomial.X : Polynomial (Polynomial ℤ))).toRingHom def swapBivar : Polynomial (Polynomial ℤ) →+* Polynomial (Polynomial ℤ) := Polynomial.eval₂RingHom swapInner (Polynomial.C Polynomial.X) @[simp] theorem swapBivar_X : swapBivar Polynomial.X = Polynomial.C Polynomial.X := Polynomial.eval₂_X _ _ @[simp] theorem swapBivar_C_X : swapBivar (Polynomial.C Polynomial.X) = Polynomial.X := by show Polynomial.eval₂ swapInner (Polynomial.C Polynomial.X) (Polynomial.C Polynomial.X) = Polynomial.X rw [Polynomial.eval₂_C] exact Polynomial.aeval_X _ end SwapBivar namespace PhiGen section CosetIndex variable (ℓ : ℕ) def cosetA (i : Fin (ℓ + 1)) : ℕ := if i = 0 then ℓ else 1 def cosetB (i : Fin (ℓ + 1)) : ℕ := if i = 0 then 0 else (i : ℕ) - 1 @[simp] theorem cosetA_zero : cosetA ℓ (0 : Fin (ℓ + 1)) = ℓ := if_pos rfl @[simp] theorem cosetB_zero : cosetB ℓ (0 : Fin (ℓ + 1)) = 0 := if_pos rfl @[simp] theorem cosetA_succ (b : Fin ℓ) : cosetA ℓ b.succ = 1 := if_neg (Fin.succ_ne_zero b) @[simp] theorem cosetB_succ (b : Fin ℓ) : cosetB ℓ b.succ = (b : ℕ) := by rw [cosetB, if_neg (Fin.succ_ne_zero b), Fin.val_succ, Nat.add_sub_cancel] instance instNeZeroPhiGenCosetA [hℓ : Fact (Nat.Prime ℓ)] (i : Fin (ℓ + 1)) : NeZero (cosetA ℓ i) := ⟨by unfold cosetA; split <;> simp [hℓ.out.ne_zero]⟩ end CosetIndex section ConjugateFamily variable {K : Type*} [Field K] theorem cosetSubst_congr (ζ : Kˣ) {a a' b b' : ℕ} [NeZero a] [NeZero a'] (ha : a = a') (hb : b = b') (f : LaurentSeries K) : cosetSubst ζ a b f = cosetSubst ζ a' b' f := by subst ha; subst hb; rfl variable [Algebra ℚ K] (ℓ : ℕ) [hℓ : Fact (Nat.Prime ℓ)] (ζ : Kˣ) def conj (i : Fin (ℓ + 1)) : LaurentSeries K := cosetSubst ζ (cosetA ℓ i) (cosetB ℓ i) (coeffEmb K jq) theorem conj_zero : conj ℓ ζ (0 : Fin (ℓ + 1)) = qExpand K (ℓ * ℓ) (coeffEmb K jq) := by have h1 : conj ℓ ζ (0 : Fin (ℓ + 1)) = cosetSubst ζ ℓ 0 (coeffEmb K jq) := cosetSubst_congr ζ (cosetA_zero ℓ) (cosetB_zero ℓ) (coeffEmb K jq) rw [h1, cosetSubst, RingHom.comp_apply, mul_zero, pow_zero, qTwist_one_apply] theorem conj_succ (b : Fin ℓ) : conj ℓ ζ b.succ = qTwist (ζ ^ (b : ℕ)) (coeffEmb K jq) := by have h1 : conj ℓ ζ b.succ = cosetSubst ζ 1 ((b : ℕ)) (coeffEmb K jq) := cosetSubst_congr ζ (cosetA_succ ℓ b) (cosetB_succ ℓ b) (coeffEmb K jq) rw [h1, cosetSubst, RingHom.comp_apply, qExpand_congr (show 1 * 1 = 1 by norm_num), qExpand_one_apply, one_mul] end ConjugateFamily section Product variable {K : Type*} [Field K] (ℓ : ℕ) def phiProd (conj : Fin (ℓ + 1) → LaurentSeries K) : Polynomial (LaurentSeries K) := ∏ i : Fin (ℓ + 1), (Polynomial.X - Polynomial.C (conj i)) theorem phiProd_monic (conj : Fin (ℓ + 1) → LaurentSeries K) : (phiProd ℓ conj).Monic := monic_prod_of_monic _ _ fun i _ => monic_X_sub_C (conj i) theorem phiProd_natDegree (conj : Fin (ℓ + 1) → LaurentSeries K) : (phiProd ℓ conj).natDegree = ℓ + 1 := by rw [phiProd, natDegree_prod_of_monic _ _ fun i _ => monic_X_sub_C _] simp theorem phiProd_ne_zero (conj : Fin (ℓ + 1) → LaurentSeries K) : phiProd ℓ conj ≠ 0 := (phiProd_monic ℓ conj).ne_zero theorem phiProd_eval_conj (conj : Fin (ℓ + 1) → LaurentSeries K) (i : Fin (ℓ + 1)) : (phiProd ℓ conj).eval (conj i) = 0 := by rw [phiProd, Polynomial.eval_prod] exact Finset.prod_eq_zero (Finset.mem_univ i) (by simp) end Product section PoleDefs variable {K : Type*} [Field K] def TPoleOrderLE (f : LaurentSeries K) (n : ℕ) : Prop := ∀ m : ℤ, m < -(n : ℤ) → f.coeff m = 0 theorem tPoleOrderLE_iff_poleOrderLE (f : LaurentSeries ℚ) (n : ℕ) : TPoleOrderLE f n ↔ PoleOrderLE f n := Iff.rfl variable (J : LaurentSeries K) def JSimplePole : Prop := ∀ m : ℤ, m < -1 → J.coeff m = 0 end PoleDefs def IntCoeffs (f : LaurentSeries ℚ) : Prop := ∀ m : ℤ, ∃ z : ℤ, f.coeff m = (z : ℚ) section Descends variable {K : Type*} [Field K] [Algebra ℚ K] (ℓ : ℕ) [hℓ : Fact (Nat.Prime ℓ)] (ζ : Kˣ) def PhiGenDescends (c : ℕ → LaurentSeries ℚ) : Prop := ∀ k : ℕ, (phiProd ℓ (conj ℓ ζ)).coeff k = coeffEmb K (qExpand ℚ ℓ (c k)) end Descends end PhiGen end ModularCurve
Statements phrased using this module (132)
- Existence of a symmetric modular polynomial Φ_ℓ
ModularCurve.exists_modularPolynomialData_evalSymm39 below · depth 8 - Principal divisors on the function field of X₀(N) over ℚ̄
ModularCurve.hasPrincipalDivisors_modularFunctionFieldBar36 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 - 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 - Irreducible modular polynomial datum from degree ψ(N)
ModularCurve.exists_phiIrreducible_of_finrank_eq42 below · depth 9 - Principal divisors on the level-N modular function field over L
ModularCurve.hasPrincipalDivisors_laurentBaseChange_modularFunctionFieldFull35 below · depth 9 - Integrality of ̄ j(q^N) over K(̄ j(q))
ModularCurve.isIntegral_jqNModC_of_modularPolynomialData3 below · depth 9 - Descent by one prime: j(q^M)∈ℚ(j(q),j(q^{Mp}))
ModularCurve.jqN_div_mem_modularFunctionField46 below · depth 9 - Minimal polynomial of j(q^M) splits into primitive slots
ModularCurve.minpoly_jqN_map_eq_prod_slots59 below · depth 9 - Bidegree bound deg cᵢ ≤ p(ψ(p)-i) at prime level
ModularCurve.ModularPolynomialData.natDegree_coeff_le_mul_dedekindPsi_sub48 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 - Existence of an irreducible symmetric modular polynomial Φ_ℓ
ModularCurve.exists_phiIrreducible_evalSymm40 below · depth 10 - Finiteness along the β-degeneracy map q↦ q^ℓ
ModularCurve.finiteAlong_heckeBetaBar_of_modularPolynomialData6 below · depth 10 - Integrality of the β degeneracy map from a symmetric Φ_ℓ
ModularCurve.heckeBetaBarIntegral_of_modularPolynomialData7 below · depth 10 - Integrality of j(q^N) over K(j(q)) at all levels
ModularCurve.isIntegral_jqNModC_all_of_modularPolynomialFamily4 below · depth 10 - Coefficient law for θ = q d/dq on Laurent series
ModularCurve.theta_coeff73 below · depth 10 - Leibniz rule for θ = q d/dq on Laurent series
ModularCurve.theta_mul73 below · depth 10 - Swapped modular equation Φ_ℓ(j(q^{dℓ}),j(qᵈ))=0 over any ring
ModularCurve.ModularPolynomialData.eval_jqNModC_of_mul_eq_zero2 below · depth 11 - Irreducibility of Φ_ℓ(j,Y) over ℚ(j) from its conjugate factorisation
ModularCurve.PhiGen.phiIrreducible_of_splits6 below · depth 11 - Summing q-twists over the ℓ-th roots of unity
ModularCurve.PhiGen.sum_qTwist_coeff72 below · depth 11 - Coefficient transposition under the bivariate swap
ModularCurve.coeff_coeff_swapBivar0 below · depth 11 - Killing the pole at q=0 by a polynomial in j(q)
ModularCurve.exists_aeval_jq_sub_holomorphicAtInfty0 below · depth 11 - Degree [K(j)(j(qᵈ)):K(j)]=ψ(d) over any field
ModularCurve.finrank_adjoin_jqNModC_eq_dedekindPsi_of_socket88 below · depth 11 - Hecke inputs at the q-degeneracy roof from separability
ModularCurve.heckeInputsFibre_of_separable_phi_map62 below · depth 11 - Separability of j(q^N) over K(j) in good characteristic
ModularCurve.isSeparable_jqNModC_of_good91 below · depth 11 - Separability of j(q^M) over K(j(q)) for M invertible
ModularCurve.isSeparable_jqNModC_of_natCast_ne_zero42 below · depth 11 - Normalised Hahn-series embeddings at a place above j₀
ModularCurve.natCard_normalized_algHom_jBar_eq_toNat_ord151 below · depth 11 - Evaluation symmetry over ℚ((q)) forces symmetry of Φ
ModularCurve.swapBivar_eq_of_evalSymm0 below · depth 11 - 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 - Divisibility G∘ R ∣ c Gᵖ⁺¹ from q-expansion identities
ModularCurve.StarBank.closure0 below · depth 12 - A norm identity for the q-expansion of Δ
ModularCurve.StarBank.deltaNorm0 below · depth 12 - Monicity and splitting of a polynomial relation R(j(q))=j(qᵖ)
ModularCurve.StarBank.press3 below · depth 12 - Existence of a Fricke automorphism from symmetric irreducible Φ
ModularCurve.exists_isFrickeAut_of_modularPolynomialData1 below · depth 12 - Existence of an irreducible modular polynomial at every level
ModularCurve.exists_phiIrreducible69 below · depth 12 - Every cusp place of X₀(N) arises from a slot
ModularCurve.exists_slot_of_isCusp151 below · depth 12 - Finiteness and separability of the modular function field over K(j)
ModularCurve.finiteDimensional_and_isSeparable_adjoin_jGeomGen_of_isSeparable_jqNModC1 below · depth 12 - Descent of the fibre Hecke correspondence to Pic⁰
ModularCurve.heckeDivFibreDescends_of_separable_phi_map59 below · depth 12 - Separability of j(q^N) over K(j(q))
ModularCurve.isSeparable_jqNModC_of_modularPolynomialData3 below · depth 12 - Laurent series fixed by q↦ζ q lie in K((qⁿ))
ModularCurve.mem_range_qExpand_of_qTwist_eq0 below · depth 12 - Φ_N(j,Y) as minimal polynomial of j(q^N) over ℚ(j)
ModularCurve.minpoly_jqN_eq_toAdjoin0 below · depth 12 - Normalised Hahn-series embeddings inducing a place above j₀
ModularCurve.natCard_normalized_algHom_hahnSeries_jBar_sub_eq_toNat_ord0 below · depth 12 - Degree ψ(d) and generation at every d ∣ M
ModularCurve.package_of_socket57 below · depth 12 - Symmetry of the modular polynomial at levels N>1
ModularCurve.ModularPolynomialData.evalSymm_of_one_lt77 below · depth 13 - Prime-level splitting of Φₚ at the slot uq^e
ModularCurve.PhiGen.splits_prime_at_slot_of_isPrimitiveRoot48 below · depth 13 - Pole order at t=0 is unchanged by coefficient extension
ModularCurve.PhiGen.tPoleOrderLE_coeffEmb_iff3 below · depth 13 - Pole order descends along t ↦ t^N
ModularCurve.PhiGen.tPoleOrderLE_of_qExpand3 below · depth 13 - Pole bound ℓ²+ℓ-1 for non-constant coefficients
ModularCurve.PhiGen.tPoleOrderLE_phiProd_conj_of_ne_zero0 below · depth 13 - Cusp-label embedding of the base-changed modular function field
ModularCurve.exists_algHom_laurentBaseChange_slot150 below · depth 13 - Degree of K(j)(j(qᵈ)) over K(j) equals ψ(d)
ModularCurve.finrank_adjoin_jqNModC_eq_dedekindPsi_of_charZero88 below · depth 13 - Integrality of j(qᵈ) over a field containing j(q^{dℓ})
ModularCurve.isIntegral_jqNModC_of_mul3 below · depth 13 - Irreducibility of the modular polynomial at every level
ModularCurve.phiIrreducible_all72 below · depth 13 - Cusp width and orders of j(q), j(q^N) at a place
ModularCurve.slot_ord_of_algHom_laurentBaseChange78 below · depth 13 - Places of X₀(N) labelled by pairs (a,b)
ModularCurve.slot_place_eq_iff_modEq78 below · depth 13 - Uniqueness of places over a point smooth in the first variable
ModularCurve.CharPModel.place_eq_of_ord_pos_of_derivative_swapBivar_evalEval_ne_zero0 below · depth 14 - Evaluation symmetry of an irreducible modular polynomial datum
ModularCurve.ModularPolynomialData.evalSymm_of_irreducible5 below · depth 14 - Splitting of Φₚ(j(qᵖ),Y) over K((q))
ModularCurve.PhiGen.splits_prime_of_isPrimitiveRoot48 below · depth 14 - Finiteness and separability over K(j(q^N))
ModularCurve.finiteDimensional_and_isSeparable_adjoin_jqNModC_of_natCast_ne_zero98 below · depth 14 - Two β-substitutions generate the roof field at Nℓℓ'
ModularCurve.heckeBetaRoof_adjoin_range_union_eq_top90 below · depth 14 - Modular equation as minimal polynomial of α(j) over β
ModularCurve.minpoly_heckeAlphaBar_along_heckeBetaBar148 below · depth 14 - Minimal polynomial of j(q^M) over K(j) as a slot product
ModularCurve.minpoly_jqNModC_map_eq_prod_slots51 below · depth 14 - Irreducibility of prime-level modular polynomial data
ModularCurve.phiIrreducible_of_prime42 below · depth 14 - Monicity of the transpose under coefficient degree bounds
ModularCurve.swapBivar_monic_of_coeff_bounds5 below · depth 14 - Places over a centre from the roots of Φ_N
ModularCurve.exists_map_roots_places_of_card_roots_eq_dedekindPsi_univ278 below · depth 15 - Symmetry of the modular polynomial at squarefree level
ModularCurve.ModularPolynomialData.evalSymm_of_squarefree77 below · depth 16 - The reversed modular polynomial at prime level
ModularCurve.ModularPolynomialData.exists_reversed_eval2_inv_jq_inv_jqN_eq_zero46 below · depth 16 - Irreducible Φ_N is the minimal polynomial of j(q^N)
ModularCurve.ModularPolynomialData.minpoly_jqN_eq1 below · depth 16 - Unique centre with uniformiser gives partial_YΦ̄_N(c)≠ 0
ModularCurve.derivative_evalEval_ne_zero_of_isCentreOf_unique_of_ord_jGeomGen_sub_eq_one144 below · depth 16 - Nonvanishing derivatives of Φ_ℓ at (b,b^ℓ) in characteristic ℓ
ModularCurve.derivative_evalEval_ne_zero_of_kroneckerCongruence_of_pow_sq_ne0 below · depth 16 - Nonvanishing of partialⱼΦ̄_N at a unique centre with uniformiser
ModularCurve.derivative_swapBivar_evalEval_ne_zero_of_isCentreOf_unique_of_ord_jNGeomGen_sub_eq_one164 below · depth 16 - Arithmetic Galois transport of a slot chart at a place
ModularCurve.arithmeticGalois_smul_slot0 below · depth 17 - Restriction of a slot place along ᾱ from level Nℓ
ModularCurve.slot_restrictAlong_heckeAlphaBar85 below · depth 17 - Slot data under restriction along `heckeBetaBar`
ModularCurve.slot_restrictAlong_heckeBetaBar85 below · depth 17 - Descended symmetric functions of the conjugates lie in ℚ[j]
ModularCurve.PhiGen.mem_adjoin_jq_of_qExpand_descent_phiProd_modularUnit20 below · depth 18 - Order of ι(jmath̄(qᵈ)) equals -(N/d)a'² for some a' ∣ d
ModularCurve.exists_order_algHom_qExpand_jqModC_eq_of_apply_jqModC_eq123 below · depth 18 - Poles of jmath̄ on the full level-N field are slot places
ModularCurve.exists_slot_of_ord_jqModC_neg123 below · depth 18 - Vélu quotient of the Tate curve over a non-toric slot set
ModularCurve.veluQuotient_nonToricSlotSet0 below · depth 19 - Degree of ℚ(j)(j(q^N)) over ℚ(j) equals ψ(N)
ModularCurve.finrank_adjoin_jqN_eq0 below · depth 20 - Separability of ̄ j(q^N) over K(̄ j(q)) at invertible prime level
ModularCurve.isSeparable_jqNModC_of_modularPolynomialFamily7 below · depth 20 - Kronecker norm form of T_ℓ on X_H(M)
ModularCurve.qExpand_norm_heckeBetaHBar211 below · depth 20 - q-expansion of the trace down the degeneracy roof at level p
ModularCurve.qExpansionDiffAlong_traceDiff_pullbackDiff_heckeBetaC_self209 below · depth 20 - θ = q d/dq against the substitution q ↦ q^N
ModularCurve.theta_qExpand73 below · depth 20 - Coefficient at ℓ n of ℓ² f(q^{ℓ^2})+sum_b f(ζᵇ q)
ModularCurve.PhiGen.weightTwo_coeff_sum_slots73 below · depth 21 - Mod ℓ cusp expansion of the function field of X_H(M)
ModularCurve.exists_algHom_qExpFunctionFieldC_gammaH_eq_slot_and_diamondPullbackModL_eq_qTwist116 below · depth 21 - Poles of j on the level-N modular function field are slot expansions
ModularCurve.exists_slot_algHom_modularFunctionFieldFullC_of_ord_neg123 below · depth 21 - Trace census by ℓ+1 embeddings at level Nℓ
ModularCurve.exists_traceCensus150 below · depth 21 - θ = q d/dq commutes with the twist q ↦ uq
ModularCurve.theta_qTwist73 below · depth 21 - Level automorphisms preserve the j-shadow of a supersingular place
ModularCurve.FullLevel.jShadow_levelAutBar_smul_iff523 below · depth 22 - Places in a supersingular tube lie in its j-shadow
ModularCurve.FullLevel.jShadow_of_inTube46 below · depth 22 - Unipotent γ acts on q-expansions as the ζᵇ-twist
ModularCurve.FullLevel.coe_levelAutBar_apply_eq_qTwist_of_redQ_eq_unipotent32 below · depth 23 - Level automorphism acts by root-of-unity twist when q∤ a
ModularCurve.FullLevel.exists_coe_levelAutBar_apply_eq_qTwist_of_not_dvd_of_mem_laurentBaseChange_gamma038 below · depth 23 - Integrality descent for polynomials in the λ-series
ModularCurve.aeval_lambdaModC_intCoeffs_descent0 below · depth 23 - Slot embeddings realised by q-expansions at a cusp
ModularCurve.exists_algHom_slot_mul_qExpansion_slash_eq82 below · depth 23 - Integral q-expansions of the λ modular equation coefficients
ModularCurve.intCoeffs_minpoly_lambdaNModC_coeff180 below · depth 23 - Half-period shift of the Legendre λ-series
ModularCurve.qTwist_neg_one_lambdaModC_mul27 below · depth 23 - Endomorphisms with trivial reduction move Gauss-presented rings inside 𝔪
ValuationSubring.mem_and_sub_mem_maximalIdeal_of_gaussPresentation_of_coe_eq_of_coeffMap_residue_comp_eq0 below · depth 23 - Kronecker congruence in Gauss form for X₁(Mp) chart functions
ModularCurve.XOneP.exists_monic_map_eq_prod_X_sub_C_qTwist_and_gaussPresentation_chartAlgFin_x1_mul86 below · depth 24 - Norm along the q↦ q^ℓ degeneracy as a product of twists
ModularCurve.coe_heckeBetaOneBar_norm_eq_prod_qTwist_of_finrankAlong_eq0 below · depth 24 - M-torsion of Tate(q^M) and the inertia transvection
ModularCurve.exists_point_tateBase_qTwist_eq_add_of_isPrimitiveRoot47 below · depth 24 - Level-two modular relation splits into q+1 conjugates
ModularCurve.map_eq_phiProd_lambda_of_eval_qExpand_eq_zero0 below · depth 24 - Powers of j have integral q-expansions
ModularCurve.PhiGen.intCoeffs_jq_pow0 below · depth 25 - Monic lift through q↦ qᵖ of prodᵢ (X-g(ζⁱ q))
ModularCurve.XOneP.exists_monic_map_eq_prod_X_sub_C_qTwist_chartAlgFin_x1_mul81 below · depth 25 - Inertia twist q ↦ ζ q on non-toric Tate points
ModularCurve.qTwist_nonToricPoint_of_pow_eq_one2 below · depth 25 - Relative degree of the level-N function field over k(̃ j_N)
ModularCurve.CharPModel.relfinrank_adjoin_jqNModC_eq_dedekindPsi_of_evalSymm4 below · depth 27 - Descent of the modular equation Φ_ℓ to a q-series subfield
ModularCurve.exists_monic_map_eq_prod_X_sub_C_qTwist_qExpand_jqModC_mul_X_sub_C77 below · depth 27 - Degree of F(x) from a twist-orbit factorisation
ModularCurve.finrank_adjoin_eq_of_map_eq_prod_X_sub_C_qTwist_mul_X_sub_C0 below · depth 27 - Degree ℓ+1 for a twist-fixed Laurent series
ModularCurve.finrank_adjoin_eq_succ_of_map_eq_prod_X_sub_C_qTwist_mul_X_sub_C_of_not_mem0 below · depth 27 - Degree bound for the coefficients of Φ_N
ModularCurve.ModularPolynomialData.natDegree_coeff_le_mul_dedekindPsi_sub_all85 below · depth 31 - Monic relation of degree ≤ p+1 for j over K(j(qᵖ))
ModularCurve.exists_monic_natDegree_le_aeval_jqModC_eq_zero0 below · depth 32 - Atkin–Lehner pin commutes with the Hecke norm up to a scalar
ModularCurve.exists_ofAlgAut_smul_norm_heckeBetaHBar_inv_smul_eq_algebraMap_mul_norm_heckeBetaHBar_of_ne333 below · depth 32 - Mod-p reduction of a p-fold twisted product law
ModularCurve.coeffMap_residue_eq_C_mul_coeffMap_frobenius_of_qExpand_eq_C_mul_prod_qTwist0 below · depth 33 - qᵖ-expansion of the Atkin–Lehner conjugate of a Uₚ-norm
ModularCurve.exists_qExpand_coe_smul_norm_heckeBetaHBar_inv_smul_eq_C_mul_prod_qTwist330 below · depth 33