Reduction trees: a data structure for semistable reduction of covers of the projective line

Let \(K\) be a field with a discrete valuation \(v_K\). We let \(X:=\mathbb{P}^1_K\) denote the projective line over \(K\). We are also given a finite cover

\[\phi: Y \to X,\]

where \(Y\) is a smooth projective and absolutely irreducible curve. We assume that \(Y\) has positive genus.

Let \(\mathcal{X}_0\) be a (normal) \(v_K\)-model of \(X\). Then for every finite field extension \(L/K\) and every extension \(v_L\) of \(v_K\) to \(L\), we obtain \(v_L\)-models \(\mathcal{X}\) of \(X_L\) and \(\mathcal{Y}\) of \(Y_L\) and a finite map \(\mathcal{Y}\to\mathcal{X}\) extending \(\phi\) by normalizing \(\mathcal{X}_0\). Restricting this map to the special fiber yields a finite map

\[\bar{\phi}: \bar{Y} \to \bar{X}\]

between projective curves over the residue field of \(v_L\). We call this the reduction of \(\phi\) over \((L,v_L)\) with respect to the inertial model \(\mathcal{X}_0\).

If we fix \(\phi\) and \(\mathcal{X}_0\) then there exists \((L,v_L)\) such that the curves \(\bar{Y}\) and \(\bar{X}\) are reduced. If this is the case, any further extension of \((L,v_L)\) will not change \(\bar{Y}\) and \(\bar{X}\) in an essential way (more precisely, it will only replace \(\bar{Y}\) and \(\bar{X}\) by their base extensions to the larger residue field). Therefore we call the models \(\mathcal{Y}\) and \(\mathcal{X}\) permanent.

We say that \(\mathcal{X}_0\) is a semistable inertial model of \(\phi\) if the permanent models \(\mathcal{Y}\) and \(\mathcal{X}\) are semistable, and all irreducible components of the (semistable) curves \(\bar{Y}\) and \(\bar{X}\) are smooth (i.e. they do not intersect themselves).

The class ReductionTree defined in this module is a datastructure which encodes a cover \(\phi:Y\to X\) and an inertial model \(\mathcal{X}_0\) as above, and provides functionality for computing the reduction \(\bar{\phi}:\bar{Y}\to\bar{X}\) with respect to extensions \((L,v_L)\). In particular, it allows us to check whether the given inertial model \(\mathcal{X}_0\) is semistable and, if this is the case, to compute the semistable reduction of the curve \(Y\).

The inertial model

The inertial model \(\mathcal{X}_0\) of \(X\) is determined by a Berkovich tree \(T\) on the analytic space \(X^{an}\) (the Berkovich line over \(\hat{K}\), the completion of \(K\) with respect to \(v_K\)). Thus,

  • the irreducible components of the special fiber of \(\mathcal{X}_0\) (called the inertial components) correspond to the vertices of \(T\) which are points of type II on \(X^{an}\).
  • the vertices of \(T\) which are points of type I (i.e. closed points on \(X\)) are considered marked points on \(X\)
  • an edge of \(T\) connecting two points of type II correspond to the point of intersection of the two corresponding inertial components
  • an edge of \(T\) connecting a point of type II and a point of type II corresponds to the specialization of a marked point to an inertial component

In particular, the inertial model \(\mathcal{X}_0\) is a marked model. As a result, the models \(\mathcal{X}\) and \(\mathcal{Y}\) induced by \(\mathcal{X}_0\) and an extension \((L,v_L)\) are marked models, too. The condition that \(\mathcal{X}_0\) is a semistable inertial model therefore implies that \(\mathcal{X}\) and \(\mathcal{Y}\) are marked semistable models, for \(L/K\) sufficiently large. Recall that this means that the marked points specialize to the smooth points on the special fiber.

Reduction components

Let us fix an inertial component \(Z_0\). The interior of \(Z_0\) is the affinoid subdomain of \(X^{an}\) consisting of all points which specialize to a point on \(Z_0\) which is neither the point of intersection with another inertial component nor the specialization of a marked point (exception: if there is a unique inertial component and no marking then this is all of \(X^{an}\) and not an affinoid). We have to choose a basepoint for \(Z_0\), which is a closed point on \(X\) lying inside the interior. This choice is made in a heuristic manner; the degree of the base point should be as small as possible. Then a splitting field for \(Z_0\) is a finite extension \((L,v_L)\) of \((K,v_K)\) with the property that the base point and all points on \(Y\) above it are \(\hat{L}\)-rational (where \(\hat{L}\) denotes the completion of \(L\) with respect to \(v_L\)).

