Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
# -*- coding: utf-8 -*- Discrete valuations on function fields
AUTHORS:
- Julian Rüth (2016-10-16): initial version
EXAMPLES:
We can create classical valuations that correspond to finite and infinite places on a rational function field::
sage: K.<x> = FunctionField(QQ) sage: v = K.valuation(1); v (x - 1)-adic valuation sage: v = K.valuation(x^2 + 1); v (x^2 + 1)-adic valuation sage: v = K.valuation(1/x); v Valuation at the infinite place
Note that we can also specify valuations which do not correspond to a place of the function field::
sage: R.<x> = QQ[] sage: w = valuations.GaussValuation(R, QQ.valuation(2)) sage: v = K.valuation(w); v 2-adic valuation
Valuations on a rational function field can then be extended to finite extensions::
sage: v = K.valuation(x - 1); v (x - 1)-adic valuation sage: R.<y> = K[] sage: L.<y> = K.extension(y^2 - x) sage: w = v.extensions(L); w [[ (x - 1)-adic valuation, v(y + 1) = 1 ]-adic valuation, [ (x - 1)-adic valuation, v(y - 1) = 1 ]-adic valuation]
TESTS:
Run test suite for classical places over rational function fields::
sage: K.<x> = FunctionField(QQ) sage: v = K.valuation(1) sage: TestSuite(v).run(max_runs=100) # long time
sage: v = K.valuation(x^2 + 1) sage: TestSuite(v).run(max_runs=100) # long time
sage: v = K.valuation(1/x) sage: TestSuite(v).run(max_runs=100) # long time
Run test suite over classical places of finite extensions::
sage: K.<x> = FunctionField(QQ) sage: v = K.valuation(x - 1) sage: R.<y> = K[] sage: L.<y> = K.extension(y^2 - x) sage: ws = v.extensions(L) sage: for w in ws: TestSuite(w).run(max_runs=100) # long time
Run test suite for valuations that do not correspond to a classical place::
sage: K.<x> = FunctionField(QQ) sage: R.<x> = QQ[] sage: v = GaussValuation(R, QQ.valuation(2)) sage: w = K.valuation(v) sage: TestSuite(w).run() # long time
Run test suite for some other classical places over large ground fields::
sage: K.<t> = FunctionField(GF(3)) sage: M.<x> = FunctionField(K) sage: v = M.valuation(x^3 - t) sage: TestSuite(v).run(max_runs=10) # long time
Run test suite for extensions over the infinite place::
sage: K.<x> = FunctionField(QQ) sage: v = K.valuation(1/x) sage: R.<y> = K[] sage: L.<y> = K.extension(y^2 - 1/(x^2 + 1)) sage: w = v.extensions(L) sage: TestSuite(w).run() # long time
Run test suite for a valuation with `v(1/x) > 0` which does not come from a classical valuation of the infinite place::
sage: K.<x> = FunctionField(QQ) sage: R.<x> = QQ[] sage: w = GaussValuation(R, QQ.valuation(2)).augmentation(x, 1) sage: w = K.valuation(w) sage: v = K.valuation((w, K.hom([~K.gen()]), K.hom([~K.gen()]))) sage: TestSuite(v).run() # long time
Run test suite for extensions which come from the splitting in the base field::
sage: K.<x> = FunctionField(QQ) sage: v = K.valuation(x^2 + 1) sage: L.<x> = FunctionField(GaussianIntegers().fraction_field()) sage: ws = v.extensions(L) sage: for w in ws: TestSuite(w).run(max_runs=100) # long time
Run test suite for a finite place with residual degree and ramification::
sage: K.<t> = FunctionField(GF(3)) sage: L.<x> = FunctionField(K) sage: v = L.valuation(x^6 - t) sage: TestSuite(v).run(max_runs=10) # long time
Run test suite for a valuation which is backed by limit valuation::
sage: K.<x> = FunctionField(QQ) sage: R.<y> = K[] sage: L.<y> = K.extension(y^2 - (x^2 + x + 1)) sage: v = K.valuation(x - 1) sage: w = v.extension(L) sage: TestSuite(w).run() # long time
Run test suite for a valuation which sends an element to `-\infty`::
sage: R.<x> = QQ[] sage: v = GaussValuation(QQ['x'], QQ.valuation(2)).augmentation(x, infinity) sage: K.<x> = FunctionField(QQ) sage: w = K.valuation(v) sage: TestSuite(w).run() # long time
REFERENCES:
An overview of some computational tools relating to valuations on function fields can be found in Section 4.6 of [Rüt2014]_. Most of this was originally developed for number fields in [Mac1936I]_ and [Mac1936II]_.
""" #***************************************************************************** # Copyright (C) 2016-2017 Julian Rüth <julian.rueth@fsfe.org> # # Distributed under the terms of the GNU General Public License (GPL) # as published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # http://www.gnu.org/licenses/ #*****************************************************************************
r""" Create a valuation on ``domain`` corresponding to ``prime``.
INPUT:
- ``domain`` -- a function field
- ``prime`` -- a place of the function field, a valuation on a subring, or a valuation on another function field together with information for isomorphisms to and from that function field
EXAMPLES::
sage: K.<x> = FunctionField(QQ) sage: v = K.valuation(1); v # indirect doctest (x - 1)-adic valuation sage: v(x) 0 sage: v(x - 1) 1
See :meth:`sage.rings.function_field.function_field.FunctionField.valuation` for further examples.
""" r""" Create a unique key which identifies the valuation given by ``prime`` on ``domain``.
TESTS:
We specify a valuation on a function field by two different means and get the same object::
sage: K.<x> = FunctionField(QQ) sage: v = K.valuation(x - 1) # indirect doctest
sage: R.<x> = QQ[] sage: w = GaussValuation(R, valuations.TrivialValuation(QQ)).augmentation(x - 1, 1) sage: K.valuation(w) is v True
The normalization is, however, not smart enough, to unwrap substitutions that turn out to be trivial::
sage: w = GaussValuation(R, QQ.valuation(2)) sage: w = K.valuation(w) sage: w is K.valuation((w, K.hom([~K.gen()]), K.hom([~K.gen()]))) False
""" raise ValueError("Domain must be a function field.")
# prime is a triple of a valuation on another function field with # isomorphism information
# prime is already a valuation of the requested domain # if we returned (domain, prime), we would break caching # because this element has been created from a different key # Instead, we return the key that was used to create prime # so the caller gets back a correctly cached version of prime raise NotImplementedError("Valuations on function fields must be unique and come out of the FunctionFieldValuation factory but %r has been created by other means"%(prime,))
# prime defines a place # prime is a discrete (pseudo-)valuation on the polynomial ring # that the domain is constructed from # prime might define a valuation on a subring of domain and have a # unique extension to domain from sage.rings.ideal import is_Ideal if is_Ideal(prime): raise NotImplementedError("a place can not be given by an ideal yet")
raise NotImplementedError("argument must be a place or a pseudo-valuation on a supported subring but %r does not satisfy this for the domain %r"%(prime, domain))
r""" Create a unique key which identifies the valuation at the place specified by ``generator``.
TESTS:
sage: K.<x> = FunctionField(QQ) sage: v = K.valuation(1/x) # indirect doctest
""" raise NotImplementedError("a place must be defined over a rational function field")
# if this is an extension field, construct the unique place over # the place on the subfield
# generator is a constant, we associate to it the place which # corresponds to the polynomial (x - generator)
# generator is a polynomial raise ValueError("place must be defined by a monic polynomiala but %r is not monic"%(generator,)) raise ValueError("place must be defined by an irreducible polynomial but %r factors over %r"%(generator, domain._ring)) # we construct the corresponding valuation on the polynomial ring # with v(generator) = 1 # generator is 1/x, the infinite place else: raise ValueError("a place must be given by an irreducible polynomial or the inverse of the generator; %r does not define a place over %r"%(generator, domain))
r""" Create a unique key which identifies the valuation which extends ``valuation``.
TESTS:
sage: K.<x> = FunctionField(QQ) sage: R.<x> = QQ[] sage: w = GaussValuation(R, valuations.TrivialValuation(QQ)).augmentation(x - 1, 1) sage: v = K.valuation(w) # indirect doctest
""" # this should have been handled by create_key already
raise ValueError("valuation must extend a valuation on the base field but %r extends %r whose domain is not %r"%(valuation, vK, domain.base_field())) # Valuation is an approximant that describes a single valuation # on domain. # For uniqueness of valuations (which provides better caching # and easier pickling) we need to find a normal form of # valuation, i.e., the smallest approximant that describes this # valuation else: # on a rational function field K(x), any valuation on K[x] that # does not have an element with valuation -infty extends to a # pseudo-valuation on K(x) raise ValueError("there must not be an element of valuation -Infinity in the domain of valuation"%(valuation,))
# valuation is defined on a subring of this function field, try to lift it
raise NotImplementedError("extension of valuation from %r to %r not implemented yet"%(valuation.domain(), domain))
r""" Create a unique key which identifies the valuation which is ``valuation`` after mapping through ``to_valuation_domain``.
TESTS::
sage: K.<x> = FunctionField(GF(2)) sage: R.<y> = K[] sage: L.<y> = K.extension(y^2 + y + x^3) sage: v = K.valuation(1/x) sage: w = v.extension(L) # indirect doctest
""" raise ValueError("valuation must be defined over an isomorphic function field but %r is not a function field"%(valuation.domain(),))
raise ValueError("to_valuation_domain must map from %r to %r but %r maps from %r to %r"%(domain, valuation.domain(), to_valuation_domain, to_valuation_domain.domain(), to_valuation_domain.codomain())) raise ValueError("from_valuation_domain must map from %r to %r but %r maps from %r to %r"%(valuation.domain(), domain, from_valuation_domain, from_valuation_domain.domain(), from_valuation_domain.codomain()))
# over rational function fields, we only support the map x |--> 1/x with another rational function field raise NotImplementedError("maps must be isomorphisms with a rational function field over the same base field, not with %r"%(valuation.domain(),)) raise NotImplementedError("to_valuation_domain must be the map %r not %r"%(domain.hom([~valuation.domain().gen()]), to_valuation_domain)) raise NotImplementedError("from_valuation_domain must be the map %r not %r"%(valuation.domain().hom([domain.gen()]), from_valuation_domain)) # make it harder to create different representations of the same valuation # (nothing bad happens if we did, but >= and <= are only implemented when this is the case.) raise NotImplementedError("domain and valuation.domain() must be the same rational function field but %r is not %r"%(domain, valuation.domain())) else: raise NotImplementedError("domain and valuation.domain() must have the same base field but %r is not %r"%(domain.base(), valuation.domain().base())) raise NotImplementedError("to_valuation_domain must be trivial on the base fields but %r is not %r"%(to_valuation_domain, domain.hom([to_valuation_domain(domain.gen())]))) raise NotImplementedError("from_valuation_domain must be trivial on the base fields but %r is not %r"%(from_valuation_domain, valuation.domain().hom([from_valuation_domain(valuation.domain().gen())]))) raise NotImplementedError("to_valuation_domain seems to be trivial but trivial maps would currently break partial orders of valuations")
# only a necessary condition raise ValueError("to_valuation_domain and from_valuation_domain are not inverses of each other")
r""" Create the valuation specified by ``key``.
EXAMPLES::
sage: K.<x> = FunctionField(QQ) sage: R.<x> = QQ[] sage: w = valuations.GaussValuation(R, QQ.valuation(2)) sage: v = K.valuation(w); v # indirect doctest 2-adic valuation
"""
# valuation on the rational function field after x |--> 1/x # the classical valuation at the place 1/x
else: clazz = dynamic_class("RationalFunctionFieldMappedValuation_infinite", (clazz, InfiniteDiscretePseudoValuation))
# we can not just return valuation in this case # as this would break uniqueness and pickling raise ValueError("valuation must not be a valuation on domain yet but %r is a valuation on %r"%(valuation, domain))
# valuation is a base valuation on K[x] that induces a valuation on K(x) # valuation corresponds to a finite place else: else: else: # valuation is a limit valuation that singles out an extension
raise NotImplementedError("valuation on %r from %r on %r"%(domain, valuation, valuation.domain()))
r""" Abstract base class for any discrete (pseudo-)valuation on a function field.
TESTS::
sage: K.<x> = FunctionField(QQ) sage: v = K.valuation(x) # indirect doctest sage: from sage.rings.function_field.function_field_valuation import FunctionFieldValuation_base sage: isinstance(v, FunctionFieldValuation_base) True
"""
r""" Base class for discrete valuations on function fields.
TESTS::
sage: K.<x> = FunctionField(QQ) sage: v = K.valuation(x) # indirect doctest sage: from sage.rings.function_field.function_field_valuation import DiscreteFunctionFieldValuation_base sage: isinstance(v, DiscreteFunctionFieldValuation_base) True
""" r""" Return the extensions of this valuation to ``L``.
EXAMPLES::
sage: K.<x> = FunctionField(QQ) sage: v = K.valuation(x) sage: R.<y> = K[] sage: L.<y> = K.extension(y^2 - x) sage: v.extensions(L) [(x)-adic valuation]
TESTS:
Valuations over the infinite place::
sage: v = K.valuation(1/x) sage: R.<y> = K[] sage: L.<y> = K.extension(y^2 - 1/(x^2 + 1)) sage: sorted(v.extensions(L), key=str) [[ Valuation at the infinite place, v(y + 1/x) = 3 ]-adic valuation, [ Valuation at the infinite place, v(y - 1/x) = 3 ]-adic valuation]
Iterated extensions over the infinite place::
sage: K.<x> = FunctionField(GF(2)) sage: R.<y> = K[] sage: L.<y> = K.extension(y^2 + y + x^3) sage: v = K.valuation(1/x) sage: w = v.extension(L) sage: R.<z> = L[] sage: M.<z> = L.extension(z^2 - y) sage: w.extension(M) # squarefreeness is not implemented here Traceback (most recent call last): ... NotImplementedError
A case that caused some trouble at some point::
sage: R.<x> = QQ[] sage: v = GaussValuation(R, QQ.valuation(2))
sage: K.<x> = FunctionField(QQ) sage: v = K.valuation(v)
sage: R.<y> = K[] sage: L.<y> = K.extension(y^3 - x^4 - 1) sage: v.extensions(L) [2-adic valuation]
""" return [self] # L = K[y]/(G) is a simple extension of the domain of this valuation G = G / G.leading_coefficient() # rewrite L = K[u]/(H) with H integral and compute the extensions
raise NotImplementedError elif L.base() is not L and K.is_subring(L): # recursively call this method for the tower of fields from operator import add return reduce(add, A, []) elif L.constant_field() is not K.constant_field() and K.constant_field().is_subring(L): # subclasses should override this method and handle this case, so we never get here raise NotImplementedError("Can not compute the extensions of %r from %r to %r since the base ring changes."%(self, self.domain(), L)) raise NotImplementedError("extension of %r from %r to %r not implemented"%(self, K, L))
r""" Base class for valuations on rational function fields.
TESTS::
sage: K.<x> = FunctionField(GF(2)) sage: v = K.valuation(x) # indirect doctest sage: from sage.rings.function_field.function_field_valuation import RationalFunctionFieldValuation_base sage: isinstance(v, RationalFunctionFieldValuation_base) True
"""
r""" Base class for discrete valuations on rational function fields that come from points on the projective line.
TESTS::
sage: K.<x> = FunctionField(GF(5)) sage: v = K.valuation(x) # indirect doctest sage: from sage.rings.function_field.function_field_valuation import ClassicalFunctionFieldValuation_base sage: isinstance(v, ClassicalFunctionFieldValuation_base) True
""" r""" Check correctness of the residue field of a discrete valuation at a classical point.
TESTS::
sage: K.<x> = FunctionField(QQ) sage: v = K.valuation(x^2 + 1) sage: v._test_classical_residue_field()
"""
r""" Return whether ``self`` is greater or equal to ``other`` everywhere.
EXAMPLES::
sage: K.<x> = FunctionField(QQ) sage: v = K.valuation(x^2 + 1) sage: w = K.valuation(x) sage: v >= w False sage: w >= v False
""" return other.is_discrete_valuation() super(ClassicalFunctionFieldValuation_base, self)._ge_(other)
r""" Base class for function field valuation induced by a valuation on the underlying polynomial ring.
TESTS::
sage: K.<x> = FunctionField(QQ) sage: v = K.valuation(x^2 + 1) # indirect doctest
""" r""" TESTS::
sage: K.<x> = FunctionField(QQ) sage: v = K.valuation(x) # indirect doctest sage: from sage.rings.function_field.function_field_valuation import InducedFunctionFieldValuation_base sage: isinstance(v, InducedFunctionFieldValuation_base) True
"""
raise ValueError("base valuation must be defined on %r but %r is defined on %r"%(domain._ring, base_valuation, base_valuation.domain()))
r""" Return a uniformizing element for this valuation.
EXAMPLES::
sage: K.<x> = FunctionField(QQ) sage: K.valuation(x).uniformizer() x
"""
r""" Return a lift of ``F`` to the domain of this valuation such that :meth:`reduce` returns the original element.
EXAMPLES::
sage: K.<x> = FunctionField(QQ) sage: v = K.valuation(x) sage: v.lift(0) 0 sage: v.lift(1) 1
""" elif F in self._base_valuation.residue_ring().fraction_field(): num = self._base_valuation.residue_ring()(F.numerator()) den = self._base_valuation.residue_ring()(F.denominator()) else: raise NotImplementedError("lifting not implemented for this valuation")
r""" Return the value group of this valuation.
EXAMPLES::
sage: K.<x> = FunctionField(QQ) sage: K.valuation(x).value_group() Additive Abelian Group generated by 1
"""
r""" Return the reduction of ``f`` in :meth:`residue_ring`.
EXAMPLES::
sage: K.<x> = FunctionField(QQ) sage: v = K.valuation(x^2 + 1) sage: v.reduce(x) u1
"""
raise ValueError("can not reduce element of negative valuation")
r""" Return a printable representation of this valuation.
EXAMPLES::
sage: K.<x> = FunctionField(QQ) sage: K.valuation(x^2 + 1) # indirect doctest (x^2 + 1)-adic valuation
"""
r""" Return all extensions of this valuation to ``L`` which has a larger constant field than the domain of this valuation.
EXAMPLES::
sage: K.<x> = FunctionField(QQ) sage: v = K.valuation(x^2 + 1) sage: L.<x> = FunctionField(GaussianIntegers().fraction_field()) sage: v.extensions(L) # indirect doctest [(x - I)-adic valuation, (x + I)-adic valuation]
""" return [self]
and K.is_subring(L) \ and L.base() is L \ and L.constant_field() is not K.constant_field() \ and K.constant_field().is_subring(L.constant_field()): # The above condition checks whether L is an extension of K that # comes from an extension of the field of constants # Condition "L.base() is L" is important so we do not call this # code for extensions from K(x) to K(x)(y)
# We extend the underlying valuation on the polynomial ring
r""" Evaluate this valuation at the function ``f``.
EXAMPLES::
sage: K.<x> = FunctionField(QQ) sage: v = K.valuation(x) # indirect doctest sage: v((x+1)/x^2) -2
"""
r""" Return the residue field of this valuation.
EXAMPLES::
sage: K.<x> = FunctionField(QQ) sage: K.valuation(x).residue_ring() Rational Field
sage: K.<x> = FunctionField(QQ) sage: v = valuations.GaussValuation(QQ['x'], QQ.valuation(2)) sage: w = K.valuation(v) sage: w.residue_ring() Fraction Field of Univariate Polynomial Ring in x over Finite Field of size 2 (using ...)
sage: R.<x> = QQ[] sage: vv = v.augmentation(x, 1) sage: w = K.valuation(vv) sage: w.residue_ring() Fraction Field of Univariate Polynomial Ring in x over Finite Field of size 2 (using ...)
"""
r""" Valuation of a finite place of a function field.
EXAMPLES::
sage: K.<x> = FunctionField(QQ) sage: v = K.valuation(x + 1); v # indirect doctest (x + 1)-adic valuation
A finite place with residual degree::
sage: w = K.valuation(x^2 + 1); w (x^2 + 1)-adic valuation
A finite place with ramification::
sage: K.<t> = FunctionField(GF(3)) sage: L.<x> = FunctionField(K) sage: u = L.valuation(x^3 - t); u (x^3 + 2*t)-adic valuation
A finite place with residual degree and ramification::
sage: q = L.valuation(x^6 - t); q (x^6 + 2*t)-adic valuation
""" r""" TESTS::
sage: K.<x> = FunctionField(QQ) sage: v = K.valuation(x + 1) sage: from sage.rings.function_field.function_field_valuation import FiniteRationalFunctionFieldValuation sage: isinstance(v, FiniteRationalFunctionFieldValuation) True
"""
r""" Valuation induced by a valuation on the underlying polynomial ring which is non-classical.
EXAMPLES::
sage: K.<x> = FunctionField(QQ) sage: v = GaussValuation(QQ['x'], QQ.valuation(2)) sage: w = K.valuation(v); w # indirect doctest 2-adic valuation
""" r""" TESTS:
There is some support for discrete pseudo-valuations on rational function fields in the code. However, since these valuations must send elments to `-\infty`, they are not supported yet::
sage: R.<x> = QQ[] sage: v = GaussValuation(QQ['x'], QQ.valuation(2)).augmentation(x, infinity) sage: K.<x> = FunctionField(QQ) sage: w = K.valuation(v) sage: from sage.rings.function_field.function_field_valuation import NonClassicalRationalFunctionFieldValuation sage: isinstance(w, NonClassicalRationalFunctionFieldValuation) True
"""
r""" A valuation on a finite extensions of function fields `L=K[y]/(G)` where `K` is another function field.
EXAMPLES::
sage: K.<x> = FunctionField(QQ) sage: R.<y> = K[] sage: L.<y> = K.extension(y^2 - (x^2 + x + 1)) sage: v = K.valuation(x - 1) # indirect doctest sage: w = v.extension(L); w (x - 1)-adic valuation
""" r""" TESTS::
sage: K.<x> = FunctionField(QQ) sage: R.<y> = K[] sage: L.<y> = K.extension(y^2 - (x^2 + x + 1)) sage: v = K.valuation(x - 1) # indirect doctest sage: w = v.extension(L) sage: from sage.rings.function_field.function_field_valuation import FunctionFieldFromLimitValuation sage: isinstance(w, FunctionFieldFromLimitValuation) True
"""
r""" Return ``f`` as an element of the domain of the underlying limit valuation.
EXAMPLES::
sage: K.<x> = FunctionField(QQ) sage: R.<y> = K[] sage: L.<y> = K.extension(y^2 - (x^2 + x + 1)) sage: v = K.valuation(x - 1) # indirect doctest sage: w = v.extension(L) sage: w._to_base_domain(y).parent() Univariate Polynomial Ring in y over Rational function field in x over Rational Field
"""
r""" Return this valuation scaled by ``scalar``.
EXAMPLES::
sage: K.<x> = FunctionField(QQ) sage: R.<y> = K[] sage: L.<y> = K.extension(y^2 - (x^2 + x + 1)) sage: v = K.valuation(x - 1) # indirect doctest sage: w = v.extension(L) sage: 3*w 3 * (x - 1)-adic valuation
""" return super(FunctionFieldFromLimitValuation, self).scale(scalar)
r""" A valuation on a function field which relies on a ``base_valuation`` on an isomorphic function field.
EXAMPLES::
sage: K.<x> = FunctionField(GF(2)) sage: v = K.valuation(1/x); v Valuation at the infinite place
""" r""" TESTS::
sage: K.<x> = FunctionField(GF(2)) sage: v = K.valuation(1/x) sage: from sage.rings.function_field.function_field_valuation import FunctionFieldMappedValuation_base sage: isinstance(v, FunctionFieldMappedValuation_base) True
"""
r""" Return ``f`` as an element in the domain of ``_base_valuation``.
EXAMPLES::
sage: K.<x> = FunctionField(GF(2)) sage: R.<y> = K[] sage: L.<y> = K.extension(y^2 + y + x^3) sage: v = K.valuation(1/x) sage: w = v.extension(L) sage: w._to_base_domain(y) x^2*y
"""
r""" Return ``f`` as an element in the domain of this valuation.
EXAMPLES::
sage: K.<x> = FunctionField(GF(2)) sage: R.<y> = K[] sage: L.<y> = K.extension(y^2 + y + x^3) sage: v = K.valuation(1/x) sage: w = v.extension(L) sage: w._from_base_domain(w._to_base_domain(y)) y
r"""
r""" Return this valuation scaled by ``scalar``.
EXAMPLES::
sage: K.<x> = FunctionField(GF(2)) sage: R.<y> = K[] sage: L.<y> = K.extension(y^2 + y + x^3) sage: v = K.valuation(1/x) sage: w = v.extension(L) sage: 3*w 3 * (x)-adic valuation (in Rational function field in x over Finite Field of size 2 after x |--> 1/x)
""" return super(FunctionFieldMappedValuation_base, self).scale(scalar)
r""" Return a printable representation of this valuation.
EXAMPLES::
sage: K.<x> = FunctionField(GF(2)) sage: R.<y> = K[] sage: L.<y> = K.extension(y^2 + y + x^3) sage: v = K.valuation(1/x) sage: v.extension(L) # indirect doctest Valuation at the infinite place
"""
r""" Return whether this is a discrete valuation.
EXAMPLES::
sage: K.<x> = FunctionField(QQ) sage: R.<y> = K[] sage: L.<y> = K.extension(y^2 - x^4 - 1) sage: v = K.valuation(1/x) sage: w0,w1 = v.extensions(L) sage: w0.is_discrete_valuation() True
"""
r""" Valuation on a rational function field that is implemented after a map to an isomorphic (rational) function field.
EXAMPLES::
sage: K.<x> = FunctionField(QQ) sage: R.<x> = QQ[] sage: w = GaussValuation(R, QQ.valuation(2)).augmentation(x, 1) sage: w = K.valuation(w) sage: v = K.valuation((w, K.hom([~K.gen()]), K.hom([~K.gen()]))); v Valuation on rational function field induced by [ Gauss valuation induced by 2-adic valuation, v(x) = 1 ] (in Rational function field in x over Rational Field after x |--> 1/x)
""" r""" TESTS::
sage: K.<x> = FunctionField(QQ) sage: R.<x> = QQ[] sage: w = GaussValuation(R, QQ.valuation(2)).augmentation(x, 1) sage: w = K.valuation(w) sage: v = K.valuation((w, K.hom([~K.gen()]), K.hom([~K.gen()]))) sage: from sage.rings.function_field.function_field_valuation import RationalFunctionFieldMappedValuation sage: isinstance(v, RationalFunctionFieldMappedValuation) True
"""
r""" Valuation of the infinite place of a function field.
EXAMPLES::
sage: K.<x> = FunctionField(QQ) sage: v = K.valuation(1/x) # indirect doctest
""" r""" TESTS::
sage: K.<x> = FunctionField(QQ) sage: v = K.valuation(1/x) # indirect doctest sage: from sage.rings.function_field.function_field_valuation import InfiniteRationalFunctionFieldValuation sage: isinstance(v, InfiniteRationalFunctionFieldValuation) True
"""
r""" Return a printable representation of this valuation.
EXAMPLES::
sage: K.<x> = FunctionField(QQ) sage: K.valuation(1/x) # indirect doctest Valuation at the infinite place
"""
r""" A valuation on a finite extensions of function fields `L=K[y]/(G)` where `K` is another function field which redirects to another ``base_valuation`` on an isomorphism function field `M=K[y]/(H)`.
The isomorphisms must be trivial on ``K``.
EXAMPLES::
sage: K.<x> = FunctionField(GF(2)) sage: R.<y> = K[] sage: L.<y> = K.extension(y^2 + y + x^3) sage: v = K.valuation(1/x) sage: w = v.extension(L)
sage: w(x) -1 sage: w(y) -3/2 sage: w.uniformizer() 1/x^2*y
TESTS::
sage: from sage.rings.function_field.function_field_valuation import FunctionFieldExtensionMappedValuation sage: isinstance(w, FunctionFieldExtensionMappedValuation) True
""" r""" Return a printable representation of this valuation.
EXAMPLES::
sage: K.<x> = FunctionField(GF(2)) sage: R.<y> = K[] sage: L.<y> = K.extension(y^2 + y + x^3) sage: v = K.valuation(1/x) sage: w = v.extension(L); w Valuation at the infinite place
sage: K.<x> = FunctionField(QQ) sage: R.<y> = K[] sage: L.<y> = K.extension(y^2 - 1/x^2 - 1) sage: v = K.valuation(1/x) sage: w = v.extensions(L); w [[ Valuation at the infinite place, v(y + 1) = 2 ]-adic valuation, [ Valuation at the infinite place, v(y - 1) = 2 ]-adic valuation]
""" return super(FunctionFieldExtensionMappedValuation, self)._repr_()
r""" Return the restriction of this valuation to ``ring``.
EXAMPLES::
sage: K.<x> = FunctionField(GF(2)) sage: R.<y> = K[] sage: L.<y> = K.extension(y^2 + y + x^3) sage: v = K.valuation(1/x) sage: w = v.extension(L) sage: w.restriction(K) is v True
""" return super(FunctionFieldMappedValuation, self).restriction(ring) |