Splitting Algebras#
Splitting algebras have been considered by Dan Laksov, Anders Thorup, Torsten Ekedahl and others (see references below) in order to study intersection theory of Grassmann and other flag schemes. Similarly as splitting fields they can be considered as extensions of rings containing all the roots of a given monic polynomial over that ring under the assumption that its Galois group is the symmetric group of order equal to the polynomial’s degree.
Thus they can be used as a tool to express elements of a ring generated by \(n\) indeterminates in terms of symmetric functions in these indeterminates.
This realization of splitting algebras follows the approach of a recursive
quotient ring construction splitting off some linear factor of the
polynomial in each recursive step. Accordingly it is inherited from
PolynomialQuotientRing_domain
.
AUTHORS:
Sebastian Oehms (April 2020): initial version
- class sage.algebras.splitting_algebra.SplittingAlgebra(monic_polynomial, names='X', iterate=True, warning=True)#
Bases:
sage.rings.polynomial.polynomial_quotient_ring.PolynomialQuotientRing_domain
For a given monic polynomial \(p(t)\) of degree \(n\) over a commutative ring \(R\), the splitting algebra is the universal \(R\)-algebra in which \(p(t)\) has \(n\) roots, or, more precisely, over which \(p(t)\) factors,
\[p(t) = (t - \xi_1) \cdots (t - \xi_n).\]This class creates an algebra as extension over the base ring of a given polynomial \(p\) such that \(p\) splits into linear factors over that extension. It is assumed (and not checked in general) that the Galois group of \(p\) is the symmetric Group \(S(n)\). The construction is recursive (following [LT2012], 1.3).
INPUT:
monic_polynomial
– the monic polynomial which should be splitnames
– names for the indeterminates to be adjoined to the base ring ofmonic_polynomial
warning
– (default:True
) can be used (by setting toFalse
) to suppress a warning which will be thrown whenever it cannot be checked that the Galois group ofmonic_polynomial
is maximal
EXAMPLES:
sage: from sage.algebras.splitting_algebra import SplittingAlgebra sage: Lc.<w> = LaurentPolynomialRing(ZZ) sage: PabLc.<u,v> = Lc[]; t = polygen(PabLc) sage: S.<x, y> = SplittingAlgebra(t^3 - u*t^2 + v*t - w) doctest:...: UserWarning: Assuming x^3 - u*x^2 + v*x - w to have maximal Galois group! sage: roots = S.splitting_roots(); roots [x, y, -y - x + u] sage: all(t^3 -u*t^2 +v*t -w == 0 for t in roots) True sage: xi = ~x; xi (w^-1)*x^2 + ((-w^-1)*u)*x + (w^-1)*v sage: ~xi == x True sage: ~y ((-w^-1)*x)*y + (-w^-1)*x^2 + ((w^-1)*u)*x sage: zi = ((w^-1)*x)*y; ~zi -y - x + u sage: cp3 = cyclotomic_polynomial(3).change_ring(GF(5)) sage: CR3.<e3> = SplittingAlgebra(cp3) sage: CR3.is_field() True sage: CR3.cardinality() 25 sage: F.<a> = cp3.splitting_field() sage: F.cardinality() 25 sage: E3 = cp3.change_ring(F).roots()[0][0]; E3 3*a + 3 sage: f = CR3.hom([E3]); f Ring morphism: From: Splitting Algebra of x^2 + x + 1 with roots [e3, 4*e3 + 4] over Finite Field of size 5 To: Finite Field in a of size 5^2 Defn: e3 |--> 3*a + 3
REFERENCES:
- Element#
alias of
SplittingAlgebraElement
- defining_polynomial()#
Return the defining polynomial of
self
.EXAMPLES:
sage: from sage.algebras.splitting_algebra import SplittingAlgebra sage: L.<u, v, w > = LaurentPolynomialRing(ZZ) sage: x = polygen(L) sage: S = SplittingAlgebra(x^3 - u*x^2 + v*x - w, ('X', 'Y')) sage: S.defining_polynomial() x^3 - u*x^2 + v*x - w
- hom(im_gens, codomain=None, check=True, base_map=None)#
This version keeps track with the special recursive structure of
SplittingAlgebra
Type
Ring.hom?
to see the general documentation of this method. Here you see just special examples for the current class.EXAMPLES:
sage: from sage.algebras.splitting_algebra import SplittingAlgebra sage: L.<u, v, w> = LaurentPolynomialRing(ZZ); x = polygen(L) sage: S = SplittingAlgebra(x^3 - u*x^2 + v*x - w, ('X', 'Y')) sage: P.<x, y, z> = PolynomialRing(ZZ) sage: F = FractionField(P) sage: im_gens = [F(g) for g in [y, x, x + y + z, x*y+x*z+y*z, x*y*z]] sage: f = S.hom(im_gens) sage: f(u), f(v), f(w) (x + y + z, x*y + x*z + y*z, x*y*z) sage: roots = S.splitting_roots(); roots [X, Y, -Y - X + u] sage: [f(r) for r in roots] [x, y, z]
- is_completely_split()#
Return True if the defining polynomial of
self
splits into linear factors overself
.EXAMPLES:
sage: from sage.algebras.splitting_algebra import SplittingAlgebra sage: L.<u, v, w > = LaurentPolynomialRing(ZZ); x = polygen(L) sage: S.<a,b> = SplittingAlgebra(x^3 - u*x^2 + v*x - w) sage: S.is_completely_split() True sage: S.base_ring().is_completely_split() False
- lifting_map()#
Return a section map from
self
to the cover ring. It is implemented according to the same named method ofQuotientRing_nc
.EXAMPLES:
sage: from sage.algebras.splitting_algebra import SplittingAlgebra sage: x = polygen(ZZ) sage: S = SplittingAlgebra(x^2+1, ('I',)) sage: lift = S.lifting_map() sage: lift(5) 5 sage: r1, r2 =S.splitting_roots() sage: lift(r1) I
- scalar_base_ring()#
Return the ring of scalars of
self
(considered as an algebra)EXAMPLES:
sage: from sage.algebras.splitting_algebra import SplittingAlgebra sage: L.<u, v, w > = LaurentPolynomialRing(ZZ) sage: x = polygen(L) sage: S = SplittingAlgebra(x^3 - u*x^2 + v*x - w, ('X', 'Y')) sage: S.base_ring() Factorization Algebra of x^3 - u*x^2 + v*x - w with roots [X] over Multivariate Laurent Polynomial Ring in u, v, w over Integer Ring sage: S.scalar_base_ring() Multivariate Laurent Polynomial Ring in u, v, w over Integer Ring
- splitting_roots()#
Return the roots of the split equation.
EXAMPLES:
sage: from sage.algebras.splitting_algebra import SplittingAlgebra sage: x = polygen(ZZ) sage: S = SplittingAlgebra(x^2+1, ('I',)) sage: S.splitting_roots() [I, -I]
- class sage.algebras.splitting_algebra.SplittingAlgebraElement(parent, polynomial, check=True)#
Bases:
sage.rings.polynomial.polynomial_quotient_ring_element.PolynomialQuotientRingElement
Element class for
SplittingAlgebra
.EXAMPLES:
sage: from sage.algebras.splitting_algebra import SplittingAlgebra sage: cp6 = cyclotomic_polynomial(6) sage: CR6.<e6> = SplittingAlgebra(cp6) sage: type(e6) <class 'sage.algebras.splitting_algebra.SplittingAlgebra_with_category.element_class'> sage: type(CR6(5)) <class 'sage.algebras.splitting_algebra.SplittingAlgebra_with_category.element_class'>
- dict()#
Return the dictionary of
self
according to its lift to the cover.EXAMPLES:
sage: from sage.algebras.splitting_algebra import SplittingAlgebra sage: CR3.<e3> = SplittingAlgebra(cyclotomic_polynomial(3)) sage: (e3 + 42).dict() {0: 42, 1: 1}
- is_unit()#
Return
True
ifself
is invertible.EXAMPLES:
sage: from sage.algebras.splitting_algebra import SplittingAlgebra sage: CR3.<e3> = SplittingAlgebra(cyclotomic_polynomial(3)) sage: e3.is_unit() True
- sage.algebras.splitting_algebra.solve_with_extension(monic_polynomial, root_names=None, var='x', flatten=False, warning=True)#
Return all roots of a monic polynomial in its base ring or in an appropriate extension ring, as far as possible.
INPUT:
monic_polynomial
– the monic polynomial whose roots should be createdroot_names
– names for the indeterminates needed to define the splitting algebra of themonic_polynomial
(if necessary and possible)var
– (default:'x'
) for the indeterminate needed to define the splitting field of themonic_polynomial
(if necessary and possible)flatten
– (default:True
) ifTrue
the roots will not be given as a list of pairs(root, multiplicity)
but as a list of roots repeated according to their multiplicitywarning
– (default:True
) can be used (by setting toFalse
) to suppress a warning which will be thrown whenever it cannot be checked that the Galois group ofmonic_polynomial
is maximal
OUTPUT:
List of tuples
(root, multiplicity)
respectively list of roots repeated according to their multiplicity if optionflatten
isTrue
.EXAMPLES:
sage: from sage.algebras.splitting_algebra import solve_with_extension sage: t = polygen(ZZ) sage: p = t^2 -2*t +1 sage: solve_with_extension(p, flatten=True ) [1, 1] sage: solve_with_extension(p) [(1, 2)] sage: cp5 = cyclotomic_polynomial(5, var='T').change_ring(UniversalCyclotomicField()) sage: solve_with_extension(cp5) [(E(5), 1), (E(5)^4, 1), (E(5)^2, 1), (E(5)^3, 1)] sage: _[0][0].parent() Universal Cyclotomic Field