AUTHORS:

  • Stefan Wewers (2017-8-10): initial version

EXAMPLES:

sage: from mclf import *
sage: FX.<x> = FunctionField(QQ)
sage: v_2 = QQ.valuation(2)
sage: X = BerkovichLine(FX, v_2)
sage: T = BerkovichTree(X, X.gauss_point())
sage: T, _ = T.add_point(X.infty())
sage: R.<y> = FX[]
sage: FY.<y> = FX.extension(y^2-x^3-1)
sage: Y = SmoothProjectiveCurve(FY)
sage: RT = ReductionTree(Y, v_2, T)
sage: RT
A reduction tree for  the smooth projective curve with Function field in y defined by y^2 - x^3 - 1, relative to 2-adic valuation
sage: RT.inertial_components()
[inertial component of reduction tree with interior Elementary affinoid defined by
 v(x) >= 0
 ]

TODO:

  • better documentation
  • more doctests
class mclf.semistable_reduction.reduction_trees.InertialComponent(R, xi, is_separable=True)

Bases: SageObject

Return the inertial component corresponding to a type-II-point which is a vertex of \(T\).

INPUT:

  • R – a reduction tree
  • xi – a point of type II on the Berkovich line \(X\) underlying \(R\); it is assumed that \(\xi\) is a vertex of the Berkovich tree \(T\) underlying \(R\)
  • is_separable – boolean (default: True)

OUTPUT: The base component corresponding to \(\xi\).

It is assumed that \(\xi\) is a vertex of the given Berkovich tree. It thus corresponds to an irreducible component of the special fiber of the inertial model \(\mathcal{X}_0\). If this is not the case, an error is raised.

The inertial component which is generated by this command is an object for hosting methods which compute information about the irreducible components of models \(Y\) of \(X\) lying above \(\xi\), over various extensions of the base field.

basepoint()

Return the base point.

The basepoint is a type-I-point on the underlying Berkovich line which specializes to the interior of this component of the special fiber of \(\mathcal{X}_0\). If no base point is given when the base component was created, then such a point is computed now.

berkovich_line()

Return the underlying Berkovich line \(X\).

component()

Return the smooth projective curve underlying this inertial component.

Note that the constant base field of this curve is, by definition, the residue field of the base valuation. This may differ from the field of constants of its function field.

component_degree(u=∞)

Return the sum of the degrees of the upper components above this inertial component.

Here the degree of an upper component ist the degree of its field of constants, as extension of the constant base field.

function_field()

Return the function field of this inertial component (which is the residue field of the valuation corresponding to it).

interior()

Return the interior of this inertial component.

OUTPUT:

an elementary affinoid subdomain of the underlying Berkovich line.

The interior of a base component is the elementary affinoid subdomain of the underlying Berkovich line whose canonical reduction is an open affine subset of this inertial component of the inertial model \(\mathcal{X}_0\).

It is chosen such that the canonical reduction does not contain the points of intersection with the other components of \(\mathcal{X}_{0,s}\) and is disjoint from the residue classes of the marked points.

is_separable()

Return True is this inertial component is separable.

lower_components(u=∞)

Return the lower components relative to a given extension of the base field.

INPUT:

  • u – an integer, or Infinity (default: Infinity)

OUTPUT: the list of lower components of the model of the reduction tree lying over this base component. If \(u=\infty\) then these components are computed over the splitting field of the base component. Otherwise, \(u\) is assumed to be a break in the ramification filtration of the splitting field, and then we use the corresponding subfield.

The entries of the list correspond to the irreducible components of the special fiber of the \(v_L\)-model \(\mathcal{X}\) (the normalization of \(\mathcal{X}_0\)) lying over the given inertial component. By definition, the constant base field of these components is the residue field of \(v_L\) (and it may differ from its field of constants).

outdegree(u=∞)

Return the outdegree of this inertial component.

INPUT:

  • u – an integer, or Infinity (default: Infinity)

