示例#1
0
    def lower_components(self, u=Infinity):
        r"""
        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.

        """
        if u in self._lower_components.keys():
            return self._lower_components[u]
            # we have already computed this before!

        L = self.splitting_field()
        if u == Infinity:
            vL = L.valuation()
        else:
            L = L.ramification_subfield(u)
            vL = L.valuation()

        FX = self.berkovich_line().function_field()
        L = vL.domain()      # actually, this is the number field underlying L
        FXL = FunctionField(L, FX.variable_name())
        XL = BerkovichLine(FXL, vL)
        f, s = self.type_II_point().discoid()
        f = FXL(f)

        v0 = self.valuation()
        F0 = self.function_field()
        x0 = FXL(v0.lift(v0.residue_field().gen()))
        k0 = F0.constant_base_field()
        lower_valuations = [xi.valuation() for xi in XL.points_from_inequality(f, s)]
        lower_components = []
        for v in lower_valuations:
            F1 = make_function_field(v.residue_field())
            # we need to find the correct inclusion of F0 into F1
            if k0.is_prime_field():
                phi = F0.hom(F1(v.reduce(x0)))
            else:
                k1 = F1.constant_base_field()
                theta0 = FXL(v0.lift(k0.gen()))
                psi = k0.hom([k1(F1(v.reduce(theta0)))])
                phi = F0.hom(F1(v.reduce(x0)), psi)
            lower_components.append(LowerComponent(self, vL, v, phi))
        self._lower_components[u] = lower_components
        return lower_components
示例#2
0
    def lower_components(self, u=Infinity):
        r"""
        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).

        """
        if u in self._lower_components.keys():
            return self._lower_components[u]
            # we have already computed this before!

        L = self.splitting_field()
        if u == Infinity:
            vL = L.valuation()
        else:
            L = L.ramification_subfield(u)
            vL = L.valuation()

        # we construct the base change of the underlying Berkovich line
        # to L:
        FX = self.berkovich_line().function_field()
        L = vL.domain()      # actually, this is the number field underlying L
        FXL = FunctionField(L, FX.variable_name())
        # test that FX is a subring of FXL
        assert FX.is_subring(FXL)
        # hence there is a natural coercion morphism
        XL = BerkovichLine(FXL, vL)
        # the representation of xi as a discoid on X, which is defined
        # by an inequality v(f) >= s:
        f, s = self.type_II_point().discoid()
        # the lower components correspon to the connected components of
        # the base change to L of the discoid defining the inertial component:
        f = FXL(f)
        lower_valuations = [xi.valuation() for xi in XL.points_from_inequality(f, s)]

        # some preparation:
        v0 = self.valuation()
        F0 = self.function_field()
        x0 = FXL(v0.lift(v0.residue_field().gen()))
        # x0 is a lift to FXL of the canonical coordinate on the
        # inertial component; we need it to find the natural map from the
        # lower components to the inertial component.
        k0 = F0.constant_base_field()
        theta0 = FXL(v0.lift(k0.gen()))

        # now we construct the lower components:
        lower_components = []
        for v in lower_valuations:
            F1, to_F1, _ = make_function_field(v.residue_field())
            # we need to find the correct inclusion phi of F0 into F1
            if k0.is_prime_field():
                # we don't have to worry about the right embedding of the
                # constant base field
                phi = F0.hom(to_F1(v.reduce(x0)))
            else:
                k1 = F1.constant_base_field()
                # we have to be careful about the correct embedding of k0 into k1
                phi_base = k0.hom([k1(to_F1(v.reduce(theta0)))])
                # now phi is determined by phi_base and the image of the
                # natural coordinate of F0
                phi = F0.hom(to_F1(v.reduce(x0)), phi_base)
            lower_components.append(LowerComponent(self, vL, v, phi))
        self._lower_components[u] = lower_components
        return lower_components