The point map induced by a ring homomorphism #
Mathlib's WeierstrassCurve.Affine.Point.map moves the points of a fixed curve between two
field extensions of a base, along an AlgHom in a scalar tower — which covers the q-power
Frobenius, Mathlib bundling that as FiniteField.frobeniusAlgHom. This file supplies the other
functoriality: an injective ring homomorphism f : R →+* S carries the points of W over R to
the points of the curve W.map f over S, with no fields and no tower involved.
Main definitions and results #
WeierstrassCurve.Affine.Point.mapAlong: the mapW.Point → (W.map f).Point, over arbitrary commutative rings.WeierstrassCurve.Affine.Point.mapAlong_neg,mapAlong_id,mapAlong_mapAlongandmapAlong_injective: the functorial API, over arbitrary commutative rings, mirroring Mathlib'sAffine.Point.map_id,map_mapandmap_injectivefor theAlgHomversion. Both curve equalities —W.map (RingHom.id R) = Wand(W.map f).map g = W.map (g.comp f)— hold by definition, so the identity and composition laws are stated with no transport.WeierstrassCurve.Affine.Point.mapAlong_eq_map: over a field, whenKis anF-algebra, the transport alongalgebraMap F Kis Mathlib'sAffine.Point.map. A user holding only a ring homomorphismf : F →+* KwritesletI := f.toAlgebraand gets the same statement forf.WeierstrassCurve.Affine.Point.mapAlong_iterateFrobenius_some: iterated Frobenius sends(x, y)to(x ^ (p ^ n), y ^ (p ^ n)).WeierstrassCurve.Affine.Point.mapAlong_add: over fields the transport is additive.
Affine.Point.map is already an AddMonoidHom, so installing f.toAlgebra locally and rewriting
with mapAlong_eq_map gives map_add, map_zero and map_zsmul from Mathlib directly, including
when f is a field endomorphism.
What Mathlib lacks, and what this file adds, is the transport over arbitrary commutative rings,
where W.Point has no group law to speak of.
The definition needs only injectivity, since that is what Affine.map_nonsingular needs to carry
nonsingularity across. Negation and the functorial laws hold over any commutative ring and are
proved here at that generality.
This supports the Hasse strand of TauCetiRoadmap/EllipticCurves/README.md, Layer 3: the Silverman
V.1 route counts #E(𝔽_q) as the fixed points of Frobenius, which means transporting points along
the q-power ring homomorphism and knowing that transport respects the group law and ℤ-multiples.
The roadmap's §"What Mathlib already has (consume)" lists Affine.Point and its AddCommGroup as
consumed infrastructure whose "infrastructure is load-bearing API here, not an implementation
detail"; this is a complement to that API, not a reimplementation of it.
Provenance #
Ported from the AINTLIB HasseWeil project (github.com/CBirkbeck/AINTLIB, Apache-2.0, pinned by
that roadmap at dev/hasse-weil @ 513e83879e2f), HasseWeil/EC/AffinePointMap.lean,
declarations map, map_zero, map_some and map_neg.
The source's mapAddMonoidHom and map_zsmul are not ported; over fields they are Mathlib's
Affine.Point.map under f.toAlgebra. The source's map_add corresponds to mapAlong_add, proved
through the same bridge.
Changes from the source. The names take an Along suffix (mapAlong), Mathlib having taken
Point.map for the AlgHom version. The computation rules are stated in simp-normal form, and
negation and the functorial laws are stated over an arbitrary commutative ring rather than a field.
The identity, composition and injectivity laws have no counterpart in the source.
The points of W map to the points of W.map f along an injective ring homomorphism.
Nonsingularity transports by Mathlib's Affine.map_nonsingular, which is what injectivity is
for.
Equations
Instances For
The point map sends the point at infinity to the point at infinity.
The point map sends an affine point to the point with image coordinates.
The point map preserves negation, over any commutative ring.
The point map along the identity is the identity. W.map (RingHom.id R) is W by
definition, so no transport is needed.
The point map is functorial in the ring homomorphism. (W.map f).map g is
W.map (g.comp f) by definition, so no transport is needed.
The point map is injective.
Over a field the transport is Mathlib's Affine.Point.map. For a ring homomorphism
f : F →+* K that is not an ambient algebraMap, apply this under letI := f.toAlgebra, where
algebraMap F K is f by definition.
Over fields the point map is additive, by identifying it with Mathlib's additive
Affine.Point.map after installing the algebra structure induced by f.
The iterated Frobenius sends an affine point (x, y) to
(x ^ (p ^ n), y ^ (p ^ n)).
Not a simp lemma: mapAlong_some already rewrites the left-hand side to coordinates expressed
using iterateFrobenius; this theorem records their p ^ n-power form.