Definitions/Def_ModularCurve_WeierstrassLevelCarrier.lean
Kernel polynomials of cyclic -subgroups on Weierstrass models
Over a commutative ring T with a Weierstrass curve W, the module introduces the currency for recording a cyclic level-N structure as a polynomial in the x-coordinate. First, smulNumerator takes a,d \in \mathbb{N} and h \in T[X] to \sum_{i=0}^{d} h_i\,\Phi_a^{\,i}\,(\Psi^{\mathrm{sq}}_a)^{\,d-i}, where h_i is the i-th coefficient of h and \Phi_a, \Psi^{\mathrm{sq}}_a are the division-polynomial numerator and denominator of x([a]P); this is the numerator obtained from h by substituting x \mapsto \Phi_a/\Psi^{\mathrm{sq}}_a and clearing denominators, homogenised to degree d. Second, IsCyclicKernel N h is a four-field predicate on h \in T[X]: the natural degree of h is at most (N-1)/2; the coefficient of h in degree (N-1)/2 equals 1; h divides preΨ N, the N-th division polynomial in x; and h divides smulNumerator a ((N-1)/2) h for every a with 2 \le a \le (N-1)/2. Thus h is monic of degree exactly (N-1)/2 (recorded as IsCyclicKernel.monic), its roots lie among the x-coordinates of N-torsion points, and the set of those roots is stable under all multiplications [a] — the defining conditions for h to be the kernel polynomial \prod (x - x(P)) of a cyclic subgroup of order N, with no generating section required.
The datum is transported along a ring homomorphism f : T \to T': smulNumerator_map identifies the construction for the base-changed curve applied to h mapped by f with the image of smulNumerator, and IsCyclicKernel.map transports all four fields. kernelVariableChange is the accompanying operation on polynomials for a variable change C with parameters u, r, namely u^{-2\deg h}\,h(u^2 X + r). Finally, jOfUnit gives the j-invariant of W from a witness that \Delta is a unit rather than from an IsElliptic instance; it agrees with j when such an instance is present, commutes with ring maps, is invariant under variable changes, and the unit property of \Delta is itself shown to be preserved by base change and by variable changes.
Relation to Mathlib
Mathlib supplies the Weierstrass curve, its division polynomials preΨ, Φ, ΨSq, variable changes, and the j-invariant of an IsElliptic curve; smulNumerator, IsCyclicKernel, kernelVariableChange and jOfUnit are the project's own additions, the last being a packaging of Mathlib's j that takes the unit-discriminant witness as an explicit argument.
Where it is used
These definitions provide the carrier-level description of a \Gamma_0(N)-structure on an elliptic curve given by a Weierstrass model over an arbitrary base ring, a cyclic subgroup of order N being encoded by its kernel polynomial in x rather than by a generator. They are used throughout the tree's treatment of modular curves with \Gamma_0(N)-level structure and of the associated moduli descriptions.
References
- N. M. Katz and B. Mazur, Arithmetic Moduli of Elliptic Curves, Annals of Mathematics Studies 108, Princeton University Press, 1985, ch. 3
- J. H. Silverman, The Arithmetic of Elliptic Curves, Graduate Texts in Mathematics 106, Springer, 2nd ed., 2009
References are suggested automatically and have not been individually verified.
English text generated automatically from the Lean source; the Lean statement is authoritative.
- 77 lines
- 15 declarations
- used in the statements of 45 theorems and imported by 50 proofs
- imports 0 definition modules
Source file: Definitions/Def_ModularCurve_WeierstrassLevelCarrier.lean
Imports
- only Mathlib
Declarations
- def
WeierstrassCurve.smulNumerator - structure
WeierstrassCurve.IsCyclicKernel - field
WeierstrassCurve.IsCyclicKernel.natDegree_le - field
WeierstrassCurve.IsCyclicKernel.coeff_eq_one - field
WeierstrassCurve.IsCyclicKernel.dvd_smulNumerator - theorem
WeierstrassCurve.IsCyclicKernel.monic - theorem
WeierstrassCurve.smulNumerator_map - theorem
WeierstrassCurve.IsCyclicKernel.map - def
WeierstrassCurve.kernelVariableChange - def
WeierstrassCurve.jOfUnit - theorem
WeierstrassCurve.jOfUnit_eq_j - theorem
WeierstrassCurve.jOfUnit_map - theorem
WeierstrassCurve.jOfUnit_variableChange - theorem
WeierstrassCurve.isUnit_Δ_map - theorem
WeierstrassCurve.isUnit_Δ_variableChange
Source
import Mathlib set_option autoImplicit false noncomputable section open Polynomial namespace WeierstrassCurve variable {T : Type*} [CommRing T] (W : WeierstrassCurve T) def smulNumerator (a d : ℕ) (h : T[X]) : T[X] := ∑ i ∈ Finset.range (d + 1), C (h.coeff i) * W.Φ a ^ i * W.ΨSq a ^ (d - i) structure IsCyclicKernel (N : ℕ) (h : T[X]) : Prop where natDegree_le : h.natDegree ≤ (N - 1) / 2 coeff_eq_one : h.coeff ((N - 1) / 2) = 1 dvd_preΨ : h ∣ W.preΨ N dvd_smulNumerator : ∀ a : ℕ, 2 ≤ a → a ≤ (N - 1) / 2 → h ∣ W.smulNumerator a ((N - 1) / 2) h theorem IsCyclicKernel.monic {N : ℕ} {h : T[X]} (hh : W.IsCyclicKernel N h) : h.Monic := Polynomial.monic_of_natDegree_le_of_coeff_eq_one _ hh.natDegree_le hh.coeff_eq_one section Map variable {T' : Type*} [CommRing T'] (f : T →+* T') theorem smulNumerator_map (a d : ℕ) (h : T[X]) : (W.map f).smulNumerator a d (h.map f) = (W.smulNumerator a d h).map f := by simp only [smulNumerator, Polynomial.coeff_map, WeierstrassCurve.map_Φ, WeierstrassCurve.map_ΨSq, Polynomial.map_sum, Polynomial.map_mul, Polynomial.map_pow, Polynomial.map_C] theorem IsCyclicKernel.map {N : ℕ} {h : T[X]} (hh : W.IsCyclicKernel N h) : (W.map f).IsCyclicKernel N (h.map f) where natDegree_le := (Polynomial.natDegree_map_le).trans hh.natDegree_le coeff_eq_one := by rw [Polynomial.coeff_map, hh.coeff_eq_one, map_one] dvd_preΨ := by rw [WeierstrassCurve.map_preΨ]; exact Polynomial.map_dvd f hh.dvd_preΨ dvd_smulNumerator := fun a ha ha' => by rw [W.smulNumerator_map f]; exact Polynomial.map_dvd f (hh.dvd_smulNumerator a ha ha') end Map def kernelVariableChange (C : VariableChange T) (h : T[X]) : T[X] := Polynomial.C (((C.u⁻¹ : Tˣ) : T) ^ (2 * h.natDegree)) * h.comp (Polynomial.C ((C.u : Tˣ) : T) ^ 2 * X + Polynomial.C C.r) def jOfUnit (hΔ : IsUnit W.Δ) : T := haveI : W.IsElliptic := ⟨hΔ⟩ W.j theorem jOfUnit_eq_j [W.IsElliptic] (hΔ : IsUnit W.Δ) : W.jOfUnit hΔ = W.j := rfl theorem jOfUnit_map {T' : Type*} [CommRing T'] (f : T →+* T') (hΔ : IsUnit W.Δ) (hΔ' : IsUnit (W.map f).Δ) : (W.map f).jOfUnit hΔ' = f (W.jOfUnit hΔ) := by haveI : W.IsElliptic := ⟨hΔ⟩ exact W.map_j f theorem jOfUnit_variableChange (C : VariableChange T) (hΔ : IsUnit W.Δ) (hΔ' : IsUnit (C • W).Δ) : (C • W).jOfUnit hΔ' = W.jOfUnit hΔ := by haveI : W.IsElliptic := ⟨hΔ⟩ exact W.variableChange_j C theorem isUnit_Δ_map {T' : Type*} [CommRing T'] (f : T →+* T') (hΔ : IsUnit W.Δ) : IsUnit (W.map f).Δ := by rw [W.map_Δ]; exact hΔ.map f theorem isUnit_Δ_variableChange (C : VariableChange T) (hΔ : IsUnit W.Δ) : IsUnit (C • W).Δ := by haveI : W.IsElliptic := ⟨hΔ⟩ exact (C • W).isUnit_Δ end WeierstrassCurve end
Statements phrased using this module (45)
- Invariance of the (p,k)-kernel predicate under variable change
ModularCurve.IsGamma0PowAt.variableChange5 below · depth 28 - Generator-kernel polynomials of level p^k under variable change
WeierstrassCurve.IsCyclicGenKernel.variableChange3 below · depth 29 - Two-torsion kernel polynomials under Weierstrass changes of variables
WeierstrassCurve.IsTwoKernel.variableChange0 below · depth 29 - Module-finite algebra representing Γ₀(M') kernel tuples
ModularCurve.IsGamma0PowAt.exists_moduleFinite_represents_tuple2 below · depth 31 - A rational Γ₀(p^k)-structure on the Tate curve
ModularCurve.exists_isGamma0PowAt_tateBase_and_map_coeffMap_eq_prod_X_sub_C_toricPoint22 below · depth 31 - Tate curve: toric generators give a Γ₀(p^k)-structure
ModularCurve.isGamma0PowAt_tateBase_prod_X_sub_C_toricPoint_fst19 below · depth 32 - A cyclic generator-kernel polynomial splits over ⟨ Q⟩
WeierstrassCurve.IsCyclicGenKernel.eq_prod_X_sub_C_coordsOrZero_nsmul8 below · depth 32 - Generator-kernel polynomials have a root of exact order p^k
WeierstrassCurve.IsCyclicGenKernel.exists_addOrderOf_eq_and_isRoot13 below · depth 32 - Representability of cyclic generator-kernel polynomials by a finite B-algebra
WeierstrassCurve.IsCyclicGenKernel.exists_moduleFinite_represents0 below · depth 32 - A module-finite algebra representing monic linear divisors of Ψ₂²
WeierstrassCurve.IsTwoKernel.exists_moduleFinite_represents0 below · depth 32 - Generator independence of the half-system x-coordinate polynomial
WeierstrassCurve.prod_X_sub_C_coordsOrZero_nsmul_eq_of_zmultiples_eq8 below · depth 32 - Integral descent of Γ₀(M')-kernel tuples, componentwise
ModularCurve.exists_map_eq_and_isGamma0PowAt_tuple_of_isGamma0PowAt_map1 below · depth 33 - Model-fixing coordinate changes versus rational automorphisms preserving ⟨ g⟩
ModularCurve.natCard_variableChange_smul_eq_and_kernelVariableChangeDeg_eq_eq_natCard_rationalAut_map_zmultiples_eq22 below · depth 33 - Invariance of automorphism counts under a field isomorphism
ModularCurve.natCard_variableChange_smul_eq_and_kernelVariableChangeDeg_eq_eq_of_ringEquiv0 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 - Cyclic generator-kernel polynomial of a point of order p^k
WeierstrassCurve.isCyclicGenKernel_prod_X_sub_C_coordsOrZero_nsmul_of_addOrderOf_eq_pow8 below · depth 33 - Order-two point gives a degree-one kernel polynomial
WeierstrassCurve.isTwoKernel_X_sub_C_coordsOrZero_of_addOrderOf_eq_two1 below · depth 33 - DVR extension containing an n-th root of π
IsDiscreteValuationRing.exists_dvr_extension_pow_eq0 below · depth 34 - Descent of a Γ₀(p^k) kernel polynomial to an integrally closed domain
ModularCurve.exists_map_eq_and_isGamma0PowAt_of_isGamma0PowAt_map0 below · depth 34 - Kernel tuple fixed iff the cyclic subgroup is preserved
ModularCurve.forall_kernelVariableChangeDeg_eq_iff_image_equivOfVariableChangeEq_zmultiples_eq17 below · depth 34 - μ_M gives a cyclic M-kernel polynomial on Tate(qⁿ)
ModularCurve.isCyclicKernel_tateBase_prod_X_sub_C_toricPoint_fst15 below · depth 34 - Integral j forces Δ ∣ a³ and Δ ∣ b²
WeierstrassCurve.discr_dvd_pow_of_jOfUnit_mem_range_short0 below · depth 34 - Deformation over W₀[[X]] of a supersingular curve with monomial j
WeierstrassCurve.exists_powerSeries_lift_coeff_nthSeries_sub_mul_X_mem_span_and_jOfUnit_sub_eq_mul_X_pow_of_five_le33 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 - Serre–Tate: ⋆-isomorphic formal groups force equal j-invariants
WeierstrassCurve.jOfUnit_eq_jOfUnit_of_lawIso_of_isAdicComplete46 below · depth 34 - Uniqueness of the cyclic subgroup cut out by a Γ₀(p^k)-kernel
ModularCurve.IsGamma0PowAt.zmultiples_eq_zmultiples_of_isRoot_of_addOrderOf_eq3 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 - Two-kernel polynomials are X-x(Q) with Q of order 2
WeierstrassCurve.IsTwoKernel.exists_addOrderOf_eq_two_and_eq_X_sub_C0 below · depth 35 - Monomial j universal deformation at a supersingular point, case j=1728
WeierstrassCurve.exists_powerSeries_lift_coeff_nthSeries_sub_mul_X_mem_span_and_jOfUnit_sub_eq_mul_X_pow_of_five_le_of_j_eq_172826 below · depth 35 - Universal monomial-j deformation at a supersingular point, case j=0
WeierstrassCurve.exists_powerSeries_lift_coeff_nthSeries_sub_mul_X_mem_span_and_jOfUnit_sub_eq_mul_X_pow_of_five_le_of_j_eq_zero26 below · depth 35 - Supersingular deformation with monomial j when j(E₀)≠ 0,1728
WeierstrassCurve.exists_powerSeries_lift_coeff_nthSeries_sub_mul_X_mem_span_and_jOfUnit_sub_eq_mul_X_pow_of_five_le_of_j_ne_zero_of_j_ne30 below · depth 35 - Universal Weierstrass lift of a supersingular curve over W₀[[t]]
WeierstrassCurve.exists_powerSeries_lift_coeff_nthSeries_sub_mul_X_mem_span_and_jOfUnit_sub_eq_mul_eval37 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 - Kernel polynomial of a rational point of odd prime order
WeierstrassCurve.isCyclicKernel_kernelPolynomial_oddOrderSummingSet6 below · depth 35 - Serre–Tate: strictly isomorphic formal groups give equal j
WeierstrassCurve.jOfUnit_eq_jOfUnit_of_lawIso_of_isAdicComplete_of_prime47 below · depth 35 - Unique lifting of Γ₀(p^k) kernel polynomials along nilpotent surjections
ModularCurve.IsGamma0PowAt.existsUnique_map_eq_of_surjective_of_ker_pow_eq_bot11 below · depth 36 - Unique lifting of Γ₁(ℓ)-points along nilpotent thickenings
ModularCurve.IsGamma1Point.existsUnique_map_eq_of_surjective_of_ker_pow_eq_bot5 below · depth 36 - Cyclic subgroups of order p^k match Γ₀-kernel polynomials
ModularCurve.exists_equiv_addSubgroup_isAddCyclic_isGamma0PowAt_of_isAlgClosed22 below · depth 36 - Potential good reduction over a DVR extension for integral j
WeierstrassCurve.exists_dvr_extension_variableChange_smul_eq_map_of_jOfUnit_mem_range11 below · depth 36 - Transport of the universal-family package along a variable change
WeierstrassCurve.exists_powerSeries_lift_coeff_nthSeries_sub_mul_X_mem_span_and_jOfUnit_sub_eq_mul_X_pow_of_coeff_hasseInvariant_map_variableChange24 below · depth 36 - Characteristic three: universal deformation of a supersingular curve
WeierstrassCurve.exists_powerSeries_lift_coeff_nthSeries_sub_mul_X_mem_span_and_jOfUnit_sub_eq_mul_eval_of_eq_three24 below · depth 36 - Characteristic 2 supersingular lift with distinguished j-polynomial
WeierstrassCurve.exists_powerSeries_lift_coeff_nthSeries_sub_mul_X_mem_span_and_jOfUnit_sub_eq_mul_eval_of_eq_two2 below · depth 36 - Lifting the Γ₁-link along a nilpotent thickening
ModularCurve.IsGamma1Link.of_map_of_surjective_of_ker_pow_eq_bot18 below · depth 37 - From an explicit q-adic family to the formal-group package
WeierstrassCurve.exists_powerSeries_lift_coeff_nthSeries_sub_mul_X_mem_span_and_jOfUnit_sub_eq_mul_X_pow_of_coeff_hasseInvariant_map22 below · depth 37 - Deformation package from a distinguished j-expansion
WeierstrassCurve.exists_powerSeries_lift_coeff_nthSeries_sub_mul_X_mem_span_and_jOfUnit_sub_eq_mul_eval_of_coeff_hasseInvariant_map22 below · depth 37