FLT/Mathlib/AlgebraicGeometry/EllipticCurve/Aut.lean
Explanation legend Lean4 Domain Explanation Language (L4DEL)
L4DEL explanations are a separate layer. They do not change the Lean source. Intuition is explanatory prose; numbered items are a reading path; sources link the wording back to evidence.
- L4DEL
- Lean4 Domain Explanation Language
Credit: The upstream authors and contributors retain credit for the project and mathematics. lean4-explainer only renders their pinned source and adds the separately disclosed explanation layer.
Project sources: Pinned project documentation, Pinned FLT blueprint introduction
8 declarations, 0 contain sorry, 0 declared as axioms
Automorphisms of an elliptic curve with j ∉ {0, 1728}
Proposed new Mathlib file Mathlib.AlgebraicGeometry.EllipticCurve.Aut.
Let E be an elliptic curve over a field K. Over a field, isomorphisms of Weierstrass curves
are exactly the admissible changes of variables WeierstrassCurve.VariableChange K, acting via
•; the automorphisms of E are therefore the C : VariableChange K with C • E = E. This file
proves the classical fact (Silverman, The Arithmetic of Elliptic Curves, III.10) that if
j(E) ∉ {0, 1728} then the only automorphisms of E are ±1, uniformly in the characteristic.
Main definitions and statements
WeierstrassCurve.eq_one_or_eq_negVariableChange_of_smul_eq: ifj(E) ∉ {0, 1728}then anyC : VariableChange KwithC • E = Eequals1ornegVariableChange E.WeierstrassCurve.autGroup E: the automorphism group ofE, as the stabiliser ofEunder the action ofVariableChange K.WeierstrassCurve.autGroupMulEquiv: forj(E) ∉ {0, 1728}, the (computable) isomorphismautGroup E ≃* Multiplicative (ZMod 2).
Implementation notes
The proof is broken into pieces. j ∉ {0, 1728} is equivalent to c₄ ≠ 0 and c₆ ≠ 0
(j_eq_zero_iff and c₆_eq_zero_iff_j_eq_1728). From the transformation laws of c₄ and c₆
one gets u² = 1 (u_eq_one_or_eq_neg_one), which reduces everything to the case u = 1. There
r = 0 follows from the transformation laws of b₄, b₆, b₈ (r_eq_zero_of_u_eq_one), and
then s, t are read off from those of a₁, a₂, a₃, a₄
(eq_one_or_eq_negVariableChange_of_u_eq_one, where the negVariableChange value can occur only
in characteristic 2).
Imports (2)
Imported by 2 files
- lemma
WeierstrassCurve.r_eq_zero_of_u_eq_oneAn automorphismCofEwithC.u = 1has nox-translation:C.r = 0line 59 sourceSource documentation
An automorphism
CofEwithC.u = 1has nox-translation:C.r = 0. This follows from the transformation laws ofb₄,b₆,b₈together withc₆ ≠ 0.standard axioms: Classical.choice, Quot.sound, propext what this means
Statement uses:
Field,WeierstrassCurve,Ne,WeierstrassCurve.c₆,OfNat.ofNat,WeierstrassCurve.VariableChange,Eq,Units,WeierstrassCurve.VariableChange.u,HSMul.hSMul,WeierstrassCurve.VariableChange.rProof uses:
WeierstrassCurve.b₄,congrArg,WeierstrassCurve.b₆,WeierstrassCurve.b₈,Eq.mp,HSub.hSub,HAdd.hAdd,Neg.neg,HPow.hPow,Nat,WeierstrassCurve.b₂,HMul.hMul,WeierstrassCurve.c₆.eq_1,congrFun',Eq.trans,Inv.inv,WeierstrassCurve.variableChange_b₄,inv_one,one_pow,one_muland 2 more69 instances, coercions and auxiliary constants left out.
Tactic trace: 6 steps
Open to load the checked before-and-after goal states.
lemma r_eq_zero_of_u_eq_one (hc6 : E.c₆ ≠ 0) {C : VariableChange K} (hu : C.u = 1) (hCE : C • E = E) : C.r = 0 := by … - lemma
WeierstrassCurve.eq_one_or_eq_negVariableChange_of_u_eq_oneAn automorphismCofEwithC.u = 1is either the identity ornegVariableChange Eline 73 sourceSource documentation
An automorphism
CofEwithC.u = 1is either the identity ornegVariableChange E. Afterr_eq_zero_of_u_eq_one, thea₁anda₃laws give2s = 2t = 0; in characteristic≠ 2this forcess = t = 0, and in characteristic2thea₂,a₄laws pin(s, t)down to either(0, 0)or(-a₁, -a₃).standard axioms: Classical.choice, Quot.sound, propext what this means
Statement uses:
Field,WeierstrassCurve,Ne,WeierstrassCurve.c₄,OfNat.ofNat,WeierstrassCurve.c₆,WeierstrassCurve.VariableChange,Eq,Units,WeierstrassCurve.VariableChange.u,HSMul.hSMul,Or, WeierstrassCurve.negVariableChangeProof uses:
WeierstrassCurve.VariableChange.r, WeierstrassCurve.r_eq_zero_of_u_eq_one,WeierstrassCurve.a₁,And,WeierstrassCurve.a₂,WeierstrassCurve.a₃,WeierstrassCurve.a₄,WeierstrassCurve.a₆,Iff.mp,WeierstrassCurve.ext_iff,Nat,eq_or_ne,Eq.mp,HSub.hSub,HPow.hPow,HAdd.hAdd,HMul.hMul,WeierstrassCurve.b₄,congrArg,WeierstrassCurve.b₄.eq_1and 84 more110 instances, coercions and auxiliary constants left out.
Tactic trace: 31 steps
Open to load the checked before-and-after goal states.
lemma eq_one_or_eq_negVariableChange_of_u_eq_one (hc4 : E.c₄ ≠ 0) (hc6 : E.c₆ ≠ 0) {C : VariableChange K} (hu : C.u = 1) (hCE : C • E = E) : C = 1 ∨ C = E.negVariableChange := by … - lemma
WeierstrassCurve.u_eq_one_or_eq_neg_oneTheu-coefficient of an automorphismCofE(withc₄, c₆ ≠ 0) satisfiesu² = 1: thec₄andc₆laws giveu⁴ = u⁶ = 1line 100 sourceSource documentation
The
u-coefficient of an automorphismCofE(withc₄, c₆ ≠ 0) satisfiesu² = 1: thec₄andc₆laws giveu⁴ = u⁶ = 1.standard axioms: Classical.choice, Quot.sound, propext what this means
Statement uses:
Field,WeierstrassCurve,Ne,WeierstrassCurve.c₄,OfNat.ofNat,WeierstrassCurve.c₆,WeierstrassCurve.VariableChange,Eq,HSMul.hSMul,Or,Units,WeierstrassCurve.VariableChange.u,Neg.negProof uses:
HPow.hPow,Nat,congrArg,Eq.mp,Inv.inv,propext,inv_eq_one,inv_pow,HMul.hMul,mul_eq_right₀,Units.val_inv_eq_inv_val,WeierstrassCurve.variableChange_c₄,WeierstrassCurve.variableChange_c₆,Mathlib.Tactic.LinearCombination.eq_of_eq,HAdd.hAdd,Mathlib.Tactic.LinearCombination.add_eq_eq,Eq.symm,Mathlib.Tactic.LinearCombination.mul_const_eq,Mathlib.Tactic.LinearCombination.eq_rearrange,Mathlib.Tactic.Ring.of_eqand 60 more104 instances, coercions and auxiliary constants left out.
Tactic trace: 13 steps
Open to load the checked before-and-after goal states.
lemma u_eq_one_or_eq_neg_one (hc4 : E.c₄ ≠ 0) (hc6 : E.c₆ ≠ 0) {C : VariableChange K} (hCE : C • E = E) : C.u = 1 ∨ C.u = -1 := by … - theorem
WeierstrassCurve.eq_one_or_eq_negVariableChange_of_smul_eq_of_c₄_ne_zeroIfc₄ ≠ 0andc₆ ≠ 0then the only admissible changes of variables fixingEare1andnegVariableChange Eline 116 sourceSource documentation
If
c₄ ≠ 0andc₆ ≠ 0then the only admissible changes of variables fixingEare1andnegVariableChange E. This is the form ofAut(E) = {±1}phrased viac₄, c₆(equivalent toj ∉ {0, 1728}for an elliptic curve, seeeq_one_or_eq_negVariableChange_of_smul_eq).standard axioms: Classical.choice, Quot.sound, propext what this means
Statement uses:
Field,WeierstrassCurve,Ne,WeierstrassCurve.c₄,OfNat.ofNat,WeierstrassCurve.c₆,WeierstrassCurve.VariableChange,Eq,HSMul.hSMul,Or, WeierstrassCurve.negVariableChangeProof uses:
Units,WeierstrassCurve.VariableChange.u,Neg.neg, WeierstrassCurve.u_eq_one_or_eq_neg_one, WeierstrassCurve.eq_one_or_eq_negVariableChange_of_u_eq_one,HMul.hMul,Eq.mpr,id,congrArg,rfl, WeierstrassCurve.negVariableChange_u,neg_one_mul,neg_neg,Eq.refl,SemigroupAction.mul_smul, WeierstrassCurve.negVariableChange_smul_self,Eq.symm,mul_assoc, WeierstrassCurve.negVariableChange_mul_self,one_muland 3 more50 instances, coercions and auxiliary constants left out.
Tactic trace: 17 steps
Open to load the checked before-and-after goal states.
theorem eq_one_or_eq_negVariableChange_of_smul_eq_of_c₄_ne_zero (hc4 : E.c₄ ≠ 0) (hc6 : E.c₆ ≠ 0) {C : VariableChange K} (hC : C • E = E) : C = 1 ∨ C = E.negVariableChange := by … - theorem
WeierstrassCurve.eq_one_or_eq_negVariableChange_of_smul_eqIfj(E) ∉ {0, 1728}then the only admissible changes of variables fixingEare1andnegVariableChange E; that is,Aut(E) = {±1}line 134 sourceSource documentation
If
j(E) ∉ {0, 1728}then the only admissible changes of variables fixingEare1andnegVariableChange E; that is,Aut(E) = {±1}.standard axioms: Classical.choice, Quot.sound, propext what this means
Statement uses:
Field,WeierstrassCurve,WeierstrassCurve.IsElliptic,Ne,WeierstrassCurve.j,OfNat.ofNat,Nat,WeierstrassCurve.VariableChange,Eq,HSMul.hSMul,Or, WeierstrassCurve.negVariableChangeProof uses: WeierstrassCurve.eq_one_or_eq_negVariableChange_of_smul_eq_of_c₄_ne_zero,
Iff.mp,Not,WeierstrassCurve.c₄,Iff.not,WeierstrassCurve.j_eq_zero_iff,Iff.mpr,WeierstrassCurve.c₆, WeierstrassCurve.c₆_eq_zero_iff_j_eq_172843 instances, coercions and auxiliary constants left out.
theorem eq_one_or_eq_negVariableChange_of_smul_eq [E.IsElliptic] (hj₀ : E.j ≠ 0) (hj₁₇₂₈ : E.j ≠ 1728) {C : VariableChange K} (hC : C • E = E) : C = 1 ∨ C = E.negVariableChange := … - def
WeierstrassCurve.autGroupThe automorphism group of a Weierstrass curveEover a field: the admissible changes of variables fixingE, i.e. the stabiliser ofEunder the action ofVariableChange Kline 145 sourceSource documentation
The automorphism group of a Weierstrass curve
Eover a field: the admissible changes of variables fixingE, i.e. the stabiliser ofEunder the action ofVariableChange K.standard axioms: Quot.sound, propext what this means
Statement uses:
Field,WeierstrassCurve,Subgroup,WeierstrassCurve.VariableChangeProof uses:
MulAction.stabilizer5 instances, coercions and auxiliary constants left out.
def autGroup : Subgroup (VariableChange K) := stabilizer (VariableChange K) E
- lemma
WeierstrassCurve.mem_autGroupline 147 sourcestandard axioms: Quot.sound, propext what this means
Statement uses:
Field,WeierstrassCurve,WeierstrassCurve.VariableChange,Iff,Membership.mem,Subgroup, WeierstrassCurve.autGroup,Eq,HSMul.hSMulProof uses:
Iff.rfl10 instances, coercions and auxiliary constants left out.
- def
WeierstrassCurve.autGroupMulEquivAut(E) ≅ ℤ/2forj(E) ∉ {0, 1728}line 154 sourceSource documentation
Aut(E) ≅ ℤ/2forj(E) ∉ {0, 1728}. The automorphism group ofEis{±1}, so it is isomorphic toMultiplicative (ZMod 2): it has exactly two elements —1andnegVariableChange E(eq_one_or_eq_negVariableChange_of_smul_eq), distinct bynegVariableChange_ne_one. The isomorphism sendsnegVariableChange EtoMultiplicative.ofAdd 1.standard axioms: Classical.choice, Quot.sound, propext what this means
Statement uses:
Field,WeierstrassCurve,DecidableEq,WeierstrassCurve.IsElliptic,Ne,WeierstrassCurve.j,OfNat.ofNat,Nat,MulEquiv,Subtype,WeierstrassCurve.VariableChange,Membership.mem,Subgroup, WeierstrassCurve.autGroup,Multiplicative,ZModProof uses: mulEquivMultiplicativeZModTwo,
Subtype.mk, WeierstrassCurve.negVariableChange, WeierstrassCurve.negVariableChange_smul_self47 instances, coercions and auxiliary constants left out.
def autGroupMulEquiv [DecidableEq K] [E.IsElliptic] (hj₀ : E.j ≠ 0) (hj₁₇₂₈ : E.j ≠ 1728) : E.autGroup ≃* Multiplicative (ZMod 2) := …