Coordinates and constructor elimination for affine points #
WeierstrassCurve.Affine.Point is a two-constructor inductive type: the point at infinity, and an
affine point together with a nonsingularity certificate. Ruling out the first constructor and
naming the data of the second is a step that recurs wherever a point is known to be nonzero.
This file also supplies total coordinate accessors, junk-valued at the point at infinity, so
downstream definitions can read both coordinates without embedding a case split.
The existential form reads best when the point is a compound term such as n • P: obtain names
the coordinates, the nonsingularity certificate and the identifying equation in one line, with no
separate generalisation to arrange. The accessor form is useful when the coordinates must occur in
a definition, such as evaluation at a translated generic point.
Most coordinate reconstruction results assume the point is nonzero. The descent criterion
exists_map_eq_iff handles infinity separately: both accessors are 0 there, and infinity
descends along every field embedding. Nothing here needs ellipticity. The map lemmas need field
hypotheses only because Mathlib's Point.map does.
Main definitions #
WeierstrassCurve.Affine.Point.xCoordandWeierstrassCurve.Affine.Point.yCoord: the two affine coordinates, both0at infinity.
Main results #
WeierstrassCurve.Affine.Point.exists_eq_some_of_ne_zero: a nonzero affine point is.some, in a form that applies to a compound point.WeierstrassCurve.Affine.Point.nonsingular_coordsandWeierstrassCurve.Affine.Point.some_coords: a nonzero point is.someof its accessors.WeierstrassCurve.Affine.Point.eq_of_coords: nonzero points with equal coordinates are equal.WeierstrassCurve.Affine.Point.xCoord_mapandWeierstrassCurve.Affine.Point.yCoord_map: the accessors commute withPoint.map.WeierstrassCurve.Affine.Point.exists_map_eq_iff: a point descends along a field embedding exactly when both coordinates do.WeierstrassCurve.Affine.Point.cast_zeroandWeierstrassCurve.Affine.Point.cast_some: transport along an equality of curves, as inAddEquiv.castandEquiv.cast, fixes the point at infinity and keeps the coordinates of a point.
The coordinate accessors support TauCetiRoadmap/EllipticCurves/README.md, Layer 0.5, whose
translation-action milestone evaluates functions at translates of the generic point.
Provenance #
Not a port: Mathlib carries Point.xRep, the projective representative of the x-coordinate
map to ℙ¹, but that object intentionally identifies ±P and records no y-coordinate.
A nonzero affine point is .some. The case split on Affine.Point's two constructors,
packaged as an existential: one obtain yields the coordinates, the nonsingularity certificate,
and the equation identifying the point with .some of them — the last being what consumers go on
to rewrite with.
The x-coordinate of a point, taken to be 0 at the point at infinity.
Equations
Instances For
The y-coordinate of a point, taken to be 0 at the point at infinity.
Equations
Instances For
The coordinates of a nonzero point are a nonsingular solution of the equation.
The x-coordinate commutes with Point.map. The point at infinity needs no exception:
both sides are 0 there.
The y-coordinate commutes with Point.map.
A point descends along a field embedding exactly when both coordinates lie in its image. The point at infinity also satisfies the criterion, since its coordinate accessors are zero.
Transport of affine points along an equality of Weierstrass curves fixes the point at
infinity. Mathlib's AddEquiv.cast and Equiv.cast both reduce to this cast.
Transport of affine points along an equality of Weierstrass curves keeps the coordinates of
a point. Mathlib's AddEquiv.cast and Equiv.cast both reduce to this cast. It is used by
the variable-change and quadratic-twist point isomorphisms and by the base-change point map
WeierstrassCurve.Affine.pointMap (MordellWeil/LocalCondition.lean).