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
""" Fixed modulus template for complete discrete valuation rings.
In order to use this template you need to write a linkage file and gluing file. For an example see mpz_linkage.pxi (linkage file) and padic_fixed_modulus_element.pyx (gluing file).
The linkage file implements a common API that is then used in the class FMElement defined here. See sage/libs/linkages/padics/API.pxi for the functions needed.
The gluing file does the following:
- ctypedef's celement to be the appropriate type (e.g. mpz_t) - includes the linkage file - includes this template - defines a concrete class inheriting from FMElement, and implements any desired extra methods
AUTHORS:
- David Roe (2012-03-01) -- initial version """
#***************************************************************************** # Copyright (C) 2007-2012 David Roe <roed.math@gmail.com> # William Stein <wstein@gmail.com> # # 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/ #*****************************************************************************
include "padic_template_element.pxi" from cpython.int cimport *
from sage.structure.element cimport Element from sage.rings.padics.common_conversion cimport comb_prec, _process_args_and_kwds from sage.rings.integer_ring import ZZ from sage.rings.rational_field import QQ from sage.categories.sets_cat import Sets from sage.categories.sets_with_partial_maps import SetsWithPartialMaps from sage.categories.homset import Hom
cdef class FMElement(pAdicTemplateElement): cdef int _set(self, x, long val, long xprec, absprec, relprec) except -1: """ Sets the value of this element from given defining data.
This function is intended for use in conversion, and should not be called on an element created with :meth:`_new_c`.
INPUT:
- ``x`` -- data defining a `p`-adic element: int, long, Integer, Rational, other `p`-adic element...
- ``val`` -- the valuation of the resulting element (unused; for compatibility with other `p`-adic precision modes)
- ``xprec -- an inherent precision of ``x`` (unused; for compatibility with other `p`-adic precision modes)
- ``absprec`` -- an absolute precision cap for this element (unused; for compatibility with other `p`-adic precision modes)
- ``relprec`` -- a relative precision cap for this element (unused; for compatibility with other `p`-adic precision modes)
TESTS::
sage: R = ZpFM(5) sage: a = R(17,5); a #indirect doctest 2 + 3*5 + O(5^20) sage: R = ZpFM(5,5) sage: a = R(25/9); a #indirect doctest 4*5^2 + 2*5^3 + O(5^5) """ cshift(self.value, (<FMElement>x).value, 0, 0, self.prime_pow, False) else:
cdef FMElement _new_c(self): """ Creates a new element with the same basic info.
TESTS::
sage: R = ZpFM(5); R(6) * R(7) #indirect doctest 2 + 3*5 + 5^2 + O(5^20) """
cdef pAdicTemplateElement _new_with_value(self, celement value, long absprec): """ Creates a new element with a given value and absolute precision.
Used by code that doesn't know the precision type. """
cdef int _get_unit(self, celement value) except -1: """ Sets ``value`` to the unit of this p-adic element. """
cdef int check_preccap(self) except -1: """ Check that the precision of this element does not exceed the precision cap. Does nothing for fixed mod elements.
TESTS::
sage: ZpFM(5)(1).lift_to_precision(30) # indirect doctest 1 + O(5^20) """ pass
def __copy__(self): """ Return a copy of this element.
EXAMPLES::
sage: a = ZpFM(5,6)(17); b = copy(a) sage: a == b True sage: a is b False """
def __dealloc__(self): """ Deallocate the underlying data structure.
TESTS::
sage: R = ZpFM(5) sage: a = R(17) sage: del(a) """
def __reduce__(self): """ Return a tuple of a function and data that can be used to unpickle this element.
EXAMPLES::
sage: a = ZpFM(5)(-3) sage: type(a) <type 'sage.rings.padics.padic_fixed_mod_element.pAdicFixedModElement'> sage: loads(dumps(a)) == a True """
cpdef _neg_(self): r""" Return the additive inverse of this element.
EXAMPLES::
sage: R = Zp(7, 4, 'fixed-mod', 'series') sage: -R(7) #indirect doctest 6*7 + 6*7^2 + 6*7^3 + O(7^4) """
cpdef _add_(self, _right): r""" Return the sum of this element and ``_right``.
EXAMPLES::
sage: R = Zp(7, 4, 'fixed-mod', 'series') sage: x = R(1721); x 6 + 5*7^3 + O(7^4) sage: y = R(1373); y 1 + 4*7^3 + O(7^4) sage: x + y #indirect doctest 7 + 2*7^3 + O(7^4) """
cpdef _sub_(self, _right): r""" Return the difference of this element and ``_right``.
EXAMPLES::
sage: R = Zp(7, 4, 'fixed-mod', 'series') sage: x = R(1721); x 6 + 5*7^3 + O(7^4) sage: y = R(1373); y 1 + 4*7^3 + O(7^4) sage: x - y #indirect doctest 5 + 7^3 + O(7^4) """
def __invert__(self): r""" Returns multiplicative inverse of this element. The valuation of ``self`` must be zero.
EXAMPLES::
sage: R = Zp(7, 4, 'fixed-mod', 'series') sage: ~R(2) 4 + 3*7 + 3*7^2 + 3*7^3 + O(7^4) sage: ~R(0) Traceback (most recent call last): ... ValueError: cannot invert non-unit sage: ~R(7) Traceback (most recent call last): ... ValueError: cannot invert non-unit """
cpdef _mul_(self, _right): r""" Return the product of this element and ``_right``.
EXAMPLES::
sage: R = Zp(7, 4, 'fixed-mod', 'series') sage: R(3) * R(2) #indirect doctest 6 + O(7^4) sage: R(1/2) * R(2) 1 + O(7^4) """
cpdef _div_(self, _right): r""" Return the quotient of this element and ``right``. ``right`` must have valuation zero.
EXAMPLES::
sage: R = Zp(7, 4, 'fixed-mod', 'series') sage: R(3) / R(2) #indirect doctest 5 + 3*7 + 3*7^2 + 3*7^3 + O(7^4) sage: R(5) / R(0) Traceback (most recent call last): ... ValueError: cannot invert non-unit sage: R(7) / R(49) Traceback (most recent call last): ... ValueError: cannot invert non-unit """
def __pow__(FMElement self, _right, dummy): # NOTE: dummy ignored, always use self.prime_pow.prec_cap """ Exponentiation by an integer
EXAMPLES::
sage: R = ZpFM(11, 5) sage: R(1/2)^5 10 + 7*11 + 11^2 + 5*11^3 + 4*11^4 + O(11^5) sage: R(1/32) 10 + 7*11 + 11^2 + 5*11^3 + 4*11^4 + O(11^5) sage: R(1/2)^5 == R(1/32) True sage: R(3)^1000 #indirect doctest 1 + 4*11^2 + 3*11^3 + 7*11^4 + O(11^5)
TESTS:
We check that :trac:`15640` is resolved::
sage: R(11)^-1 Traceback (most recent call last): ... ValueError: cannot invert non-unit """
cdef pAdicTemplateElement _lshift_c(self, long shift): """ Multiplies self by `\pi^{shift}`.
If shift < -self.valuation(), digits will be truncated. See :meth:`__rshift__` for details.
EXAMPLES:
We create a fixed modulus ring::
sage: R = ZpFM(5, 20); a = R(1000); a 3*5^3 + 5^4 + O(5^20)
Shifting to the right is the same as dividing by a power of the uniformizer `\pi` of the `p`-adic ring.::
sage: a >> 1 3*5^2 + 5^3 + O(5^20)
Shifting to the left is the same as multiplying by a power of `\pi`::
sage: a << 2 3*5^5 + 5^6 + O(5^20) sage: a*5^2 3*5^5 + 5^6 + O(5^20)
Shifting by a negative integer to the left is the same as right shifting by the absolute value::
sage: a << -3 3 + 5 + O(5^20) sage: a >> 3 3 + 5 + O(5^20) """ csetzero(ans.value, ans.prime_pow) else:
cdef pAdicTemplateElement _rshift_c(self, long shift): """ Divides by `\pi^{shift}`, and truncates.
Note that this operation will insert arbitrary digits (in practice, currently all zero) in the least significant digits.
EXAMPLES::
sage: R = ZpFM(997, 7); a = R(123456878908); a 964*997 + 572*997^2 + 124*997^3 + O(997^7)
Shifting to the right divides by a power of `\pi`, but dropping terms with negative valuation::
sage: a >> 3 124 + O(997^7)
A negative shift multiplies by that power of `\pi`::
sage: a >> -3 964*997^4 + 572*997^5 + 124*997^6 + O(997^7) """ csetzero(ans.value, ans.prime_pow) else:
def add_bigoh(self, absprec): """ Returns a new element truncated modulo `\pi^{\mbox{absprec}}`.
INPUT:
- ``absprec`` -- an integer or infinity
OUTPUT:
- a new element truncated modulo `\pi^{\mbox{absprec}}`.
EXAMPLES::
sage: R = Zp(7,4,'fixed-mod','series'); a = R(8); a.add_bigoh(1) 1 + O(7^4)
TESTS:
We handle very large and very small values for ``absprec`` correctly::
sage: a = R(7) sage: a.add_bigoh(2^1000) 7 + O(7^4) sage: a.add_bigoh(-2^1000) 0
""" cdef long aprec else: absprec = Integer(absprec) else:
cpdef bint _is_exact_zero(self) except -1: """ Tests whether this element is an exact zero, which is always False for fixed modulus elements.
EXAMPLES::
sage: R = Zp(7,4,'fixed-mod','series'); a = R(8); a._is_exact_zero() False """
cpdef bint _is_inexact_zero(self) except -1: """ Returns True if self is indistinguishable from zero.
EXAMPLES::
sage: R = ZpFM(7, 5) sage: R(14)._is_inexact_zero() False sage: R(0)._is_inexact_zero() True """
def is_zero(self, absprec = None): r""" Returns whether self is zero modulo `\pi^{\mbox{absprec}}`.
INPUT:
- ``absprec`` -- an integer
EXAMPLES::
sage: R = ZpFM(17, 6) sage: R(0).is_zero() True sage: R(17^6).is_zero() True sage: R(17^2).is_zero(absprec=2) True """ absprec = Integer(absprec)
def __nonzero__(self): """ Returns True if this element is distinguishable from zero.
For most applications, explicitly specifying the power of p modulo which the element is supposed to be nonzero is preferrable.
EXAMPLES::
sage: R = ZpFM(5); a = R(0); b = R(75) sage: bool(a), bool(b) # indirect doctest (False, True) """
def is_equal_to(self, _right, absprec=None): r""" Returns whether this element is equal to ``right`` modulo `p^{\mbox{absprec}}`.
If ``absprec`` is ``None``, returns if ``self == 0``.
INPUT:
- ``right`` -- a p-adic element with the same parent - ``absprec`` -- a positive integer or ``None`` (default: ``None``)
EXAMPLES::
sage: R = ZpFM(2, 6) sage: R(13).is_equal_to(R(13)) True sage: R(13).is_equal_to(R(13+2^10)) True sage: R(13).is_equal_to(R(17), 2) True sage: R(13).is_equal_to(R(17), 5) False """ cdef FMElement right cdef long aprec, rprec, sval, rval else: right = self.parent()(_right) # The default absolute precision is given by the precision cap else: absprec = Integer(absprec) # If absprec is not positive, then self and right are always # equal. return True # If absprec is bigger than the precision cap, we use it # instead. else: right.value, aprec, aprec < self.prime_pow.prec_cap, aprec < right.prime_pow.prec_cap,
cdef int _cmp_units(self, pAdicGenericElement _right) except -2: """ Comparison of units, used in equality testing.
EXAMPLES::
sage: R = ZpFM(5) sage: a = R(17); b = R(0,3); c = R(85,7); d = R(2, 1) sage: any([a == b, a == c, b == c, b == d, c == d, a == d]) # indirect doctest False sage: all([a == a, b == b, c == c, d == d]) True """
cdef pAdicTemplateElement lift_to_precision_c(self, long absprec): """ Lifts this element to another with precision at least absprec.
Since fixed modulus elements don't track precision, this function just returns the same element.
EXAMPLES::
sage: R = ZpFM(5); sage: a = R(77, 2); a 2 + 3*5^2 + O(5^20) sage: a.lift_to_precision(17) # indirect doctest 2 + 3*5^2 + O(5^20) """
def _teichmuller_set_unsafe(self): """ Sets this element to the Teichmuller representative with the same residue.
.. WARNING::
This function modifies the element, which is not safe. Elements are supposed to be immutable.
EXAMPLES::
sage: R = ZpFM(17,5); a = R(11) sage: a 11 + O(17^5) sage: a._teichmuller_set_unsafe(); a 11 + 14*17 + 2*17^2 + 12*17^3 + 15*17^4 + O(17^5) sage: E = a.expansion(lift_mode='teichmuller'); E 17-adic expansion of 11 + 14*17 + 2*17^2 + 12*17^3 + 15*17^4 + O(17^5) (teichmuller) sage: list(E) [11 + 14*17 + 2*17^2 + 12*17^3 + 15*17^4 + O(17^5), O(17^5), O(17^5), O(17^5), O(17^5)]
Note that if you set an element which is congruent to 0 you get 0 to maximum precision::
sage: b = R(17*5); b 5*17 + O(17^5) sage: b._teichmuller_set_unsafe(); b O(17^5) """ else:
def polynomial(self, var='x'): """ Returns a polynomial over the base ring that yields this element when evaluated at the generator of the parent.
INPUT:
- ``var`` -- string, the variable name for the polynomial
EXAMPLES::
sage: R.<a> = ZqFM(5^3) sage: a.polynomial() (1 + O(5^20))*x + (O(5^20)) sage: a.polynomial(var='y') (1 + O(5^20))*y + (O(5^20)) sage: (5*a^2 + 25).polynomial() (5 + O(5^20))*x^2 + (O(5^20))*x + (5^2 + O(5^20)) """ else: L = [R(c, (prec - i - 1) // e + 1) for i, c in enumerate(L)]
def precision_absolute(self): """ The absolute precision of this element.
EXAMPLES::
sage: R = Zp(7,4,'fixed-mod'); a = R(7); a.precision_absolute() 4 """
def precision_relative(self): r""" The relative precision of this element.
EXAMPLES::
sage: R = Zp(7,4,'fixed-mod'); a = R(7); a.precision_relative() 3 sage: a = R(0); a.precision_relative() 0 """
cpdef pAdicTemplateElement unit_part(FMElement self): r""" Returns the unit part of self.
If the valuation of self is positive, then the high digits of the result will be zero.
EXAMPLES::
sage: R = Zp(17, 4, 'fixed-mod') sage: R(5).unit_part() 5 + O(17^4) sage: R(18*17).unit_part() 1 + 17 + O(17^4) sage: R(0).unit_part() O(17^4) sage: type(R(5).unit_part()) <type 'sage.rings.padics.padic_fixed_mod_element.pAdicFixedModElement'> sage: R = ZpFM(5, 5); a = R(75); a.unit_part() 3 + O(5^5) """
cdef long valuation_c(self): """ Returns the valuation of this element.
TESTS::
sage: R = ZpFM(5, 5); R(0).valuation() #indirect doctest 5 sage: R = Zp(17, 4,'fixed-mod') sage: a = R(2*17^2) sage: a.valuation() 2 sage: R = Zp(5, 4,'fixed-mod') sage: R(0).valuation() 4 sage: R(1).valuation() 0 sage: R(2).valuation() 0 sage: R(5).valuation() 1 sage: R(10).valuation() 1 sage: R(25).valuation() 2 sage: R(50).valuation() 2 """ # for backward compatibility
cpdef val_unit(self): """ Returns a 2-tuple, the first element set to the valuation of self, and the second to the unit part of self.
If self == 0, then the unit part is O(p^self.parent().precision_cap()).
EXAMPLES::
sage: R = ZpFM(5,5) sage: a = R(75); b = a - a sage: a.val_unit() (2, 3 + O(5^5)) sage: b.val_unit() (5, O(5^5)) """
def __hash__(self): """ Hashing.
EXAMPLES::
sage: R = ZpFM(11, 5) sage: hash(R(3)) == hash(3) True """
cdef class pAdicCoercion_ZZ_FM(RingHomomorphism): """ The canonical inclusion from ZZ to a fixed modulus ring.
EXAMPLES::
sage: f = ZpFM(5).coerce_map_from(ZZ); f Ring morphism: From: Integer Ring To: 5-adic Ring of fixed modulus 5^20
TESTS::
sage: TestSuite(f).run()
""" def __init__(self, R): """ Initialization.
EXAMPLES::
sage: f = ZpFM(5).coerce_map_from(ZZ); type(f) <type 'sage.rings.padics.padic_fixed_mod_element.pAdicCoercion_ZZ_FM'> """
cdef dict _extra_slots(self): """ Helper for copying and pickling.
EXAMPLES::
sage: f = ZpFM(5).coerce_map_from(ZZ) sage: g = copy(f) # indirect doctest sage: g == f True sage: g(6) 1 + 5 + O(5^20) sage: g(6) == f(6) True """
cdef _update_slots(self, dict _slots): """ Helper for copying and pickling.
EXAMPLES::
sage: f = ZpFM(5).coerce_map_from(ZZ) sage: g = copy(f) # indirect doctest sage: g == f True sage: g(6) 1 + 5 + O(5^20) sage: g(6) == f(6) True """
cpdef Element _call_(self, x): """ Evaluation.
EXAMPLES::
sage: f = ZpFM(5).coerce_map_from(ZZ) sage: f(0).parent() 5-adic Ring of fixed modulus 5^20 sage: f(5) 5 + O(5^20) """
cpdef Element _call_with_args(self, x, args=(), kwds={}): """ This function is used when some precision cap is passed in (relative or absolute or both).
INPUT:
- ``x`` -- an Integer
- ``absprec``, or the first positional argument -- the maximum absolute precision (unused for fixed modulus elements).
- ``relprec``, or the second positional argument -- the maximum relative precision (unused for fixed modulus elements)
EXAMPLES::
sage: R = ZpFM(5,4) sage: type(R(10,2)) <type 'sage.rings.padics.padic_fixed_mod_element.pAdicFixedModElement'> sage: R(30,2) 5 + 5^2 + O(5^4) sage: R(30,3,1) 5 + 5^2 + O(5^4) sage: R(30,absprec=2) 5 + 5^2 + O(5^4) sage: R(30,relprec=2) 5 + 5^2 + O(5^4) sage: R(30,absprec=1) 5 + 5^2 + O(5^4) sage: R(30,empty=True) 5 + 5^2 + O(5^4) """
def section(self): """ Returns a map back to ZZ that approximates an element of this `p`-adic ring by an integer.
EXAMPLES::
sage: f = ZpFM(5).coerce_map_from(ZZ).section() sage: f(ZpFM(5)(-1)) - 5^20 -1 """
cdef class pAdicConvert_FM_ZZ(RingMap): """ The map from a fixed modulus ring back to ZZ that returns the smallest non-negative integer approximation to its input which is accurate up to the precision.
If the input is not in the closure of the image of ZZ, raises a ValueError.
EXAMPLES::
sage: f = ZpFM(5).coerce_map_from(ZZ).section(); f Set-theoretic ring morphism: From: 5-adic Ring of fixed modulus 5^20 To: Integer Ring """ def __init__(self, R): """ Initialization.
EXAMPLES::
sage: f = ZpFM(5).coerce_map_from(ZZ).section(); type(f) <type 'sage.rings.padics.padic_fixed_mod_element.pAdicConvert_FM_ZZ'> sage: f.category() Category of homsets of sets """ else:
cpdef Element _call_(self, _x): """ Evaluation.
EXAMPLES::
sage: f = ZpFM(5).coerce_map_from(ZZ).section() sage: f(ZpFM(5)(-1)) - 5^20 -1 sage: f(ZpFM(5)(0)) 0 """
cdef class pAdicConvert_QQ_FM(Morphism): """ The inclusion map from QQ to a fixed modulus ring that is defined on all elements with non-negative p-adic valuation.
EXAMPLES::
sage: f = ZpFM(5).convert_map_from(QQ); f Generic morphism: From: Rational Field To: 5-adic Ring of fixed modulus 5^20 """ def __init__(self, R): """ Initialization.
EXAMPLES::
sage: f = ZpFM(5).convert_map_from(QQ); type(f) <type 'sage.rings.padics.padic_fixed_mod_element.pAdicConvert_QQ_FM'> """
cdef dict _extra_slots(self): """ Helper for copying and pickling.
EXAMPLES::
sage: f = ZpFM(5).convert_map_from(QQ) sage: g = copy(f) # indirect doctest sage: g == f # todo: comparison not implemented True sage: g(1/6) 1 + 4*5 + 4*5^3 + 4*5^5 + 4*5^7 + 4*5^9 + 4*5^11 + 4*5^13 + 4*5^15 + 4*5^17 + 4*5^19 + O(5^20) sage: g(1/6) == f(1/6) True """
cdef _update_slots(self, dict _slots): """ Helper for copying and pickling.
EXAMPLES::
sage: f = ZpFM(5).convert_map_from(QQ) sage: g = copy(f) # indirect doctest sage: g == f # todo: comparison not implemented True sage: g(1/6) 1 + 4*5 + 4*5^3 + 4*5^5 + 4*5^7 + 4*5^9 + 4*5^11 + 4*5^13 + 4*5^15 + 4*5^17 + 4*5^19 + O(5^20) sage: g(1/6) == f(1/6) True """
cpdef Element _call_(self, x): """ Evaluation.
EXAMPLES::
sage: f = ZpFM(5,4).convert_map_from(QQ) sage: f(1/7) 3 + 3*5 + 2*5^3 + O(5^4) sage: f(0) O(5^4) """
cpdef Element _call_with_args(self, x, args=(), kwds={}): """ This function is used when some precision cap is passed in (relative or absolute or both).
INPUT:
- ``x`` -- a Rational
- ``absprec``, or the first positional argument -- the maximum absolute precision (unused for fixed modulus elements).
- ``relprec``, or the second positional argument -- the maximum relative precision (unused for fixed modulus elements)
EXAMPLES::
sage: R = ZpFM(5,4) sage: type(R(1/7,2)) <type 'sage.rings.padics.padic_fixed_mod_element.pAdicFixedModElement'> sage: R(1/7,2) 3 + 3*5 + 2*5^3 + O(5^4) sage: R(1/7,3,1) 3 + 3*5 + 2*5^3 + O(5^4) sage: R(1/7,absprec=2) 3 + 3*5 + 2*5^3 + O(5^4) sage: R(1/7,relprec=2) 3 + 3*5 + 2*5^3 + O(5^4) sage: R(1/7,absprec=1) 3 + 3*5 + 2*5^3 + O(5^4) sage: R(1/7,empty=True) 3 + 3*5 + 2*5^3 + O(5^4) """
cdef class pAdicCoercion_FM_frac_field(RingHomomorphism): """ The canonical inclusion of Zq into its fraction field.
EXAMPLES::
sage: R.<a> = ZqFM(27, implementation='FLINT') sage: K = R.fraction_field() sage: f = K.coerce_map_from(R); f Ring morphism: From: Unramified Extension in a defined by x^3 + 2*x + 1 of fixed modulus 3^20 over 3-adic Ring To: Unramified Extension in a defined by x^3 + 2*x + 1 with floating precision 20 over 3-adic Field
TESTS::
sage: TestSuite(f).run()
""" def __init__(self, R, K): """ Initialization.
EXAMPLES::
sage: R.<a> = ZqFM(27) sage: K = R.fraction_field() sage: f = K.coerce_map_from(R); type(f) <type 'sage.rings.padics.qadic_flint_FM.pAdicCoercion_FM_frac_field'> """
cpdef Element _call_(self, _x): """ Evaluation.
EXAMPLES::
sage: R.<a> = ZqFM(27) sage: K = R.fraction_field() sage: f = K.coerce_map_from(R) sage: f(a) a """
cpdef Element _call_with_args(self, _x, args=(), kwds={}): """ This function is used when some precision cap is passed in (relative or absolute or both).
See the documentation for :meth:`pAdicCappedAbsoluteElement.__init__` for more details.
EXAMPLES::
sage: R.<a> = ZqFM(27) sage: K = R.fraction_field() sage: f = K.coerce_map_from(R) sage: f(a, 3) a sage: b = 117*a sage: f(b, 3) a*3^2 sage: f(b, 4, 1) a*3^2 sage: f(b, 4, 3) a*3^2 + a*3^3 sage: f(b, absprec=4) a*3^2 + a*3^3 sage: f(b, relprec=3) a*3^2 + a*3^3 + a*3^4 sage: f(b, absprec=1) 0 sage: f(R(0)) 0 """ cdef long aprec, rprec
def section(self): """ Returns a map back to the ring that converts elements of non-negative valuation.
EXAMPLES::
sage: R.<a> = ZqFM(27) sage: K = R.fraction_field() sage: f = K.coerce_map_from(R) sage: f.section()(K.gen()) a + O(3^20) """ import copy self._section = copy.copy(self._section)
cdef dict _extra_slots(self): """ Helper for copying and pickling.
TESTS::
sage: R.<a> = ZqFM(27) sage: K = R.fraction_field() sage: f = K.coerce_map_from(R) sage: g = copy(f) # indirect doctest sage: g Ring morphism: From: Unramified Extension in a defined by x^3 + 2*x + 1 of fixed modulus 3^20 over 3-adic Ring To: Unramified Extension in a defined by x^3 + 2*x + 1 with floating precision 20 over 3-adic Field sage: g == f True sage: g is f False sage: g(a) a sage: g(a) == f(a) True """
cdef _update_slots(self, dict _slots): """ Helper for copying and pickling.
TESTS::
sage: R.<a> = ZqFM(9) sage: K = R.fraction_field() sage: f = K.coerce_map_from(R) sage: g = copy(f) # indirect doctest sage: g Ring morphism: From: Unramified Extension in a defined by x^2 + 2*x + 2 of fixed modulus 3^20 over 3-adic Ring To: Unramified Extension in a defined by x^2 + 2*x + 2 with floating precision 20 over 3-adic Field sage: g == f True sage: g is f False sage: g(a) a sage: g(a) == f(a) True
"""
def is_injective(self): r""" Return whether this map is injective.
EXAMPLES::
sage: R.<a> = ZqFM(9) sage: K = R.fraction_field() sage: f = K.coerce_map_from(R) sage: f.is_injective() True
"""
def is_surjective(self): r""" Return whether this map is surjective.
EXAMPLES::
sage: R.<a> = ZqFM(9) sage: K = R.fraction_field() sage: f = K.coerce_map_from(R) sage: f.is_surjective() False
"""
cdef class pAdicConvert_FM_frac_field(Morphism): """ The section of the inclusion from `\ZZ_q`` to its fraction field.
EXAMPLES::
sage: R.<a> = ZqFM(27) sage: K = R.fraction_field() sage: f = R.convert_map_from(K); f Generic morphism: From: Unramified Extension in a defined by x^3 + 2*x + 1 with floating precision 20 over 3-adic Field To: Unramified Extension in a defined by x^3 + 2*x + 1 of fixed modulus 3^20 over 3-adic Ring """ def __init__(self, K, R): """ Initialization.
EXAMPLES::
sage: R.<a> = ZqFM(27) sage: K = R.fraction_field() sage: f = R.convert_map_from(K); type(f) <type 'sage.rings.padics.qadic_flint_FM.pAdicConvert_FM_frac_field'> """
cpdef Element _call_(self, _x): """ Evaluation.
EXAMPLES::
sage: R.<a> = ZqFM(27) sage: K = R.fraction_field() sage: f = R.convert_map_from(K) sage: f(K.gen()) a + O(3^20) """
cpdef Element _call_with_args(self, _x, args=(), kwds={}): """ This function is used when some precision cap is passed in (relative or absolute or both).
See the documentation for :meth:`pAdicCappedAbsoluteElement.__init__` for more details.
EXAMPLES::
sage: R.<a> = ZqFM(27) sage: K = R.fraction_field() sage: f = R.convert_map_from(K); a = K(a) sage: f(a, 3) a + O(3^20) sage: b = 117*a sage: f(b, 3) a*3^2 + O(3^20) sage: f(b, 4, 1) a*3^2 + O(3^20) sage: f(b, 4, 3) a*3^2 + a*3^3 + O(3^20) sage: f(b, absprec=4) a*3^2 + a*3^3 + O(3^20) sage: f(b, relprec=3) a*3^2 + a*3^3 + a*3^4 + O(3^20) sage: f(b, absprec=1) O(3^20) sage: f(K(0)) O(3^20) """ cdef long aprec, rprec return self._zero
cdef dict _extra_slots(self): """ Helper for copying and pickling.
TESTS::
sage: R.<a> = ZqFM(27) sage: K = R.fraction_field() sage: f = R.convert_map_from(K) sage: a = K(a) sage: g = copy(f) # indirect doctest sage: g Generic morphism: From: Unramified Extension in a defined by x^3 + 2*x + 1 with floating precision 20 over 3-adic Field To: Unramified Extension in a defined by x^3 + 2*x + 1 of fixed modulus 3^20 over 3-adic Ring sage: g == f True sage: g is f False sage: g(a) a + O(3^20) sage: g(a) == f(a) True """
cdef _update_slots(self, dict _slots): """ Helper for copying and pickling.
TESTS::
sage: R.<a> = ZqFM(9) sage: K = R.fraction_field() sage: f = R.convert_map_from(K) sage: a = f(a) sage: g = copy(f) # indirect doctest sage: g Generic morphism: From: Unramified Extension in a defined by x^2 + 2*x + 2 with floating precision 20 over 3-adic Field To: Unramified Extension in a defined by x^2 + 2*x + 2 of fixed modulus 3^20 over 3-adic Ring sage: g == f True sage: g is f False sage: g(a) a + O(3^20) sage: g(a) == f(a) True
"""
def unpickle_fme_v2(cls, parent, value): """ Unpickles a fixed-mod element.
EXAMPLES::
sage: from sage.rings.padics.padic_fixed_mod_element import pAdicFixedModElement, unpickle_fme_v2 sage: R = ZpFM(5) sage: a = unpickle_fme_v2(pAdicFixedModElement, R, 17*25); a 2*5^2 + 3*5^3 + O(5^20) sage: a.parent() is R True """ |