\(p\)-adic Capped Absolute Elements¶
Elements of \(p\)-adic Rings with Absolute Precision Cap
AUTHORS:
David Roe
Genya Zaytman: documentation
David Harvey: doctests
- class sage.rings.padics.padic_capped_absolute_element.CAElement[source]¶
Bases:
pAdicTemplateElement
- add_bigoh(absprec)[source]¶
Return a new element with absolute precision decreased to
absprec
. The precision never increases.INPUT:
absprec
– integer or infinity
OUTPUT:
self
with precision set to the minimum ofself
’s precision andprec
EXAMPLES:
sage: R = Zp(7,4,'capped-abs','series'); a = R(8); a.add_bigoh(1) 1 + O(7) sage: k = ZpCA(3,5) sage: a = k(41); a 2 + 3 + 3^2 + 3^3 + O(3^5) sage: a.add_bigoh(7) 2 + 3 + 3^2 + 3^3 + O(3^5) sage: a.add_bigoh(3) 2 + 3 + 3^2 + O(3^3)
>>> from sage.all import * >>> R = Zp(Integer(7),Integer(4),'capped-abs','series'); a = R(Integer(8)); a.add_bigoh(Integer(1)) 1 + O(7) >>> k = ZpCA(Integer(3),Integer(5)) >>> a = k(Integer(41)); a 2 + 3 + 3^2 + 3^3 + O(3^5) >>> a.add_bigoh(Integer(7)) 2 + 3 + 3^2 + 3^3 + O(3^5) >>> a.add_bigoh(Integer(3)) 2 + 3 + 3^2 + O(3^3)
- is_equal_to(_right, absprec=None)[source]¶
Determine whether the inputs are equal modulo \(\pi^{\mbox{absprec}}\).
INPUT:
right
– a \(p\)-adic element with the same parentabsprec
– integer, infinity, orNone
EXAMPLES:
sage: R = ZpCA(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 sage: R(13).is_equal_to(R(13+2^10),absprec=10) Traceback (most recent call last): ... PrecisionError: elements not known to enough precision
>>> from sage.all import * >>> R = ZpCA(Integer(2), Integer(6)) >>> R(Integer(13)).is_equal_to(R(Integer(13))) True >>> R(Integer(13)).is_equal_to(R(Integer(13)+Integer(2)**Integer(10))) True >>> R(Integer(13)).is_equal_to(R(Integer(17)), Integer(2)) True >>> R(Integer(13)).is_equal_to(R(Integer(17)), Integer(5)) False >>> R(Integer(13)).is_equal_to(R(Integer(13)+Integer(2)**Integer(10)),absprec=Integer(10)) Traceback (most recent call last): ... PrecisionError: elements not known to enough precision
- is_zero(absprec=None)[source]¶
Determine whether this element is zero modulo \(\pi^{\mbox{absprec}}\).
If
absprec is None
, returnsTrue
if this element is indistinguishable from zero.INPUT:
absprec
– integer, infinity, orNone
EXAMPLES:
sage: R = ZpCA(17, 6) sage: R(0).is_zero() True sage: R(17^6).is_zero() True sage: R(17^2).is_zero(absprec=2) True sage: R(17^6).is_zero(absprec=10) Traceback (most recent call last): ... PrecisionError: not enough precision to determine if element is zero
>>> from sage.all import * >>> R = ZpCA(Integer(17), Integer(6)) >>> R(Integer(0)).is_zero() True >>> R(Integer(17)**Integer(6)).is_zero() True >>> R(Integer(17)**Integer(2)).is_zero(absprec=Integer(2)) True >>> R(Integer(17)**Integer(6)).is_zero(absprec=Integer(10)) Traceback (most recent call last): ... PrecisionError: not enough precision to determine if element is zero
- polynomial(var='x')[source]¶
Return 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: # needs sage.libs.flint sage: R.<a> = ZqCA(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 + R(25, 4)).polynomial() (5 + O(5^4))*x^2 + O(5^4)*x + 5^2 + O(5^4)
>>> from sage.all import * >>> # needs sage.libs.flint >>> R = ZqCA(Integer(5)**Integer(3), names=('a',)); (a,) = R._first_ngens(1) >>> a.polynomial() (1 + O(5^20))*x + O(5^20) >>> a.polynomial(var='y') (1 + O(5^20))*y + O(5^20) >>> (Integer(5)*a**Integer(2) + R(Integer(25), Integer(4))).polynomial() (5 + O(5^4))*x^2 + O(5^4)*x + 5^2 + O(5^4)
- precision_absolute()[source]¶
The absolute precision of this element.
This is the power of the maximal ideal modulo which this element is defined.
EXAMPLES:
sage: R = Zp(7,4,'capped-abs'); a = R(7); a.precision_absolute() 4
>>> from sage.all import * >>> R = Zp(Integer(7),Integer(4),'capped-abs'); a = R(Integer(7)); a.precision_absolute() 4
- precision_relative()[source]¶
The relative precision of this element.
This is the power of the maximal ideal modulo which the unit part of this element is defined.
EXAMPLES:
sage: R = Zp(7,4,'capped-abs'); a = R(7); a.precision_relative() 3
>>> from sage.all import * >>> R = Zp(Integer(7),Integer(4),'capped-abs'); a = R(Integer(7)); a.precision_relative() 3
- unit_part()[source]¶
Return the unit part of this element.
EXAMPLES:
sage: R = Zp(17,4,'capped-abs', 'val-unit') sage: a = R(18*17) sage: a.unit_part() 18 + O(17^3) sage: type(a) <class 'sage.rings.padics.padic_capped_absolute_element.pAdicCappedAbsoluteElement'> sage: R(0).unit_part() O(17^0)
>>> from sage.all import * >>> R = Zp(Integer(17),Integer(4),'capped-abs', 'val-unit') >>> a = R(Integer(18)*Integer(17)) >>> a.unit_part() 18 + O(17^3) >>> type(a) <class 'sage.rings.padics.padic_capped_absolute_element.pAdicCappedAbsoluteElement'> >>> R(Integer(0)).unit_part() O(17^0)
- val_unit()[source]¶
Return a 2-tuple, the first element set to the valuation of this element, and the second to the unit part of this element.
For a zero element, the unit part is
O(p^0)
.EXAMPLES:
sage: R = ZpCA(5) sage: a = R(75, 6); b = a - a sage: a.val_unit() (2, 3 + O(5^4)) sage: b.val_unit() (6, O(5^0))
>>> from sage.all import * >>> R = ZpCA(Integer(5)) >>> a = R(Integer(75), Integer(6)); b = a - a >>> a.val_unit() (2, 3 + O(5^4)) >>> b.val_unit() (6, O(5^0))
- class sage.rings.padics.padic_capped_absolute_element.ExpansionIter[source]¶
Bases:
object
An iterator over a \(p\)-adic expansion.
This class should not be instantiated directly, but instead using
expansion()
.INPUT:
elt
– the \(p\)-adic elementprec
– the number of terms to be emittedmode
– eithersimple_mode
,smallest_mode
orteichmuller_mode
EXAMPLES:
sage: E = Zp(5,4)(373).expansion() sage: I = iter(E) # indirect doctest sage: type(I) <class 'sage.rings.padics.padic_capped_relative_element.ExpansionIter'>
>>> from sage.all import * >>> E = Zp(Integer(5),Integer(4))(Integer(373)).expansion() >>> I = iter(E) # indirect doctest >>> type(I) <class 'sage.rings.padics.padic_capped_relative_element.ExpansionIter'>
- class sage.rings.padics.padic_capped_absolute_element.ExpansionIterable[source]¶
Bases:
object
An iterable storing a \(p\)-adic expansion of an element.
This class should not be instantiated directly, but instead using
expansion()
.INPUT:
elt
– the \(p\)-adic elementprec
– the number of terms to be emittedval_shift
– how many zeros to add at the beginning of the expansion, or the number of initial terms to truncate (if negative)mode
– one of the following:'simple_mode'
'smallest_mode'
'teichmuller_mode'
EXAMPLES:
sage: E = Zp(5,4)(373).expansion() # indirect doctest sage: type(E) <class 'sage.rings.padics.padic_capped_relative_element.ExpansionIterable'>
>>> from sage.all import * >>> E = Zp(Integer(5),Integer(4))(Integer(373)).expansion() # indirect doctest >>> type(E) <class 'sage.rings.padics.padic_capped_relative_element.ExpansionIterable'>
- class sage.rings.padics.padic_capped_absolute_element.PowComputer_[source]¶
Bases:
PowComputer_base
A PowComputer for a capped-absolute \(p\)-adic ring.
- sage.rings.padics.padic_capped_absolute_element.make_pAdicCappedAbsoluteElement(parent, x, absprec)[source]¶
Unpickles a capped absolute element.
EXAMPLES:
sage: from sage.rings.padics.padic_capped_absolute_element import make_pAdicCappedAbsoluteElement sage: R = ZpCA(5) sage: a = make_pAdicCappedAbsoluteElement(R, 17*25, 5); a 2*5^2 + 3*5^3 + O(5^5)
>>> from sage.all import * >>> from sage.rings.padics.padic_capped_absolute_element import make_pAdicCappedAbsoluteElement >>> R = ZpCA(Integer(5)) >>> a = make_pAdicCappedAbsoluteElement(R, Integer(17)*Integer(25), Integer(5)); a 2*5^2 + 3*5^3 + O(5^5)
- class sage.rings.padics.padic_capped_absolute_element.pAdicCappedAbsoluteElement[source]¶
Bases:
CAElement
Construct new element with given parent and value.
INPUT:
x
– value to coerce into a capped absolute ringabsprec
– maximum number of digits of absolute precisionrelprec
– maximum number of digits of relative precision
EXAMPLES:
sage: R = ZpCA(3, 5) sage: R(2) 2 + O(3^5) sage: R(2, absprec=2) 2 + O(3^2) sage: R(3, relprec=2) 3 + O(3^3) sage: R(Qp(3)(10)) 1 + 3^2 + O(3^5) sage: R(pari(6)) 2*3 + O(3^5) sage: R(pari(1/2)) 2 + 3 + 3^2 + 3^3 + 3^4 + O(3^5) sage: R(1/2) 2 + 3 + 3^2 + 3^3 + 3^4 + O(3^5) sage: R(mod(-1, 3^7)) 2 + 2*3 + 2*3^2 + 2*3^3 + 2*3^4 + O(3^5) sage: R(mod(-1, 3^2)) 2 + 2*3 + O(3^2) sage: R(3 + O(3^2)) 3 + O(3^2)
>>> from sage.all import * >>> R = ZpCA(Integer(3), Integer(5)) >>> R(Integer(2)) 2 + O(3^5) >>> R(Integer(2), absprec=Integer(2)) 2 + O(3^2) >>> R(Integer(3), relprec=Integer(2)) 3 + O(3^3) >>> R(Qp(Integer(3))(Integer(10))) 1 + 3^2 + O(3^5) >>> R(pari(Integer(6))) 2*3 + O(3^5) >>> R(pari(Integer(1)/Integer(2))) 2 + 3 + 3^2 + 3^3 + 3^4 + O(3^5) >>> R(Integer(1)/Integer(2)) 2 + 3 + 3^2 + 3^3 + 3^4 + O(3^5) >>> R(mod(-Integer(1), Integer(3)**Integer(7))) 2 + 2*3 + 2*3^2 + 2*3^3 + 2*3^4 + O(3^5) >>> R(mod(-Integer(1), Integer(3)**Integer(2))) 2 + 2*3 + O(3^2) >>> R(Integer(3) + O(Integer(3)**Integer(2))) 3 + O(3^2)
- lift()[source]¶
EXAMPLES:
sage: R = ZpCA(3) sage: R(10).lift() 10 sage: R(-1).lift() 3486784400
>>> from sage.all import * >>> R = ZpCA(Integer(3)) >>> R(Integer(10)).lift() 10 >>> R(-Integer(1)).lift() 3486784400
- multiplicative_order()[source]¶
Return the minimum possible multiplicative order of this element.
OUTPUT:
The multiplicative order of
self
. This is the minimum multiplicative order of all elements of \(\ZZ_p\) liftingself
to infinite precision.EXAMPLES:
sage: R = ZpCA(7, 6) sage: R(1/3) 5 + 4*7 + 4*7^2 + 4*7^3 + 4*7^4 + 4*7^5 + O(7^6) sage: R(1/3).multiplicative_order() +Infinity sage: R(7).multiplicative_order() +Infinity sage: R(1).multiplicative_order() 1 sage: R(-1).multiplicative_order() 2 sage: R.teichmuller(3).multiplicative_order() 6
>>> from sage.all import * >>> R = ZpCA(Integer(7), Integer(6)) >>> R(Integer(1)/Integer(3)) 5 + 4*7 + 4*7^2 + 4*7^3 + 4*7^4 + 4*7^5 + O(7^6) >>> R(Integer(1)/Integer(3)).multiplicative_order() +Infinity >>> R(Integer(7)).multiplicative_order() +Infinity >>> R(Integer(1)).multiplicative_order() 1 >>> R(-Integer(1)).multiplicative_order() 2 >>> R.teichmuller(Integer(3)).multiplicative_order() 6
- residue(absprec=1, field=None, check_prec=True)[source]¶
Reduces
self
modulo \(p^\mathrm{absprec}\).INPUT:
absprec
– nonnegative integer (default: 1)field
– boolean (default:None
); whether to return an element of GF(p) or Zmod(p)check_prec
– boolean (default:True
); whether to raise an error if this element has insufficient precision to determine the reduction
OUTPUT:
This element reduced modulo \(p^\mathrm{absprec}\) as an element of \(\ZZ/p^\mathrm{absprec}\ZZ\)
EXAMPLES:
sage: R = Zp(7,10,'capped-abs') sage: a = R(8) sage: a.residue(1) 1
>>> from sage.all import * >>> R = Zp(Integer(7),Integer(10),'capped-abs') >>> a = R(Integer(8)) >>> a.residue(Integer(1)) 1
This is different from applying
% p^n
which returns an element in the same ring:sage: b = a.residue(2); b 8 sage: b.parent() Ring of integers modulo 49 sage: c = a % 7^2; c 1 + 7 + O(7^10) sage: c.parent() 7-adic Ring with capped absolute precision 10
>>> from sage.all import * >>> b = a.residue(Integer(2)); b 8 >>> b.parent() Ring of integers modulo 49 >>> c = a % Integer(7)**Integer(2); c 1 + 7 + O(7^10) >>> c.parent() 7-adic Ring with capped absolute precision 10
Note that reduction of
c
dropped to the precision of the unit part of7^2
, see_mod_()
:sage: R(7^2).unit_part() 1 + O(7^8)
>>> from sage.all import * >>> R(Integer(7)**Integer(2)).unit_part() 1 + O(7^8)
See also
_mod_()
- class sage.rings.padics.padic_capped_absolute_element.pAdicCoercion_CA_frac_field[source]¶
Bases:
RingHomomorphism
The canonical inclusion of Zq into its fraction field.
EXAMPLES:
sage: # needs sage.libs.flint sage: R.<a> = ZqCA(27, implementation='FLINT') sage: K = R.fraction_field() sage: f = K.coerce_map_from(R); f Ring morphism: From: 3-adic Unramified Extension Ring in a defined by x^3 + 2*x + 1 To: 3-adic Unramified Extension Field in a defined by x^3 + 2*x + 1
>>> from sage.all import * >>> # needs sage.libs.flint >>> R = ZqCA(Integer(27), implementation='FLINT', names=('a',)); (a,) = R._first_ngens(1) >>> K = R.fraction_field() >>> f = K.coerce_map_from(R); f Ring morphism: From: 3-adic Unramified Extension Ring in a defined by x^3 + 2*x + 1 To: 3-adic Unramified Extension Field in a defined by x^3 + 2*x + 1
- is_injective()[source]¶
Return whether this map is injective.
EXAMPLES:
sage: # needs sage.libs.flint sage: R.<a> = ZqCA(9, implementation='FLINT') sage: K = R.fraction_field() sage: f = K.coerce_map_from(R) sage: f.is_injective() True
>>> from sage.all import * >>> # needs sage.libs.flint >>> R = ZqCA(Integer(9), implementation='FLINT', names=('a',)); (a,) = R._first_ngens(1) >>> K = R.fraction_field() >>> f = K.coerce_map_from(R) >>> f.is_injective() True
- is_surjective()[source]¶
Return whether this map is surjective.
EXAMPLES:
sage: # needs sage.libs.flint sage: R.<a> = ZqCA(9, implementation='FLINT') sage: K = R.fraction_field() sage: f = K.coerce_map_from(R) sage: f.is_surjective() False
>>> from sage.all import * >>> # needs sage.libs.flint >>> R = ZqCA(Integer(9), implementation='FLINT', names=('a',)); (a,) = R._first_ngens(1) >>> K = R.fraction_field() >>> f = K.coerce_map_from(R) >>> f.is_surjective() False
- section()[source]¶
Return a map back to the ring that converts elements of nonnegative valuation.
EXAMPLES:
sage: # needs sage.libs.flint sage: R.<a> = ZqCA(27, implementation='FLINT') sage: K = R.fraction_field() sage: f = K.coerce_map_from(R) sage: f(K.gen()) a + O(3^20) sage: f.section() Generic morphism: From: 3-adic Unramified Extension Field in a defined by x^3 + 2*x + 1 To: 3-adic Unramified Extension Ring in a defined by x^3 + 2*x + 1
>>> from sage.all import * >>> # needs sage.libs.flint >>> R = ZqCA(Integer(27), implementation='FLINT', names=('a',)); (a,) = R._first_ngens(1) >>> K = R.fraction_field() >>> f = K.coerce_map_from(R) >>> f(K.gen()) a + O(3^20) >>> f.section() Generic morphism: From: 3-adic Unramified Extension Field in a defined by x^3 + 2*x + 1 To: 3-adic Unramified Extension Ring in a defined by x^3 + 2*x + 1
- class sage.rings.padics.padic_capped_absolute_element.pAdicCoercion_ZZ_CA[source]¶
Bases:
RingHomomorphism
The canonical inclusion from the ring of integers to a capped absolute ring.
EXAMPLES:
sage: f = ZpCA(5).coerce_map_from(ZZ); f Ring morphism: From: Integer Ring To: 5-adic Ring with capped absolute precision 20
>>> from sage.all import * >>> f = ZpCA(Integer(5)).coerce_map_from(ZZ); f Ring morphism: From: Integer Ring To: 5-adic Ring with capped absolute precision 20
- section()[source]¶
Return a map back to the ring of integers that approximates an element by an integer.
EXAMPLES:
sage: f = ZpCA(5).coerce_map_from(ZZ).section() sage: f(ZpCA(5)(-1)) - 5^20 -1
>>> from sage.all import * >>> f = ZpCA(Integer(5)).coerce_map_from(ZZ).section() >>> f(ZpCA(Integer(5))(-Integer(1))) - Integer(5)**Integer(20) -1
- class sage.rings.padics.padic_capped_absolute_element.pAdicConvert_CA_ZZ[source]¶
Bases:
RingMap
The map from a capped absolute ring back to the ring of integers that returns the smallest nonnegative integer approximation to its input which is accurate up to the precision.
Raises a
ValueError
if the input is not in the closure of the image of the ring of integers.EXAMPLES:
sage: f = ZpCA(5).coerce_map_from(ZZ).section(); f Set-theoretic ring morphism: From: 5-adic Ring with capped absolute precision 20 To: Integer Ring
>>> from sage.all import * >>> f = ZpCA(Integer(5)).coerce_map_from(ZZ).section(); f Set-theoretic ring morphism: From: 5-adic Ring with capped absolute precision 20 To: Integer Ring
- class sage.rings.padics.padic_capped_absolute_element.pAdicConvert_CA_frac_field[source]¶
Bases:
Morphism
The section of the inclusion from \(\ZZ_q\) to its fraction field.
EXAMPLES:
sage: # needs sage.libs.flint sage: R.<a> = ZqCA(27, implementation='FLINT') sage: K = R.fraction_field() sage: f = R.convert_map_from(K); f Generic morphism: From: 3-adic Unramified Extension Field in a defined by x^3 + 2*x + 1 To: 3-adic Unramified Extension Ring in a defined by x^3 + 2*x + 1
>>> from sage.all import * >>> # needs sage.libs.flint >>> R = ZqCA(Integer(27), implementation='FLINT', names=('a',)); (a,) = R._first_ngens(1) >>> K = R.fraction_field() >>> f = R.convert_map_from(K); f Generic morphism: From: 3-adic Unramified Extension Field in a defined by x^3 + 2*x + 1 To: 3-adic Unramified Extension Ring in a defined by x^3 + 2*x + 1
- class sage.rings.padics.padic_capped_absolute_element.pAdicConvert_QQ_CA[source]¶
Bases:
Morphism
The inclusion map from the rationals to a capped absolute ring that is defined on all elements with nonnegative \(p\)-adic valuation.
EXAMPLES:
sage: f = ZpCA(5).convert_map_from(QQ); f Generic morphism: From: Rational Field To: 5-adic Ring with capped absolute precision 20
>>> from sage.all import * >>> f = ZpCA(Integer(5)).convert_map_from(QQ); f Generic morphism: From: Rational Field To: 5-adic Ring with capped absolute precision 20
- class sage.rings.padics.padic_capped_absolute_element.pAdicTemplateElement[source]¶
Bases:
pAdicGenericElement
A class for common functionality among the \(p\)-adic template classes.
INPUT:
parent
– a local ring or fieldx
– data defining this element. Various types are supported, including ints, Integers, Rationals, PARI \(p\)-adics, integers mod \(p^k\) and other Sage \(p\)-adics.absprec
– a cap on the absolute precision of this elementrelprec
– a cap on the relative precision of this element
EXAMPLES:
sage: Zp(17)(17^3, 8, 4) 17^3 + O(17^7)
>>> from sage.all import * >>> Zp(Integer(17))(Integer(17)**Integer(3), Integer(8), Integer(4)) 17^3 + O(17^7)
- expansion(n=None, lift_mode='simple', start_val=None)[source]¶
Return the coefficients in a \(\pi\)-adic expansion. If this is a field element, start at \(\pi^{\mbox{valuation}}\), if a ring element at \(\pi^0\).
For each lift mode, this function returns a list of \(a_i\) so that this element can be expressed as
\[\pi^v \cdot \sum_{i=0}^\infty a_i \pi^i,\]where \(v\) is the valuation of this element when the parent is a field, and \(v = 0\) otherwise.
Different lift modes affect the choice of \(a_i\). When
lift_mode
is'simple'
, the resulting \(a_i\) will be nonnegative: if the residue field is \(\GF{p}\) then they will be integers with \(0 \le a_i < p\); otherwise they will be a list of integers in the same range giving the coefficients of a polynomial in the indeterminant representing the maximal unramified subextension.Choosing
lift_mode
as'smallest'
is similar to'simple'
, but uses a balanced representation \(-p/2 < a_i \le p/2\).Finally, setting
lift_mode = 'teichmuller'
will yield Teichmuller representatives for the \(a_i\): \(a_i^q = a_i\). In this case the \(a_i\) will lie in the ring of integers of the maximal unramified subextension of the parent of this element.INPUT:
n
– integer (default:None
); if given, returns the corresponding entry in the expansion. Can also accept a slice (seeslice()
).lift_mode
–'simple'
,'smallest'
or'teichmuller'
(default:'simple'
)start_val
– start at this valuation rather than the default (\(0\) or the valuation of this element)
OUTPUT:
If
n
isNone
, an iterable giving a \(\pi\)-adic expansion of this element. For base elements the contents will be integers iflift_mode
is'simple'
or'smallest'
, and elements ofself.parent()
iflift_mode
is'teichmuller'
.If
n
is an integer, the coefficient of \(\pi^n\) in the \(\pi\)-adic expansion of this element.
Note
Use slice operators to get a particular range.
EXAMPLES:
sage: R = Zp(7,6); a = R(12837162817); a 3 + 4*7 + 4*7^2 + 4*7^4 + O(7^6) sage: E = a.expansion(); E 7-adic expansion of 3 + 4*7 + 4*7^2 + 4*7^4 + O(7^6) sage: list(E) [3, 4, 4, 0, 4, 0] sage: sum([c * 7^i for i, c in enumerate(E)]) == a True sage: E = a.expansion(lift_mode='smallest'); E 7-adic expansion of 3 + 4*7 + 4*7^2 + 4*7^4 + O(7^6) (balanced) sage: list(E) [3, -3, -2, 1, -3, 1] sage: sum([c * 7^i for i, c in enumerate(E)]) == a True sage: E = a.expansion(lift_mode='teichmuller'); E 7-adic expansion of 3 + 4*7 + 4*7^2 + 4*7^4 + O(7^6) (teichmuller) sage: list(E) [3 + 4*7 + 6*7^2 + 3*7^3 + 2*7^5 + O(7^6), 0, 5 + 2*7 + 3*7^3 + O(7^4), 1 + O(7^3), 3 + 4*7 + O(7^2), 5 + O(7)] sage: sum(c * 7^i for i, c in enumerate(E)) 3 + 4*7 + 4*7^2 + 4*7^4 + O(7^6)
>>> from sage.all import * >>> R = Zp(Integer(7),Integer(6)); a = R(Integer(12837162817)); a 3 + 4*7 + 4*7^2 + 4*7^4 + O(7^6) >>> E = a.expansion(); E 7-adic expansion of 3 + 4*7 + 4*7^2 + 4*7^4 + O(7^6) >>> list(E) [3, 4, 4, 0, 4, 0] >>> sum([c * Integer(7)**i for i, c in enumerate(E)]) == a True >>> E = a.expansion(lift_mode='smallest'); E 7-adic expansion of 3 + 4*7 + 4*7^2 + 4*7^4 + O(7^6) (balanced) >>> list(E) [3, -3, -2, 1, -3, 1] >>> sum([c * Integer(7)**i for i, c in enumerate(E)]) == a True >>> E = a.expansion(lift_mode='teichmuller'); E 7-adic expansion of 3 + 4*7 + 4*7^2 + 4*7^4 + O(7^6) (teichmuller) >>> list(E) [3 + 4*7 + 6*7^2 + 3*7^3 + 2*7^5 + O(7^6), 0, 5 + 2*7 + 3*7^3 + O(7^4), 1 + O(7^3), 3 + 4*7 + O(7^2), 5 + O(7)] >>> sum(c * Integer(7)**i for i, c in enumerate(E)) 3 + 4*7 + 4*7^2 + 4*7^4 + O(7^6)
If the element has positive valuation then the list will start with some zeros:
sage: a = R(7^3 * 17) sage: E = a.expansion(); E 7-adic expansion of 3*7^3 + 2*7^4 + O(7^9) sage: list(E) [0, 0, 0, 3, 2, 0, 0, 0, 0]
>>> from sage.all import * >>> a = R(Integer(7)**Integer(3) * Integer(17)) >>> E = a.expansion(); E 7-adic expansion of 3*7^3 + 2*7^4 + O(7^9) >>> list(E) [0, 0, 0, 3, 2, 0, 0, 0, 0]
The expansion of 0 is truncated:
sage: E = R(0, 7).expansion(); E 7-adic expansion of O(7^7) sage: len(E) 0 sage: list(E) []
>>> from sage.all import * >>> E = R(Integer(0), Integer(7)).expansion(); E 7-adic expansion of O(7^7) >>> len(E) 0 >>> list(E) []
In fields, on the other hand, the expansion starts at the valuation:
sage: R = Qp(7,4); a = R(6*7+7**2); E = a.expansion(); E 7-adic expansion of 6*7 + 7^2 + O(7^5) sage: list(E) [6, 1, 0, 0] sage: list(a.expansion(lift_mode='smallest')) [-1, 2, 0, 0] sage: list(a.expansion(lift_mode='teichmuller')) [6 + 6*7 + 6*7^2 + 6*7^3 + O(7^4), 2 + 4*7 + 6*7^2 + O(7^3), 3 + 4*7 + O(7^2), 3 + O(7)]
>>> from sage.all import * >>> R = Qp(Integer(7),Integer(4)); a = R(Integer(6)*Integer(7)+Integer(7)**Integer(2)); E = a.expansion(); E 7-adic expansion of 6*7 + 7^2 + O(7^5) >>> list(E) [6, 1, 0, 0] >>> list(a.expansion(lift_mode='smallest')) [-1, 2, 0, 0] >>> list(a.expansion(lift_mode='teichmuller')) [6 + 6*7 + 6*7^2 + 6*7^3 + O(7^4), 2 + 4*7 + 6*7^2 + O(7^3), 3 + 4*7 + O(7^2), 3 + O(7)]
You can ask for a specific entry in the expansion:
sage: a.expansion(1) 6 sage: a.expansion(1, lift_mode='smallest') -1 sage: a.expansion(2, lift_mode='teichmuller') 2 + 4*7 + 6*7^2 + O(7^3)
>>> from sage.all import * >>> a.expansion(Integer(1)) 6 >>> a.expansion(Integer(1), lift_mode='smallest') -1 >>> a.expansion(Integer(2), lift_mode='teichmuller') 2 + 4*7 + 6*7^2 + O(7^3)
- lift_to_precision(absprec=None)[source]¶
Return another element of the same parent with absolute precision at least
absprec
, congruent to this \(p\)-adic element modulo the precision of this element.INPUT:
absprec
– integer orNone
(default:None
); the absolute precision of the result. IfNone
, lifts to the maximum precision allowed.
Note
If setting
absprec
that high would violate the precision cap, raises a precision error. Note that the new digits will not necessarily be zero.EXAMPLES:
sage: R = ZpCA(17) sage: R(-1,2).lift_to_precision(10) 16 + 16*17 + O(17^10) sage: R(1,15).lift_to_precision(10) 1 + O(17^15) sage: R(1,15).lift_to_precision(30) Traceback (most recent call last): ... PrecisionError: precision higher than allowed by the precision cap sage: R(-1,2).lift_to_precision().precision_absolute() == R.precision_cap() True sage: R = Zp(5); c = R(17,3); c.lift_to_precision(8) 2 + 3*5 + O(5^8) sage: c.lift_to_precision().precision_relative() == R.precision_cap() True
>>> from sage.all import * >>> R = ZpCA(Integer(17)) >>> R(-Integer(1),Integer(2)).lift_to_precision(Integer(10)) 16 + 16*17 + O(17^10) >>> R(Integer(1),Integer(15)).lift_to_precision(Integer(10)) 1 + O(17^15) >>> R(Integer(1),Integer(15)).lift_to_precision(Integer(30)) Traceback (most recent call last): ... PrecisionError: precision higher than allowed by the precision cap >>> R(-Integer(1),Integer(2)).lift_to_precision().precision_absolute() == R.precision_cap() True >>> R = Zp(Integer(5)); c = R(Integer(17),Integer(3)); c.lift_to_precision(Integer(8)) 2 + 3*5 + O(5^8) >>> c.lift_to_precision().precision_relative() == R.precision_cap() True
Fixed modulus elements don’t raise errors:
sage: R = ZpFM(5); a = R(5); a.lift_to_precision(7) 5 sage: a.lift_to_precision(10000) 5
>>> from sage.all import * >>> R = ZpFM(Integer(5)); a = R(Integer(5)); a.lift_to_precision(Integer(7)) 5 >>> a.lift_to_precision(Integer(10000)) 5
- residue(absprec=1, field=None, check_prec=True)[source]¶
Reduce this element modulo \(p^\mathrm{absprec}\).
INPUT:
absprec
–0
or1
field
– boolean (default:None
); for precision 1, whether to return an element of the residue field or a residue ring. Currently unused.check_prec
– boolean (default:True
); whether to raise an error if this element has insufficient precision to determine the reduction. Errors are never raised for fixed-mod or floating-point types.
OUTPUT:
This element reduced modulo \(p^\mathrm{absprec}\) as an element of the residue field or the null ring.
EXAMPLES:
sage: # needs sage.libs.ntl sage: R.<a> = Zq(27, 4) sage: (3 + 3*a).residue() 0 sage: (a + 1).residue() a0 + 1
>>> from sage.all import * >>> # needs sage.libs.ntl >>> R = Zq(Integer(27), Integer(4), names=('a',)); (a,) = R._first_ngens(1) >>> (Integer(3) + Integer(3)*a).residue() 0 >>> (a + Integer(1)).residue() a0 + 1
- teichmuller_expansion(n=None)[source]¶
Return an iterator over coefficients \(a_0, a_1, \dots, a_n\) such that
\(a_i^q = a_i\), where \(q\) is the cardinality of the residue field,
this element can be expressed as
\[\pi^v \cdot \sum_{i=0}^\infty a_i \pi^i\]where \(v\) is the valuation of this element when the parent is a field, and \(v = 0\) otherwise.
if \(a_i \ne 0\), the precision of \(a_i\) is \(i\) less than the precision of this element (relative in the case that the parent is a field, absolute otherwise)
Note
The coefficients will lie in the ring of integers of the maximal unramified subextension.
INPUT:
n
– integer (default:None
); if given, returns the coefficient of \(\pi^n\) in the expansion
EXAMPLES:
For fields, the expansion starts at the valuation:
sage: R = Qp(5,5); list(R(70).teichmuller_expansion()) [4 + 4*5 + 4*5^2 + 4*5^3 + 4*5^4 + O(5^5), 3 + 3*5 + 2*5^2 + 3*5^3 + O(5^4), 2 + 5 + 2*5^2 + O(5^3), 1 + O(5^2), 4 + O(5)]
>>> from sage.all import * >>> R = Qp(Integer(5),Integer(5)); list(R(Integer(70)).teichmuller_expansion()) [4 + 4*5 + 4*5^2 + 4*5^3 + 4*5^4 + O(5^5), 3 + 3*5 + 2*5^2 + 3*5^3 + O(5^4), 2 + 5 + 2*5^2 + O(5^3), 1 + O(5^2), 4 + O(5)]
But if you specify
n
, you get the coefficient of \(\pi^n\):sage: R(70).teichmuller_expansion(2) 3 + 3*5 + 2*5^2 + 3*5^3 + O(5^4)
>>> from sage.all import * >>> R(Integer(70)).teichmuller_expansion(Integer(2)) 3 + 3*5 + 2*5^2 + 3*5^3 + O(5^4)
- unit_part()[source]¶
Return the unit part of this element.
This is the \(p\)-adic element \(u\) in the same ring so that this element is \(\pi^v u\), where \(\pi\) is a uniformizer and \(v\) is the valuation of this element.
EXAMPLES:
sage: # needs sage.libs.ntl sage: R.<a> = Zq(125) sage: (5*a).unit_part() a + O(5^20)
>>> from sage.all import * >>> # needs sage.libs.ntl >>> R = Zq(Integer(125), names=('a',)); (a,) = R._first_ngens(1) >>> (Integer(5)*a).unit_part() a + O(5^20)
- sage.rings.padics.padic_capped_absolute_element.unpickle_cae_v2(cls, parent, value, absprec)[source]¶
Unpickle capped absolute elements.
INPUT:
cls
– the class of the capped absolute elementparent
– a \(p\)-adic ringvalue
– a Python object wrapping a celement, of the kind accepted by the cunpickle functionabsprec
– a Python int or Sage integer
EXAMPLES:
sage: from sage.rings.padics.padic_capped_absolute_element import unpickle_cae_v2, pAdicCappedAbsoluteElement sage: R = ZpCA(5,8) sage: a = unpickle_cae_v2(pAdicCappedAbsoluteElement, R, 42, int(6)); a 2 + 3*5 + 5^2 + O(5^6) sage: a.parent() is R True
>>> from sage.all import * >>> from sage.rings.padics.padic_capped_absolute_element import unpickle_cae_v2, pAdicCappedAbsoluteElement >>> R = ZpCA(Integer(5),Integer(8)) >>> a = unpickle_cae_v2(pAdicCappedAbsoluteElement, R, Integer(42), int(Integer(6))); a 2 + 3*5 + 5^2 + O(5^6) >>> a.parent() is R True