Definitions/Def_ModularCurve_KatzLevelP.lean
Katz modular forms with level- structure on Weierstrass curves
Fix a commutative ring A and a Weierstrass curve W/A. For x_0,x\in A the element \mathrm{indepElt}(W,p,x_0,x)=\prod_{a=1}^{(p-1)/2}\bigl(x\,\Psi^{\mathrm{Sq}}_a(x_0)-\Phi_a(x_0)\bigr) is formed from Mathlib's univariate division polynomials (the product runs over the integer interval 1\le a\le (p-1)/2, with natural-number division), and the predicate InLine asserts that one factor vanishes, i.e. x\,\Psi^{\mathrm{Sq}}_a(x_0)=\Phi_a(x_0) for some such a: the x-coordinate x is that of a multiple [a] of a point with abscissa x_0. Both are compatible with ring maps, and InLine holds for x=x_0 as soon as 1\le (p-1)/2. The structure LevelPData is simply a quadruple (x_P,y_P,x_Q,y_Q)\in A^4, with the involution exchanging the two pairs, coordinatewise transport along ring homomorphisms, and the substitution attached to a VariableChange (u,r,s,t), namely x\mapsto u^{-2}(x-r), y\mapsto u^{-3}(y-s(x-r)-t) applied to each pair. The predicate IsLevelPStructure W p D is the conjunction of six conditions carried as fields: both pairs satisfy the affine Weierstrass equation of W, (\mathrm{pre}\Psi_p)(x_P)=(\mathrm{pre}\Psi_p)(x_Q)=0, and both \mathrm{indepElt}(W,p,x_P,x_Q) and \mathrm{indepElt}(W,p,x_Q,x_P) are units. It is preserved by the swap and by base change; for variable change only the invariance of the two equations is recorded.
Over a commutative ring R and for k\in\mathbb Z, KatzLevelPForm R p k is a rule assigning to each R-algebra A, each W/A with \Delta(W) a unit and each level-p structure D on W an element of A, subject to two laws held as fields: compatibility with R-algebra maps, and the weight-k rule F(C\cdot W,\,D^C)=(u^{-1})^{k}F(W,D). These form an R-module, with a multiplication adding weights, and the involution F\mapsto F^{\mathrm{sw}} given by swapping D. Three predicates are defined: dependence of F only on the second abscissa up to InLine, dependence only on both abscissae up to InLine, and swap-invariance (equivalent to F^{\mathrm{sw}}=F); the first implies the second and also that F^{\mathrm{sw}}-F has the second property, and it is stable under the module operations and products. KatzGamma0Form R p k is a KatzLevelPForm together with a field asserting the first predicate, again an R-module with weight-additive product. A level-one Katz form pulls back to both, by ignoring the level data; the pullback is swap-invariant, and the pullback maps respect zero, addition and scalars. Finally, inside \mathrm{GL}_2(\mathbb Z/p) are defined the subgroup of matrices with vanishing (0,1)-entry, the subgroup of diagonal matrices (contained in it), and the two elements \begin{pmatrix}1&1\\0&1\end{pmatrix} and \begin{pmatrix}0&1\\1&0\end{pmatrix}.
Relation to Mathlib
Weierstrass curves, their discriminant, admissible variable changes, the affine equation and the division polynomials preΨ, ΨSq, Φ are Mathlib's; the level-p data, the predicate IsLevelPStructure, and the functor-of-points notions of Katz form with level-p or \Gamma_0(p)-type structure are the project's own, shaped exactly like its level-one KatzModularForm.
Where it is used
These definitions provide the algebraic (functor-of-points) description of modular forms of level p and of \Gamma_0(p)-type on which the q-expansion and Hecke-theoretic input to the modularity arguments is built, the level-p structure playing the role of a basis of the p-torsion and the InLine relation that of passage to the cyclic subgroup it generates.
References
- N. M. Katz, p-adic properties of modular schemes and modular forms, in: Modular Functions of One Variable III, Lecture Notes in Mathematics 350, Springer, 1973, 69–190
- N. M. Katz and B. Mazur, Arithmetic Moduli of Elliptic Curves, Annals of Mathematics Studies 108, Princeton University Press, 1985
- J. H. Silverman, The Arithmetic of Elliptic Curves, Graduate Texts in Mathematics 106, Springer, 1986
References are suggested automatically and have not been individually verified.
English text generated automatically from the Lean source; the Lean statement is authoritative.
- 556 lines
- 124 declarations
- used in the statements of 177 theorems and imported by 215 proofs
- imports 1 definition modules
Source file: Definitions/Def_ModularCurve_KatzLevelP.lean
Imports
Imported by
Def_ModularCurve_KatzBaseChangeDef_ModularCurve_KatzLevelPClassifyingMapsDef_ModularCurve_KatzLevelPCuspsDef_ModularCurve_KatzLevelPQuotientDef_ModularCurve_KatzLevelPTorusPairsDef_ModularCurve_KatzLevelPUniversalDef_ModularCurve_KatzLevelPYonedaDef_ModularCurve_LevelNormalFormDef_ModularCurve_LevelRelabellingDef_ModularCurve_WeierstrassLevelComponents
Declarations
- def
ModularCurve.indepElt - def
ModularCurve.InLine - theorem
ModularCurve.inLine_self - theorem
ModularCurve.indepElt_map - theorem
ModularCurve.InLine.map - structure
ModularCurve.LevelPData - field
ModularCurve.LevelPData.xP - field
ModularCurve.LevelPData.yP - field
ModularCurve.LevelPData.xQ - field
ModularCurve.LevelPData.yQ - def
ModularCurve.LevelPData.swap - theorem
ModularCurve.LevelPData.swap_xP - theorem
ModularCurve.LevelPData.swap_yP - theorem
ModularCurve.LevelPData.swap_xQ - theorem
ModularCurve.LevelPData.swap_yQ - theorem
ModularCurve.LevelPData.swap_swap - def
ModularCurve.LevelPData.map - theorem
ModularCurve.LevelPData.map_xP - theorem
ModularCurve.LevelPData.map_yP - theorem
ModularCurve.LevelPData.map_xQ - theorem
ModularCurve.LevelPData.map_yQ - theorem
ModularCurve.LevelPData.map_id - theorem
ModularCurve.LevelPData.map_map - theorem
ModularCurve.LevelPData.map_swap - def
ModularCurve.LevelPData.variableChange - theorem
ModularCurve.LevelPData.variableChange_xP - theorem
ModularCurve.LevelPData.variableChange_yP - theorem
ModularCurve.LevelPData.variableChange_xQ - theorem
ModularCurve.LevelPData.variableChange_yQ - theorem
ModularCurve.LevelPData.variableChange_swap - structure
ModularCurve.IsLevelPStructure - field
ModularCurve.IsLevelPStructure.D - field
ModularCurve.IsLevelPStructure.equation_P - field
ModularCurve.IsLevelPStructure.equation_Q - field
ModularCurve.IsLevelPStructure.isUnit_indepElt_PQ - field
ModularCurve.IsLevelPStructure.isUnit_indepElt_QP - theorem
ModularCurve.IsLevelPStructure.swap - theorem
ModularCurve.IsLevelPStructure.map - theorem
ModularCurve.IsLevelPStructure.equation_variableChange_aux - theorem
ModularCurve.IsLevelPStructure.equation_P_variableChange - theorem
ModularCurve.IsLevelPStructure.equation_Q_variableChange - structure
ModularCurve.KatzLevelPForm - field
ModularCurve.KatzLevelPForm.toFun - field
ModularCurve.KatzLevelPForm.map_toFun - field
ModularCurve.KatzLevelPForm.f - field
ModularCurve.KatzLevelPForm.hW' - field
ModularCurve.KatzLevelPForm.hD' - field
ModularCurve.KatzLevelPForm.toFun - field
ModularCurve.KatzLevelPForm.toFun_variableChange - field
ModularCurve.KatzLevelPForm.W - field
ModularCurve.KatzLevelPForm.hD - field
ModularCurve.KatzLevelPForm.toFun - theorem
ModularCurve.KatzLevelPForm.toFun_injective - theorem
ModularCurve.KatzLevelPForm.ext - theorem
ModularCurve.KatzLevelPForm.zero_toFun - theorem
ModularCurve.KatzLevelPForm.add_toFun - theorem
ModularCurve.KatzLevelPForm.neg_toFun - theorem
ModularCurve.KatzLevelPForm.sub_toFun - theorem
ModularCurve.KatzLevelPForm.smul_toFun - def
ModularCurve.KatzLevelPForm.mul - theorem
ModularCurve.KatzLevelPForm.mul_toFun - def
ModularCurve.KatzLevelPForm.swap - theorem
ModularCurve.KatzLevelPForm.swap_toFun - theorem
ModularCurve.KatzLevelPForm.swap_swap - theorem
ModularCurve.KatzLevelPForm.swap_zero - theorem
ModularCurve.KatzLevelPForm.swap_add - theorem
ModularCurve.KatzLevelPForm.swap_neg - theorem
ModularCurve.KatzLevelPForm.swap_sub - theorem
ModularCurve.KatzLevelPForm.swap_smul - def
ModularCurve.KatzLevelPForm.DependsOnlyOnSndLine - def
ModularCurve.KatzLevelPForm.DependsOnlyOnLines - def
ModularCurve.KatzLevelPForm.SwapInvariant - theorem
ModularCurve.KatzLevelPForm.swapInvariant_iff_swap_eq - theorem
ModularCurve.KatzLevelPForm.DependsOnlyOnSndLine.dependsOnlyOnLines - theorem
ModularCurve.KatzLevelPForm.DependsOnlyOnSndLine.dependsOnlyOnLines_swap_sub - theorem
ModularCurve.KatzLevelPForm.DependsOnlyOnSndLine.zero - theorem
ModularCurve.KatzLevelPForm.DependsOnlyOnSndLine.add - theorem
ModularCurve.KatzLevelPForm.DependsOnlyOnSndLine.neg - theorem
ModularCurve.KatzLevelPForm.DependsOnlyOnSndLine.smul - theorem
ModularCurve.KatzLevelPForm.DependsOnlyOnSndLine.mul - structure
ModularCurve.KatzGamma0Form - field
ModularCurve.KatzGamma0Form.dependsOnlyOnSndLine - theorem
ModularCurve.KatzGamma0Form.toKatzLevelPForm_injective - theorem
ModularCurve.KatzGamma0Form.ext - theorem
ModularCurve.KatzGamma0Form.toKatzLevelPForm_zero - theorem
ModularCurve.KatzGamma0Form.toKatzLevelPForm_add - theorem
ModularCurve.KatzGamma0Form.toKatzLevelPForm_neg - theorem
ModularCurve.KatzGamma0Form.toKatzLevelPForm_sub - theorem
ModularCurve.KatzGamma0Form.toKatzLevelPForm_smul - def
ModularCurve.KatzGamma0Form.mul - theorem
ModularCurve.KatzGamma0Form.toKatzLevelPForm_mul - def
KatzModularForm.pullbackLevelP - theorem
KatzModularForm.pullbackLevelP_toFun - theorem
KatzModularForm.dependsOnlyOnSndLine_pullbackLevelP - theorem
KatzModularForm.swapInvariant_pullbackLevelP - theorem
KatzModularForm.swap_pullbackLevelP - def
KatzModularForm.pullbackGamma0 - theorem
KatzModularForm.pullbackGamma0_toKatzLevelPForm - theorem
KatzModularForm.pullbackLevelP_zero - theorem
KatzModularForm.pullbackLevelP_add - theorem
KatzModularForm.pullbackLevelP_smul - def
ModularCurve.LevelP.borel - def
ModularCurve.LevelP.splitTorus - def
ModularCurve.LevelP.unipotentU - def
ModularCurve.LevelP.swapW - theorem
ModularCurve.LevelP.coe_unipotentU - theorem
ModularCurve.LevelP.coe_swapW - theorem
ModularCurve.LevelP.mem_borel_iff - theorem
ModularCurve.LevelP.mem_splitTorus_iff - theorem
ModularCurve.LevelP.splitTorus_le_borel
Source
import Mathlib import Definitions.Def_ModularForm_KatzLevelOne set_option autoImplicit false universe u v w noncomputable section open WeierstrassCurve Polynomial namespace ModularCurve section Elements variable {A : Type*} [CommRing A] def indepElt (W : WeierstrassCurve A) (p : ℕ) (x₀ x : A) : A := ∏ a ∈ Finset.Icc 1 ((p - 1) / 2), (x * (W.ΨSq a).eval x₀ - (W.Φ a).eval x₀) def InLine (W : WeierstrassCurve A) (p : ℕ) (x₀ x : A) : Prop := ∃ a : ℕ, 1 ≤ a ∧ a ≤ (p - 1) / 2 ∧ x * (W.ΨSq a).eval x₀ = (W.Φ a).eval x₀ theorem inLine_self (W : WeierstrassCurve A) {p : ℕ} (hp : 1 ≤ (p - 1) / 2) (x₀ : A) : InLine W p x₀ x₀ := ⟨1, le_rfl, hp, by simp [WeierstrassCurve.ΨSq_one, WeierstrassCurve.Φ_one]⟩ theorem indepElt_map {B : Type*} [CommRing B] (W : WeierstrassCurve A) (f : A →+* B) (p : ℕ) (x₀ x : A) : indepElt (W.map f) p (f x₀) (f x) = f (indepElt W p x₀ x) := by simp only [indepElt, map_prod, map_sub, map_mul, WeierstrassCurve.map_ΨSq, WeierstrassCurve.map_Φ, Polynomial.eval_map, Polynomial.eval₂_at_apply] theorem InLine.map {B : Type*} [CommRing B] {W : WeierstrassCurve A} (f : A →+* B) {p : ℕ} {x₀ x : A} (h : InLine W p x₀ x) : InLine (W.map f) p (f x₀) (f x) := by obtain ⟨a, ha, ha', hx⟩ := h refine ⟨a, ha, ha', ?_⟩ rw [WeierstrassCurve.map_ΨSq, WeierstrassCurve.map_Φ, Polynomial.eval_map, Polynomial.eval_map, Polynomial.eval₂_at_apply, Polynomial.eval₂_at_apply, ← map_mul, hx] end Elements @[ext] structure LevelPData (A : Type u) where xP : A yP : A xQ : A yQ : A namespace LevelPData variable {A : Type u} {B : Type v} def swap (D : LevelPData A) : LevelPData A := ⟨D.xQ, D.yQ, D.xP, D.yP⟩ @[simp] theorem swap_xP (D : LevelPData A) : D.swap.xP = D.xQ := rfl @[simp] theorem swap_yP (D : LevelPData A) : D.swap.yP = D.yQ := rfl @[simp] theorem swap_xQ (D : LevelPData A) : D.swap.xQ = D.xP := rfl @[simp] theorem swap_yQ (D : LevelPData A) : D.swap.yQ = D.yP := rfl @[simp] theorem swap_swap (D : LevelPData A) : D.swap.swap = D := rfl variable [CommRing A] [CommRing B] def map (f : A →+* B) (D : LevelPData A) : LevelPData B := ⟨f D.xP, f D.yP, f D.xQ, f D.yQ⟩ @[simp] theorem map_xP (f : A →+* B) (D : LevelPData A) : (D.map f).xP = f D.xP := rfl @[simp] theorem map_yP (f : A →+* B) (D : LevelPData A) : (D.map f).yP = f D.yP := rfl @[simp] theorem map_xQ (f : A →+* B) (D : LevelPData A) : (D.map f).xQ = f D.xQ := rfl @[simp] theorem map_yQ (f : A →+* B) (D : LevelPData A) : (D.map f).yQ = f D.yQ := rfl theorem map_id (D : LevelPData A) : D.map (RingHom.id A) = D := rfl theorem map_map {C : Type w} [CommRing C] (f : A →+* B) (g : B →+* C) (D : LevelPData A) : (D.map f).map g = D.map (g.comp f) := rfl theorem map_swap (f : A →+* B) (D : LevelPData A) : D.swap.map f = (D.map f).swap := rfl def variableChange (C : VariableChange A) (D : LevelPData A) : LevelPData A where xP := ((C.u⁻¹ : Aˣ) : A) ^ 2 * (D.xP - C.r) yP := ((C.u⁻¹ : Aˣ) : A) ^ 3 * (D.yP - C.s * (D.xP - C.r) - C.t) xQ := ((C.u⁻¹ : Aˣ) : A) ^ 2 * (D.xQ - C.r) yQ := ((C.u⁻¹ : Aˣ) : A) ^ 3 * (D.yQ - C.s * (D.xQ - C.r) - C.t) @[simp] theorem variableChange_xP (C : VariableChange A) (D : LevelPData A) : (D.variableChange C).xP = ((C.u⁻¹ : Aˣ) : A) ^ 2 * (D.xP - C.r) := rfl @[simp] theorem variableChange_yP (C : VariableChange A) (D : LevelPData A) : (D.variableChange C).yP = ((C.u⁻¹ : Aˣ) : A) ^ 3 * (D.yP - C.s * (D.xP - C.r) - C.t) := rfl @[simp] theorem variableChange_xQ (C : VariableChange A) (D : LevelPData A) : (D.variableChange C).xQ = ((C.u⁻¹ : Aˣ) : A) ^ 2 * (D.xQ - C.r) := rfl @[simp] theorem variableChange_yQ (C : VariableChange A) (D : LevelPData A) : (D.variableChange C).yQ = ((C.u⁻¹ : Aˣ) : A) ^ 3 * (D.yQ - C.s * (D.xQ - C.r) - C.t) := rfl theorem variableChange_swap (C : VariableChange A) (D : LevelPData A) : D.swap.variableChange C = (D.variableChange C).swap := rfl end LevelPData structure IsLevelPStructure {A : Type u} [CommRing A] (W : WeierstrassCurve A) (p : ℕ) (D : LevelPData A) : Prop where equation_P : W.toAffine.Equation D.xP D.yP equation_Q : W.toAffine.Equation D.xQ D.yQ preΨ_P : (W.preΨ p).eval D.xP = 0 preΨ_Q : (W.preΨ p).eval D.xQ = 0 isUnit_indepElt_PQ : IsUnit (indepElt W p D.xP D.xQ) isUnit_indepElt_QP : IsUnit (indepElt W p D.xQ D.xP) namespace IsLevelPStructure variable {A : Type u} {B : Type v} [CommRing A] [CommRing B] {W : WeierstrassCurve A} {p : ℕ} {D : LevelPData A} theorem swap (h : IsLevelPStructure W p D) : IsLevelPStructure W p D.swap := ⟨h.equation_Q, h.equation_P, h.preΨ_Q, h.preΨ_P, h.isUnit_indepElt_QP, h.isUnit_indepElt_PQ⟩ theorem map (h : IsLevelPStructure W p D) (f : A →+* B) : IsLevelPStructure (W.map f) p (D.map f) where equation_P := h.equation_P.map f equation_Q := h.equation_Q.map f preΨ_P := by rw [LevelPData.map_xP, WeierstrassCurve.map_preΨ, Polynomial.eval_map, Polynomial.eval₂_at_apply, h.preΨ_P, map_zero] preΨ_Q := by rw [LevelPData.map_xQ, WeierstrassCurve.map_preΨ, Polynomial.eval_map, Polynomial.eval₂_at_apply, h.preΨ_Q, map_zero] isUnit_indepElt_PQ := by rw [LevelPData.map_xP, LevelPData.map_xQ, indepElt_map] exact h.isUnit_indepElt_PQ.map f isUnit_indepElt_QP := by rw [LevelPData.map_xP, LevelPData.map_xQ, indepElt_map] exact h.isUnit_indepElt_QP.map f theorem equation_variableChange_aux (C : VariableChange A) {x y : A} (h : W.toAffine.Equation x y) : (C • W).toAffine.Equation (((C.u⁻¹ : Aˣ) : A) ^ 2 * (x - C.r)) (((C.u⁻¹ : Aˣ) : A) ^ 3 * (y - C.s * (x - C.r) - C.t)) := by rw [WeierstrassCurve.Affine.equation_iff] at h ⊢ simp only [WeierstrassCurve.variableChange_a₁, WeierstrassCurve.variableChange_a₂, WeierstrassCurve.variableChange_a₃, WeierstrassCurve.variableChange_a₄, WeierstrassCurve.variableChange_a₆] linear_combination ((C.u⁻¹ : Aˣ) : A) ^ 6 * h theorem equation_P_variableChange (h : IsLevelPStructure W p D) (C : VariableChange A) : (C • W).toAffine.Equation (D.variableChange C).xP (D.variableChange C).yP := equation_variableChange_aux C h.equation_P theorem equation_Q_variableChange (h : IsLevelPStructure W p D) (C : VariableChange A) : (C • W).toAffine.Equation (D.variableChange C).xQ (D.variableChange C).yQ := equation_variableChange_aux C h.equation_Q end IsLevelPStructure structure KatzLevelPForm (R : Type u) [CommRing R] (p : ℕ) (k : ℤ) : Type (u + 1) where toFun : ∀ ⦃A : Type u⦄ [CommRing A] [Algebra R A] (W : WeierstrassCurve A), IsUnit W.Δ → ∀ D : LevelPData A, IsLevelPStructure W p D → A map_toFun : ∀ ⦃A B : Type u⦄ [CommRing A] [Algebra R A] [CommRing B] [Algebra R B] (f : A →ₐ[R] B) (W : WeierstrassCurve A) (hW : IsUnit W.Δ) (hW' : IsUnit (W.map (f : A →+* B)).Δ) (D : LevelPData A) (hD : IsLevelPStructure W p D) (hD' : IsLevelPStructure (W.map (f : A →+* B)) p (D.map (f : A →+* B))), toFun (W.map (f : A →+* B)) hW' (D.map (f : A →+* B)) hD' = f (toFun W hW D hD) toFun_variableChange : ∀ ⦃A : Type u⦄ [CommRing A] [Algebra R A] (C : VariableChange A) (W : WeierstrassCurve A) (hW : IsUnit W.Δ) (hW' : IsUnit (C • W).Δ) (D : LevelPData A) (hD : IsLevelPStructure W p D) (hD' : IsLevelPStructure (C • W) p (D.variableChange C)), toFun (C • W) hW' (D.variableChange C) hD' = ((C.u⁻¹ ^ k : Aˣ) : A) * toFun W hW D hD namespace KatzLevelPForm variable {R : Type u} [CommRing R] {p : ℕ} {k l : ℤ} theorem toFun_injective : Function.Injective (toFun : KatzLevelPForm R p k → _) := by rintro ⟨F, _, _⟩ ⟨G, _, _⟩ h congr @[ext] theorem ext {F G : KatzLevelPForm R p k} (h : ∀ ⦃A : Type u⦄ [CommRing A] [Algebra R A] (W : WeierstrassCurve A) (hW : IsUnit W.Δ) (D : LevelPData A) (hD : IsLevelPStructure W p D), F.toFun W hW D hD = G.toFun W hW D hD) : F = G := toFun_injective (by funext A _ _ W hW D hD; exact h W hW D hD) instance : Zero (KatzLevelPForm R p k) := ⟨{ toFun := fun _ _ _ _ _ _ _ => 0 map_toFun := by intros; simp toFun_variableChange := by intros; simp }⟩ instance : Add (KatzLevelPForm R p k) := ⟨fun F G => { toFun := fun _ _ _ W hW D hD => F.toFun W hW D hD + G.toFun W hW D hD map_toFun := by intro A B _ _ _ _ f W hW hW' D hD hD' rw [map_add, F.map_toFun f W hW hW' D hD hD', G.map_toFun f W hW hW' D hD hD'] toFun_variableChange := by intro A _ _ C W hW hW' D hD hD' rw [F.toFun_variableChange C W hW hW' D hD hD', G.toFun_variableChange C W hW hW' D hD hD', mul_add] }⟩ instance : Neg (KatzLevelPForm R p k) := ⟨fun F => { toFun := fun _ _ _ W hW D hD => -F.toFun W hW D hD map_toFun := by intro A B _ _ _ _ f W hW hW' D hD hD' rw [map_neg, F.map_toFun f W hW hW' D hD hD'] toFun_variableChange := by intro A _ _ C W hW hW' D hD hD' rw [F.toFun_variableChange C W hW hW' D hD hD', mul_neg] }⟩ instance : Sub (KatzLevelPForm R p k) := ⟨fun F G => { toFun := fun _ _ _ W hW D hD => F.toFun W hW D hD - G.toFun W hW D hD map_toFun := by intro A B _ _ _ _ f W hW hW' D hD hD' rw [map_sub, F.map_toFun f W hW hW' D hD hD', G.map_toFun f W hW hW' D hD hD'] toFun_variableChange := by intro A _ _ C W hW hW' D hD hD' rw [F.toFun_variableChange C W hW hW' D hD hD', G.toFun_variableChange C W hW hW' D hD hD', mul_sub] }⟩ instance : SMul R (KatzLevelPForm R p k) := ⟨fun c F => { toFun := fun _ _ _ W hW D hD => c • F.toFun W hW D hD map_toFun := by intro A B _ _ _ _ f W hW hW' D hD hD' rw [map_smul, F.map_toFun f W hW hW' D hD hD'] toFun_variableChange := by intro A _ _ C W hW hW' D hD hD' rw [F.toFun_variableChange C W hW hW' D hD hD', mul_smul_comm] }⟩ section simp_lemmas variable {A : Type u} [CommRing A] [Algebra R A] (W : WeierstrassCurve A) (hW : IsUnit W.Δ) (D : LevelPData A) (hD : IsLevelPStructure W p D) @[simp] theorem zero_toFun : (0 : KatzLevelPForm R p k).toFun W hW D hD = 0 := rfl @[simp] theorem add_toFun (F G : KatzLevelPForm R p k) : (F + G).toFun W hW D hD = F.toFun W hW D hD + G.toFun W hW D hD := rfl @[simp] theorem neg_toFun (F : KatzLevelPForm R p k) : (-F).toFun W hW D hD = -F.toFun W hW D hD := rfl @[simp] theorem sub_toFun (F G : KatzLevelPForm R p k) : (F - G).toFun W hW D hD = F.toFun W hW D hD - G.toFun W hW D hD := rfl @[simp] theorem smul_toFun (c : R) (F : KatzLevelPForm R p k) : (c • F).toFun W hW D hD = c • F.toFun W hW D hD := rfl end simp_lemmas instance : AddCommGroup (KatzLevelPForm R p k) where add_assoc F G H := by ext; simp [add_assoc] zero_add F := by ext; simp add_zero F := by ext; simp add_comm F G := by ext; simp [add_comm] neg_add_cancel F := by ext; simp sub_eq_add_neg F G := by ext; simp [sub_eq_add_neg] nsmul := nsmulRec zsmul := zsmulRec instance : Module R (KatzLevelPForm R p k) where one_smul F := by ext; simp mul_smul a b F := by ext; simp [mul_smul] smul_zero a := by ext; simp smul_add a F G := by ext; simp add_smul a b F := by ext; simp [add_smul] zero_smul F := by ext; simp def mul (F : KatzLevelPForm R p k) (G : KatzLevelPForm R p l) : KatzLevelPForm R p (k + l) where toFun _ _ _ W hW D hD := F.toFun W hW D hD * G.toFun W hW D hD map_toFun := by intro A B _ _ _ _ f W hW hW' D hD hD' rw [map_mul, F.map_toFun f W hW hW' D hD hD', G.map_toFun f W hW hW' D hD hD'] toFun_variableChange := by intro A _ _ C W hW hW' D hD hD' rw [F.toFun_variableChange C W hW hW' D hD hD', G.toFun_variableChange C W hW hW' D hD hD', zpow_add, Units.val_mul] ring @[simp] theorem mul_toFun (F : KatzLevelPForm R p k) (G : KatzLevelPForm R p l) {A : Type u} [CommRing A] [Algebra R A] (W : WeierstrassCurve A) (hW : IsUnit W.Δ) (D : LevelPData A) (hD : IsLevelPStructure W p D) : (F.mul G).toFun W hW D hD = F.toFun W hW D hD * G.toFun W hW D hD := rfl def swap (F : KatzLevelPForm R p k) : KatzLevelPForm R p k where toFun _ _ _ W hW D hD := F.toFun W hW D.swap hD.swap map_toFun := by intro A B _ _ _ _ f W hW hW' D hD hD' exact F.map_toFun f W hW hW' D.swap hD.swap hD'.swap toFun_variableChange := by intro A _ _ C W hW hW' D hD hD' exact F.toFun_variableChange C W hW hW' D.swap hD.swap hD'.swap @[simp] theorem swap_toFun (F : KatzLevelPForm R p k) {A : Type u} [CommRing A] [Algebra R A] (W : WeierstrassCurve A) (hW : IsUnit W.Δ) (D : LevelPData A) (hD : IsLevelPStructure W p D) : F.swap.toFun W hW D hD = F.toFun W hW D.swap hD.swap := rfl @[simp] theorem swap_swap (F : KatzLevelPForm R p k) : F.swap.swap = F := rfl @[simp] theorem swap_zero : (0 : KatzLevelPForm R p k).swap = 0 := rfl @[simp] theorem swap_add (F G : KatzLevelPForm R p k) : (F + G).swap = F.swap + G.swap := rfl @[simp] theorem swap_neg (F : KatzLevelPForm R p k) : (-F).swap = -F.swap := rfl @[simp] theorem swap_sub (F G : KatzLevelPForm R p k) : (F - G).swap = F.swap - G.swap := rfl @[simp] theorem swap_smul (c : R) (F : KatzLevelPForm R p k) : (c • F).swap = c • F.swap := rfl def DependsOnlyOnSndLine (F : KatzLevelPForm R p k) : Prop := ∀ ⦃A : Type u⦄ [CommRing A] [Algebra R A] (W : WeierstrassCurve A) (hW : IsUnit W.Δ) (D D' : LevelPData A) (hD : IsLevelPStructure W p D) (hD' : IsLevelPStructure W p D'), InLine W p D.xQ D'.xQ → F.toFun W hW D' hD' = F.toFun W hW D hD def DependsOnlyOnLines (F : KatzLevelPForm R p k) : Prop := ∀ ⦃A : Type u⦄ [CommRing A] [Algebra R A] (W : WeierstrassCurve A) (hW : IsUnit W.Δ) (D D' : LevelPData A) (hD : IsLevelPStructure W p D) (hD' : IsLevelPStructure W p D'), InLine W p D.xP D'.xP → InLine W p D.xQ D'.xQ → F.toFun W hW D' hD' = F.toFun W hW D hD def SwapInvariant (F : KatzLevelPForm R p k) : Prop := ∀ ⦃A : Type u⦄ [CommRing A] [Algebra R A] (W : WeierstrassCurve A) (hW : IsUnit W.Δ) (D : LevelPData A) (hD : IsLevelPStructure W p D), F.toFun W hW D.swap hD.swap = F.toFun W hW D hD theorem swapInvariant_iff_swap_eq (F : KatzLevelPForm R p k) : F.SwapInvariant ↔ F.swap = F := ⟨fun h => ext fun _ _ _ W hW D hD => h W hW D hD, fun h A _ _ W hW D hD => by rw [← swap_toFun, h]⟩ theorem DependsOnlyOnSndLine.dependsOnlyOnLines {F : KatzLevelPForm R p k} (h : F.DependsOnlyOnSndLine) : F.DependsOnlyOnLines := fun _ _ _ W hW D D' hD hD' _ hQ => h W hW D D' hD hD' hQ theorem DependsOnlyOnSndLine.dependsOnlyOnLines_swap_sub {F : KatzLevelPForm R p k} (h : F.DependsOnlyOnSndLine) : (F.swap - F).DependsOnlyOnLines := by intro A _ _ W hW D D' hD hD' hP hQ simp only [sub_toFun, swap_toFun] rw [h W hW D D' hD hD' hQ, h W hW D.swap D'.swap hD.swap hD'.swap hP] theorem DependsOnlyOnSndLine.zero : (0 : KatzLevelPForm R p k).DependsOnlyOnSndLine := fun _ _ _ _ _ _ _ _ _ _ => rfl theorem DependsOnlyOnSndLine.add {F G : KatzLevelPForm R p k} (hF : F.DependsOnlyOnSndLine) (hG : G.DependsOnlyOnSndLine) : (F + G).DependsOnlyOnSndLine := by intro A _ _ W hW D D' hD hD' hQ simp only [add_toFun, hF W hW D D' hD hD' hQ, hG W hW D D' hD hD' hQ] theorem DependsOnlyOnSndLine.neg {F : KatzLevelPForm R p k} (hF : F.DependsOnlyOnSndLine) : (-F).DependsOnlyOnSndLine := by intro A _ _ W hW D D' hD hD' hQ simp only [neg_toFun, hF W hW D D' hD hD' hQ] theorem DependsOnlyOnSndLine.smul (c : R) {F : KatzLevelPForm R p k} (hF : F.DependsOnlyOnSndLine) : (c • F).DependsOnlyOnSndLine := by intro A _ _ W hW D D' hD hD' hQ simp only [smul_toFun, hF W hW D D' hD hD' hQ] theorem DependsOnlyOnSndLine.mul {F : KatzLevelPForm R p k} {G : KatzLevelPForm R p l} (hF : F.DependsOnlyOnSndLine) (hG : G.DependsOnlyOnSndLine) : (F.mul G).DependsOnlyOnSndLine := by intro A _ _ W hW D D' hD hD' hQ simp only [mul_toFun, hF W hW D D' hD hD' hQ, hG W hW D D' hD hD' hQ] end KatzLevelPForm structure KatzGamma0Form (R : Type u) [CommRing R] (p : ℕ) (k : ℤ) : Type (u + 1) extends KatzLevelPForm R p k where dependsOnlyOnSndLine : toKatzLevelPForm.DependsOnlyOnSndLine namespace KatzGamma0Form variable {R : Type u} [CommRing R] {p : ℕ} {k l : ℤ} theorem toKatzLevelPForm_injective : Function.Injective (toKatzLevelPForm : KatzGamma0Form R p k → KatzLevelPForm R p k) := by rintro ⟨F, _⟩ ⟨G, _⟩ h congr @[ext] theorem ext {F G : KatzGamma0Form R p k} (h : F.toKatzLevelPForm = G.toKatzLevelPForm) : F = G := toKatzLevelPForm_injective h instance : Zero (KatzGamma0Form R p k) := ⟨⟨0, KatzLevelPForm.DependsOnlyOnSndLine.zero⟩⟩ instance : Add (KatzGamma0Form R p k) := ⟨fun F G => ⟨F.toKatzLevelPForm + G.toKatzLevelPForm, F.dependsOnlyOnSndLine.add G.dependsOnlyOnSndLine⟩⟩ instance : Neg (KatzGamma0Form R p k) := ⟨fun F => ⟨-F.toKatzLevelPForm, F.dependsOnlyOnSndLine.neg⟩⟩ instance : Sub (KatzGamma0Form R p k) := ⟨fun F G => ⟨F.toKatzLevelPForm - G.toKatzLevelPForm, by rw [sub_eq_add_neg]; exact F.dependsOnlyOnSndLine.add G.dependsOnlyOnSndLine.neg⟩⟩ instance : SMul R (KatzGamma0Form R p k) := ⟨fun c F => ⟨c • F.toKatzLevelPForm, F.dependsOnlyOnSndLine.smul c⟩⟩ @[simp] theorem toKatzLevelPForm_zero : (0 : KatzGamma0Form R p k).toKatzLevelPForm = 0 := rfl @[simp] theorem toKatzLevelPForm_add (F G : KatzGamma0Form R p k) : (F + G).toKatzLevelPForm = F.toKatzLevelPForm + G.toKatzLevelPForm := rfl @[simp] theorem toKatzLevelPForm_neg (F : KatzGamma0Form R p k) : (-F).toKatzLevelPForm = -F.toKatzLevelPForm := rfl @[simp] theorem toKatzLevelPForm_sub (F G : KatzGamma0Form R p k) : (F - G).toKatzLevelPForm = F.toKatzLevelPForm - G.toKatzLevelPForm := rfl @[simp] theorem toKatzLevelPForm_smul (c : R) (F : KatzGamma0Form R p k) : (c • F).toKatzLevelPForm = c • F.toKatzLevelPForm := rfl instance : AddCommGroup (KatzGamma0Form R p k) where add_assoc F G H := by ext1; simp [add_assoc] zero_add F := by ext1; simp add_zero F := by ext1; simp add_comm F G := by ext1; simp [add_comm] neg_add_cancel F := by ext1; simp sub_eq_add_neg F G := by ext1; simp [sub_eq_add_neg] nsmul := nsmulRec zsmul := zsmulRec instance : Module R (KatzGamma0Form R p k) where one_smul F := by ext1; simp mul_smul a b F := by ext1; simp [mul_smul] smul_zero a := by ext1; simp smul_add a F G := by ext1; simp add_smul a b F := by ext1; simp [add_smul] zero_smul F := by ext1; simp def mul (F : KatzGamma0Form R p k) (G : KatzGamma0Form R p l) : KatzGamma0Form R p (k + l) := ⟨F.toKatzLevelPForm.mul G.toKatzLevelPForm, F.dependsOnlyOnSndLine.mul G.dependsOnlyOnSndLine⟩ @[simp] theorem toKatzLevelPForm_mul (F : KatzGamma0Form R p k) (G : KatzGamma0Form R p l) : (F.mul G).toKatzLevelPForm = F.toKatzLevelPForm.mul G.toKatzLevelPForm := rfl end KatzGamma0Form end ModularCurve namespace KatzModularForm variable {R : Type u} [CommRing R] {k : ℤ} def pullbackLevelP (g : KatzModularForm R k) (p : ℕ) : ModularCurve.KatzLevelPForm R p k where toFun _ _ _ W hW _ _ := g.toFun W hW map_toFun := by intro A B _ _ _ _ f W hW hW' D hD hD' exact g.map_toFun f W hW hW' toFun_variableChange := by intro A _ _ C W hW hW' D hD hD' exact g.toFun_variableChange C W hW hW' @[simp] theorem pullbackLevelP_toFun (g : KatzModularForm R k) (p : ℕ) {A : Type u} [CommRing A] [Algebra R A] (W : WeierstrassCurve A) (hW : IsUnit W.Δ) (D : ModularCurve.LevelPData A) (hD : ModularCurve.IsLevelPStructure W p D) : (g.pullbackLevelP p).toFun W hW D hD = g.toFun W hW := rfl theorem dependsOnlyOnSndLine_pullbackLevelP (g : KatzModularForm R k) (p : ℕ) : (g.pullbackLevelP p).DependsOnlyOnSndLine := fun _ _ _ _ _ _ _ _ _ _ => rfl theorem swapInvariant_pullbackLevelP (g : KatzModularForm R k) (p : ℕ) : (g.pullbackLevelP p).SwapInvariant := fun _ _ _ _ _ _ _ => rfl @[simp] theorem swap_pullbackLevelP (g : KatzModularForm R k) (p : ℕ) : (g.pullbackLevelP p).swap = g.pullbackLevelP p := rfl def pullbackGamma0 (g : KatzModularForm R k) (p : ℕ) : ModularCurve.KatzGamma0Form R p k := ⟨g.pullbackLevelP p, g.dependsOnlyOnSndLine_pullbackLevelP p⟩ @[simp] theorem pullbackGamma0_toKatzLevelPForm (g : KatzModularForm R k) (p : ℕ) : (g.pullbackGamma0 p).toKatzLevelPForm = g.pullbackLevelP p := rfl @[simp] theorem pullbackLevelP_zero (p : ℕ) : (0 : KatzModularForm R k).pullbackLevelP p = 0 := rfl @[simp] theorem pullbackLevelP_add (g h : KatzModularForm R k) (p : ℕ) : (g + h).pullbackLevelP p = g.pullbackLevelP p + h.pullbackLevelP p := rfl @[simp] theorem pullbackLevelP_smul (c : R) (g : KatzModularForm R k) (p : ℕ) : (c • g).pullbackLevelP p = c • g.pullbackLevelP p := rfl end KatzModularForm namespace ModularCurve.LevelP variable (p : ℕ) def borel : Subgroup (GL (Fin 2) (ZMod p)) where carrier := {g | (g : Matrix (Fin 2) (Fin 2) (ZMod p)) 0 1 = 0} mul_mem' := by intro g h hg hh simp only [Set.mem_setOf_eq] at hg hh ⊢ rw [Units.val_mul, Matrix.mul_apply, Fin.sum_univ_two, hg, hh, zero_mul, mul_zero, add_zero] one_mem' := by simp inv_mem' := by intro g hg simp only [Set.mem_setOf_eq] at hg ⊢ rw [Matrix.coe_units_inv, Matrix.inv_def, Matrix.smul_apply, Matrix.adjugate_fin_two] simp [hg] def splitTorus : Subgroup (GL (Fin 2) (ZMod p)) where carrier := {g | (g : Matrix (Fin 2) (Fin 2) (ZMod p)) 0 1 = 0 ∧ (g : Matrix (Fin 2) (Fin 2) (ZMod p)) 1 0 = 0} mul_mem' := by intro g h hg hh simp only [Set.mem_setOf_eq] at hg hh ⊢ simp only [Units.val_mul, Matrix.mul_apply, Fin.sum_univ_two, hg.1, hh.1, hg.2, hh.2] simp one_mem' := by simp inv_mem' := by intro g hg simp only [Set.mem_setOf_eq] at hg ⊢ rw [Matrix.coe_units_inv, Matrix.inv_def, Matrix.smul_apply, Matrix.smul_apply, Matrix.adjugate_fin_two] simp [hg.1, hg.2] def unipotentU : GL (Fin 2) (ZMod p) := ⟨!![1, 1; 0, 1], !![1, -1; 0, 1], by rw [Matrix.mul_fin_two, Matrix.one_fin_two]; norm_num, by rw [Matrix.mul_fin_two, Matrix.one_fin_two]; norm_num⟩ def swapW : GL (Fin 2) (ZMod p) := ⟨!![0, 1; 1, 0], !![0, 1; 1, 0], by rw [Matrix.mul_fin_two, Matrix.one_fin_two]; norm_num, by rw [Matrix.mul_fin_two, Matrix.one_fin_two]; norm_num⟩ @[simp] theorem coe_unipotentU : (unipotentU p : Matrix (Fin 2) (Fin 2) (ZMod p)) = !![1, 1; 0, 1] := rfl @[simp] theorem coe_swapW : (swapW p : Matrix (Fin 2) (Fin 2) (ZMod p)) = !![0, 1; 1, 0] := rfl theorem mem_borel_iff (g : GL (Fin 2) (ZMod p)) : g ∈ borel p ↔ (g : Matrix (Fin 2) (Fin 2) (ZMod p)) 0 1 = 0 := Iff.rfl theorem mem_splitTorus_iff (g : GL (Fin 2) (ZMod p)) : g ∈ splitTorus p ↔ (g : Matrix (Fin 2) (Fin 2) (ZMod p)) 0 1 = 0 ∧ (g : Matrix (Fin 2) (Fin 2) (ZMod p)) 1 0 = 0 := Iff.rfl theorem splitTorus_le_borel : splitTorus p ≤ borel p := fun _ hg => hg.1 end ModularCurve.LevelP end
Statements phrased using this module (177)
- Level reduction for even-weight Katz forms on Γ₀(p)
ModularCurve.KatzGamma0Form.exists_pullbackLevelP_eq_of_qTwist_qExpansion_eq_of_even_of_five_le413 below · depth 17 - Mazur's cusp gives a level-p structure on Tate(qᵖ)
ModularCurve.isLevelPStructure_tateBase_cuspData_mazurCusp_of_five_le68 below · depth 17 - Weight-two Γ₀(p) forms as Katz forms over ℤ[1/p]
ModularForm.exists_katzGamma0Form_evalCusp_eq_of_five_le499 below · depth 17 - Level-p data transport along Weierstrass variable changes
ModularCurve.IsLevelPStructure.variableChange0 below · depth 18 - Level reduction for Katz Γ₀(p) forms, p≥ 5
ModularCurve.KatzGamma0Form.exists_pullbackLevelP_eq_of_qTwist_qExpansion_eq_of_five_le412 below · depth 18 - q-expansion principle for Γ₀(p)-type Katz forms
ModularCurve.KatzLevelPForm.eq_zero_of_dependsOnlyOnSndLine_of_evalCusp_eq_zero328 below · depth 18 - Étaleness of the level-n basis ring for nΔ invertible
ModularCurve.LevelP.BasisRing.etale4 below · depth 18 - Flatness of the universal level-p basis, coordinate-change and Borel rings
ModularCurve.LevelP.flat_univBasisRing_vcRing_borelRing0 below · depth 18 - The universal Borel pair is a level-p structure
ModularCurve.LevelP.isLevelPStructure_borelDataPrime6 below · depth 18 - Vélu's x-only quotient depends only on the line
ModularCurve.LevelP.quotientByLine_eq_of_inLine8 below · depth 18 - Symmetry of the division-polynomial independence unit
ModularCurve.isUnit_indepElt_symm4 below · depth 18 - Independence element of toric and slot points is a unit
ModularCurve.isUnit_indepElt_tateBase_tateToricPoint_nonToricPoint2 below · depth 18 - q-expansion principle at split Cartan level p
ModularCurve.KatzLevelPForm.eq_zero_of_dependsOnlyOnLines_of_forall_evalCusp_eq_zero328 below · depth 19 - q-expansion principle for Γ₀(p)-type Katz level-p forms
ModularCurve.KatzLevelPForm.eq_zero_of_dependsOnlyOnSndLine_of_evalCusp_eq_zero_of_field313 below · depth 19 - Descent of the q-expansion principle from fields
ModularCurve.KatzLevelPForm.eq_zero_of_dependsOnlyOnSndLine_of_evalCusp_eq_zero_of_forall_field18 below · depth 19 - Descent of swap-invariant level-p Katz forms to level one
ModularCurve.KatzLevelPForm.existsUnique_pullbackLevelP_eq_of_swapInvariant13 below · depth 19 - q-twisting by ζ shifts level-p cusp data
ModularCurve.cuspData_map_qTwist2 below · depth 19 - Level-p structures exist over algebraically closed fields
ModularCurve.exists_isLevelPStructure_of_isAlgClosed5 below · depth 19 - Non-toric cusp points: x(t· w) on the line of x(w)
ModularCurve.inLine_cuspData_smul_of_five_le49 below · depth 19 - Vanishing of the independence element and cyclic subgroup membership
ModularCurve.indepElt_eq_zero_iff_mem_zmultiples3 below · depth 19 - Cusp points are level-p structures on the Tate curve
ModularCurve.isLevelPStructure_cuspData81 below · depth 19 - Vanishing at one cusp kills line-dependent Katz level-p forms
ModularCurve.KatzLevelPForm.eq_zero_of_dependsOnlyOnLines_of_evalCusp_eq_zero_of_field318 below · depth 20 - Vanishing of Katz level-p forms: fields to rings
ModularCurve.KatzLevelPForm.eq_zero_of_dependsOnlyOnLines_of_evalCusp_eq_zero_of_forall_field17 below · depth 20 - Generic-curve vanishing of a level-p Katz form
ModularCurve.KatzLevelPForm.eq_zero_of_forall_toFun_genericCurve_eq_zero4 below · depth 20 - Cusp points lie on the Tate curve over R((q))
ModularCurve.equation_tateBase_cuspPoint40 below · depth 20 - Cusp points of the Tate curve are p-torsion, p ≥ 5
ModularCurve.eval_prePsi_tateBase_cuspPoint_eq_zero_of_five_le43 below · depth 20 - A p-torsion point independent of two given ones
ModularCurve.exists_torsionPt_indepElt_ne_zero4 below · depth 20 - Unit independence element for two p-torsion cusp points
ModularCurve.isUnit_indepElt_tateBase_cuspPoint_of_five_le78 below · depth 20 - Galois transitivity on cyclic p-subgroups of the generic curve
WeierstrassCurve.Generic.exists_algEquiv_inLine_of_eval_prePsi_eq_zero_of_ne_zero307 below · depth 20 - Unit independence element at two non-toric cusp slots
ModularCurve.isUnit_indepElt_tateBase_cuspPoint_slot_slot_of_five_le49 below · depth 21 - Special-fibre points of the rigid chart as level structures
ModularCurve.FullLevel.exists_ssFibreDictionary_chartAlgFin_rigidDataPow2,868 below · depth 28 - Transitivity of Γ(N₀) on Weil-normalised level-ℓ structures
ModularCurve.LevelRelabelling.exists_mem_Gamma_relabel_eq_of_weilPairing0_eq45 below · depth 28 - Special-fibre dictionary for the rigid chart at level Γ(q)∩Γ₁(ℓ_g)∩Γ₀(M')
ModularCurve.FullLevel.Diamond.exists_ssFibreDictionary_chartAlgFin_rigidDataGamma1Pow2,857 below · depth 29 - Constancy of the level-ℓ' Weil pairing on the special fibre
ModularCurve.FullLevel.exists_forall_weilPairing0_eq_of_eq_map_classify_rigidDataPow42 below · depth 29 - No q-torsion and alignment above a supersingular place
ModularCurve.FullLevel.forall_nsmul_eq_zero_and_exists_variableChange_of_over_of_eq_map_classify_rigidDataPow_of_tatePoint2,862 below · depth 29 - Points on the line of P₀ lie in ℤP₀
ModularCurve.InLine.some_mem_zmultiples_some_of_nonsingular3 below · depth 29 - Two level-ℓ structures differ by an invertible matrix
ModularCurve.IsLevelPStructure.exists_eq_nsmul_add_nsmul_of_isLevelPStructure4 below · depth 29 - Cusp-regular integral level-M' functions lie in the j-chart
ModularCurve.FullLevel.Diamond.coeffEmb_mem_chartAlgFin_of_cuspRegular_of_mem_integers827 below · depth 30 - Directed supersingular-fibre dictionary for the Γ₁(ℓ_g)-rigid moduli data
ModularCurve.FullLevel.Diamond.exists_ssFibreDictionary_chartAlgFin_rigidDataGamma1Pow_directedAt2,856 below · depth 30 - One moduli place for all rigid-chart points over s
ModularCurve.FullLevel.exists_place_forall_isModuliPlaceOf_of_over_of_eq_map_classify_rigidDataPow_of_tatePoint2,858 below · depth 30 - Unique normal form of a level-ℓ structure
ModularCurve.IsLevelPStructure.existsUnique_variableChange_isNormalForm6 below · depth 30 - Rigidity of Katz full level-ℓ structures
ModularCurve.IsLevelPStructure.variableChange_eq_one_of_smul_eq_of_variableChange_eq_of_prime2 below · depth 30 - Universal Katz level-ℓ Weil pairing as ℓ-th root of unity
ModularCurve.LevelComponent.exists_pow_eq_one_and_forall_weilPairing0_toPoint_mapRing_eq_of_mk_eq_univ39 below · depth 30 - Invariance of the point-level Weil pairing under coordinate change
WeierstrassCurve.Affine.weilPairing0_toPoint_variableChange2 below · depth 30 - A point of order M' whose multiples are cut out by the Γ₀-component
WeierstrassCurve.DrinfeldGlobal.exists_addOrderOf_eq_forall_isRoot_level_fst_of_raw_rigidDataPow5 below · depth 30 - Aligning raw rigid data with equal Γ₀(M')-moduli class
WeierstrassCurve.DrinfeldGlobal.exists_variableChange_curve_eq_level_fst_eq_of_moduliPoint_mk_eq_of_raw_rigidDataPow2 below · depth 30 - Vanishing q-torsion and line alignment at supersingular places
ModularCurve.FullLevel.Diamond.forall_nsmul_eq_zero_and_exists_variableChange_and_inLine_of_over_of_eq_map_classify_rigidDataH1Pow_of_tatePoint_pinGamma12,852 below · depth 31 - Transported μ_{p^k} kernel has coefficients in the level field
ModularCurve.FullLevel.coeff_kernelVariableChangeDeg_mem_range_of_variableChange_cuspData_xP_mem_range_gamma0Pow58 below · depth 31 - Supersingular fibre dictionary with automorphism count at s
ModularCurve.FullLevel.exists_ssFibreDictionary_autCount_chartAlgFin_rigidDataPow2,889 below · depth 31 - Weight-one change of variables: Tate curve and cusps over K
ModularCurve.FullLevel.exists_variableChange_weightOne_tateBase_mem_laurentBaseChange_and_cuspData_mem_of_exists_ringHom114 below · depth 31 - Closed points above a supersingular place carry no q-torsion
ModularCurve.FullLevel.forall_nsmul_eq_zero_of_over_of_eq_map_classify_rigidDataPow104 below · depth 31 - Equal floor readings and supersingular fibre force equal Γ₀(M')-class
ModularCurve.FullLevel.moduliPoint_mk_eq_of_forall_apply_qExpand_eq_of_eq_map_classify_rigidDataPow_of_tatePoint2,857 below · depth 31 - Local constancy of the Weil pairing of a level-ℓ basis
ModularCurve.LevelComponent.exists_not_mem_and_exists_pow_eq_one_forall_weilPairing0_toPoint_mapRing_localizationAway_eq33 below · depth 31 - Ring maps out of the level-p basis ring are determined by basis data
ModularCurve.LevelP.BasisRing.ringHom_ext_of_basisData_map_eq0 below · depth 31 - Natural relabelling of level-ℓ data by integral matrices
ModularCurve.LevelRelabelling.exists_natural_relabel_levelPData19 below · depth 31 - Weil-normalised level-ℓ structures number #SL₂(ℤ/ℓ)
ModularCurve.LevelRelabelling.natCard_isLevelPStructure_weilPairing0_eq_eq_natCard_specialLinearGroup51 below · depth 31 - Rigidity of Katz level-ℓ structures over algebraically closed fields
ModularCurve.LevelRelabelling.variableChange_eq_one_of_smul_eq_of_variableChange_eq_of_isLevelPStructure3 below · depth 31 - Inverse-twisted cusp data gives a level-p structure on Tate(qⁿ)
ModularCurve.isLevelPStructure_tateBase_cuspData_neg_of_dvd74 below · depth 31 - Presentation independence of the point-level Weil pairing
WeierstrassCurve.Affine.weilPairing0_toPoint_eq_of_baseChange_eq0 below · depth 31 - Sections through an independent q-torsion pair are a Drinfeld basis
WeierstrassCurve.DrinfeldGlobal.isDrinfeldBasis_of_isSectionThrough_of_torsion_basis118 below · depth 31 - A single moduli place above a supersingular place, H₁ level
ModularCurve.FullLevel.Diamond.exists_place_forall_isModuliPlaceOf_of_over_of_eq_map_classify_rigidDataH1Pow_of_tatePoint_pinGamma12,847 below · depth 32 - Supersingular places read off injectively from Γ₀(M')-classes
ModularCurve.FullLevel.exists_injective_forall_place_eq_of_forall_evalAt_eq_of_eq_map_classify_rigidDataPow_of_tatePoint2,847 below · depth 32 - Closed points of the rigid j-chart read rational floor places
ModularCurve.FullLevel.exists_place_forall_evalAt_eq_apply_qExpand_of_eq_map_classify_rigidDataPow865 below · depth 32 - Transport of level automorphism and supersingular point to j-chart
ModularCurve.FullLevel.exists_ringHom_chartAlgFin_levelAut_comap_eq_of_isLevelAutAt_of_ringHom_cyclotomic_rigidDataPow968 below · depth 32 - Admissible constants over a cyclotomic discrete valuation ring
ModularCurve.FullLevel.exists_valuationSubring_admissibleConstants_over_cyclotomic11 below · depth 32 - Level automorphisms in Γ(ℓ')∩Γ₀(M') fix supersingular closed points
ModularCurve.FullLevel.levelAut_sub_self_mem_of_isLevelAutAt_of_mem_Gamma_of_over_ssPlace_rigidDataPow2,871 below · depth 32 - Automorphisms of the Γ₀(M')-fibre datum over a supersingular place
ModularCurve.FullLevel.natCard_variableChange_act_curve_eq_and_level_fst_eq_eq_two_mul_placeWidthChar_of_over_of_eq_map_classify_rigidDataPow_of_tatePoint2,872 below · depth 32 - Degeneracy image of a cusp-regular integral function is chart-integral
ModularCurve.FullLevel.qExpand_mem_chartAlgFin_of_cuspRegular_of_mem_integers828 below · depth 32 - Level automorphism acts on transported cusp data through γ
ModularCurve.FullLevel.zsmul_toPoint_add_zsmul_toPoint_eq_toPoint_levelAut_of_map_eq_cuspData_of_exists_ringHom140 below · depth 32 - Unique Tate normal form for a Γ₁(ℓ)-point
ModularCurve.IsGamma1Point.existsUnique_variableChange_isNormalForm6 below · depth 32 - Invariance of Γ₁(ℓ)-point data under Weierstrass coordinate changes
ModularCurve.IsGamma1Point.variableChange0 below · depth 32 - Rigidity of Γ₁(ℓ)-points under variable changes
ModularCurve.IsGamma1Point.variableChange_eq_one_of_smul_eq_of_variableChange_eq7 below · depth 32 - Level-ℓ data gives an independent pair of ℓ-torsion points
ModularCurve.IsLevelPStructure.exists_nsmul_eq_zero_and_dvd_of_zsmul_add_zsmul_eq_zero4 below · depth 32 - Relabelling a level-ℓ structure by a matrix invertible mod ℓ
ModularCurve.IsLevelPStructure.relabel_of_isUnit_det4 below · depth 32 - Relabelling a level-ℓ structure is a right GL₂(ℤ/ℓ)-action
ModularCurve.IsLevelPStructure.relabel_relabel_and_relabel_one_and_relabel_eq_of_map_eq4 below · depth 32 - Relabelling level-ℓ data commutes with Weierstrass coordinate changes
ModularCurve.IsLevelPStructure.relabel_variableChange5 below · depth 32 - Universal relabelling of the level-ℓ basis exists
ModularCurve.LevelP.exists_levelPData_map_eq_relabel_univData5 below · depth 32 - Reducedness of the universal level-ℓ basis ring
ModularCurve.LevelP.isReduced_univBasisRing11 below · depth 32 - Natural [a]-multiplication on Γ₁(ℓ)-data over A-algebras
ModularCurve.LevelRelabelling.exists_natural_zsmul_gamma1Point172 below · depth 32 - Relabelled level data read back as the relabelled points
ModularCurve.LevelRelabelling.toPoint_relabel_eq_zsmul_add_zsmul0 below · depth 32 - Mazur's cusp is a level-p structure on Tate(qᵖ)
ModularCurve.isLevelPStructure_tateBase_cuspData_mazurCusp73 below · depth 32 - Weil pairing of a Katz level-ℓ structure is primitive
WeierstrassCurve.Affine.isPrimitiveRoot_weilPairing0_toPoint_of_isLevelPStructure44 below · depth 32 - Cyclic generator of order M' cut by the Γ₀(M')-tuple
WeierstrassCurve.DrinfeldGlobal.exists_addOrderOf_eq_forall_isRoot_level_fst_of_raw_rigidDataH1Pow5 below · depth 32 - Equal Γ₀(M')-moduli points give a common change of variables
WeierstrassCurve.DrinfeldGlobal.exists_variableChange_curve_eq_level_fst_eq_of_moduliPoint_mk_eq_of_raw_rigidDataH1Pow2 below · depth 32 - Two H₁-admissible Γ₁(ℓ_g)-points on one curve lie in line
WeierstrassCurve.DrinfeldGlobal.inLine_level_snd_fst_xP_of_curve_eq_of_level_fst_eq_rigidDataH1Pow20 below · depth 32 - Transport along a change of variables on sections through a point
WeierstrassCurve.DrinfeldGlobal.isSectionThrough_act_of_isSectionTransport0 below · depth 32 - Sections of a transported Drinfeld pair pass through f-images
WeierstrassCurve.DrinfeldGlobal.isSectionThrough_map_of_isSectionTransport0 below · depth 32 - Integer combinations of sections pass through the combined points
WeierstrassCurve.DrinfeldGlobal.isSectionThrough_zlinComb_of_isSectionThrough86 below · depth 32 - Transport of a cyclotomic level automorphism to the k₀-chart
ModularCurve.FullLevel.Diamond.exists_ringHom_chartAlgFin_levelAut_comap_eq_of_isLevelAutAt_of_ringHom_cyclotomic_rigidDataGamma1Pow939 below · depth 33 - Supersingular specialisations of the H₁ datum have no q-torsion
ModularCurve.FullLevel.Diamond.forall_nsmul_eq_zero_of_over_of_eq_map_classify_rigidDataH1Pow104 below · depth 33 - Trivial-diamond level automorphisms fix supersingular chart points
ModularCurve.FullLevel.Diamond.levelAut_sub_self_mem_of_isLevelAutAt_of_mem_gamma0_of_apply_eq_one_of_over_ssPlace_rigidDataGamma1Pow2,859 below · depth 33 - Equal floor readings force equal Γ₀(M')-moduli class
ModularCurve.FullLevel.Diamond.moduliPoint_mk_eq_of_forall_apply_eq_of_eq_map_classify_rigidDataH1Pow_of_tatePoint_pinGamma12,846 below · depth 33 - Closed points of the rigid chart read through R₀
ModularCurve.FullLevel.exists_algHom_forall_apply_residue_eq_apply_qExpand_of_eq_map_classify_rigidDataPow860 below · depth 33 - Supersingular closed point lifts to the chart over admissible constants
ModularCurve.FullLevel.exists_isMaximal_chartAlgFin_comap_eq_of_coeffMap_cyclotomic_rigidDataPow197 below · depth 33 - Read place is a moduli place of the Frobenius-twisted fibre
ModularCurve.FullLevel.exists_isModuliPlaceOf_map_frobenius_of_forall_evalAt_eq_of_eq_map_classify_rigidDataPow_of_tatePoint2,828 below · depth 33 - Transport of level automorphisms along a cyclotomic coefficient map
ModularCurve.FullLevel.exists_ringHom_chartAlgFin_isLevelAutAt_restrict_comp_eq_of_isLevelAutAt_cyclotomic_rigidDataPow242 below · depth 33 - Supersingular fibre dictionary with Γ₀(M') relabelling
ModularCurve.FullLevel.exists_ssFibreDictionary_relabel_of_isLevelAutAt_chartAlgFin_rigidDataPow2,868 below · depth 33 - Supersingular points of the j-chart lie over supersingular places
ModularCurve.FullLevel.exists_ssPlace_under_of_isMaximal_chartAlgFin_of_mem_ssJSet_rigidDataPow891 below · depth 33 - Relabelling by γ∈Γ(ℓ')∩Γ₀(M') fixes a supersingular class
ModularCurve.FullLevel.quotMk_eq_of_relabel_of_mem_Gamma_of_forall_smul_eq_zero_rigidDataPow10 below · depth 33 - Relabelling rigidity for Katz level-ℓ structures over a field
ModularCurve.IsLevelPStructure.map_eq_of_relabel_variableChange_eq4 below · depth 33 - Relabelling commutes with a Weierstrass change of variables
ModularCurve.LevelRelabelling.relabel_smul_variableChange1 below · depth 33 - Relabelling cusp data on the Tate curve is linear in (v,w)
ModularCurve.LevelRelabelling.relabel_tateBase_cuspData_eq_cuspData_zsmul_add_zsmul50 below · depth 33 - Level-ℓ structures over K descend to the valuation ring
ModularCurve.exists_map_eq_and_isLevelPStructure_of_isLevelPStructure_map13 below · depth 33 - ℓ-torsion of a section versus vanishing of preΨ_ℓ
WeierstrassCurve.DrinfeldGlobal.nsmul_eq_one_iff_eval_prePsi_eq_zero_of_isSectionThrough138 below · depth 33 - Good integral model from integral j and level-ℓ data
WeierstrassCurve.exists_variableChange_smul_eq_map_of_isLevelPStructure_of_jOfUnit_mem_range19 below · depth 33 - DVR extension containing an n-th root of π
IsDiscreteValuationRing.exists_dvr_extension_pow_eq0 below · depth 34 - Supersingular places injectively indexed by Γ₀(M')-moduli points
ModularCurve.FullLevel.Diamond.exists_injective_forall_place_eq_of_forall_evalAt_eq_of_eq_map_classify_rigidDataH1Pow_of_tatePoint_pinGamma12,836 below · depth 34 - A maximal ideal of the k₀-chart contracting to y₁
ModularCurve.FullLevel.Diamond.exists_isMaximal_chartAlgFin_comap_eq_of_coeffMap_cyclotomic_rigidDataGamma1Pow198 below · depth 34 - One rational place reads all admissible functions at H₁ level
ModularCurve.FullLevel.Diamond.exists_place_forall_evalAt_eq_apply_of_eq_map_classify_rigidDataH1Pow864 below · depth 34 - Transfer of level automorphisms to the j-finite chart
ModularCurve.FullLevel.Diamond.exists_ringHom_chartAlgFin_isLevelAutAt_restrict_comp_eq_of_isLevelAutAt_cyclotomic_rigidDataGamma1Pow212 below · depth 34 - Directed supersingular-fibre dictionary under Γ₀(M')-level automorphisms
ModularCurve.FullLevel.Diamond.exists_ssFibreDictionary_chartAlgFin_rigidDataGamma1Pow_directedAt_of_mem_gamma02,856 below · depth 34 - Supersingular chart points lie over supersingular places (Γ₁(ℓ_g) frame)
ModularCurve.FullLevel.Diamond.exists_ssPlace_under_of_isMaximal_chartAlgFin_of_mem_ssJSet_rigidDataGamma1Pow890 below · depth 34 - q-expansion criterion at a supersingular point, H₁ level
ModularCurve.FullLevel.Diamond.mem_of_forall_coeff_mem_maximalIdeal_of_isMaximal_of_mem_ssJSet_chartAlgFin_rigidDataGamma1Pow_of_isPrimitiveRoot_mul2,299 below · depth 34 - Trivial-diamond Γ₀(M')-relabelling fixes supersingular Γ₁(ℓ_g)-points
ModularCurve.FullLevel.Diamond.quotMk_eq_of_relabel_of_apply_eq_one_of_forall_smul_eq_zero_rigidDataGamma1Pow7 below · depth 34 - Reading admissible level-M' functions gives a κ_A-embedding
ModularCurve.FullLevel.exists_algHom_modularFunctionFieldFullC_forall_apply_residue_eq_ringHom_of_transcendental_of_tatePoint863 below · depth 34 - Frobenius twist and cyclic-quotient j at a Tate point
ModularCurve.FullLevel.exists_place_curve_reduction_eq_map_frobenius_cyclicQuotientJ_eq_of_levelAut_of_originChart_of_tatePoint2,251 below · depth 34 - Supersingular branch with second Drinfeld section at the origin
ModularCurve.FullLevel.exists_place_ringHom_chartAlgFin_residue_eq_originChart_levelAut_of_forall_nsmul_eq_zero_of_tatePoint2,365 below · depth 34 - Tate model and division values over the full-level q-expansion field
ModularCurve.FullLevel.exists_variableChange_tateBase_mem_laurentBaseChange_and_cuspData_mem124 below · depth 34 - Integrality and cusp-regularity of j(qᵈ) for d ∣ M'
ModularCurve.FullLevel.mem_integers_and_cuspRegular_qExpand_jq_of_dvd44 below · depth 34 - Level-p data yield an injective map (ℤ/p)² → W(F)
ModularCurve.IsLevelPStructure.exists_injective_addMonoidHom_zmod_prod3 below · depth 34 - Equal classifying kernels give equal q-Weil pairing values
ModularCurve.LevelModuliPackageAbs.weilPairing0_drinfeld_mapRing_eq_of_ker_classify_eq_rigidDataPow254 below · depth 34 - Weil pairing determined by the kernel of `classify`
ModularCurve.LevelModuliPackageAbs.weilPairing0_mapRing_eq_of_ker_classify_eq_rigidDataPow41 below · depth 34 - Relabelling of level data commutes with base change
ModularCurve.LevelRelabelling.relabel_map_eq_map_relabel0 below · depth 34 - Cusp of Tate(qⁿ) gives a level-ℓ structure when ℓ ∣ n
ModularCurve.isLevelPStructure_tateBase_cuspData_of_dvd74 below · depth 34 - Drinfeld basis sections factor through the affine chart
WeierstrassCurve.DrinfeldGlobal.RawDrinfeldPair.IsLevel.exists_isSectionThrough_of_isUnit99 below · depth 34 - Unit Katz independence elements for Drinfeld Γ(q)-bases
WeierstrassCurve.DrinfeldGlobal.RawDrinfeldPair.IsLevel.isUnit_indepElt_of_isSectionThrough104 below · depth 34 - Weil pairing of a Drinfeld Γ(q)-basis is primitive
WeierstrassCurve.DrinfeldGlobal.isPrimitiveRoot_weilPairing0_of_isLevel_of_isSectionThrough_ed2196 below · depth 34 - Integral j forces Δ ∣ a³ and Δ ∣ b²
WeierstrassCurve.discr_dvd_pow_of_jOfUnit_mem_range_short0 below · depth 34 - Short integral model over the fraction field of a domain
WeierstrassCurve.exists_variableChange_smul_eq_map_short_of_isUnit_two_three0 below · depth 34 - Specialisation of the H₁ chart yields a κ(A)-algebra homomorphism
ModularCurve.FullLevel.Diamond.exists_algHom_forall_apply_residue_eq_apply_of_eq_map_classify_rigidDataH1Pow859 below · depth 35 - Existence of a moduli place for the Frobenius-twisted Γ₀(M')-class
ModularCurve.FullLevel.Diamond.exists_isModuliPlaceOf_map_frobenius_of_forall_evalAt_eq_of_eq_map_classify_rigidDataH1Pow_of_tatePoint_pinGamma12,817 below · depth 35 - Gauss nonunits lie in the supersingular maximal ideal
ModularCurve.FullLevel.Diamond.mem_of_coe_mem_nonunits_of_isMaximal_of_mem_ssJSet_chartAlgFin2,297 below · depth 35 - Specialisation of j(q^{dℓ'}) as the q-th power of a cyclic-quotient j
ModularCurve.FullLevel.apply_eq_cyclicQuotientJ_pow_of_levelAut_of_originChart_of_forall_nsmul_eq_zero_of_tatePoint2,242 below · depth 35 - First Drinfeld section is the origin at the Gauss place
ModularCurve.FullLevel.exists_originChart_fst_of_forall_ringHom_eq_zero_iff_mem_nonunits_of_tatePoint23 below · depth 35 - Weight-one Tate model and cusp points over K
ModularCurve.FullLevel.exists_variableChange_weightOne_tateBase_mem_laurentBaseChange_and_cuspData_mem123 below · depth 35 - Unique lifting of level-ℓ structures along nilpotent surjections
ModularCurve.IsLevelPStructure.existsUnique_map_eq_of_surjective_of_ker_pow_eq_bot7 below · depth 35 - Distinct x-coordinates in a level-ℓ datum for ℓ ≥ 3
ModularCurve.IsLevelPStructure.isUnit_xP_sub_xQ0 below · depth 35 - Equal `classify` kernels give equal Drinfeld Weil pairing values
ModularCurve.LevelModuliPackageAbs.weilPairing0_drinfeld_mapRing_eq_of_ker_classify_eq_rigidDataH1Pow254 below · depth 35 - Γ₁(ℓ)-points of the generic fibre descend to R₀
ModularCurve.exists_map_eq_and_isGamma1Point_of_isGamma1Point_map1 below · depth 35 - Sum of a level-ℓ section and q-torsion meets the affine chart
WeierstrassCurve.DrinfeldGlobal.exists_isSectionThrough_mul_of_isLevelPStructure_of_nsmul_eq_one121 below · depth 35 - Drinfeld Γ(q)-pairs versus Katz level-q data, naturally
WeierstrassCurve.DrinfeldGlobal.exists_rawDrinfeldPair_equiv_levelPData_natural_of_isUnit199 below · depth 35 - Katz level-q data yield a Drinfeld Γ(q)-basis
WeierstrassCurve.DrinfeldGlobal.isDrinfeldBasis_of_isSectionThrough_of_isLevelPStructure175 below · depth 35 - Drinfeld Γ(q)-bases yield Katz level-q structures
WeierstrassCurve.DrinfeldGlobal.isLevelPStructure_of_isLevel_of_isSectionThrough157 below · depth 35 - Equal raw classes give the same Γ₀(M') moduli point
WeierstrassCurve.DrinfeldGlobal.moduliPoint_mk_eq_of_quot_mk_eq_of_raw_rigidDataPow6 below · depth 35 - Weil pairing of a Drinfeld q-basis is variable-change invariant
WeierstrassCurve.DrinfeldGlobal.weilPairing0_toPoint_variableChange_of_isLevel_of_isSectionThrough160 below · depth 35 - Good integral model over a DVR from a Γ₁(ℓ)-point and integral j
WeierstrassCurve.exists_variableChange_smul_eq_map_of_isGamma1Point_of_jOfUnit_mem_range21 below · depth 35 - Supersingular maximal ideals agreeing on q-substituted functions coincide
ModularCurve.FullLevel.Diamond.eq_of_isMaximal_of_mem_ssJSet_of_forall_coe_eq_qExpand_iff_chartAlgFin2,214 below · depth 36 - Branch reading gives an embedding of the full level-M' field
ModularCurve.FullLevel.Diamond.exists_algHom_modularFunctionFieldFullC_forall_apply_residue_eq_ringHom_of_transcendental_rigidDataH1Pow_of_tatePoint_pinGamma1864 below · depth 36 - Frobenius twist of the H₁ branch after place extension
ModularCurve.FullLevel.Diamond.exists_place_curve_reduction_eq_map_frobenius_cyclicQuotientJ_eq_of_levelAut_of_originChart_rigidDataH1Pow_of_tatePoint_pinGamma12,187 below · depth 36 - Branch place at a supersingular point of the H₁ chart
ModularCurve.FullLevel.Diamond.exists_place_ringHom_chartAlgFin_residue_eq_originChart_levelAut_of_forall_nsmul_eq_zero_rigidDataH1Pow_of_tatePoint_pinGamma12,343 below · depth 36
… and 27 more statements (search for the module name to find them).