Definitions/Def_WeierstrassCurve_FullKernelQuotient.lean
Vélu quotient by the full kernel of a point
Let W be a Weierstrass curve over a field F and Q a point of the associated affine curve. For N : \mathbb{N}, WeierstrassCurve.fullKernelQuotient W Q N is the Weierstrass curve obtained from W by veluQuotientOfSums applied to the two sums taken over the finite set oddOrderSummingSet W Q (N - 1) — the set of coordinate pairs (x,y) of the multiples Q, 2Q, \dots, (N-1)Q, each pair occurring once, with the point at infinity recorded as (0,0): the first sum is \sum_P g_x(x_P,y_P) and the second is \sum_P\bigl(x_P g_x(x_P,y_P) - y_P g_y(x_P,y_P)\bigr), where g_x(x,y) = 3x^2 + 2a_2x + a_4 - a_1y and g_y(x,y) = -(2y + a_1x + a_3). Thus a_1,a_2,a_3 are unchanged while a_4 and a_6 are decreased by 5t and by b_2 t + 7w for those two sums t,w; the construction is a curve in a fixed Weierstrass presentation, not an isogeny.
The arithmetic content is the identification of this one-sided sum with Vélu's symmetric one. Two polynomial identities show that g_x(x,y) + g_x(x, -y-a_1x-a_3) equals t_P = 2g_x - a_1g_y and that the corresponding pair of asymmetric weights sums to w_P = g_y^2 + x\,t_P. When Q has exact additive order 2n+1, the set of pairs for Q,\dots,2nQ is the disjoint union of the pairs for Q,\dots,nQ and their images under (x,y) \mapsto (x, -y-a_1x-a_3), whence the two sums equal veluTSum and veluWSum of the half-system, and \mathrm{fullKernelQuotient}(W,Q,2n+1) = \mathrm{veluQuotient}(W, S_n(Q)). Supplementary cases: for N = 1 the sums are empty and the value is W; for N = 2 at a nonsingular point (x,y) with g_y(x,y) = 0 the value is the order-two quotient veluQuotient2 W x y.
Relation to Mathlib
Mathlib supplies WeierstrassCurve and its affine points; the Vélu data (veluGx, veluGy, veluT, veluW, veluTSum, veluWSum, veluQuotient, veluQuotient2), the coordinate map coordsOrZero and the summing sets are the project's own definitions.
Where it is used
These constructions give an explicit Weierstrass model for the quotient of a curve by the cyclic subgroup generated by a torsion point, indexed either by a half-system of multiples or by the whole punctured kernel, and so provide the explicit isogenous curves used in the elliptic-curve part of the argument.
References
- J. Vélu, Isogénies entre courbes elliptiques, C. R. Acad. Sci. Paris Sér. A-B 273 (1971), 238–241
- J. H. Silverman, The Arithmetic of Elliptic Curves, 2nd edition, 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.
- 143 lines
- 14 declarations
- used in the statements of 31 theorems and imported by 44 proofs
- imports 3 definition modules
Source file: Definitions/Def_WeierstrassCurve_FullKernelQuotient.lean
Imports
Imported by
Declarations
- def
WeierstrassCurve.fullKernelQuotient - theorem
WeierstrassCurve.veluGx_add_veluGx_negY - theorem
WeierstrassCurve.asymWeight_add_asymWeight_negY - theorem
WeierstrassCurve.coordsOrZero_neg - theorem
WeierstrassCurve.eq_of_coordsOrZero_eq - theorem
WeierstrassCurve.negPair_injective - theorem
WeierstrassCurve.oddOrderSummingSet_two_mul - theorem
WeierstrassCurve.disjoint_oddOrderSummingSet_image_neg - theorem
WeierstrassCurve.sum_oddOrderSummingSet_two_mul - theorem
WeierstrassCurve.sum_veluGx_oddOrderSummingSet_two_mul - theorem
WeierstrassCurve.sum_asymWeight_oddOrderSummingSet_two_mul - theorem
WeierstrassCurve.fullKernelQuotient_eq_veluQuotient_oddOrderSummingSet - theorem
WeierstrassCurve.fullKernelQuotient_one - theorem
WeierstrassCurve.fullKernelQuotient_two
Source
import Definitions.Def_WeierstrassCurve_OddOrderSummingSet import Definitions.Def_WeierstrassCurve_VeluQuotientOfSums import Definitions.Def_WeierstrassCurve_VeluOrderTwo set_option autoImplicit false namespace WeierstrassCurve def fullKernelQuotient {F : Type*} [Field F] [DecidableEq F] (W : WeierstrassCurve F) (Q : W.toAffine.Point) (N : ℕ) : WeierstrassCurve F := W.veluQuotientOfSums (∑ P ∈ W.oddOrderSummingSet Q (N - 1), W.veluGx P.1 P.2) (∑ P ∈ W.oddOrderSummingSet Q (N - 1), (P.1 * W.veluGx P.1 P.2 - P.2 * W.veluGy P.1 P.2)) theorem veluGx_add_veluGx_negY {R : Type*} [CommRing R] (W : WeierstrassCurve R) (x y : R) : W.veluGx x y + W.veluGx x (W.toAffine.negY x y) = W.veluT x y := by simp only [veluGx, veluGy, veluT, Affine.negY] ring theorem asymWeight_add_asymWeight_negY {R : Type*} [CommRing R] (W : WeierstrassCurve R) (x y : R) : (x * W.veluGx x y - y * W.veluGy x y) + (x * W.veluGx x (W.toAffine.negY x y) - W.toAffine.negY x y * W.veluGy x (W.toAffine.negY x y)) = W.veluW x y := by simp only [veluGx, veluGy, veluT, veluW, veluU, Affine.negY] ring theorem coordsOrZero_neg {R : Type*} [CommRing R] {W : WeierstrassCurve R} (P : W.toAffine.Point) (hP : P ≠ 0) : (-P).coordsOrZero = (P.coordsOrZero.1, W.toAffine.negY P.coordsOrZero.1 P.coordsOrZero.2) := by rcases P with _ | ⟨x, y, h⟩ · exact absurd rfl hP · rfl theorem eq_of_coordsOrZero_eq {R : Type*} [CommRing R] {W : WeierstrassCurve R} {P P' : W.toAffine.Point} (hP : P ≠ 0) (hP' : P' ≠ 0) (h : P.coordsOrZero = P'.coordsOrZero) : P = P' := by rcases P with _ | ⟨x, y, hx⟩ · exact absurd rfl hP rcases P' with _ | ⟨x', y', hx'⟩ · exact absurd rfl hP' simp only [Affine.Point.coordsOrZero_some, Prod.mk.injEq] at h obtain ⟨rfl, rfl⟩ := h rfl theorem negPair_injective {R : Type*} [CommRing R] (W : WeierstrassCurve R) : Function.Injective (fun P : R × R => (P.1, W.toAffine.negY P.1 P.2)) := by intro P P' h simp only [Prod.mk.injEq] at h obtain ⟨h1, h2⟩ := h have h3 := congrArg (W.toAffine.negY P.1) h2 rw [Affine.negY_negY, h1, Affine.negY_negY] at h3 exact Prod.ext h1 h3 theorem oddOrderSummingSet_two_mul {F : Type*} [Field F] [DecidableEq F] (W : WeierstrassCurve F) (Q : W.toAffine.Point) (n : ℕ) (hQ : addOrderOf Q = 2 * n + 1) : W.oddOrderSummingSet Q (2 * n) = W.oddOrderSummingSet Q n ∪ (W.oddOrderSummingSet Q n).image (fun P => (P.1, W.toAffine.negY P.1 P.2)) := by have hrefl : ∀ k, 1 ≤ k → k ≤ 2 * n → (2 * n + 1 - k) • Q = -(k • Q) := fun k hk1 hk2 => by refine eq_neg_of_add_eq_zero_left ?_ rw [← add_nsmul, Nat.sub_add_cancel (by omega), ← hQ, addOrderOf_nsmul_eq_zero] have hne : ∀ k, 1 ≤ k → k ≤ 2 * n → k • Q ≠ 0 := fun k hk1 hk2 => nsmul_ne_zero_of_lt_addOrderOf (by omega) (by rw [hQ]; omega) ext P simp only [Finset.mem_union, Finset.mem_image, mem_oddOrderSummingSet] constructor · rintro ⟨k, hk1, hk2, rfl⟩ by_cases hkn : k ≤ n · exact Or.inl ⟨k, hk1, hkn, rfl⟩ · refine Or.inr ⟨((2 * n + 1 - k) • Q).coordsOrZero, ⟨2 * n + 1 - k, by omega, by omega, rfl⟩, ?_⟩ rw [hrefl k hk1 hk2, coordsOrZero_neg _ (hne k hk1 hk2), Affine.negY_negY] · rintro (⟨k, hk1, hk2, rfl⟩ | ⟨P', ⟨k, hk1, hk2, rfl⟩, rfl⟩) · exact ⟨k, hk1, by omega, rfl⟩ · refine ⟨2 * n + 1 - k, by omega, by omega, ?_⟩ rw [hrefl k hk1 (by omega), coordsOrZero_neg _ (hne k hk1 (by omega))] theorem disjoint_oddOrderSummingSet_image_neg {F : Type*} [Field F] [DecidableEq F] (W : WeierstrassCurve F) (Q : W.toAffine.Point) (n : ℕ) (hQ : addOrderOf Q = 2 * n + 1) : Disjoint (W.oddOrderSummingSet Q n) ((W.oddOrderSummingSet Q n).image (fun P => (P.1, W.toAffine.negY P.1 P.2))) := by have hne : ∀ k, 1 ≤ k → k ≤ n → k • Q ≠ 0 := fun k hk1 hk2 => nsmul_ne_zero_of_lt_addOrderOf (by omega) (by rw [hQ]; omega) rw [Finset.disjoint_left] rintro P hP hP' rw [mem_oddOrderSummingSet] at hP simp only [Finset.mem_image, mem_oddOrderSummingSet] at hP' obtain ⟨k, hk1, hk2, rfl⟩ := hP obtain ⟨P', ⟨l, hl1, hl2, rfl⟩, h⟩ := hP' rw [← coordsOrZero_neg _ (hne l hl1 hl2)] at h have hkl : -(l • Q) = k • Q := eq_of_coordsOrZero_eq (neg_ne_zero.mpr (hne l hl1 hl2)) (hne k hk1 hk2) h have h0 : (k + l) • Q = 0 := by rw [add_nsmul, ← hkl, neg_add_cancel] have hdvd : addOrderOf Q ∣ k + l := addOrderOf_dvd_iff_nsmul_eq_zero.mpr h0 rw [hQ] at hdvd exact absurd (Nat.le_of_dvd (by omega) hdvd) (by omega) theorem sum_oddOrderSummingSet_two_mul {F : Type*} [Field F] [DecidableEq F] (W : WeierstrassCurve F) (Q : W.toAffine.Point) (n : ℕ) (hQ : addOrderOf Q = 2 * n + 1) (f : F × F → F) : ∑ P ∈ W.oddOrderSummingSet Q (2 * n), f P = ∑ P ∈ W.oddOrderSummingSet Q n, (f P + f (P.1, W.toAffine.negY P.1 P.2)) := by rw [oddOrderSummingSet_two_mul W Q n hQ, Finset.sum_union (disjoint_oddOrderSummingSet_image_neg W Q n hQ), Finset.sum_image (fun P _ P' _ h => negPair_injective W h), Finset.sum_add_distrib] theorem sum_veluGx_oddOrderSummingSet_two_mul {F : Type*} [Field F] [DecidableEq F] (W : WeierstrassCurve F) (Q : W.toAffine.Point) (n : ℕ) (hQ : addOrderOf Q = 2 * n + 1) : ∑ P ∈ W.oddOrderSummingSet Q (2 * n), W.veluGx P.1 P.2 = W.veluTSum (W.oddOrderSummingSet Q n) := by rw [sum_oddOrderSummingSet_two_mul W Q n hQ (fun P => W.veluGx P.1 P.2), veluTSum] exact Finset.sum_congr rfl fun P _ => veluGx_add_veluGx_negY W P.1 P.2 theorem sum_asymWeight_oddOrderSummingSet_two_mul {F : Type*} [Field F] [DecidableEq F] (W : WeierstrassCurve F) (Q : W.toAffine.Point) (n : ℕ) (hQ : addOrderOf Q = 2 * n + 1) : ∑ P ∈ W.oddOrderSummingSet Q (2 * n), (P.1 * W.veluGx P.1 P.2 - P.2 * W.veluGy P.1 P.2) = W.veluWSum (W.oddOrderSummingSet Q n) := by rw [sum_oddOrderSummingSet_two_mul W Q n hQ (fun P => P.1 * W.veluGx P.1 P.2 - P.2 * W.veluGy P.1 P.2), veluWSum] exact Finset.sum_congr rfl fun P _ => asymWeight_add_asymWeight_negY W P.1 P.2 theorem fullKernelQuotient_eq_veluQuotient_oddOrderSummingSet {F : Type*} [Field F] [DecidableEq F] (W : WeierstrassCurve F) (Q : W.toAffine.Point) (n : ℕ) (hQ : addOrderOf Q = 2 * n + 1) : W.fullKernelQuotient Q (2 * n + 1) = W.veluQuotient (W.oddOrderSummingSet Q n) := by rw [fullKernelQuotient, Nat.add_sub_cancel, sum_veluGx_oddOrderSummingSet_two_mul W Q n hQ, sum_asymWeight_oddOrderSummingSet_two_mul W Q n hQ] exact (W.veluQuotient_eq_veluQuotientOfSums _).symm theorem fullKernelQuotient_one {F : Type*} [Field F] [DecidableEq F] (W : WeierstrassCurve F) (Q : W.toAffine.Point) : W.fullKernelQuotient Q 1 = W := by have h : W.oddOrderSummingSet Q (1 - 1) = ∅ := by simp [oddOrderSummingSet] rw [fullKernelQuotient, h, Finset.sum_empty, Finset.sum_empty] ext <;> simp [veluQuotientOfSums] theorem fullKernelQuotient_two {F : Type*} [Field F] [DecidableEq F] (W : WeierstrassCurve F) {x y : F} (h : W.toAffine.Nonsingular x y) (hgy : W.veluGy x y = 0) : W.fullKernelQuotient (.some x y h) 2 = W.veluQuotient2 x y := by have hS : W.oddOrderSummingSet (.some x y h) (2 - 1) = {(x, y)} := by simp [oddOrderSummingSet] rw [fullKernelQuotient, hS] simp only [Finset.sum_singleton] rw [hgy, mul_zero, sub_zero] rfl end WeierstrassCurve
Statements phrased using this module (31)
- Transfer of the modular-fibre factorisation to arbitrary algebraically closed fields
ModularCurve.ModularPolynomialData.fibrePoly_j_eq_prod_fullKernelQuotient_j_of_transcendental10 below · depth 15 - Modular polynomial at a transcendental j splits over Vélu quotients
ModularCurve.ModularPolynomialData.fibrePoly_j_eq_prod_fullKernelQuotient_j_of_transcendental_of_charZero222 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 - Full-kernel quotient equals the half-system Vélu quotient at odd order
WeierstrassCurve.fullKernelQuotient_eq_veluQuotient_of_odd0 below · depth 15 - Places of X₀(M), X₀(Ms) and the two degeneracy laws
ModularCurve.exists_orbitMap_cyclicAddSubgroup_places_restrictAlong_heckeAlphaC_heckeBetaC_eq437 below · depth 16 - Vélu's isogeny with kernel generated by a point of order N
WeierstrassCurve.exists_fullKernelHom76 below · depth 16 - Even-order Vélu quotient factors through an order-two step
WeierstrassCurve.fullKernelHom_eq_veluPointMap2_comp_of_stage_last79 below · depth 16 - Nonvanishing discriminant of the full-kernel Vélu quotient
WeierstrassCurve.fullKernelQuotient_discriminant_ne_zero12 below · depth 16 - Orbit map on X₀(N): j_N-values and dual ramification
ModularCurve.exists_orbitMap_cyclicAddSubgroup_places_evalAt_jqNModC_eq_and_ord_sub_eq_natCard397 below · depth 17 - Second degeneracy map on moduli places: (E,C)↦(E/⟨ Q⟩,φ C)
ModularCurve.moduliPlace_restrictAlong_qExpand_fullKernelQuotient91 below · depth 17 - Vélu's double full-kernel quotient is multiplication by N
WeierstrassCurve.exists_variableChange_eq_fullKernelQuotient_fullKernelQuotient_comp_eq_smul122 below · depth 17 - Surjectivity of Vélu's full-kernel map over algebraically closed fields
WeierstrassCurve.fullKernelHom_surjective_of_isAlgClosed77 below · depth 17 - Vélu quotient by an even cyclic kernel factors through W/{0,T}
WeierstrassCurve.fullKernelQuotient_eq_fullKernelQuotient_veluQuotient25 below · depth 17 - j=0 is preserved by Vélu quotients in characteristic 2 or 3
WeierstrassCurve.fullKernelQuotient_j_eq_zero_of_j_eq_zero_of_ringChar0 below · depth 17 - Equinumerous variable-change stabilisers along a Vélu cyclic isogeny
WeierstrassCurve.natCard_variableChange_stabilizer_eq_of_fullKernelQuotient124 below · depth 17 - Atkin–Lehner toggle at q and Vélu quotients of moduli places
ModularCurve.congrEquiv_moduliPlace_eq_moduliPlace_fullKernelQuotient_of_atkinLehner136 below · depth 18 - Kronecker dictionary: Φ(H) carries j(q^N) to j(E/H)
ModularCurve.exists_equiv_algHom_modularFunctionFieldFullC_apply_jqNModC_eq_fullKernelQuotient_j286 below · depth 18 - Equivariant torsion reduction: j of the Vélu quotient and ramification
ModularCurve.exists_equivariant_torsion_reduction_ofJ_evalAt_fullKernelQuotient_j_ord_mul_natCard389 below · depth 18 - Iterated Vélu j equals full-kernel quotient j
WeierstrassCurve.cyclicQuotientJ_zmultiples_eq_fullKernelQuotient_j84 below · depth 18 - Vélu's full-kernel quotient commutes with reduction
WeierstrassCurve.exists_map_eq_fullKernelQuotient_map_residue_eq_fullKernelQuotient_reduceHom0 below · depth 18 - Tower law for Vélu full-kernel quotient Weierstrass models
WeierstrassCurve.fullKernelQuotient_fullKernelQuotient_eq_of_fullKernelHom80 below · depth 18 - Covariance of Vélu's full-kernel quotient under coordinate changes
WeierstrassCurve.fullKernelQuotient_variableChange_vcInvFun1 below · depth 18 - Vélu's isogeny commutes with a change of Weierstrass coordinates
WeierstrassCurve.heq_fullKernelHom_vcInvFun2 below · depth 18 - Reduction intertwines Vélu quotient maps on points
WeierstrassCurve.heq_reduceHom_fullKernelHom_of_map_eq_fullKernelQuotient0 below · depth 18 - Ramification of X₀(N) over the j-line, intrinsic form
ModularCurve.ord_mul_natCard_stabilizer_zmultiples_reduceHom_eq_ramificationIndexAlong_mul_natCard_stabilizer320 below · depth 19 - Ramification over the j(q^N)-line for a good model
ModularCurve.ord_sub_mul_natCard_stabilizer_zmultiples_reduceHom_eq_ramificationIndexAlong_mul_natCard_stabilizer_fullKernelQuotient386 below · depth 19 - Enumerating the ψ(N) cyclic N-subgroups with nonsingular Vélu quotients
WeierstrassCurve.exists_enum_cyclic_fullKernelQuotient_discriminant_ne_zero23 below · depth 19 - Full-kernel Vélu quotient commutes with base change
WeierstrassCurve.map_fullKernelQuotient_mapPoint0 below · depth 19 - Igusa ramification formula via equivariant torsion reduction
ModularCurve.ord_mul_natCard_stabilizer_eq_ramificationIndexAlong_mul_of_equivariant_torsion_reduction302 below · depth 20 - Biduality of Vélu quotients: j(W''/⟨ Q'⟩)=j(W)
WeierstrassCurve.j_fullKernelQuotient_fullKernelQuotient_eq_j124 below · depth 20 - Stabiliser orders agree for a cyclic subgroup and its Vélu dual
WeierstrassCurve.natCard_stabilizer_zmultiples_eq_natCard_stabilizer_zmultiples_fullKernelQuotient127 below · depth 20