Documentation

Mathlib.AlgebraicGeometry.EllipticCurve.Affine.Point

Nonsingular points and the group law in affine coordinates #

Let W be a Weierstrass curve over a field F given by a Weierstrass equation W(X, Y) = 0 in affine coordinates. The type of nonsingular points W⟮F⟯ in affine coordinates is an inductive, consisting of the unique point at infinity 𝓞 and nonsingular affine points (x, y). Then W⟮F⟯ can be endowed with a group law, with 𝓞 as the identity nonsingular point, which is uniquely determined by the formulae in Mathlib/AlgebraicGeometry/EllipticCurve/Affine/Formula.lean.

With this description, there is an addition-preserving injection between W⟮F⟯ and the ideal class group of the affine coordinate ring F[W] := F[X, Y] / ⟨W(X, Y)⟩ of W. This is given by mapping 𝓞 to the trivial ideal class and a nonsingular affine point (x, y) to the ideal class of the invertible ideal ⟨X - x, Y - y⟩. Proving that this is well-defined and preserves addition reduces to equalities of integral ideals checked in WeierstrassCurve.Affine.CoordinateRing.XYIdeal_neg_mul and in WeierstrassCurve.Affine.CoordinateRing.XYIdeal_mul_XYIdeal via explicit ideal computations. Now F[W] is a free rank two F[X]-algebra with basis {1, Y}, so every element of F[W] is of the form p + qY for some p, q in F[X], and there is an algebra norm N : F[W] → F[X]. Injectivity can then be shown by computing the degree of such a norm N(p + qY) in two different ways, which is done in WeierstrassCurve.Affine.CoordinateRing.degree_norm_smul_basis and in the auxiliary lemmas in the proof of WeierstrassCurve.Affine.Point.instAddCommGroup.

This file defines the group law on nonsingular points W⟮F⟯ in affine coordinates.

Main definitions #

Main statements #

Notations #

References #

Tags #

elliptic curve, affine, point, group law, class group

The affine coordinate ring #

@[reducible, inline]

The affine coordinate ring R[W] := R[X, Y] / ⟨W(X, Y)⟩ of a Weierstrass curve W.

