\(p\)-adic Extension Generic¶
A common superclass for all extensions of Qp and Zp.
AUTHORS:
David Roe
- class sage.rings.padics.padic_extension_generic.DefPolyConversion[source]¶
Bases:
Morphism
Conversion map between \(p\)-adic rings/fields with the same defining polynomial.
INPUT:
R
– a \(p\)-adic extension ring or fieldS
– a \(p\)-adic extension ring or field with the same defining polynomial
EXAMPLES:
sage: R.<a> = Zq(125, print_mode='terse') sage: S = R.change(prec = 15, type='floating-point') sage: a - 1 95367431640624 + a + O(5^20) sage: S(a - 1) 30517578124 + a + O(5^15)
>>> from sage.all import * >>> R = Zq(Integer(125), print_mode='terse', names=('a',)); (a,) = R._first_ngens(1) >>> S = R.change(prec = Integer(15), type='floating-point') >>> a - Integer(1) 95367431640624 + a + O(5^20) >>> S(a - Integer(1)) 30517578124 + a + O(5^15)
sage: R.<a> = Zq(125, print_mode='terse') sage: S = R.change(prec = 15, type='floating-point') sage: f = S.convert_map_from(R) sage: TestSuite(f).run()
>>> from sage.all import * >>> R = Zq(Integer(125), print_mode='terse', names=('a',)); (a,) = R._first_ngens(1) >>> S = R.change(prec = Integer(15), type='floating-point') >>> f = S.convert_map_from(R) >>> TestSuite(f).run()
- class sage.rings.padics.padic_extension_generic.MapFreeModuleToOneStep[source]¶
Bases:
pAdicModuleIsomorphism
The isomorphism from the underlying module of a one-step \(p\)-adic extension to the extension.
EXAMPLES:
sage: K.<a> = Qq(125) sage: V, fr, to = K.free_module() sage: TestSuite(fr).run(skip=['_test_nonzero_equal']) # skipped since Qq(125) doesn't have dimension()
>>> from sage.all import * >>> K = Qq(Integer(125), names=('a',)); (a,) = K._first_ngens(1) >>> V, fr, to = K.free_module() >>> TestSuite(fr).run(skip=['_test_nonzero_equal']) # skipped since Qq(125) doesn't have dimension()
- class sage.rings.padics.padic_extension_generic.MapFreeModuleToTwoStep[source]¶
Bases:
pAdicModuleIsomorphism
The isomorphism from the underlying module of a two-step \(p\)-adic extension to the extension.
EXAMPLES:
sage: K.<a> = Qq(125) sage: R.<x> = ZZ[] sage: L.<b> = K.extension(x^2 - 5*x + 5) sage: V, fr, to = L.free_module(base=Qp(5)) sage: TestSuite(fr).run(skip=['_test_nonzero_equal']) # skipped since L doesn't have dimension()
>>> from sage.all import * >>> K = Qq(Integer(125), names=('a',)); (a,) = K._first_ngens(1) >>> R = ZZ['x']; (x,) = R._first_ngens(1) >>> L = K.extension(x**Integer(2) - Integer(5)*x + Integer(5), names=('b',)); (b,) = L._first_ngens(1) >>> V, fr, to = L.free_module(base=Qp(Integer(5))) >>> TestSuite(fr).run(skip=['_test_nonzero_equal']) # skipped since L doesn't have dimension()
- class sage.rings.padics.padic_extension_generic.MapOneStepToFreeModule[source]¶
Bases:
pAdicModuleIsomorphism
The isomorphism from a one-step \(p\)-adic extension to its underlying free module.
EXAMPLES:
sage: K.<a> = Qq(125) sage: V, fr, to = K.free_module() sage: TestSuite(to).run()
>>> from sage.all import * >>> K = Qq(Integer(125), names=('a',)); (a,) = K._first_ngens(1) >>> V, fr, to = K.free_module() >>> TestSuite(to).run()
- class sage.rings.padics.padic_extension_generic.MapTwoStepToFreeModule[source]¶
Bases:
pAdicModuleIsomorphism
The isomorphism from a two-step \(p\)-adic extension to its underlying free module.
EXAMPLES:
sage: K.<a> = Qq(125) sage: R.<x> = ZZ[] sage: L.<b> = K.extension(x^2 - 5*x + 5) sage: V, fr, to = L.free_module(base=Qp(5)) sage: TestSuite(to).run()
>>> from sage.all import * >>> K = Qq(Integer(125), names=('a',)); (a,) = K._first_ngens(1) >>> R = ZZ['x']; (x,) = R._first_ngens(1) >>> L = K.extension(x**Integer(2) - Integer(5)*x + Integer(5), names=('b',)); (b,) = L._first_ngens(1) >>> V, fr, to = L.free_module(base=Qp(Integer(5))) >>> TestSuite(to).run()
- class sage.rings.padics.padic_extension_generic.pAdicExtensionGeneric(poly, prec, print_mode, names, element_class)[source]¶
Bases:
pAdicGeneric
Initialization.
EXAMPLES:
sage: R = Zp(5,5) sage: S.<x> = R[] sage: f = x^5 + 75*x^3 - 15*x^2 +125*x - 5 sage: W.<w> = R.ext(f) # indirect doctest
>>> from sage.all import * >>> R = Zp(Integer(5),Integer(5)) >>> S = R['x']; (x,) = S._first_ngens(1) >>> f = x**Integer(5) + Integer(75)*x**Integer(3) - Integer(15)*x**Integer(2) +Integer(125)*x - Integer(5) >>> W = R.ext(f, names=('w',)); (w,) = W._first_ngens(1)# indirect doctest
- construction(forbid_frac_field=False)[source]¶
Return the functorial construction of this ring, namely, the algebraic extension of the base ring defined by the given polynomial.
Also preserves other information that makes this ring unique (e.g. precision, rounding, print mode).
INPUT:
forbid_frac_field
– require a completion functor rather than a fraction field functor. This is used in thesage.rings.padics.local_generic.LocalGeneric.change()
method.
EXAMPLES:
sage: R.<a> = Zq(25, 8, print_mode='val-unit') sage: c, R0 = R.construction(); R0 5-adic Ring with capped relative precision 8 sage: c(R0) 5-adic Unramified Extension Ring in a defined by x^2 + 4*x + 2 sage: c(R0) == R True
>>> from sage.all import * >>> R = Zq(Integer(25), Integer(8), print_mode='val-unit', names=('a',)); (a,) = R._first_ngens(1) >>> c, R0 = R.construction(); R0 5-adic Ring with capped relative precision 8 >>> c(R0) 5-adic Unramified Extension Ring in a defined by x^2 + 4*x + 2 >>> c(R0) == R True
For a field, by default we return a fraction field functor.
sage: K.<a> = Qq(25, 8) sage: c, R = K.construction(); R 5-adic Unramified Extension Ring in a defined by x^2 + 4*x + 2 sage: c FractionField
>>> from sage.all import * >>> K = Qq(Integer(25), Integer(8), names=('a',)); (a,) = K._first_ngens(1) >>> c, R = K.construction(); R 5-adic Unramified Extension Ring in a defined by x^2 + 4*x + 2 >>> c FractionField
If you prefer an extension functor, you can use the
forbit_frac_field
keyword:sage: c, R = K.construction(forbid_frac_field=True); R 5-adic Field with capped relative precision 8 sage: c AlgebraicExtensionFunctor sage: c(R) is K True
>>> from sage.all import * >>> c, R = K.construction(forbid_frac_field=True); R 5-adic Field with capped relative precision 8 >>> c AlgebraicExtensionFunctor >>> c(R) is K True
- defining_polynomial(var=None, exact=False)[source]¶
Return the polynomial defining this extension.
INPUT:
var
– string (default:'x'
); the name of the variableexact
– boolean (default:False
); whether to return the underlying exactdefining polynomial rather than the one with coefficients in the base ring
EXAMPLES:
sage: R = Zp(5,5) sage: S.<x> = R[] sage: f = x^5 + 75*x^3 - 15*x^2 + 125*x - 5 sage: W.<w> = R.ext(f) sage: W.defining_polynomial() (1 + O(5^5))*x^5 + O(5^6)*x^4 + (3*5^2 + O(5^6))*x^3 + (2*5 + 4*5^2 + 4*5^3 + 4*5^4 + 4*5^5 + O(5^6))*x^2 + (5^3 + O(5^6))*x + 4*5 + 4*5^2 + 4*5^3 + 4*5^4 + 4*5^5 + O(5^6) sage: W.defining_polynomial(exact=True) x^5 + 75*x^3 - 15*x^2 + 125*x - 5 sage: W.defining_polynomial(var='y', exact=True) y^5 + 75*y^3 - 15*y^2 + 125*y - 5
>>> from sage.all import * >>> R = Zp(Integer(5),Integer(5)) >>> S = R['x']; (x,) = S._first_ngens(1) >>> f = x**Integer(5) + Integer(75)*x**Integer(3) - Integer(15)*x**Integer(2) + Integer(125)*x - Integer(5) >>> W = R.ext(f, names=('w',)); (w,) = W._first_ngens(1) >>> W.defining_polynomial() (1 + O(5^5))*x^5 + O(5^6)*x^4 + (3*5^2 + O(5^6))*x^3 + (2*5 + 4*5^2 + 4*5^3 + 4*5^4 + 4*5^5 + O(5^6))*x^2 + (5^3 + O(5^6))*x + 4*5 + 4*5^2 + 4*5^3 + 4*5^4 + 4*5^5 + O(5^6) >>> W.defining_polynomial(exact=True) x^5 + 75*x^3 - 15*x^2 + 125*x - 5 >>> W.defining_polynomial(var='y', exact=True) y^5 + 75*y^3 - 15*y^2 + 125*y - 5
See also
- exact_field()[source]¶
Return a number field with the same defining polynomial.
Note that this method always returns a field, even for a \(p\)-adic ring.
EXAMPLES:
sage: R = Zp(5,5) sage: S.<x> = R[] sage: f = x^5 + 75*x^3 - 15*x^2 +125*x - 5 sage: W.<w> = R.ext(f) sage: W.exact_field() Number Field in w with defining polynomial x^5 + 75*x^3 - 15*x^2 + 125*x - 5
>>> from sage.all import * >>> R = Zp(Integer(5),Integer(5)) >>> S = R['x']; (x,) = S._first_ngens(1) >>> f = x**Integer(5) + Integer(75)*x**Integer(3) - Integer(15)*x**Integer(2) +Integer(125)*x - Integer(5) >>> W = R.ext(f, names=('w',)); (w,) = W._first_ngens(1) >>> W.exact_field() Number Field in w with defining polynomial x^5 + 75*x^3 - 15*x^2 + 125*x - 5
See also
- exact_ring()[source]¶
Return the order with the same defining polynomial.
Will raise a
ValueError
if the coefficients of the defining polynomial are not integral.EXAMPLES:
sage: R = Zp(5,5) sage: S.<x> = R[] sage: f = x^5 + 75*x^3 - 15*x^2 +125*x - 5 sage: W.<w> = R.ext(f) sage: W.exact_ring() Order generated by w in Number Field in w with defining polynomial x^5 + 75*x^3 - 15*x^2 + 125*x - 5 sage: T = Zp(5,5) sage: U.<z> = T[] sage: g = 2*z^4 + 1 sage: V.<v> = T.ext(g) sage: V.exact_ring() Traceback (most recent call last): ... ValueError: each generator must be integral
>>> from sage.all import * >>> R = Zp(Integer(5),Integer(5)) >>> S = R['x']; (x,) = S._first_ngens(1) >>> f = x**Integer(5) + Integer(75)*x**Integer(3) - Integer(15)*x**Integer(2) +Integer(125)*x - Integer(5) >>> W = R.ext(f, names=('w',)); (w,) = W._first_ngens(1) >>> W.exact_ring() Order generated by w in Number Field in w with defining polynomial x^5 + 75*x^3 - 15*x^2 + 125*x - 5 >>> T = Zp(Integer(5),Integer(5)) >>> U = T['z']; (z,) = U._first_ngens(1) >>> g = Integer(2)*z**Integer(4) + Integer(1) >>> V = T.ext(g, names=('v',)); (v,) = V._first_ngens(1) >>> V.exact_ring() Traceback (most recent call last): ... ValueError: each generator must be integral
- free_module(base=None, basis=None, map=True)[source]¶
Return a free module \(V\) over a specified base ring together with maps to and from \(V\).
INPUT:
base
– a subring \(R\) so that this ring/field is isomorphic to a finite-rank free \(R\)-module \(V\)basis
– a basis for this ring/field over the basemap
– boolean (default:True
); whether to return \(R\)-linear maps to and from \(V\)
OUTPUT:
A finite-rank free \(R\)-module \(V\)
An \(R\)-module isomorphism from \(V\) to this ring/field (only included if
map
isTrue
)An \(R\)-module isomorphism from this ring/field to \(V\) (only included if
map
isTrue
)
EXAMPLES:
sage: R.<x> = ZZ[] sage: K.<a> = Qq(125) sage: L.<pi> = K.extension(x^2-5) sage: V, from_V, to_V = K.free_module() sage: W, from_W, to_W = L.free_module() sage: W0, from_W0, to_W0 = L.free_module(base=Qp(5)) sage: to_V(a + O(5^7)) (O(5^7), 1 + O(5^7), O(5^7)) sage: to_W(a) (a + O(5^20), O(5^20)) sage: to_W0(a + O(5^7)) (O(5^7), 1 + O(5^7), O(5^7), O(5^7), O(5^7), O(5^7)) sage: to_W(pi) (O(5^21), 1 + O(5^20)) sage: to_W0(pi + O(pi^11)) (O(5^6), O(5^6), O(5^6), 1 + O(5^5), O(5^5), O(5^5)) sage: X, from_X, to_X = K.free_module(K) sage: to_X(a) (a + O(5^20))
>>> from sage.all import * >>> R = ZZ['x']; (x,) = R._first_ngens(1) >>> K = Qq(Integer(125), names=('a',)); (a,) = K._first_ngens(1) >>> L = K.extension(x**Integer(2)-Integer(5), names=('pi',)); (pi,) = L._first_ngens(1) >>> V, from_V, to_V = K.free_module() >>> W, from_W, to_W = L.free_module() >>> W0, from_W0, to_W0 = L.free_module(base=Qp(Integer(5))) >>> to_V(a + O(Integer(5)**Integer(7))) (O(5^7), 1 + O(5^7), O(5^7)) >>> to_W(a) (a + O(5^20), O(5^20)) >>> to_W0(a + O(Integer(5)**Integer(7))) (O(5^7), 1 + O(5^7), O(5^7), O(5^7), O(5^7), O(5^7)) >>> to_W(pi) (O(5^21), 1 + O(5^20)) >>> to_W0(pi + O(pi**Integer(11))) (O(5^6), O(5^6), O(5^6), 1 + O(5^5), O(5^5), O(5^5)) >>> X, from_X, to_X = K.free_module(K) >>> to_X(a) (a + O(5^20))
- ground_ring()[source]¶
Return the ring of which this ring is an extension.
EXAMPLES:
sage: R = Zp(5,5) sage: S.<x> = R[] sage: f = x^5 + 75*x^3 - 15*x^2 +125*x - 5 sage: W.<w> = R.ext(f) sage: W.ground_ring() 5-adic Ring with capped relative precision 5
>>> from sage.all import * >>> R = Zp(Integer(5),Integer(5)) >>> S = R['x']; (x,) = S._first_ngens(1) >>> f = x**Integer(5) + Integer(75)*x**Integer(3) - Integer(15)*x**Integer(2) +Integer(125)*x - Integer(5) >>> W = R.ext(f, names=('w',)); (w,) = W._first_ngens(1) >>> W.ground_ring() 5-adic Ring with capped relative precision 5
- ground_ring_of_tower()[source]¶
Return the \(p\)-adic base ring of which this is ultimately an extension.
Currently this function is identical to
ground_ring()
, since relative extensions have not yet been implemented.EXAMPLES:
sage: Qq(27,30,names='a').ground_ring_of_tower() 3-adic Field with capped relative precision 30
>>> from sage.all import * >>> Qq(Integer(27),Integer(30),names='a').ground_ring_of_tower() 3-adic Field with capped relative precision 30
- modulus(exact=False)[source]¶
Return the polynomial defining this extension.
INPUT:
exact
– boolean (default:False
); whether to return the underlying exact defining polynomial rather than the one with coefficients in the base ring
EXAMPLES:
sage: R = Zp(5,5) sage: S.<x> = R[] sage: f = x^5 + 75*x^3 - 15*x^2 +125*x - 5 sage: W.<w> = R.ext(f) sage: W.modulus() (1 + O(5^5))*x^5 + O(5^6)*x^4 + (3*5^2 + O(5^6))*x^3 + (2*5 + 4*5^2 + 4*5^3 + 4*5^4 + 4*5^5 + O(5^6))*x^2 + (5^3 + O(5^6))*x + 4*5 + 4*5^2 + 4*5^3 + 4*5^4 + 4*5^5 + O(5^6) sage: W.modulus(exact=True) x^5 + 75*x^3 - 15*x^2 + 125*x - 5
>>> from sage.all import * >>> R = Zp(Integer(5),Integer(5)) >>> S = R['x']; (x,) = S._first_ngens(1) >>> f = x**Integer(5) + Integer(75)*x**Integer(3) - Integer(15)*x**Integer(2) +Integer(125)*x - Integer(5) >>> W = R.ext(f, names=('w',)); (w,) = W._first_ngens(1) >>> W.modulus() (1 + O(5^5))*x^5 + O(5^6)*x^4 + (3*5^2 + O(5^6))*x^3 + (2*5 + 4*5^2 + 4*5^3 + 4*5^4 + 4*5^5 + O(5^6))*x^2 + (5^3 + O(5^6))*x + 4*5 + 4*5^2 + 4*5^3 + 4*5^4 + 4*5^5 + O(5^6) >>> W.modulus(exact=True) x^5 + 75*x^3 - 15*x^2 + 125*x - 5
See also
- polynomial_ring()[source]¶
Return the polynomial ring of which this is a quotient.
EXAMPLES:
sage: Qq(27,30,names='a').polynomial_ring() Univariate Polynomial Ring in x over 3-adic Field with capped relative precision 30
>>> from sage.all import * >>> Qq(Integer(27),Integer(30),names='a').polynomial_ring() Univariate Polynomial Ring in x over 3-adic Field with capped relative precision 30
- random_element()[source]¶
Return a random element of
self
.This is done by picking a random element of the ground ring self.degree() times, then treating those elements as coefficients of a polynomial in self.gen().
EXAMPLES:
sage: R.<a> = Zq(125, 5) sage: R.random_element().parent() is R True sage: R = Zp(5,3); S.<x> = ZZ[]; f = x^5 + 25*x^2 - 5; W.<w> = R.ext(f) sage: W.random_element().parent() is W True
>>> from sage.all import * >>> R = Zq(Integer(125), Integer(5), names=('a',)); (a,) = R._first_ngens(1) >>> R.random_element().parent() is R True >>> R = Zp(Integer(5),Integer(3)); S = ZZ['x']; (x,) = S._first_ngens(1); f = x**Integer(5) + Integer(25)*x**Integer(2) - Integer(5); W = R.ext(f, names=('w',)); (w,) = W._first_ngens(1) >>> W.random_element().parent() is W True
- class sage.rings.padics.padic_extension_generic.pAdicModuleIsomorphism[source]¶
Bases:
Map
A base class for various isomorphisms between \(p\)-adic rings/fields and free modules.
EXAMPLES:
sage: K.<a> = Qq(125) sage: V, fr, to = K.free_module() sage: from sage.rings.padics.padic_extension_generic import pAdicModuleIsomorphism sage: isinstance(fr, pAdicModuleIsomorphism) True
>>> from sage.all import * >>> K = Qq(Integer(125), names=('a',)); (a,) = K._first_ngens(1) >>> V, fr, to = K.free_module() >>> from sage.rings.padics.padic_extension_generic import pAdicModuleIsomorphism >>> isinstance(fr, pAdicModuleIsomorphism) True