The valuation at infinity on the function field of a Weierstrass curve #
The function field F(W) of an affine Weierstrass curve is a quadratic extension of the rational
function field F(x) (WeierstrassCurve.Affine.finrank_functionField), so every function has an
algebra norm there. Composing that norm with Mathlib's place at infinity of F(x) gives the place
at infinity of the curve: ord_∞ f = -deg N f, the place where x and y have their poles.
Main definitions #
WeierstrassCurve.Affine.infinityPlace: the valuation at infinity,Valuation W.FunctionField (WithZero (Multiplicative ℤ)), asRatFunc.inftyValuationcomposed withAlgebra.norm.
Main results #
The valuation's map_add_le_max' rests on an ultrametric inequality in degree form, proved here;
the other three axioms are the norm's multiplicativity and Mathlib's place at infinity.
WeierstrassCurve.Affine.infinityPlace.X,WeierstrassCurve.Affine.infinityPlace.mk_Y:v_∞ x = exp 2andv_∞ y = exp 3— the double and triple poles at infinity,ord_∞ x = -2andord_∞ y = -3, which is what Layer 0 asks for by name. They read this file's twonatDegree_norm_*helpers throughAlgebra.norm_localizationand Mathlib's polynomial valuation.WeierstrassCurve.Affine.infinityPlace.algebraMap_eq_sq: restricting alongRatFunc F → W.FunctionFieldsquaresRatFunc.inftyValuation, so the place at infinity is ramified of index two over the infinite place ofF(x).WeierstrassCurve.Affine.infinityPlace.C: the valuation is trivial on the base field — a nonzero constant has value1, the constant case of the previous result. TheValuation.IsTrivialOn FandValuation.IsNontrivialinstances follow, so the place is usable through Mathlib's standard valuation API.WeierstrassCurve.Affine.infinityPlace.X_div_mk_YandWeierstrassCurve.Affine.infinityPlace.isUniformizer_X_div_mk_Y:x / yis a uniformiser at infinity. Its value isexp (-1), and it is a uniformiser in Mathlib'sValuation.IsUniformizersense. That the place is discrete of rank one needs no proof here — its value group is a nontrivial subgroup of the cyclicℤᵐ⁰ˣ, so Mathlib'sIsRankOneDiscreteinstance fires by itself — but the generator does: discreteness alone permitsexp (-n)withn ≥ 1, and the proper subgroup2ℤgenuinely occurs, being the value group of the restriction ofv_∞toF(x). One element of valueexp (-1)settles it, which is what the value above is.WeierstrassCurve.Affine.infinityPlace_ne_heightOneSpectrum_valuation: the place at infinity is distinct from the valuation of every height-one prime of the coordinate ring — the affine places. WithCoordinateRing.pointPlace_eq_iffthat makes the whole point-to-place assignment injective, the point at infinity included.
The two coordinate-function values each come in a second @[simp] form, stated in the shape simp
actually normalises them to (the note above infinityPlace.X explains why the coordinate forms
cannot carry the tag themselves). The quotient value gets no restatement of its own: map_div₀
is a simp lemma, so simp decomposes the quotient through the two atomic restatements. The
machinery that builds the ultrametric inequality is private, and the norm-degree theory it
rests on lives in FunctionField/Norm.lean.
Roadmap #
TauCetiRoadmap/EllipticCurves/README.md, Layer 0 (the function field, places, and divisors),
whose §Places asks for the one further place W.infinityPlace beyond the affine ones, sitting
"where x and y have their poles", with ord_∞ x = -2, ord_∞ y = -3. This file supplies the
valuation, those two degrees, and the uniformiser x / y — §Places lists "ord_v,
uniformisers, residue fields, the degree deg v" as the API the later layers consume.
Suggested.lean seeds no declaration it competes with, recording that the function-field layer's
"types are new API and are built there, not pinned here".
Provenance #
The route is that of the AINTLIB HasseWeil project (github.com/CBirkbeck/AINTLIB, Apache-2.0,
dev/hasse-weil at a582951fe96b), HasseWeil/Curves/Infinity.lean: normAsRatFunc,
ordAtInfty, ordAtInfty_mul, ordAtInfty_add_ge_min (tagged T-ORD-ARITH-12) and
ordAtInfty_coordX/ordAtInfty_coordY.
The ramification statement corresponds to that project's Curves/OrdAtInftyRamification.lean and
Curves/RamificationAtInfinity.lean; there it is an order identity for a WithTop ℤ-valued
ordAtInfty over the SmoothPlaneCurve wrapper, where here it is an equality of Mathlib
Valuations and follows from Algebra.norm_algebraMap with finrank_functionField.
Changes from the source. There ordAtInfty is a definition of its own, valued in WithTop ℤ, built
over a SmoothPlaneCurve structure wrapping WeierstrassCurve.Affine, with multiplicativity,
vanishing and the ultrametric bound all proved by hand. Here the norm is Mathlib's Algebra.norm
and the target is Mathlib's ℤᵐ⁰, so the result is a genuine Valuation uniform with
RatFunc.inftyValuation and IsDedekindDomain.HeightOneSpectrum.valuation; multiplicativity and
vanishing are map_mul and Algebra.norm_zero, and only the ultrametric inequality is
reproved.
The uniformiser corresponds to that project's
projects/HasseWeil/HasseWeil/Foundation/LocalExpansion.lean at main 1c1c7466, localParam —
the local parameter t = -x/y at O (Silverman IV.1) — whose uniformising property is recorded
there through a Laurent-series embedding (localExpand_localParam), over a SmoothPlaneCurve and
that development's own WithTop ℤ-valued ordAtInfty. None of that apparatus is needed here: the
value of x / y is two rewrites from the two pole orders, and Mathlib's
Valuation.IsRankOneDiscrete.generator_eq_exp_neg_one_of_mem_range turns that single value into the
generator, so the conclusion is Mathlib's Valuation.IsUniformizer directly. The sign is dropped,
x / y and -x / y having the same valuation.
The valuation at infinity on the function field of a Weierstrass curve: Mathlib's place at
infinity of F(x), composed with the algebra norm.
Equations
- W.infinityPlace = { toFun := fun (f : W.FunctionField) => (RatFunc.inftyValuation F) ((Algebra.norm (RatFunc F)) f), map_zero' := ⋯, map_one' := ⋯, map_mul' := ⋯, map_add_le_max' := ⋯ }
Instances For
The evaluation rule for infinityPlace: it is RatFunc.inftyValuation applied to the algebra
norm of the function. The definition's body is not exposed across the module boundary, so this is
how downstream modules compute with it. Deliberately not @[simp]: unfolding the valuation would
defeat the special-value lemmas below, which are the normal forms automation should reach.
x has a double pole at infinity: v_∞ x = exp 2, which is ord_∞ x = -2.
y has a triple pole at infinity: v_∞ y = exp 3, which is ord_∞ y = -3.
The place at infinity lies over the infinite place of F(x), with ramification index two.
On a rational function of x the value is the square of Mathlib's infinite valuation, the extension
F(W) / F(x) being quadratic.
The valuation at infinity of a nonzero rational function of x is exp of twice its
degree: v_∞ r = exp (2 * r.intDegree), which is ord_∞ r = -2 * r.intDegree.
The factor two is the ramification index of the place at infinity over the infinite place of
F(x), so a nonzero rational function of x lies in the maximal ideal at infinity exactly when
its degree is negative.
The valuation at infinity of a polynomial in x is exp of twice its degree: a nonzero
polynomial of degree n has a pole of order 2 * n at infinity. infinityPlace.X is the case
p = X.
The valuation is trivial on the base field: a nonzero constant has value 1, so v_∞
restricted to F is trivial. The analogue of RatFunc.inftyValuation.C.
The valuation at infinity is trivial on the base field.
The valuation at infinity is nontrivial: x has value exp 2.
The simp-normal form of infinityPlace.X, stated for AdjoinRoot.of, which is what simp
rewrites the coordinate function to.
The simp-normal form of infinityPlace.mk_Y, stated for AdjoinRoot.root.
x / y is a uniformiser at infinity: v_∞ (x / y) = exp (-1), that is
ord_∞ (x / y) = 1, a simple zero at the point at infinity. The double pole of x and the triple
pole of y differ by one, which is what makes the quotient a uniformiser.
x / y is a uniformiser at the place at infinity, in Mathlib's sense: its value generates
the value group and is < 1.
The place at infinity is distinct from every affine place. Together with
CoordinateRing.pointPlace_eq_iff this gives the injectivity of the whole point-to-place
assignment, the point at infinity included.