Normal forms: transport, changes of variables, and elementary consequences #
Mathlib's WeierstrassCurve.IsCharNeTwoNF asserts a₁ = a₃ = 0 and its
WeierstrassCurve.IsShortNF asserts a₁ = a₂ = a₃ = 0, and its NormalForms file proves a
great deal from those hypotheses. This file collects four things it does not record.
Transport. Both conditions are preserved by map and baseChange — the coefficients of
W.map f are the images of W's, so a vanishing coefficient stays vanishing.
Completing the square. The change toCharNeTwoNF gives explicit formulas for its three
remaining coefficients.
Changes of variables between short normal forms. When 2 and 3 are non-zero-divisors, a
change of variables carrying one short equation to another is a pure scaling
(x, y) ↦ (u²x, u³y): its r, s and t vanish, so it acts on the coefficients by
(a₄, a₆) ↦ (u⁻⁴a₄, u⁻⁶a₆). This is the only freedom left in a short equation, and it is what a
canonical short equation has to normalise away.
Elementary consequences. Facts that follow from a₁ = a₃ = 0 alone, by unfolding negY, with
no further machinery. y_eq_zero_of_order_two is the current example: negation is (x, y) ↦ (x, -y), so a 2-torsion point has y = 0. It lives here rather than with the division-polynomial
material that first proved it because it needs none of that — this module's closure is one file,
against thirty-three for DivisionPolynomial/ShortNagellLutz.lean — and its consumers, Nagell–Lutz
and the 2-descent torsion count, sit in unrelated parts of the library.
That gap matters as soon as a statement is about a curve over ℤ and a point over ℚ, which is
the shape of the classical Nagell–Lutz theorem: the hypothesis is natural on the integral model,
while the point lives on the base change, and without these instances the class has to be
re-established by hand at every such crossing.
Main results #
WeierstrassCurve.isCharNeTwoNF_map:a₁ = a₃ = 0is preserved by a ring hom.WeierstrassCurve.isCharNeTwoNF_baseChange: the same for a base change, which is the spelling consumers hold. Both are instances, so the crossing is silent.WeierstrassCurve.isShortNF_mapandWeierstrassCurve.isShortNF_baseChange: the same two statements for short normal form.WeierstrassCurve.VariableChange.r_eq_zero_of_isShortNF,…s_eq_zero_of_isShortNFand…t_eq_zero_of_isShortNF: a change of variables between short normal forms is a scaling.WeierstrassCurve.variableChange_a₄_of_isShortNFandWeierstrassCurve.variableChange_a₆_of_isShortNF: it acts on the coefficients by(a₄, a₆) ↦ (u⁻⁴a₄, u⁻⁶a₆).WeierstrassCurve.y_eq_zero_of_order_two: in a characteristic-≠-2 normal form, an affine point killed by2hasy = 0.TauCeti.toCharNeTwoNF_a₂,TauCeti.toCharNeTwoNF_a₄, andTauCeti.toCharNeTwoNF_a₆: the coefficients after completing the square.
Characteristic-≠-2 normal form is preserved by a ring hom. (W.map f).a₁ is f W.a₁, and
a hom sends 0 to 0, so the vanishing survives.
As an instance, this is what lets typeclass search carry IsCharNeTwoNF across W.map f: a
caller who has the hypothesis on W and a statement about W.map f needs no bridging term.
Characteristic-≠-2 normal form is preserved by a base change. This is
isCharNeTwoNF_map at algebraMap R S, stated separately because baseChange is the spelling a
caller holds and instance search does not unfold it.
Short normal form is preserved by a ring hom. (W.map f).a₂ is f W.a₂, and a hom sends
0 to 0, so the vanishing survives; likewise for a₁ and a₃. As an instance, it carries
IsShortNF across W.map f in typeclass search.
Short normal form is preserved by a base change. This is isShortNF_map at
algebraMap R S, stated separately because baseChange is the spelling a caller holds and
instance search does not unfold it.
Changes of variables between short normal forms #
The coefficients a₁, a₃ and a₂ of C • W are u⁻¹ · 2s, u⁻³ · 2t and u⁻² · 3r when W
is short, so if C • W is short as well and 2 and 3 are non-zero-divisors then
r = s = t = 0, and C is the scaling (x, y) ↦ (u²x, u³y).
A change of variables between short normal forms has s = 0, when 2 is a
non-zero-divisor.
A change of variables between short normal forms has t = 0, when 2 is a
non-zero-divisor.
A change of variables between short normal forms has r = 0, when 2 and 3 are
non-zero-divisors.
Between short normal forms, a change of variables scales a₄ by u⁻⁴, when 2 and 3 are
non-zero-divisors.
Between short normal forms, a change of variables scales a₆ by u⁻⁶, when 2 and 3 are
non-zero-divisors.
In characteristic-≠-2 normal form, a two-torsion point has y = 0. Negation is
(x, y) ↦ (x, -y), so a point equal to its own negative has 2y = 0; cancelling 2 finishes it.
Nothing here sees ℤ or ℚ, and nothing needs a₂ = 0: the argument is the normal-form identity
plus the ability to cancel 2 in the point's own field, so those are exactly the hypotheses.
The hypothesis is annihilation by 2 rather than addOrderOf P = 2, which is what the proof and
every caller actually have. For an affine point the two are equivalent — Point.some _ _ _ is
never 0 — so the name remains exact; the weaker form simply spares callers the reconstruction.
The quadratic coefficient after completing the square.
The linear coefficient after completing the square.
The constant coefficient after completing the square.