OUTPUT: the sum of the degrees of all edges emanating from components of the curve \(\bar{Y}^u\) which lie above this inertial component.

Here \(u\) is a break in the ramification filtration of splitting field of this inertial component, and the curve \(\bar{Y}^u\) is the special fiber of the reduction of \(Y\) over the corresponding subfield \(L^u\) (with respect to the given inertial model). By edge we mean an edge of the component graph of the curve \(\bar{Y}^u\); it corresponds to a point in which two components intersect. We call an edge outgoing (with respect to this inertail component) if it lies above an edge of the component graph of the special fiber of the inertial model which is directed away from this inertial component. The degree of an (upper) edge is the degree of the corresponding point of \(\bar{Y}^u\), with respect to the residue field of \(L^u\).

outgoing_edges()

Return the list of outgoing edges from this inertial component.

Here an edge is a point on this inertial component where it intersects another component; so it corresponds to an edge on the Berkovich tree underlying the chosen inertial model. Outgoing is defined with respect to the natural orientation of the Berkovich tree.

reduce(f)

Return the reduction of a rational function to this component.

INPUT:

  • f – an element of the function field of the Berkovich line

It is assumed that \(f\) a unit of the valuation ring corresponding to this component.

OUTPUT: the image of \(f\) in the function field of this component.

EXAMPLES:

sage: from mclf import *
sage: R.<x> = QQ[]
sage: Y = SuperellipticCurve(x^3-1, 2)
sage: Y3 = SemistableModel(Y, QQ.valuation(3))
sage: Z = Y3.reduction_tree().inertial_components()[1]
sage: f = Z.valuation().element_with_valuation(1/2)^2/3
sage: Z.reduce(f)
x
reduction_conductor()

Return the contribution of this inertial component to the conductor exponent.

OUTPUT: an integer \(f_Z\) (where \(Z\) is this inertial component).

The conductor exponent \(f_Y\) of the curve \(Y\) can be written in the form

\[f_Y = 1 + \sum_Z f_Z\]

where \(Z\) runs over all inertial components of the reduction tree and \(f_Z\) is an integer, called the contribution of \(Z\) to the conductor exponent.

TODO: Write better documentation.

reduction_genus(u=∞)

Return the sum of the genera of the upper components.

INPUT:

  • u – an integer, or Infinity (default: Infinity)

OUTPUT: a nonnegative integer, the sum of the genera of the upper components for this base component, computed with respect to the splitting field. If \(u\neq\infty\) then it is assumed that \(u\) is a break in the ramification filtration of the splitting field, and then the corresponding subfield is used instead.

reduction_tree()

Return the reduction tree of this component.

splitting_field(check=False)

Return a splitting field for this inertial component.

INPUT:

  • check – a boolean (default: False)

OUTPUT: a weak Galois extension \((L,v_L)\) of the base field.

At the moment, the splitting field of a inertial component is a weak Galois extension \((L,v_L)\) of the base field with the following properties:

  • the basepoint becomes rational over the strict henselization of \((L,v_L)\)
  • all lower components have multiplicities one over \((L,v_L)\)
  • if the inertial component is marked as separable then the fiber of the cover \(\phi:Y\to X\) over the base point splits over the strict henselization of \((L,v_L)\)

Warning

For the moment, this only works if the basepoint is contained inside the closed unit disk.

type_II_point()

Return the type-II-point \(\xi\) corresponding to this base component.

upper_components(u=∞)

Return the upper components relative to a given extension of the base field.

INPUT:

  • u – an integer, or Infinity (default: Infinity)

OUTPUT: the list of upper components of the model of the reduction tree over this inertial component. If \(u=\) Infinity then the splitting field of this inertial component is used to compute the upper components. Otherwise, \(u\) must be step in the ramification filtration of the splitting field, and then the corresponding subfield is used.

class mclf.semistable_reduction.reduction_trees.LowerComponent(Z0, vL, v, phi)

Bases: mclf.semistable_reduction.reduction_trees.ReductionComponent

Return the lower component corresponding to a given valuation.

A lower component is a reduction component \(Z\) on the base change \(X_L\) of the Berkovich line \(X\) to some finite extension \(L/K\). It is by construction the inverse image of a given inertial component \(Z_0\) on \(X\), which is part of a reduction tree.

