Local Generic#
Superclass for \(p\)-adic and power series rings.
AUTHORS:
David Roe
- class sage.rings.padics.local_generic.LocalGeneric(base, prec, names, element_class, category=None)#
Bases:
CommutativeRing
Initialize
self
.EXAMPLES:
sage: R = Zp(5) #indirect doctest sage: R.precision_cap() 20
In trac ticket #14084, the category framework has been implemented for p-adic rings:
sage: TestSuite(R).run() sage: K = Qp(7) sage: TestSuite(K).run()
- absolute_degree()#
Return the degree of this extension over the prime p-adic field/ring.
EXAMPLES:
sage: K.<a> = Qq(3^5) sage: K.absolute_degree() 5 sage: L.<pi> = Qp(3).extension(x^2 - 3) sage: L.absolute_degree() 2
- absolute_e()#
Return the absolute ramification index of this ring/field.
EXAMPLES:
sage: K.<a> = Qq(3^5) sage: K.absolute_e() 1 sage: L.<pi> = Qp(3).extension(x^2 - 3) sage: L.absolute_e() 2
- absolute_f()#
Return the degree of the residue field of this ring/field over its prime subfield.
EXAMPLES:
sage: K.<a> = Qq(3^5) sage: K.absolute_f() 5 sage: L.<pi> = Qp(3).extension(x^2 - 3) sage: L.absolute_f() 1
- absolute_inertia_degree()#
Return the degree of the residue field of this ring/field over its prime subfield.
EXAMPLES:
sage: K.<a> = Qq(3^5) sage: K.absolute_inertia_degree() 5 sage: L.<pi> = Qp(3).extension(x^2 - 3) sage: L.absolute_inertia_degree() 1
- absolute_ramification_index()#
Return the absolute ramification index of this ring/field.
EXAMPLES:
sage: K.<a> = Qq(3^5) sage: K.absolute_ramification_index() 1 sage: L.<pi> = Qp(3).extension(x^2 - 3) sage: L.absolute_ramification_index() 2
- change(**kwds)#
Return a new ring with changed attributes.
INPUT:
The following arguments are applied to every ring in the tower:
type
– string, the precision typep
– the prime of the ground ring. Defining polynomialswill be converted to the new base rings.
print_mode
– stringprint_pos
– boolprint_sep
– stringprint_alphabet
– dictshow_prec
– boolcheck
– boollabel
– string (only for lattice precision)
The following arguments are only applied to the top ring in the tower:
var_name
– stringres_name
– stringunram_name
– stringram_name
– stringnames
– stringmodulus
– polynomial
The following arguments have special behavior:
prec
– integer. If the precision is increased on an extension ring,the precision on the base is increased as necessary (respecting ramification). If the precision is decreased, the precision of the base is unchanged.
field
– bool. IfTrue
, switch to a tower of fields via the fraction field.If False, switch to a tower of rings of integers.
q
– prime power. Replace the initial unramified extension of \(\QQ_p\) or \(\ZZ_p\)with an unramified extension of residue cardinality \(q\). If the initial extension is ramified, add in an unramified extension.
base
– ring or field. Use a specific base ring instead of recursivelycalling
change()
down the tower.
See the
constructors
for more details on the meaning of these arguments.EXAMPLES:
We can use this method to change the precision:
sage: Zp(5).change(prec=40) 5-adic Ring with capped relative precision 40
or the precision type:
sage: Zp(5).change(type="capped-abs") 5-adic Ring with capped absolute precision 20
or even the prime:
sage: ZpCA(3).change(p=17) 17-adic Ring with capped absolute precision 20
You can switch between the ring of integers and its fraction field:
sage: ZpCA(3).change(field=True) 3-adic Field with capped relative precision 20
You can also change print modes:
sage: R = Zp(5).change(prec=5, print_mode='digits') sage: repr(~R(17)) '...13403'
Changing print mode to ‘digits’ works for Eisenstein extensions:
sage: S.<x> = ZZ[] sage: W.<w> = Zp(3).extension(x^4 + 9*x^2 + 3*x - 3) sage: W.print_mode() 'series' sage: W.change(print_mode='digits').print_mode() 'digits'
You can change extensions:
sage: K.<a> = QqFP(125, prec=4) sage: K.change(q=64) 2-adic Unramified Extension Field in a defined by x^6 + x^4 + x^3 + x + 1 sage: R.<x> = QQ[] sage: K.change(modulus = x^2 - x + 2, print_pos=False) 5-adic Unramified Extension Field in a defined by x^2 - x + 2
and variable names:
sage: K.change(names='b') 5-adic Unramified Extension Field in b defined by x^3 + 3*x + 3
and precision:
sage: Kup = K.change(prec=8); Kup 5-adic Unramified Extension Field in a defined by x^3 + 3*x + 3 sage: Kup.precision_cap() 8 sage: Kup.base_ring() 5-adic Field with floating precision 8
If you decrease the precision, the precision of the base stays the same:
sage: Kdown = K.change(prec=2); Kdown 5-adic Unramified Extension Field in a defined by x^3 + 3*x + 3 sage: Kdown.precision_cap() 2 sage: Kdown.base_ring() 5-adic Field with floating precision 4
Changing the prime works for extensions:
sage: x = polygen(ZZ) sage: R.<a> = Zp(5).extension(x^2 + 2) sage: S = R.change(p=7) sage: S.defining_polynomial(exact=True) x^2 + 2 sage: A.<y> = Zp(5)[] sage: R.<a> = Zp(5).extension(y^2 + 2) sage: S = R.change(p=7) sage: S.defining_polynomial(exact=True) y^2 + 2
sage: R.<a> = Zq(5^3) sage: S = R.change(prec=50) sage: S.defining_polynomial(exact=True) x^3 + 3*x + 3
Changing label for lattice precision (the precision lattice is not copied):
sage: R = ZpLC(37, (8,11)) sage: S = R.change(label = "change"); S 37-adic Ring with lattice-cap precision (label: change) sage: S.change(label = "new") 37-adic Ring with lattice-cap precision (label: new)
- defining_polynomial(var='x', exact=False)#
Return the defining polynomial of this local ring
INPUT:
var
– string (default:'x'
), the name of the variableexact
– a boolean (default:False
), whether to return the underlying exact defining polynomial rather than the one with coefficients in the base ring.
OUTPUT:
The defining polynomial of this ring as an extension over its ground ring
EXAMPLES:
sage: R = Zp(3, 3, 'fixed-mod') sage: R.defining_polynomial().parent() Univariate Polynomial Ring in x over 3-adic Ring of fixed modulus 3^3 sage: R.defining_polynomial('foo') foo sage: R.defining_polynomial(exact=True).parent() Univariate Polynomial Ring in x over Integer Ring
- degree()#
Return the degree of this extension.
Raise an error if the base ring/field is itself an extension.
EXAMPLES:
sage: K.<a> = Qq(3^5) sage: K.degree() 5 sage: L.<pi> = Qp(3).extension(x^2 - 3) sage: L.degree() 2
- e()#
Return the ramification index of this extension.
Raise an error if the base ring/field is itself an extension.
EXAMPLES:
sage: K.<a> = Qq(3^5) sage: K.e() 1 sage: L.<pi> = Qp(3).extension(x^2 - 3) sage: L.e() 2
- ext(*args, **kwds)#
Construct an extension of self. See
extension()
for more details.EXAMPLES:
sage: A = Zp(7,10) sage: S.<x> = A[] sage: B.<t> = A.ext(x^2+7) sage: B.uniformiser() t + O(t^21)
- f()#
Return the degree of the residual extension.
Raise an error if the base ring/field is itself an extension.
EXAMPLES:
sage: K.<a> = Qq(3^5) sage: K.f() 5 sage: L.<pi> = Qp(3).extension(x^2 - 3) sage: L.f() 1
- ground_ring()#
Return
self
.Will be overridden by extensions.
INPUT:
self
– a local ring
OUTPUT:
The ground ring of
self
, i.e., itself.EXAMPLES:
sage: R = Zp(3, 5, 'fixed-mod') sage: S = Zp(3, 4, 'fixed-mod') sage: R.ground_ring() is R True sage: S.ground_ring() is R False
- ground_ring_of_tower()#
Return
self
.Will be overridden by extensions.
INPUT:
self
– a \(p\)-adic ring
OUTPUT:
The ground ring of the tower for
self
, i.e., itself.EXAMPLES:
sage: R = Zp(5) sage: R.ground_ring_of_tower() 5-adic Ring with capped relative precision 20
- inertia_degree()#
Return the degree of the residual extension.
Raise an error if the base ring/field is itself an extension.
EXAMPLES:
sage: K.<a> = Qq(3^5) sage: K.inertia_degree() 5 sage: L.<pi> = Qp(3).extension(x^2 - 3) sage: L.inertia_degree() 1
- inertia_subring()#
Return the inertia subring, i.e.
self
.INPUT:
self
– a local ring
OUTPUT:
the inertia subring of self, i.e., itself
EXAMPLES:
sage: R = Zp(5) sage: R.inertia_subring() 5-adic Ring with capped relative precision 20
- is_capped_absolute()#
Return whether this \(p\)-adic ring bounds precision in a capped absolute fashion.
The absolute precision of an element is the power of \(p\) modulo which that element is defined. In a capped absolute ring, the absolute precision of elements are bounded by a constant depending on the ring.
EXAMPLES:
sage: R = ZpCA(5, 15) sage: R.is_capped_absolute() True sage: R(5^7) 5^7 + O(5^15) sage: S = Zp(5, 15) sage: S.is_capped_absolute() False sage: S(5^7) 5^7 + O(5^22)
- is_capped_relative()#
Return whether this \(p\)-adic ring bounds precision in a capped relative fashion.
The relative precision of an element is the power of \(p\) modulo which the unit part of that element is defined. In a capped relative ring, the relative precision of elements are bounded by a constant depending on the ring.
EXAMPLES:
sage: R = ZpCA(5, 15) sage: R.is_capped_relative() False sage: R(5^7) 5^7 + O(5^15) sage: S = Zp(5, 15) sage: S.is_capped_relative() True sage: S(5^7) 5^7 + O(5^22)
- is_exact()#
Return whether this \(p\)-adic ring is exact, i.e.
False
.EXAMPLES:
sage: R = Zp(5, 3, 'fixed-mod'); R.is_exact() False
- is_fixed_mod()#
Return whether this \(p\)-adic ring bounds precision in a fixed modulus fashion.
The absolute precision of an element is the power of \(p\) modulo which that element is defined. In a fixed modulus ring, the absolute precision of every element is defined to be the precision cap of the parent. This means that some operations, such as division by \(p\), don’t return a well defined answer.
EXAMPLES:
sage: R = ZpFM(5,15) sage: R.is_fixed_mod() True sage: R(5^7,absprec=9) 5^7 sage: S = ZpCA(5, 15) sage: S.is_fixed_mod() False sage: S(5^7,absprec=9) 5^7 + O(5^9)
- is_floating_point()#
Return whether this \(p\)-adic ring bounds precision in a floating point fashion.
The relative precision of an element is the power of \(p\) modulo which the unit part of that element is defined. In a floating point ring, elements do not store precision, but arithmetic operations truncate to a relative precision depending on the ring.
EXAMPLES:
sage: R = ZpCR(5, 15) sage: R.is_floating_point() False sage: R(5^7) 5^7 + O(5^22) sage: S = ZpFP(5, 15) sage: S.is_floating_point() True sage: S(5^7) 5^7
- is_lattice_prec()#
Return whether this \(p\)-adic ring bounds precision using a lattice model.
In lattice precision, relationships between elements are stored in a precision object of the parent, which allows for optimal precision tracking at the cost of increased memory usage and runtime.
EXAMPLES:
sage: R = ZpCR(5, 15) sage: R.is_lattice_prec() False sage: x = R(25, 8) sage: x - x O(5^8) sage: S = ZpLC(5, 15) 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: S.is_lattice_prec() True sage: x = S(25, 8) sage: x - x O(5^30)
- is_relaxed()#
Return whether this \(p\)-adic ring bounds precision in a relaxed fashion.
In a relaxed ring, elements have mechanisms for computing themselves to greater precision.
EXAMPLES:
sage: R = Zp(5) sage: R.is_relaxed() False
- maximal_unramified_subextension()#
Return the maximal unramified subextension.
INPUT:
self
– a local ring
OUTPUT:
the maximal unramified subextension of
self
EXAMPLES:
sage: R = Zp(5) sage: R.maximal_unramified_subextension() 5-adic Ring with capped relative precision 20
- precision_cap()#
Return the precision cap for this ring.
EXAMPLES:
sage: R = Zp(3, 10,'fixed-mod'); R.precision_cap() 10 sage: R = Zp(3, 10,'capped-rel'); R.precision_cap() 10 sage: R = Zp(3, 10,'capped-abs'); R.precision_cap() 10
Note
This will have different meanings depending on the type of local ring. For fixed modulus rings, all elements are considered modulo
self.prime()^self.precision_cap()
. For rings with an absolute cap (i.e. the classpAdicRingCappedAbsolute
), each element has a precision that is tracked and is bounded above byself.precision_cap()
. Rings with relative caps (e.g. the classpAdicRingCappedRelative
) are the same except that the precision is the precision of the unit part of each element.
- ramification_index()#
Return the ramification index of this extension.
Raise an error if the base ring/field is itself an extension.
EXAMPLES:
sage: K.<a> = Qq(3^5) sage: K.ramification_index() 1 sage: L.<pi> = Qp(3).extension(x^2 - 3) sage: L.ramification_index() 2
- relative_degree()#
Return the degree of this extension over its base field/ring.
EXAMPLES:
sage: K.<a> = Qq(3^5) sage: K.relative_degree() 5 sage: L.<pi> = Qp(3).extension(x^2 - 3) sage: L.relative_degree() 2
- relative_e()#
Return the ramification index of this extension over its base ring/field.
EXAMPLES:
sage: K.<a> = Qq(3^5) sage: K.relative_e() 1 sage: L.<pi> = Qp(3).extension(x^2 - 3) sage: L.relative_e() 2
- relative_f()#
Return the degree of the residual extension over its base ring/field.
EXAMPLES:
sage: K.<a> = Qq(3^5) sage: K.relative_f() 5 sage: L.<pi> = Qp(3).extension(x^2 - 3) sage: L.relative_f() 1
- relative_inertia_degree()#
Return the degree of the residual extension over its base ring/field.
EXAMPLES:
sage: K.<a> = Qq(3^5) sage: K.relative_inertia_degree() 5 sage: L.<pi> = Qp(3).extension(x^2 - 3) sage: L.relative_inertia_degree() 1
- relative_ramification_index()#
Return the ramification index of this extension over its base ring/field.
EXAMPLES:
sage: K.<a> = Qq(3^5) sage: K.relative_ramification_index() 1 sage: L.<pi> = Qp(3).extension(x^2 - 3) sage: L.relative_ramification_index() 2
- residue_characteristic()#
Return the characteristic of
self
’s residue field.INPUT:
self
– a p-adic ring.
OUTPUT:
The characteristic of the residue field.
EXAMPLES:
sage: R = Zp(3, 5, 'capped-rel'); R.residue_characteristic() 3
- uniformiser()#
Return a uniformiser for
self
, ie a generator for the unique maximal ideal.EXAMPLES:
sage: R = Zp(5) sage: R.uniformiser() 5 + O(5^21) sage: A = Zp(7,10) sage: S.<x> = A[] sage: B.<t> = A.ext(x^2+7) sage: B.uniformiser() t + O(t^21)
- uniformiser_pow(n)#
Return the \(n`th power of the uniformiser of ``self`\) (as an element of
self
).EXAMPLES:
sage: R = Zp(5) sage: R.uniformiser_pow(5) 5^5 + O(5^25)