Definitions/Def_WeierstrassCurve_Velu.lean
Vélu quantities and the Vélu quotient Weierstrass curve
For a Weierstrass curve W over a commutative ring R, with coefficients a_1,\dots,a_6 and the usual b-invariants, the module introduces the per-point Vélu quantities attached to a pair (x,y) \in R \times R: veluGx = 3x^2 + 2a_2x + a_4 - a_1y and veluGy = -(2y + a_1x + a_3) (the two partial derivatives of the Weierstrass equation), then veluT = 2\,g_x - a_1 g_y, veluU = g_y^2 and veluW = u + x\,t. These are taken in a single uniform convention, with no case distinction at 2-torsion. Three identities record their shape: veluT_eq gives the closed form t = 6x^2 + b_2x + b_4, which involves x only; veluU_eq_Ψ₂Sq_eval says that for (x,y) satisfying the affine Weierstrass equation, u equals Mathlib's division-polynomial quantity Ψ₂Sq evaluated at x; and veluGy_negY, veluT_negY, veluU_negY, veluW_negY say that replacing y by -y-a_1x-a_3 negates g_y and leaves t, u, w unchanged, while veluGy_eq_zero_of_negY_eq says g_y = 0 at a point fixed by this involution.
For a finite set S \subseteq R \times R one forms the sums veluTSum t = \sum_{P \in S} t_P and veluWSum w = \sum_{P \in S} w_P, and defines veluQuotient W S to be the Weierstrass curve with coefficients (a_1, a_2, a_3, a_4 - 5t, a_6 - b_2 t - 7w). Its b-invariants are computed: b_2 is unchanged, b_4 \mapsto b_4 - 10t, b_6 \mapsto b_6 - 4b_2t - 28w, b_8 \mapsto b_8 + (5b_4 - b_2^2)t - 7b_2w - 25t^2; for S = \emptyset the sums vanish and the quotient is W itself. Finally IsVeluSet W S is a one-field structure asserting only that every P \in S satisfies the affine equation of W; it imposes no subgroup, kernel or symmetry condition, and nothing here asserts the existence of an isogeny W \to veluQuotient W S. The material is thus purely the coefficient formulas, not yet the isogeny theorem.
Relation to Mathlib
Built entirely on Mathlib: the curves are Mathlib WeierstrassCurves, the point condition is Mathlib's Affine.Equation, the involution is Mathlib's Affine.negY, and Ψ₂Sq is Mathlib's division polynomial. Mathlib has no isogenies or Vélu formulas, so the Vélu quantities, the quotient curve and IsVeluSet are the project's own definitions.
Where it is used
These explicit formulas underlie the isogeny-quotient material used in the analysis of the Frey curve's mod-p representation, where the quotient of a curve by the kernel of a putative rational p-isogeny has to be exhibited concretely.
References
- J. Vélu, Isogénies entre courbes elliptiques, C. R. Acad. Sci. Paris Sér. A 273 (1971), 238–241
- L. C. Washington, Elliptic Curves: Number Theory and Cryptography, 2nd ed., Chapman & Hall/CRC, 2008
- J. H. Silverman, The Arithmetic of Elliptic Curves, 2nd ed., Graduate Texts in Mathematics 106, Springer, 2009
References are suggested automatically and have not been individually verified.
English text generated automatically from the Lean source; the Lean statement is authoritative.
- 99 lines
- 30 declarations
- used in the statements of 67 theorems and imported by 81 proofs
- imports 0 definition modules
Source file: Definitions/Def_WeierstrassCurve_Velu.lean
Imports
- only Mathlib
Declarations
- def
WeierstrassCurve.veluGx - def
WeierstrassCurve.veluGy - def
WeierstrassCurve.veluT - def
WeierstrassCurve.veluU - def
WeierstrassCurve.veluW - lemma
WeierstrassCurve.veluT_eq - lemma
WeierstrassCurve.veluU_eq_Ψ₂Sq_eval - lemma
WeierstrassCurve.veluGy_negY - lemma
WeierstrassCurve.veluT_negY - lemma
WeierstrassCurve.veluU_negY - lemma
WeierstrassCurve.veluW_negY - lemma
WeierstrassCurve.veluGy_eq_zero_of_negY_eq - def
WeierstrassCurve.veluTSum - def
WeierstrassCurve.veluWSum - lemma
WeierstrassCurve.veluTSum_empty - lemma
WeierstrassCurve.veluWSum_empty - def
WeierstrassCurve.veluQuotient - lemma
WeierstrassCurve.veluQuotient_a₁ - lemma
WeierstrassCurve.veluQuotient_a₂ - lemma
WeierstrassCurve.veluQuotient_a₃ - lemma
WeierstrassCurve.veluQuotient_a₄ - lemma
WeierstrassCurve.veluQuotient_a₆ - lemma
WeierstrassCurve.veluQuotient_empty - lemma
WeierstrassCurve.veluQuotient_b₂ - lemma
WeierstrassCurve.veluQuotient_b₄ - lemma
WeierstrassCurve.veluQuotient_b₆ - lemma
WeierstrassCurve.veluQuotient_b₈ - structure
WeierstrassCurve.IsVeluSet - field
WeierstrassCurve.IsVeluSet.equation - lemma
WeierstrassCurve.isVeluSet_empty
Source
import Mathlib.AlgebraicGeometry.EllipticCurve.DivisionPolynomial.Basic ↗ import Mathlib.AlgebraicGeometry.EllipticCurve.Affine.Formula ↗ open Polynomial namespace WeierstrassCurve variable {R : Type*} [CommRing R] (W : WeierstrassCurve R) def veluGx (x y : R) : R := 3 * x ^ 2 + 2 * W.a₂ * x + W.a₄ - W.a₁ * y def veluGy (x y : R) : R := -(2 * y + W.a₁ * x + W.a₃) def veluT (x y : R) : R := 2 * W.veluGx x y - W.a₁ * W.veluGy x y def veluU (x y : R) : R := W.veluGy x y ^ 2 def veluW (x y : R) : R := W.veluU x y + x * W.veluT x y lemma veluT_eq (x y : R) : W.veluT x y = 6 * x ^ 2 + W.b₂ * x + W.b₄ := by simp only [veluT, veluGx, veluGy, b₂, b₄]; ring lemma veluU_eq_Ψ₂Sq_eval {x y : R} (h : W.toAffine.Equation x y) : W.veluU x y = W.Ψ₂Sq.eval x := by rw [Affine.equation_iff] at h simp only [veluU, veluGy, Ψ₂Sq, b₂, b₄, b₆, eval_add, eval_mul, eval_pow, eval_C, eval_X] linear_combination 4 * h lemma veluGy_negY (x y : R) : W.veluGy x (W.toAffine.negY x y) = -W.veluGy x y := by simp only [veluGy, Affine.negY]; ring lemma veluT_negY (x y : R) : W.veluT x (W.toAffine.negY x y) = W.veluT x y := by simp only [veluT_eq] lemma veluU_negY (x y : R) : W.veluU x (W.toAffine.negY x y) = W.veluU x y := by simp only [veluU, veluGy, Affine.negY]; ring lemma veluW_negY (x y : R) : W.veluW x (W.toAffine.negY x y) = W.veluW x y := by simp only [veluW, veluU_negY, veluT_negY] lemma veluGy_eq_zero_of_negY_eq {x y : R} (h : W.toAffine.negY x y = y) : W.veluGy x y = 0 := by have : 2 * y + W.a₁ * x + W.a₃ = 0 := by have := h simp only [Affine.negY] at this linear_combination -this simp [veluGy, this] variable (S : Finset (R × R)) def veluTSum : R := ∑ P ∈ S, W.veluT P.1 P.2 def veluWSum : R := ∑ P ∈ S, W.veluW P.1 P.2 @[simp] lemma veluTSum_empty : W.veluTSum ∅ = 0 := by simp [veluTSum] @[simp] lemma veluWSum_empty : W.veluWSum ∅ = 0 := by simp [veluWSum] def veluQuotient : WeierstrassCurve R where a₁ := W.a₁ a₂ := W.a₂ a₃ := W.a₃ a₄ := W.a₄ - 5 * W.veluTSum S a₆ := W.a₆ - W.b₂ * W.veluTSum S - 7 * W.veluWSum S @[simp] lemma veluQuotient_a₁ : (W.veluQuotient S).a₁ = W.a₁ := rfl @[simp] lemma veluQuotient_a₂ : (W.veluQuotient S).a₂ = W.a₂ := rfl @[simp] lemma veluQuotient_a₃ : (W.veluQuotient S).a₃ = W.a₃ := rfl lemma veluQuotient_a₄ : (W.veluQuotient S).a₄ = W.a₄ - 5 * W.veluTSum S := rfl lemma veluQuotient_a₆ : (W.veluQuotient S).a₆ = W.a₆ - W.b₂ * W.veluTSum S - 7 * W.veluWSum S := rfl @[simp] lemma veluQuotient_empty : W.veluQuotient ∅ = W := by ext <;> simp [veluQuotient] lemma veluQuotient_b₂ : (W.veluQuotient S).b₂ = W.b₂ := by simp [b₂] lemma veluQuotient_b₄ : (W.veluQuotient S).b₄ = W.b₄ - 10 * W.veluTSum S := by simp only [b₄, veluQuotient_a₃, veluQuotient_a₁, veluQuotient_a₄]; ring lemma veluQuotient_b₆ : (W.veluQuotient S).b₆ = W.b₆ - 4 * W.b₂ * W.veluTSum S - 28 * W.veluWSum S := by simp only [b₆, b₂, veluQuotient_a₃, veluQuotient_a₆]; ring lemma veluQuotient_b₈ : (W.veluQuotient S).b₈ = W.b₈ + (5 * W.b₄ - W.b₂ ^ 2) * W.veluTSum S - 7 * W.b₂ * W.veluWSum S - 25 * W.veluTSum S ^ 2 := by simp only [b₈, b₂, b₄, veluQuotient_a₁, veluQuotient_a₂, veluQuotient_a₃, veluQuotient_a₄, veluQuotient_a₆] ring structure IsVeluSet : Prop where equation : ∀ P ∈ S, W.toAffine.Equation P.1 P.2 lemma isVeluSet_empty : W.IsVeluSet ∅ := ⟨by simp⟩ end WeierstrassCurve
Statements phrased using this module (67)
- Rational moduli place on X₀(p) at a Vélu quotient
ModularCurve.moduliPointExists_jQuotVelu_of_mult_two323 below · depth 7 - Tate cusp criterion for the Vélu p-isogeny quotient
ModularCurve.tateCuspCriterion_jQuotVelu24 below · depth 7 - Multiplicative primes q≠ p persist for the rescaled Vélu quotient
WeierstrassCurve.dvd_discriminant_not_dvd_c4_integral_veluQuotient_rescale29 below · depth 7 - Integral rescaling of the Vélu quotient by a Galois-stable subgroup
WeierstrassCurve.exists_integral_veluQuotient_rescale_of_galois_stable16 below · depth 7 - Vélu isogeny with kernel ⟨ Q⟩ over ℚ̄
WeierstrassCurve.exists_veluPointHom_oddOrderSummingSet_algebraicClosure55 below · depth 7 - Zero-component transport along the Vélu coordinate map
WeierstrassCurve.inZeroComponentAt_veluCoord_iff_of_multiplicative28 below · depth 7 - Modular polynomial vanishes at j(W) and j(W/⟨ Q⟩)
ModularCurve.modularPolynomial_eval_jInt_jQuotVelu_eq_zero101 below · depth 8 - Simple root of Φₚ at the Vélu quotient j-invariant
ModularCurve.modularPolynomial_rootMultiplicity_jQuotVelu_eq_one239 below · depth 8 - Vélu c₄ is a non-unit for formal-group p-torsion
WeierstrassCurve.valuation_c4_add_veluTSum_lt_one_of_formal_kernel9 below · depth 8 - Valuation of the Vélu u-product over ⟨ Q⟩ at a multiplicative place
WeierstrassCurve.valuation_prod_veluU_oddOrderSummingSet_of_multiplicative19 below · depth 8 - Vélu quotient has unit c₄ at a multiplicative prime
WeierstrassCurve.valuation_veluQuotient_oddOrderSummingSet_c4_of_multiplicative10 below · depth 8 - j-invariant of a Vélu quotient lies in a subfield
WeierstrassCurve.veluQuotient_j_mem_of_mem1 below · depth 8 - Vélu quotient by an odd cyclic kernel has nonzero discriminant
WeierstrassCurve.veluQuotient_oddOrderSummingSet_discriminant_ne_zero3 below · depth 8 - Vélu discriminant identity for odd-order kernels
WeierstrassCurve.veluQuotient_oddOrderSummingSet_discriminant_prod_veluU_pow0 below · depth 8 - Forward modular equation for odd Vélu quotients
ModularCurve.ModularPolynomialData.isRoot_map_j_veluQuotient_j_of_addOrderOf_eq96 below · depth 9 - Vélu's quotient commutes with base change along a ring homomorphism
WeierstrassCurve.map_veluQuotient_image0 below · depth 9 - Vélu quotient of a nodal cubic by an odd-order point
WeierstrassCurve.veluQuotient_oddOrderSummingSet_c4_c6_discriminant_of_nodal1 below · depth 9 - Vélu function-field embedding with point map of kernel ⟨ Q⟩
WeierstrassCurve.exists_veluFunctionFieldHom_pointMapOfPushforward_ker_eq_zmultiples51 below · depth 10 - Vélu quotient j-invariant is a root of Φ₂ₙ₊₁(j(W), · )
ModularCurve.ModularPolynomialData.isRoot_map_j_veluQuotient_j_of_addOrderOf_eq_of_isAlgClosed95 below · depth 11 - Equal j of Vélu quotients forces equal cyclic subgroups
WeierstrassCurve.zmultiples_eq_of_veluQuotient_j_eq_of_forall_pointEnd_eq_zsmul70 below · depth 11 - Level-2 modular equation via Vélu quotients
ModularCurve.ModularPolynomialData.fibrePoly_j_eq_prod_veluQuotient2_j65 below · depth 12 - Equal j of Vélu 2-quotients forces equal abscissa
WeierstrassCurve.eq_of_veluQuotient2_j_eq_of_not_isIntegral_j8 below · depth 12 - Odd cyclic subgroups determined by the Vélu quotient's j
WeierstrassCurve.zmultiples_eq_of_veluQuotient_j_eq_of_transcendental185 below · depth 12 - Fibre of Φ₂ over j(E) splits over the Vélu 2-quotients
ModularCurve.fibrePoly_phiTwo_j_eq_prod_veluQuotient2_j8 below · depth 13 - Equal j of Vélu quotients forces equal cyclic subgroups
WeierstrassCurve.zmultiples_eq_of_veluQuotient_j_eq_of_forall_isogenyEndDatum_exists_int70 below · depth 13 - Vélu's order-2 quotient map is additive
WeierstrassCurve.exists_addMonoidHom_coe_eq_veluPointMap24 below · depth 15 - Full-kernel Vélu quotient: pushforward point map has kernel ℤQ
WeierstrassCurve.exists_functionFieldHom_fullKernelQuotient_pointMapOfPushforward_ker_eq_zmultiples81 below · depth 15 - Additivity of the Vélu weight across a 2-isogeny fibre
WeierstrassCurve.fiberAdd_asymWeight_cleared_sixteen0 below · depth 15 - Additivity of the Vélu weight gₓ over 2-isogeny fibres
WeierstrassCurve.fiberAdd_veluGx_cleared_four0 below · depth 15 - Nonvanishing discriminant of Vélu's odd cyclic quotient
WeierstrassCurve.veluQuotient_oddOrderSummingSet_discriminant_ne_zero_of_addOrderOf_eq1 below · depth 15 - Roots of the level-2 fibre polynomial are Vélu quotient j-invariants
ModularCurve.ModularPolynomialData.exists_veluQuotient2_j_eq_of_mem_roots_fibrePoly66 below · depth 16 - Every root of Φ_ℓ(j(W),Y) is a Vélu quotient j-invariant
ModularCurve.ModularPolynomialData.exists_veluQuotient_j_eq_of_mem_roots_fibrePoly208 below · depth 16 - Modular equation of odd prime level via Vélu quotients
ModularCurve.ModularPolynomialData.fibrePoly_j_eq_prod_veluQuotient_j204 below · depth 16 - Places of X₀(M), X₀(Ms) and the two degeneracy laws
ModularCurve.exists_orbitMap_cyclicAddSubgroup_places_restrictAlong_heckeAlphaC_heckeBetaC_eq437 below · depth 16 - Deuring's first step: β equals Vélu's quotient map up to coordinate change
WeierstrassCurve.exists_variableChange_smul_eq_veluQuotient_forall_apply_eq_of_comp_self_add_smul_eq_smul88 below · depth 16 - Vélu pushforward point map has kernel ℤQ
WeierstrassCurve.exists_veluFunctionFieldHom_pointMapOfPushforward_ker_eq_zmultiples_of_oddOrder51 below · depth 16 - Vélu isogeny as a point homomorphism over a field
WeierstrassCurve.exists_veluPointHom_oddOrderSummingSet57 below · depth 16 - Vélu's isogeny for a cyclic kernel of odd order
WeierstrassCurve.exists_veluPointHom_oddOrderSummingSet_of_addOrderOf_eq_two_mul_add_one61 below · depth 16 - Cleared secant identity for the order-2 Vélu map (ordinate)
WeierstrassCurve.velu2_secant_negAddY_cleared_identity0 below · depth 16 - Cleared identity behind the Vélu 2-isogeny doubling abscissa
WeierstrassCurve.velu2_tangent_addX_cleared_identity0 below · depth 16 - Cleared ordinate identity for Vélu's order-2 map: tangent case
WeierstrassCurve.velu2_tangent_negAddY_cleared_identity0 below · depth 16 - Surjectivity of Vélu maps over an algebraically closed field
WeierstrassCurve.veluPointHom_surjective_of_isAlgClosed1 below · depth 16 - Surjectivity of Vélu's order-2 map over algebraically closed fields
WeierstrassCurve.veluPointMap2_surjective_of_isAlgClosed2 below · depth 16 - Modular equation as Vélu product at transcendental j
ModularCurve.ModularPolynomialData.fibrePoly_j_eq_prod_veluQuotient_j_of_transcendental_of_isAlgClosed196 below · depth 17 - Second degeneracy map on moduli places via Vélu's odd-order model
ModularCurve.moduliPlace_restrictAlong_qExpand_veluQuotient92 below · depth 17 - Integral model of a Vélu quotient compatible with reduction
WeierstrassCurve.exists_map_eq_veluQuotient_and_map_residue_eq_veluQuotient_reduceHom0 below · depth 17 - Vélu isogeny with kernel ⟨ Q⟩ over algebraically closed F
WeierstrassCurve.exists_veluPointHom_oddOrderSummingSet_of_isAlgClosed55 below · depth 17 - Descent of the Vélu point homomorphism along a field homomorphism
WeierstrassCurve.exists_veluPointHom_oddOrderSummingSet_of_ringHom0 below · depth 17 - Vélu's quotient map is rational and universal
WeierstrassCurve.veluPointHom_mem_rationalHomSet_and_exists_mem_rationalHomSet_comp_eq6 below · depth 17 - Modular equation at transcendental j as product over Vélu quotients
ModularCurve.ModularPolynomialData.fibrePoly_j_eq_prod_veluQuotient_j_of_transcendental195 below · depth 18 - Enumeration of the ℓ+1 cyclic kernels with nonsingular Vélu quotients
WeierstrassCurve.exists_enum_cyclicKernels_veluQuotient_discriminant_ne_zero11 below · depth 18 - Three 2-torsion points with nonsingular Vélu quotients
WeierstrassCurve.exists_enum_twoTorsion_veluQuotient2_discriminant_ne_zero6 below · depth 18 - Vélu's maps for an odd-order point in reduced rational form
WeierstrassCurve.exists_veluX_eq_div_and_veluY_eq_div_of_addOrderOf_eq0 below · depth 18 - Vélu's x-only quotient equals the summing-set quotient
ModularCurve.LevelP.quotientByLine_eq_veluQuotient_oddOrderSummingSet2 below · depth 19 - Vélu quotient of the Tate curve over a non-toric slot set
ModularCurve.veluQuotient_nonToricSlotSet0 below · depth 19 - Vélu quotient of the Tate curve by μ_ℓ
ModularCurve.exists_variableChange_veluQuotient_tateLaurent_eq_and_vcXInv_veluX_toricPoint_eq_of_isPrimitiveRoot53 below · depth 20 - Deuring lifting in residue characteristic two, three-torsion form
WeierstrassCurve.exists_valuationSubring_lift_variableChange_veluQuotient_reduceHom_eq_of_three_smul_mem_zmultiples_of_two_eq_zero207 below · depth 21 - Deuring lift compatible with Vélu quotient on two-torsion test points
WeierstrassCurve.exists_valuationSubring_lift_variableChange_veluQuotient_reduceHom_eq_of_two_smul_mem_zmultiples203 below · depth 21 - Vélu quotient of the Tate curve by toric ℓ-torsion
ModularCurve.exists_variableChange_veluQuotient_toricPoint_tateLaurent_map_qExpand_eq_map_qExpand_mul39 below · depth 22 - Vélu's μ_ℓ-isogeny sends toric point c to c^ℓ
ModularCurve.vcXInv_veluX_and_vcYInv_veluY_toricPoint_tateLaurent_map_qExpand_eq_toricPoint_pow10 below · depth 22 - Deuring lift with level-three marking and Vélu quotient
WeierstrassCurve.exists_valuationSubring_lift_variableChange_veluQuotient_apply_threeTorsion_eq_of_smul_eq_veluQuotient191 below · depth 22 - Deuring lift marked by a cyclic subgroup and two 2-torsion points
WeierstrassCurve.exists_valuationSubring_lift_variableChange_veluQuotient_apply_twoTorsion_eq_of_smul_eq_veluQuotient188 below · depth 22 - Vélu quotient of the Tate curve by its toric p-slots
ModularCurve.exists_variableChange_veluQuotient_toricSlotSet0 below · depth 23 - Deuring's marked deformation over a formal disc, level three
WeierstrassCurve.exists_powerSeries_deformation_kohelQuotient_threeTorsion_levelThreeModulus_of_smul_eq_veluQuotient187 below · depth 23 - Marked lift with Legendre cross vanishing only at T=0
WeierstrassCurve.exists_powerSeries_deformation_kohelQuotient_twoTorsion_legendreCross_of_smul_eq_veluQuotient185 below · depth 23 - Kohel's kernel-polynomial quotient equals Vélu's quotient
WeierstrassCurve.kohelQuotient_kernelPolynomial_eq_veluQuotient0 below · depth 23 - Vélu quotient of odd non-square order has different j
WeierstrassCurve.apply_j_ne_apply_j_of_j_map_eq_veluQuotient_j_of_ne_C168 below · depth 25