-adic Base Leaves#
Implementations of
AUTHORS:
David Roe
Genya Zaytman: documentation
David Harvey: doctests
William Stein: doctest updates
EXAMPLES:
There are two types of precision for a
sage: R = Qp(5, 20, 'capped-rel', 'series'); a = R(675); a
2*5^2 + 5^4 + O(5^22)
sage: a.precision_relative()
20
The second type of precision is absolute precision, which gives the
power of
sage: a.precision_absolute()
22
The number of times that valuation()
and
ordp()
:
sage: a.valuation() 2
The following relationship holds:
self.valuation() + self.precision_relative() == self.precision_absolute().
sage: a.valuation() + a.precision_relative() == a.precision_absolute() True
In the capped relative case, the relative precision of an element is restricted to be at most a certain value, specified at the creation of the field. Individual elements also store their own precision, so the effect of various arithmetic operations on precision is tracked. When you cast an exact element into a capped relative field, it truncates it to the precision cap of the field.:
sage: R = Qp(5, 5); a = R(4006); a
1 + 5 + 2*5^3 + 5^4 + O(5^5)
sage: b = R(17/3); b
4 + 2*5 + 3*5^2 + 5^3 + 3*5^4 + O(5^5)
sage: c = R(4025); c
5^2 + 2*5^3 + 5^4 + 5^5 + O(5^7)
sage: a + b
4*5 + 3*5^2 + 3*5^3 + 4*5^4 + O(5^5)
sage: a + b + c
4*5 + 4*5^2 + 5^4 + O(5^5)
sage: R = Zp(5, 5, 'capped-rel', 'series'); a = R(4006); a
1 + 5 + 2*5^3 + 5^4 + O(5^5)
sage: b = R(17/3); b
4 + 2*5 + 3*5^2 + 5^3 + 3*5^4 + O(5^5)
sage: c = R(4025); c
5^2 + 2*5^3 + 5^4 + 5^5 + O(5^7)
sage: a + b
4*5 + 3*5^2 + 3*5^3 + 4*5^4 + O(5^5)
sage: a + b + c
4*5 + 4*5^2 + 5^4 + O(5^5)
In the capped absolute type, instead of having a cap on the relative precision of an element there is instead a cap on the absolute precision. Elements still store their own precisions, and as with the capped relative case, exact elements are truncated when cast into the ring.:
sage: R = ZpCA(5, 5); a = R(4005); a
5 + 2*5^3 + 5^4 + O(5^5)
sage: b = R(4025); b
5^2 + 2*5^3 + 5^4 + O(5^5)
sage: a * b
5^3 + 2*5^4 + O(5^5)
sage: (a * b) // 5^3
1 + 2*5 + O(5^2)
sage: type((a * b) // 5^3)
<class 'sage.rings.padics.padic_capped_absolute_element.pAdicCappedAbsoluteElement'>
sage: (a * b) / 5^3
1 + 2*5 + O(5^2)
sage: type((a * b) / 5^3)
<class 'sage.rings.padics.padic_capped_relative_element.pAdicCappedRelativeElement'>
The fixed modulus type is the leanest of the p-adic rings: it is
basically just a wrapper around
sage: R = ZpFM(5, 5); a = R(4005); a
5 + 2*5^3 + 5^4
sage: a // 5
1 + 2*5^2 + 5^3
Zp
and Qp
as above. This will ensure that there is
only one instance of
sage: Qp(17,10)
17-adic Field with capped relative precision 10
sage: R = Qp(7, prec = 20, print_mode = 'val-unit'); S = Qp(7, prec = 20, print_mode = 'val-unit'); R is S
True
sage: Qp(2)
2-adic Field with capped relative precision 20
Once one has a
sage: R = Qp(5, 5, 'capped-rel','series'); a = R(16); a
1 + 3*5 + O(5^5)
sage: b = R(23/15); b
5^-1 + 3 + 3*5 + 5^2 + 3*5^3 + O(5^4)
sage: S = Zp(5, 5, 'fixed-mod','val-unit'); c = S(Mod(75,125)); c
5^2 * 3
sage: R(c)
3*5^2 + O(5^5)
In the previous example, since fixed-mod elements don’t keep track of their precision, we assume that it has the full precision of the ring. This is why you have to cast manually here.
While you can cast explicitly as above, the chains of automatic coercion are more restricted. As always in Sage, the following arrows are transitive and the diagram is commutative.:
int -> long -> Integer -> Zp capped-rel -> Zp capped_abs -> IntegerMod
Integer -> Zp fixed-mod -> IntegerMod
Integer -> Zp capped-abs -> Qp capped-rel
In addition, there are arrows within each type. For capped relative and capped absolute rings and fields, these arrows go from lower precision cap to higher precision cap. This works since elements track their own precision: choosing the parent with higher precision cap means that precision is less likely to be truncated unnecessarily. For fixed modulus parents, the arrow goes from higher precision cap to lower. The fact that elements do not track precision necessitates this choice in order to not produce incorrect results.
- class sage.rings.padics.padic_base_leaves.pAdicFieldCappedRelative(p, prec, print_mode, names)#
Bases:
sage.rings.padics.generic_nodes.pAdicFieldBaseGeneric
,sage.rings.padics.generic_nodes.pAdicCappedRelativeFieldGeneric
An implementation of
-adic fields with capped relative precision.EXAMPLES:
sage: K = Qp(17, 1000000) #indirect doctest sage: K = Qp(101) #indirect doctest
- random_element(algorithm='default')#
Returns a random element of
self
, optionally using thealgorithm
argument to decide how it generates the element. Algorithms currently implemented:default: Choose an integer
using the standard distribution on the integers. Then choose an integer uniformly in the range where is the precision cap ofself
. Returnself(p^k * a, absprec = k + self.precision_cap())
.
EXAMPLES:
sage: Qp(17,6).random_element().parent() is Qp(17,6) True
- class sage.rings.padics.padic_base_leaves.pAdicFieldFloatingPoint(p, prec, print_mode, names)#
Bases:
sage.rings.padics.generic_nodes.pAdicFieldBaseGeneric
,sage.rings.padics.generic_nodes.pAdicFloatingPointFieldGeneric
An implementation of the
-adic rationals with floating point precision.
- class sage.rings.padics.padic_base_leaves.pAdicFieldLattice(p, prec, subtype, print_mode, names, label=None)#
Bases:
sage.rings.padics.generic_nodes.pAdicLatticeGeneric
,sage.rings.padics.generic_nodes.pAdicFieldBaseGeneric
An implementation of the
-adic numbers with lattice precision.INPUT:
p
– primeprec
– precision cap, given as a pair (relative_cap
,absolute_cap
)subtype
– either'cap'
or'float'
print_mode
– dictionary with print optionsnames
– how to print the primelabel
– the label of this ring
See also
label()
EXAMPLES:
sage: R = QpLC(next_prime(10^60)) # indirect doctest doctest:...: FutureWarning: This class/method/function is marked as experimental. It, its functionality or its interface might change without a formal deprecation. See http://trac.sagemath.org/23505 for details. sage: type(R) <class 'sage.rings.padics.padic_base_leaves.pAdicFieldLattice_with_category'> sage: R = QpLC(2,label='init') # indirect doctest sage: R 2-adic Field with lattice-cap precision (label: init)
- random_element(prec=None, integral=False)#
Return a random element of this ring.
INPUT:
prec
– an integer orNone
(the default): the absolute precision of the generated random elementintegral
– a boolean (default:False
); if true return an element in the ring of integers
EXAMPLES:
sage: K = QpLC(2) sage: K.random_element() # not tested, known bug (see :trac:`32126`) 2^-8 + 2^-7 + 2^-6 + 2^-5 + 2^-3 + 1 + 2^2 + 2^3 + 2^5 + O(2^12) sage: K.random_element(integral=True) # random 2^3 + 2^4 + 2^5 + 2^6 + 2^7 + 2^10 + 2^11 + 2^14 + 2^15 + 2^16 + 2^17 + 2^18 + 2^19 + O(2^20) sage: K.random_element(prec=10) # random 2^(-3) + 1 + 2 + 2^4 + 2^8 + O(2^10)
If the given precision is higher than the internal cap of the parent, then the cap is used:
sage: K.precision_cap_relative() 20 sage: K.random_element(prec=100) # random 2^5 + 2^8 + 2^11 + 2^12 + 2^14 + 2^18 + 2^20 + 2^24 + O(2^25)
- class sage.rings.padics.padic_base_leaves.pAdicFieldRelaxed(p, prec, print_mode, names)#
Bases:
sage.rings.padics.generic_nodes.pAdicRelaxedGeneric
,sage.rings.padics.generic_nodes.pAdicFieldBaseGeneric
An implementation of relaxed arithmetics over
.INPUT:
p
– primeprec
– default precisionprint_mode
– dictionary with print optionsnames
– how to print the prime
EXAMPLES:
sage: R = QpER(5) # indirect doctest sage: type(R) <class 'sage.rings.padics.padic_base_leaves.pAdicFieldRelaxed_with_category'>
- class sage.rings.padics.padic_base_leaves.pAdicRingCappedAbsolute(p, prec, print_mode, names)#
Bases:
sage.rings.padics.generic_nodes.pAdicRingBaseGeneric
,sage.rings.padics.generic_nodes.pAdicCappedAbsoluteRingGeneric
An implementation of the
-adic integers with capped absolute precision.
- class sage.rings.padics.padic_base_leaves.pAdicRingCappedRelative(p, prec, print_mode, names)#
Bases:
sage.rings.padics.generic_nodes.pAdicRingBaseGeneric
,sage.rings.padics.generic_nodes.pAdicCappedRelativeRingGeneric
An implementation of the
-adic integers with capped relative precision.
- class sage.rings.padics.padic_base_leaves.pAdicRingFixedMod(p, prec, print_mode, names)#
Bases:
sage.rings.padics.generic_nodes.pAdicRingBaseGeneric
,sage.rings.padics.generic_nodes.pAdicFixedModRingGeneric
An implementation of the
-adic integers using fixed modulus.
- class sage.rings.padics.padic_base_leaves.pAdicRingFloatingPoint(p, prec, print_mode, names)#
Bases:
sage.rings.padics.generic_nodes.pAdicRingBaseGeneric
,sage.rings.padics.generic_nodes.pAdicFloatingPointRingGeneric
An implementation of the
-adic integers with floating point precision.
- class sage.rings.padics.padic_base_leaves.pAdicRingLattice(p, prec, subtype, print_mode, names, label=None)#
Bases:
sage.rings.padics.generic_nodes.pAdicLatticeGeneric
,sage.rings.padics.generic_nodes.pAdicRingBaseGeneric
An implementation of the
-adic integers with lattice precision.INPUT:
p
– primeprec
– precision cap, given as a pair (relative_cap
,absolute_cap
)subtype
– either'cap'
or'float'
print_mode
– dictionary with print optionsnames
– how to print the primelabel
– the label of this ring
See also
label()
EXAMPLES:
sage: R = ZpLC(next_prime(10^60)) # indirect doctest doctest:...: FutureWarning: This class/method/function is marked as experimental. It, its functionality or its interface might change without a formal deprecation. See http://trac.sagemath.org/23505 for details. sage: type(R) <class 'sage.rings.padics.padic_base_leaves.pAdicRingLattice_with_category'> sage: R = ZpLC(2, label='init') # indirect doctest sage: R 2-adic Ring with lattice-cap precision (label: init)
- random_element(prec=None)#
Return a random element of this ring.
INPUT:
prec
– an integer orNone
(the default): the absolute precision of the generated random element
EXAMPLES:
sage: R = ZpLC(2) sage: R.random_element() # random 2^3 + 2^4 + 2^5 + 2^6 + 2^7 + 2^10 + 2^11 + 2^14 + 2^15 + 2^16 + 2^17 + 2^18 + 2^19 + 2^21 + O(2^23) sage: R.random_element(prec=10) # random 1 + 2^3 + 2^4 + 2^7 + O(2^10)
- class sage.rings.padics.padic_base_leaves.pAdicRingRelaxed(p, prec, print_mode, names)#
Bases:
sage.rings.padics.generic_nodes.pAdicRelaxedGeneric
,sage.rings.padics.generic_nodes.pAdicRingBaseGeneric
An implementation of relaxed arithmetics over
.INPUT:
p
– primeprec
– default precisionprint_mode
– dictionary with print optionsnames
– how to print the prime
EXAMPLES:
sage: R = ZpER(5) # indirect doctest sage: type(R) <class 'sage.rings.padics.padic_base_leaves.pAdicRingRelaxed_with_category'>