Equations
Instances For
    @[reducible, inline]

    The function field R(W) := Frac(R[W]) of a Weierstrass curve W.

    Equations
    Instances For
      @[reducible, inline]

      The natural ring homomorphism mapping R[X][Y] to R[W].

      Equations
      Instances For

        The power basis {1, Y} for R[W] over R[X].

        Equations
        Instances For
          theorem WeierstrassCurve.Affine.CoordinateRing.smul_basis_eq_zero {R : Type r} [CommRing R] {W' : Affine R} {p q : Polynomial R} (hpq : p 1 + q (mk W') Polynomial.X = 0) :
          p = 0 q = 0
          theorem WeierstrassCurve.Affine.CoordinateRing.smul_basis_mul_C {R : Type r} [CommRing R] {W' : Affine R} (y p q : Polynomial R) :
          (p 1 + q (mk W') Polynomial.X) * (mk W') (Polynomial.C y) = (p * y) 1 + (q * y) (mk W') Polynomial.X

          The ring homomorphism R[W] →+* S[W.map f] induced by a ring homomorphism f : R →+* S.

          Equations
          • One or more equations did not get rendered due to their size.
          Instances For
            theorem WeierstrassCurve.Affine.CoordinateRing.map_smul {R : Type r} {S : Type s} [CommRing R] [CommRing S] {W' : Affine R} (f : R →+* S) (x : Polynomial R) (y : CoordinateRing) :
            (map W' f) (x y) = Polynomial.map f x (map W' f) y

            Ideals in the affine coordinate ring #

            noncomputable def WeierstrassCurve.Affine.CoordinateRing.XClass {R : Type r} [CommRing R] (W' : Affine R) (x : R) :

            The class of the element X - x in R[W] for some x in R.

            Equations
            Instances For

              The class of the element Y - y(X) in R[W] for some y(X) in R[X].

              Equations
              Instances For
                theorem WeierstrassCurve.Affine.CoordinateRing.C_addPolynomial_slope {F : Type u} [Field F] {W : Affine F} {x₁ x₂ y₁ y₂ : F} (h₁ : W.Equation x₁ y₁) (h₂ : W.Equation x₂ y₂) (hxy : ¬(x₁ = x₂ y₁ = W.negY x₂ y₂)) :
                (mk W) (Polynomial.C (W.addPolynomial x₁ y₁ (W.slope x₁ x₂ y₁ y₂))) = -(XClass W x₁ * XClass W x₂ * XClass W (W.addX x₁ x₂ (W.slope x₁ x₂ y₁ y₂)))

                The ideal ⟨X - x⟩ of R[W] for some x in R.

                Equations
                Instances For

                  The ideal ⟨Y - y(X)⟩ of R[W] for some y(X) in R[X].

                  Equations
                  Instances For
                    noncomputable def WeierstrassCurve.Affine.CoordinateRing.XYIdeal {R : Type r} [CommRing R] (W' : Affine R) (x : R) (y : Polynomial R) :

                    The ideal ⟨X - x, Y - y(X)⟩ of R[W] for some x in R and y(X) in R[X].

                    Equations
                    Instances For

                      The R-algebra isomorphism from R[W] / ⟨X - x, Y - y(X)⟩ to R obtained by evaluation at some y(X) in R[X] and at some x in R provided that W(x, y(x)) = 0.

                      Equations
                      Instances For
                        theorem WeierstrassCurve.Affine.CoordinateRing.XYIdeal_add_eq {R : Type r} [CommRing R] {W' : Affine R} (x₁ x₂ y₁ : R) :
                        XYIdeal W' (W'.addX x₁ x₂ ) (Polynomial.C (W'.addY x₁ x₂ y₁ )) = Ideal.span {(mk W') (W'.negPolynomial - Polynomial.C (linePolynomial x₁ y₁ ))}XIdeal W' (W'.addX x₁ x₂ )
                        theorem WeierstrassCurve.Affine.CoordinateRing.XYIdeal_eq₂ {F : Type u} [Field F] {W : Affine F} {x₁ x₂ y₁ y₂ : F} (h₁ : W.Equation x₁ y₁) (h₂ : W.Equation x₂ y₂) (hxy : ¬(x₁ = x₂ y₁ = W.negY x₂ y₂)) :
                        XYIdeal W x₂ (Polynomial.C y₂) = XYIdeal W x₂ (linePolynomial x₁ y₁ (W.slope x₁ x₂ y₁ y₂))
                        theorem WeierstrassCurve.Affine.CoordinateRing.XYIdeal_mul_XYIdeal {F : Type u} [Field F] {W : Affine F} {x₁ x₂ y₁ y₂ : F} (h₁ : W.Equation x₁ y₁) (h₂ : W.Equation x₂ y₂) (hxy : ¬(x₁ = x₂ y₁ = W.negY x₂ y₂)) :
                        XIdeal W (W.addX x₁ x₂ (W.slope x₁ x₂ y₁ y₂)) * (XYIdeal W x₁ (Polynomial.C y₁) * XYIdeal W x₂ (Polynomial.C y₂)) = YIdeal W (linePolynomial x₁ y₁ (W.slope x₁ x₂ y₁ y₂)) * XYIdeal W (W.addX x₁ x₂ (W.slope x₁ x₂ y₁ y₂)) (Polynomial.C (W.addY x₁ x₂ y₁ (W.slope x₁ x₂ y₁ y₂)))

                        The non-zero fractional ideal ⟨X - x, Y - y⟩ of F(W) for some x and y in F.

                        Equations
                        • One or more equations did not get rendered due to their size.
                        Instances For
                          theorem WeierstrassCurve.Affine.CoordinateRing.XYIdeal'_eq {F : Type u} [Field F] {W : Affine F} {x y : F} (h : W.Nonsingular x y) :
                          (XYIdeal' h) = (XYIdeal W x (Polynomial.C y))
                          @[deprecated WeierstrassCurve.Affine.CoordinateRing.mk_XYIdeal'_neg_mul (since := "2025-02-01")]

                          Alias of WeierstrassCurve.Affine.CoordinateRing.mk_XYIdeal'_neg_mul.

                          theorem WeierstrassCurve.Affine.CoordinateRing.mk_XYIdeal'_mul_mk_XYIdeal' {F : Type u} [Field F] {W : Affine F} {x₁ x₂ y₁ y₂ : F} (h₁ : W.Nonsingular x₁ y₁) (h₂ : W.Nonsingular x₂ y₂) (hxy : ¬(x₁ = x₂ y₁ = W.negY x₂ y₂)) :

                          Norms on the affine coordinate ring #

                          Nonsingular points in affine coordinates #

                          inductive WeierstrassCurve.Affine.Point {R : Type r} [CommRing R] (W' : Affine R) :

                          A nonsingular point on a Weierstrass curve W in affine coordinates. This is either the unique point at infinity WeierstrassCurve.Affine.Point.zero or a nonsingular affine point WeierstrassCurve.Affine.Point.some (x, y) satisfying the Weierstrass equation of W.

                          Instances For

                            For an algebraic extension S of a ring R, the type of nonsingular S-points on a Weierstrass curve W over R in affine coordinates.

                            Equations
                            • One or more equations did not get rendered due to their size.
                            Instances For

                              Pretty printer defined by notation3 command.

                              Equations
                              • One or more equations did not get rendered due to their size.
                              Instances For
                                theorem WeierstrassCurve.Affine.Point.some_ne_zero {R : Type r} [CommRing R] {W' : Affine R} {x y : R} (h : W'.Nonsingular x y) :
                                some h 0
                                def WeierstrassCurve.Affine.Point.neg {R : Type r} [CommRing R] {W' : Affine R} :
                                W'.PointW'.Point

                                The negation of a nonsingular point on a Weierstrass curve in affine coordinates.

                                Given a nonsingular point P in affine coordinates, use -P instead of neg P.

                                Equations
                                Instances For
                                  theorem WeierstrassCurve.Affine.Point.neg_def {R : Type r} [CommRing R] {W' : Affine R} (P : W'.Point) :
                                  -P = P.neg
                                  @[simp]
                                  theorem WeierstrassCurve.Affine.Point.neg_zero {R : Type r} [CommRing R] {W' : Affine R} :
                                  -0 = 0
                                  @[simp]
                                  theorem WeierstrassCurve.Affine.Point.neg_some {R : Type r} [CommRing R] {W' : Affine R} {x y : R} (h : W'.Nonsingular x y) :
                                  -some h = some
                                  noncomputable def WeierstrassCurve.Affine.Point.add {F : Type u} [Field F] {W : Affine F} :
                                  W.PointW.PointW.Point

                                  The addition of two nonsingular points on a Weierstrass curve in affine coordinates.

                                  Given two nonsingular points P and Q in affine coordinates, use P + Q instead of add P Q.

                                  Equations
                                  Instances For
                                    theorem WeierstrassCurve.Affine.Point.add_def {F : Type u} [Field F] {W : Affine F} (P Q : W.Point) :
                                    P + Q = P.add Q
                                    theorem WeierstrassCurve.Affine.Point.add_some {F : Type u} [Field F] {W : Affine F} {x₁ x₂ y₁ y₂ : F} (hxy : ¬(x₁ = x₂ y₁ = W.negY x₂ y₂)) {h₁ : W.Nonsingular x₁ y₁} {h₂ : W.Nonsingular x₂ y₂} :
                                    some h₁ + some h₂ = some
                                    @[deprecated WeierstrassCurve.Affine.Point.add_some (since := "2025-02-28")]
                                    theorem WeierstrassCurve.Affine.Point.add_of_imp {F : Type u} [Field F] {W : Affine F} {x₁ x₂ y₁ y₂ : F} (hxy : ¬(x₁ = x₂ y₁ = W.negY x₂ y₂)) {h₁ : W.Nonsingular x₁ y₁} {h₂ : W.Nonsingular x₂ y₂} :
                                    some h₁ + some h₂ = some

                                    Alias of WeierstrassCurve.Affine.Point.add_some.

                                    @[simp]
                                    theorem WeierstrassCurve.Affine.Point.add_of_Y_eq {F : Type u} [Field F] {W : Affine F} {x₁ x₂ y₁ y₂ : F} {h₁ : W.Nonsingular x₁ y₁} {h₂ : W.Nonsingular x₂ y₂} (hx : x₁ = x₂) (hy : y₁ = W.negY x₂ y₂) :
                                    some h₁ + some h₂ = 0
                                    @[simp]
                                    theorem WeierstrassCurve.Affine.Point.add_self_of_Y_eq {F : Type u} [Field F] {W : Affine F} {x₁ y₁ : F} {h₁ : W.Nonsingular x₁ y₁} (hy : y₁ = W.negY x₁ y₁) :
                                    some h₁ + some h₁ = 0
                                    @[simp]
                                    theorem WeierstrassCurve.Affine.Point.add_of_Y_ne {F : Type u} [Field F] {W : Affine F} {x₁ x₂ y₁ y₂ : F} {h₁ : W.Nonsingular x₁ y₁} {h₂ : W.Nonsingular x₂ y₂} (hy : y₁ W.negY x₂ y₂) :
                                    some h₁ + some h₂ = some
                                    theorem WeierstrassCurve.Affine.Point.add_of_Y_ne' {F : Type u} [Field F] {W : Affine F} {x₁ x₂ y₁ y₂ : F} {h₁ : W.Nonsingular x₁ y₁} {h₂ : W.Nonsingular x₂ y₂} (hy : y₁ W.negY x₂ y₂) :
                                    some h₁ + some h₂ = -some
                                    @[simp]
                                    theorem WeierstrassCurve.Affine.Point.add_self_of_Y_ne {F : Type u} [Field F] {W : Affine F} {x₁ y₁ : F} {h₁ : W.Nonsingular x₁ y₁} (hy : y₁ W.negY x₁ y₁) :
                                    some h₁ + some h₁ = some
                                    theorem WeierstrassCurve.Affine.Point.add_self_of_Y_ne' {F : Type u} [Field F] {W : Affine F} {x₁ y₁ : F} {h₁ : W.Nonsingular x₁ y₁} (hy : y₁ W.negY x₁ y₁) :
                                    some h₁ + some h₁ = -some
                                    @[simp]
                                    theorem WeierstrassCurve.Affine.Point.add_of_X_ne {F : Type u} [Field F] {W : Affine F} {x₁ x₂ y₁ y₂ : F} {h₁ : W.Nonsingular x₁ y₁} {h₂ : W.Nonsingular x₂ y₂} (hx : x₁ x₂) :
                                    some h₁ + some h₂ = some
                                    theorem WeierstrassCurve.Affine.Point.add_of_X_ne' {F : Type u} [Field F] {W : Affine F} {x₁ x₂ y₁ y₂ : F} {h₁ : W.Nonsingular x₁ y₁} {h₂ : W.Nonsingular x₂ y₂} (hx : x₁ x₂) :
                                    some h₁ + some h₂ = -some

                                    Group law in affine coordinates #

                                    The group homomorphism mapping a nonsingular affine point (x, y) of a Weierstrass curve W to the class of the non-zero fractional ideal ⟨X - x, Y - y⟩ in the ideal class group of F[W].

                                    Equations
                                    • One or more equations did not get rendered due to their size.
                                    Instances For
                                      @[simp]
                                      @[deprecated WeierstrassCurve.Affine.Point.toClass (since := "2025-02-01")]

                                      Alias of WeierstrassCurve.Affine.Point.toClass.


                                      The group homomorphism mapping a nonsingular affine point (x, y) of a Weierstrass curve W to the class of the non-zero fractional ideal ⟨X - x, Y - y⟩ in the ideal class group of F[W].

                                      Equations
                                      Instances For
                                        Equations
                                        • One or more equations did not get rendered due to their size.

                                        Maps and base changes #

                                        noncomputable def WeierstrassCurve.Affine.Point.map {R : Type r} {S : Type s} {F : Type u} {K : Type v} [CommRing R] [CommRing S] [Field F] [Field K] {W' : Affine R} [Algebra R S] [Algebra R F] [Algebra S F] [IsScalarTower R S F] [Algebra R K] [Algebra S K] [IsScalarTower R S K] (f : F →ₐ[S] K) :

                                        The group homomorphism from W⟮F⟯ to W⟮K⟯ induced by an algebra homomorphism f : F →ₐ[S] K, where W is defined over a subring of a ring S, and F and K are field extensions of S.

                                        Equations
                                        • One or more equations did not get rendered due to their size.
                                        Instances For
                                          @[deprecated WeierstrassCurve.Affine.Point.map (since := "2025-02-01")]
                                          def WeierstrassCurve.Affine.Point.mapFun {R : Type r} {S : Type s} {F : Type u} {K : Type v} [CommRing R] [CommRing S] [Field F] [Field K] {W' : Affine R} [Algebra R S] [Algebra R F] [Algebra S F] [IsScalarTower R S F] [Algebra R K] [Algebra S K] [IsScalarTower R S K] (f : F →ₐ[S] K) :

                                          Alias of WeierstrassCurve.Affine.Point.map.


                                          The group homomorphism from W⟮F⟯ to W⟮K⟯ induced by an algebra homomorphism f : F →ₐ[S] K, where W is defined over a subring of a ring S, and F and K are field extensions of S.

                                          Equations
                                          Instances For
                                            theorem WeierstrassCurve.Affine.Point.map_zero {R : Type r} {S : Type s} {F : Type u} {K : Type v} [CommRing R] [CommRing S] [Field F] [Field K] {W' : Affine R} [Algebra R S] [Algebra R F] [Algebra S F] [IsScalarTower R S F] [Algebra R K] [Algebra S K] [IsScalarTower R S K] (f : F →ₐ[S] K) :
                                            (map f) 0 = 0
                                            theorem WeierstrassCurve.Affine.Point.map_some {R : Type r} {S : Type s} {F : Type u} {K : Type v} [CommRing R] [CommRing S] [Field F] [Field K] {W' : Affine R} [Algebra R S] [Algebra R F] [Algebra S F] [IsScalarTower R S F] [Algebra R K] [Algebra S K] [IsScalarTower R S K] (f : F →ₐ[S] K) {x y : F} (h : (WeierstrassCurve.baseChange W' F).toAffine.Nonsingular x y) :
                                            (map f) (some h) = some
                                            theorem WeierstrassCurve.Affine.Point.map_id {R : Type r} {F : Type u} [CommRing R] [Field F] {W' : Affine R} [Algebra R F] (P : Point (WeierstrassCurve.baseChange W' F)) :
                                            (map (Algebra.ofId F F)) P = P
                                            theorem WeierstrassCurve.Affine.Point.map_map {R : Type r} {S : Type s} {F : Type u} {K : Type v} {L : Type w} [CommRing R] [CommRing S] [Field F] [Field K] [Field L] {W' : Affine R} [Algebra R S] [Algebra R F] [Algebra S F] [IsScalarTower R S F] [Algebra R K] [Algebra S K] [IsScalarTower R S K] [Algebra R L] [Algebra S L] [IsScalarTower R S L] (f : F →ₐ[S] K) (g : K →ₐ[S] L) (P : Point (WeierstrassCurve.baseChange W' F)) :
                                            (map g) ((map f) P) = (map (g.comp f)) P
                                            theorem WeierstrassCurve.Affine.Point.map_injective {R : Type r} {S : Type s} {F : Type u} {K : Type v} [CommRing R] [CommRing S] [Field F] [Field K] {W' : Affine R} [Algebra R S] [Algebra R F] [Algebra S F] [IsScalarTower R S F] [Algebra R K] [Algebra S K] [IsScalarTower R S K] (f : F →ₐ[S] K) :
                                            @[reducible, inline]
                                            noncomputable abbrev WeierstrassCurve.Affine.Point.baseChange {R : Type r} (F : Type u) (K : Type v) [CommRing R] [Field F] [Field K] {W' : Affine R} [Algebra R F] [Algebra R K] [Algebra F K] [IsScalarTower R F K] :

                                            The group homomorphism from W⟮F⟯ to W⟮K⟯ induced by the base change from F to K, where W is defined over a subring of a ring S, and F and K are field extensions of S.

                                            Equations
                                            Instances For
                                              theorem WeierstrassCurve.Affine.Point.map_baseChange {R : Type r} {F : Type u} {K : Type v} {L : Type w} [CommRing R] [Field F] [Field K] [Field L] {W' : Affine R} [Algebra R F] [Algebra R K] [Algebra R L] [Algebra F K] [IsScalarTower R F K] [Algebra F L] [IsScalarTower R F L] (f : K →ₐ[F] L) (P : Point (WeierstrassCurve.baseChange W' F)) :
                                              (map f) ((baseChange F K) P) = (baseChange F L) P