INPUT:

  • Z0 – an inertial component of a reduction tree \(Y\)
  • vL – a discrete valuation on a finite extension \(L\) of the base field of \(Y\), extending the base valuation on \(Y\)
  • v – a discrete valuation on the base extension to \(L\) of the function field \(F_X\), extending \(v_L\)
  • phi – the natural morphism from the function field of Z0 into
    the residue field of v

OUTPUT: The lower component above \(Z\) corresponding to \(v\).

fiber_degree_in_upper_components(P)

Return the sum of the absolute degrees of the points above P on all upper components.

map_to_inertial_component()

Return the natural map from this lower component to its inertial component.

EXAMPLES:

sage: from mclf import *
sage: R.<x> = QQ[]
sage: Y = SuperellipticCurve(x^3-x, 2)
sage: Y3 = SemistableModel(Y,QQ.valuation(3))
sage: Z = Y3.reduction_tree().inertial_components()[0]
sage: W = Z.lower_components()[0]
sage: f = W.map_to_inertial_component()
sage: f.domain()
the smooth projective curve with Rational function field in x over Finite Field of size 3
sage: f.codomain()
the smooth projective curve with Rational function field in x over Finite Field of size 3
upper_components()

Return the list of all upper components lying above this lower component.

This lower component corresponds to a discrete valuation \(v\) on a rational function field \(L(x)\) extending the valuation \(v_L\), where \(L/K\) is some finite extension of the base field \(K\). The upper components correspond to the extensions of v to the function field of \(Y_L\) (which is a finite extension of \(L(x)\)).

Since the computation of all extensions of a nonstandard valuation on a function field to a finite extension is not yet part of Sage, we have to appeal to the MacLane algorithm ourselves.

EXAMPLES:

This example shows that extending valuations also works if the equation is not integral wrt the valuation v

sage: from mclf import *
sage: R.<x> = QQ[]
sage: Y = SuperellipticCurve(5*x^3 + 1, 2)
sage: Y2 = SemistableModel(Y, QQ.valuation(5))
sage: Y2.is_semistable()  # indirect doctest
True
class mclf.semistable_reduction.reduction_trees.ReductionComponent

Bases: SageObject

The superclass for the classes LowerComponent and UpperComponent.

base_field()

Return the base field of this reduction component.

base_valuation()

Return the base valuation of this reduction component.

component()

Return the normalization of this reduction component.

constant_base_field()

Return the constant base field of this reduction component.

Note that this field is isomorphic but not equal to the residue field of the base valuation. The isomorphism can be obtained via the restriction of isomorphism between the residue field of the valuation corresponding to the component and the function field of the component (can be obtained via self.from_residue_field()).

from_residue_field()

Return the isomorphism from the residue field of the valuation corresponding to this reduction component to its function field.

function_field()

Return the function field of this reduction component.

Note that the function field of this reduction component is the residue field of the corresponding valuation \(v\). It must not be confused with the domain of \(v\), which is the function field of the generic fiber.

function_field_of_generic_fiber()

Return the function field of the generic fiber of the model underlying this reduction component.

inertial_component()

Return the inertial component underlying this reduction component.

multiplicity()

Return the multiplicity of this reduction component.

By definition, this is equal to the ramification index of the valuation corresponding to this component over the base valuation.

reduce(f)

Return the image of a function on the generic fiber to this component.

reduction_tree()

Return the reduction tree underlying the reduction component.

valuation()

Return the valuation corresponding to this reduction component.

class mclf.semistable_reduction.reduction_trees.ReductionTree(Y, vK, T, separable_components=None)

Bases: SageObject

Initialize and return a reduction tree associated to a curve and a valuation.

INPUT:

  • Y – a curve over a basefield \(K\), given as SmoothProjectiveCurve
  • vK – a discrete valuation on \(K\)
  • T – a Berkovich tree on the Berkovich line \(X^{an}\) underlying \((Y,v_K)\)
  • separable_components – a list of type-II-points on \(X^{an}\) which are vertices of \(T\) (or None)

OUTPUT: a reduction tree for Y relative to vK; the inertial model \(\mathcal{X}_0\) is the marked model of \(X\) induced by the Berkovich tree \(T\).

Note that the tree \(T\) will be modified by the creation of the reduction tree.

Note

In the present release, the base field \(K\) must be the field of rational numbers.

add_inertial_component(xi)

Add a new inertial component to the list of such.

INPUT:

  • xi – a point of type II on the underlying Berkovich line; it is assumed that xi is a vertex of the Berkovich tree \(T\)

OUTPUT: a new inertial component \(Z\) is created and appended to the list of all inertial components. Moreover, \(Z\) is assigned to the new attribute inertial_component of the subtree of \(T\) with root \(\xi\).

base_field()

Return the base field.

base_valuation()

Return the specified valuation of the base field.

berkovich_line()

Return the Berkovich line \(X\) of which the curve \(Y\) is a cover.

berkovich_tree()

Return the Berkovich tree underlying this reduction tree.

curve()

Return the curve \(Y\).

inertial_components()

Return the list of inertial components.

is_semistable()

Check wether the reduction specified by this object is semistable.

reduction_conductor()

Return the conductor of the curve.

OUTPUT: a nonnegative integer, which is the conductor of the local Galois representation associated to the reduction which is specified in this ReductionTree. If the reduction is semistable, then the result is the conductor of \(Y\).

TODO: Write better documentation.

EXAMPLES:

We check that the conductor exponent takes the component graph into account as well:

sage: from mclf import *
sage: R.<x> = QQ[]
sage: Y = SuperellipticCurve(x^3 + x^2 + 3, 2)
sage: Y3 = SemistableModel(Y, QQ.valuation(3))
sage: Y3.is_semistable()
True
sage: Y3.conductor_exponent() # indirect doctest
1
reduction_genus()

Return the genus of the reduction.

OUTPUT: a nonnegative integer, which is the arithmetic genus of the reduction of the curve \(Y\) specified by the data in this ReductionTree, provided this reduction is semistable.

In fact, the number we compute is the sum of the genera of the upper components (i.e. the normalizations of the irreducible components of \(\bar{Y}\)) and the number of loops of the component graph of \(\bar{Y}\), which is (number of double points) - (number of components) + 1.

EXAMPLES:

We test that the arithmetic genus of a totally degenerate curve is computed correctly:

sage: from mclf import *
sage: R.<x> = QQ[]
sage: v_3 = QQ.valuation(3)
sage: f = (x^2 - 3)*(x^2 + 3)*(x^3 - 3)
sage: Y = SuperellipticCurve(f, 2)
sage: Y.genus()
3
sage: Y3 = SemistableModel(Y, v_3)
sage: Y3.reduction_tree().reduction_genus()
3
class mclf.semistable_reduction.reduction_trees.UpperComponent(Z, v)

Bases: mclf.semistable_reduction.reduction_trees.ReductionComponent

Return the upper component above this lower component, corresponding to a given valuation.

INPUT:

  • Z – a lower component of a reduction tree \(Y\)
  • v – a discrete valuation on the base extension to \(L\) of the function field \(F_Y\), extending the valuation corresponding to \(Z\)

OUTPUT: The upper component above \(Z\) corresponding to \(v\).

Note that the constant base fields of the upper and the lower components are equal, by definition, and isomorphic to the residue field of \(L\).

field_of_constants_degree()

Return the degree of the field of constants over the constant base field of this upper reduction component.

genus()

Return the genus of this upper reduction component.

lower_component()

Return the lower component underneath this upper component.

map_to_lower_component()

Return the natural map from this upper component to the lower component beneath.

mclf.semistable_reduction.reduction_trees.make_function_field(K)

Return the function field isomorphic to this field, an isomorphism, and its inverse.

INPUT:

  • K – a field

OUTPUT: A triple \((F,\phi,\psi)\), where \(F\) is a rational function field, \(\phi:K\to F\) is a field isomorphism and \(\psi\) the inverse of \(\phi\).

It is assumed that \(K\) is either the fraction field of a polynomial ring over a finite field \(k\), or a finite simple extension of such a field.

In the first case, \(F=k_1(x)\) is a rational function field over a finite field \(k_1\), where \(k_1\) as an absolute finite field isomorphic to \(k\). In the second case, \(F\) is a finite simple extension of a rational function field as in the first case.

Note

this command seems to be partly superflous by now, because the residue of a valuation is already of type “function field” whenever this makes sense. However, even if \(K\) is a function field over a finite field, it is not guaranteed that the constant base field is a ‘true’ finite field, and then it is important to change that.