Finite dimensional algebras with basis

Todo

Quotients of polynomial rings.

Quotients in general.

Matrix rings.

REFERENCES:

class sage.categories.finite_dimensional_algebras_with_basis.FiniteDimensionalAlgebrasWithBasis(base_category)

Bases: sage.categories.category_with_axiom.CategoryWithAxiom_over_base_ring

The category of finite dimensional algebras with a distinguished basis.

EXAMPLES:

sage: C = FiniteDimensionalAlgebrasWithBasis(QQ); C
Category of finite dimensional algebras with basis over Rational Field
sage: C.super_categories()
[Category of algebras with basis over Rational Field,
 Category of finite dimensional magmatic algebras with basis over Rational Field]
sage: C.example()
An example of a finite dimensional algebra with basis:
the path algebra of the Kronecker quiver
(containing the arrows a:x->y and b:x->y) over Rational Field
class Cellular(base_category)

Bases: sage.categories.category_with_axiom.CategoryWithAxiom_over_base_ring

Cellular algebras.

Let \(R\) be a commutative ring. A \(R\)-algebra \(A\) is a cellular algebra if it has a cell datum, which is a tuple \((\Lambda, i, M, C)\), where \(\Lambda\) is finite poset with order \(\ge\), if \(\mu \in \Lambda\) then \(T(\mu)\) is a finite set and

\[C \colon \coprod_{\mu\in\Lambda}T(\mu) \times T(\mu) \longrightarrow A; (\mu,s,t) \mapsto c^\mu_{st} \text{ is an injective map}\]

such that the following holds:

  • The set \(\{c^\mu_{st}\mid \mu\in\Lambda, s,t\in T(\mu)\}\) is a basis of \(A\).

  • If \(a \in A\) and \(\mu\in\Lambda, s,t \in T(\mu)\) then:

    \[a c^\mu_{st} = \sum_{u\in T(\mu)} r_a(s,u) c^\mu_{ut} \pmod{A^{>\mu}},\]

    where \(A^{>\mu}\) is spanned by

    \[\{ c^\nu_{ab} \mid \nu > \mu \text{ and } a,b \in T(\nu) \}.\]

    Moreover, the scalar \(r_a(s,u)\) depends only on \(a\), \(s\) and \(u\) and, in particular, is independent of \(t\).

  • The map \(\iota \colon A \longrightarrow A; c^\mu_{st} \mapsto c^\mu_{ts}\) is an algebra anti-isomorphism.

A cellular basis for \(A\) is any basis of the form \(\{c^\mu_{st} \mid \mu \in \Lambda, s,t \in T(\mu)\}\).

Note that in particular, the scalars \(r_a(u, s)\) in the second condition do not depend on \(t\).

REFERENCES:

class ElementMethods
cellular_involution()

Return the cellular involution on self.

EXAMPLES:

sage: S = SymmetricGroupAlgebra(QQ, 4)
sage: elt = S([3,1,2,4])
sage: ci = elt.cellular_involution(); ci
7/48*[1, 3, 2, 4] + 49/48*[2, 3, 1, 4]
 - 1/48*[3, 1, 2, 4] - 7/48*[3, 2, 1, 4]
sage: ci.cellular_involution()
[3, 1, 2, 4]
class ParentMethods
cell_module(mu, **kwds)

Return the cell module indexed by mu.

EXAMPLES:

sage: S = SymmetricGroupAlgebra(QQ, 3)
sage: S.cell_module(Partition([2,1]))
Cell module indexed by [2, 1] of Cellular basis of
 Symmetric group algebra of order 3 over Rational Field
cell_module_indices(mu)

Return the indices of the cell module of self indexed by mu .

This is the finite set \(M(\lambda)\).

EXAMPLES:

sage: S = SymmetricGroupAlgebra(QQ, 3)
sage: S.cell_module_indices([2,1])
Standard tableaux of shape [2, 1]
cell_poset()

Return the cell poset of self.

EXAMPLES:

sage: S = SymmetricGroupAlgebra(QQ, 4)
sage: S.cell_poset()
Finite poset containing 5 elements
cells()

Return the cells of self.

EXAMPLES:

sage: S = SymmetricGroupAlgebra(QQ, 3)
sage: dict(S.cells())
{[1, 1, 1]: Standard tableaux of shape [1, 1, 1],
 [2, 1]: Standard tableaux of shape [2, 1],
 [3]: Standard tableaux of shape [3]}
cellular_basis()

Return the cellular basis of self.

EXAMPLES:

sage: S = SymmetricGroupAlgebra(QQ, 3)
sage: S.cellular_basis()
Cellular basis of Symmetric group algebra of order 3
 over Rational Field
cellular_involution(x)

Return the cellular involution of x in self.

EXAMPLES:

sage: S = SymmetricGroupAlgebra(QQ, 3)
sage: for b in S.basis(): b, S.cellular_involution(b)
([1, 2, 3], [1, 2, 3])
([1, 3, 2], 49/48*[1, 3, 2] + 7/48*[2, 3, 1]
            - 7/48*[3, 1, 2] - 1/48*[3, 2, 1])
([2, 1, 3], [2, 1, 3])
([2, 3, 1], -7/48*[1, 3, 2] - 1/48*[2, 3, 1]
             + 49/48*[3, 1, 2] + 7/48*[3, 2, 1])
([3, 1, 2], 7/48*[1, 3, 2] + 49/48*[2, 3, 1]
             - 1/48*[3, 1, 2] - 7/48*[3, 2, 1])
([3, 2, 1], -1/48*[1, 3, 2] - 7/48*[2, 3, 1]
             + 7/48*[3, 1, 2] + 49/48*[3, 2, 1])
simple_module_parameterization()

Return a parameterization of the simple modules of self.

The set of simple modules are parameterized by \(\lambda \in \Lambda\) such that the cell module bilinear form \(\Phi_{\lambda} \neq 0\).

EXAMPLES:

sage: S = SymmetricGroupAlgebra(QQ, 4)
sage: S.simple_module_parameterization()
([4], [3, 1], [2, 2], [2, 1, 1], [1, 1, 1, 1])
class TensorProducts(category, *args)

Bases: sage.categories.tensor.TensorProductsCategory

The category of cellular algebras constructed by tensor product of cellular algebras.

class ParentMethods
cell_module_indices(mu)

Return the indices of the cell module of self indexed by mu .

This is the finite set \(M(\lambda)\).

EXAMPLES:

sage: S2 = SymmetricGroupAlgebra(QQ, 2)
sage: S3 = SymmetricGroupAlgebra(QQ, 3)
sage: T = S2.tensor(S3)
sage: T.cell_module_indices(([1,1], [2,1]))
The Cartesian product of (Standard tableaux of shape [1, 1],
                          Standard tableaux of shape [2, 1])
cell_poset()

Return the cell poset of self.

EXAMPLES:

sage: S2 = SymmetricGroupAlgebra(QQ, 2)
sage: S3 = SymmetricGroupAlgebra(QQ, 3)
sage: T = S2.tensor(S3)
sage: T.cell_poset()
Finite poset containing 6 elements
cellular_involution()

Return the image of the cellular involution of the basis element indexed by i.

EXAMPLES:

sage: S2 = SymmetricGroupAlgebra(QQ, 2)
sage: S3 = SymmetricGroupAlgebra(QQ, 3)
sage: T = S2.tensor(S3)
sage: for b in T.basis(): b, T.cellular_involution(b)
([1, 2] # [1, 2, 3], [1, 2] # [1, 2, 3])
([1, 2] # [1, 3, 2],
 49/48*[1, 2] # [1, 3, 2] + 7/48*[1, 2] # [2, 3, 1]
  - 7/48*[1, 2] # [3, 1, 2] - 1/48*[1, 2] # [3, 2, 1])
([1, 2] # [2, 1, 3], [1, 2] # [2, 1, 3])
([1, 2] # [2, 3, 1],
 -7/48*[1, 2] # [1, 3, 2] - 1/48*[1, 2] # [2, 3, 1]
  + 49/48*[1, 2] # [3, 1, 2] + 7/48*[1, 2] # [3, 2, 1])
([1, 2] # [3, 1, 2],
 7/48*[1, 2] # [1, 3, 2] + 49/48*[1, 2] # [2, 3, 1]
  - 1/48*[1, 2] # [3, 1, 2] - 7/48*[1, 2] # [3, 2, 1])
([1, 2] # [3, 2, 1],
 -1/48*[1, 2] # [1, 3, 2] - 7/48*[1, 2] # [2, 3, 1]
  + 7/48*[1, 2] # [3, 1, 2] + 49/48*[1, 2] # [3, 2, 1])
([2, 1] # [1, 2, 3], [2, 1] # [1, 2, 3])
([2, 1] # [1, 3, 2],
 49/48*[2, 1] # [1, 3, 2] + 7/48*[2, 1] # [2, 3, 1]
  - 7/48*[2, 1] # [3, 1, 2] - 1/48*[2, 1] # [3, 2, 1])
([2, 1] # [2, 1, 3], [2, 1] # [2, 1, 3])
([2, 1] # [2, 3, 1],
 -7/48*[2, 1] # [1, 3, 2] - 1/48*[2, 1] # [2, 3, 1]
  + 49/48*[2, 1] # [3, 1, 2] + 7/48*[2, 1] # [3, 2, 1])
([2, 1] # [3, 1, 2],
 7/48*[2, 1] # [1, 3, 2] + 49/48*[2, 1] # [2, 3, 1]
  - 1/48*[2, 1] # [3, 1, 2] - 7/48*[2, 1] # [3, 2, 1])
([2, 1] # [3, 2, 1],
 -1/48*[2, 1] # [1, 3, 2] - 7/48*[2, 1] # [2, 3, 1]
  + 7/48*[2, 1] # [3, 1, 2] + 49/48*[2, 1] # [3, 2, 1])
extra_super_categories()

Tensor products of cellular algebras are cellular.

EXAMPLES:

sage: cat = Algebras(QQ).FiniteDimensional().WithBasis()
sage: cat.Cellular().TensorProducts().extra_super_categories()
[Category of finite dimensional cellular algebras with basis
 over Rational Field]
class ElementMethods
on_left_matrix(base_ring=None, action=<built-in function mul>, side='left')

Return the matrix of the action of self on the algebra.

INPUT:

  • base_ring – the base ring for the matrix to be constructed
  • action – a bivariate function (default: operator.mul())
  • side – ‘left’ or ‘right’ (default: ‘left’)

EXAMPLES:

sage: QS3 = SymmetricGroupAlgebra(QQ, 3)
sage: a = QS3([2,1,3])
sage: a.to_matrix(side='left')
[0 0 1 0 0 0]
[0 0 0 0 1 0]
[1 0 0 0 0 0]
[0 0 0 0 0 1]
[0 1 0 0 0 0]
[0 0 0 1 0 0]
sage: a.to_matrix(side='right')
[0 0 1 0 0 0]
[0 0 0 1 0 0]
[1 0 0 0 0 0]
[0 1 0 0 0 0]
[0 0 0 0 0 1]
[0 0 0 0 1 0]
sage: a.to_matrix(base_ring=RDF, side="left")
[0.0 0.0 1.0 0.0 0.0 0.0]
[0.0 0.0 0.0 0.0 1.0 0.0]
[1.0 0.0 0.0 0.0 0.0 0.0]
[0.0 0.0 0.0 0.0 0.0 1.0]
[0.0 1.0 0.0 0.0 0.0 0.0]
[0.0 0.0 0.0 1.0 0.0 0.0]

AUTHORS: Mike Hansen, …

to_matrix(base_ring=None, action=<built-in function mul>, side='left')

Return the matrix of the action of self on the algebra.

INPUT:

  • base_ring – the base ring for the matrix to be constructed
  • action – a bivariate function (default: operator.mul())
  • side – ‘left’ or ‘right’ (default: ‘left’)

EXAMPLES:

sage: QS3 = SymmetricGroupAlgebra(QQ, 3)
sage: a = QS3([2,1,3])
sage: a.to_matrix(side='left')
[0 0 1 0 0 0]
[0 0 0 0 1 0]
[1 0 0 0 0 0]
[0 0 0 0 0 1]
[0 1 0 0 0 0]
[0 0 0 1 0 0]
sage: a.to_matrix(side='right')
[0 0 1 0 0 0]
[0 0 0 1 0 0]
[1 0 0 0 0 0]
[0 1 0 0 0 0]
[0 0 0 0 0 1]
[0 0 0 0 1 0]
sage: a.to_matrix(base_ring=RDF, side="left")
[0.0 0.0 1.0 0.0 0.0 0.0]
[0.0 0.0 0.0 0.0 1.0 0.0]
[1.0 0.0 0.0 0.0 0.0 0.0]
[0.0 0.0 0.0 0.0 0.0 1.0]
[0.0 1.0 0.0 0.0 0.0 0.0]
[0.0 0.0 0.0 1.0 0.0 0.0]

AUTHORS: Mike Hansen, …

class ParentMethods
cartan_invariants_matrix()

Return the Cartan invariants matrix of the algebra.

OUTPUT: a matrix of non negative integers

Let \(A\) be this finite dimensional algebra and \((S_i)_{i\in I}\) be representatives of the right simple modules of \(A\). Note that their adjoints \(S_i^*\) are representatives of the left simple modules.

Let \((P^L_i)_{i\in I}\) and \((P^R_i)_{i\in I}\) be respectively representatives of the corresponding indecomposable projective left and right modules of \(A\). In particular, we assume that the indexing is consistent so that \(S_i^*=\operatorname{top} P^L_i\) and \(S_i=\operatorname{top} P^R_i\).

The Cartan invariant matrix \((C_{i,j})_{i,j\in I}\) is a matrix of non negative integers that encodes much of the representation theory of \(A\); namely:

  • \(C_{i,j}\) counts how many times \(S_i^*\otimes S_j\) appears as composition factor of \(A\) seen as a bimodule over itself;
  • \(C_{i,j}=\dim Hom_A(P^R_j, P^R_i)\);
  • \(C_{i,j}\) counts how many times \(S_j\) appears as composition factor of \(P^R_i\);
  • \(C_{i,j}=\dim Hom_A(P^L_i, P^L_j)\);
  • \(C_{i,j}\) counts how many times \(S_i^*\) appears as composition factor of \(P^L_j\).

In the commutative case, the Cartan invariant matrix is diagonal. In the context of solving systems of multivariate polynomial equations of dimension zero, \(A\) is the quotient of the polynomial ring by the ideal generated by the equations, the simple modules correspond to the roots, and the numbers \(C_{i,i}\) give the multiplicities of those roots.

Note

For simplicity, the current implementation assumes that the index set \(I\) is of the form \(\{0,\dots,n-1\}\). Better indexations will be possible in the future.

ALGORITHM:

The Cartan invariant matrix of \(A\) is computed from the dimension of the summands of its Peirce decomposition.

EXAMPLES:

For a semisimple algebra, in particular for group algebras in characteristic zero, the Cartan invariants matrix is the identity:

sage: A3 = SymmetricGroup(3).algebra(QQ)
sage: A3.cartan_invariants_matrix()
[1 0 0]
[0 1 0]
[0 0 1]

For the path algebra of a quiver, the Cartan invariants matrix counts the number of paths between two vertices:

sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example()
sage: A.cartan_invariants_matrix()
[1 2]
[0 1]

In the commutative case, the Cartan invariant matrix is diagonal:

sage: Z12 = Monoids().Finite().example(); Z12
An example of a finite multiplicative monoid: the integers modulo 12
sage: A = Z12.algebra(QQ)
sage: A.cartan_invariants_matrix()
[1 0 0 0 0 0 0 0 0]
[0 1 0 0 0 0 0 0 0]
[0 0 2 0 0 0 0 0 0]
[0 0 0 1 0 0 0 0 0]
[0 0 0 0 2 0 0 0 0]
[0 0 0 0 0 1 0 0 0]
[0 0 0 0 0 0 1 0 0]
[0 0 0 0 0 0 0 2 0]
[0 0 0 0 0 0 0 0 1]

With the algebra of the \(0\)-Hecke monoid:

sage: from sage.monoids.hecke_monoid import HeckeMonoid
sage: A = HeckeMonoid(SymmetricGroup(4)).algebra(QQ)
sage: A.cartan_invariants_matrix()
[1 0 0 0 0 0 0 0]
[0 2 1 0 1 1 0 0]
[0 1 1 0 1 0 0 0]
[0 0 0 1 0 1 1 0]
[0 1 1 0 1 0 0 0]
[0 1 0 1 0 2 1 0]
[0 0 0 1 0 1 1 0]
[0 0 0 0 0 0 0 1]
center()

Return the center of self.

See also

center_basis()

EXAMPLES:

sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example(); A
An example of a finite dimensional algebra with basis:
the path algebra of the Kronecker quiver
(containing the arrows a:x->y and b:x->y) over Rational Field
sage: center = A.center(); center
Center of An example of a finite dimensional algebra with basis:
the path algebra of the Kronecker quiver
(containing the arrows a:x->y and b:x->y) over Rational Field
sage: center in Algebras(QQ).WithBasis().FiniteDimensional().Commutative()
True
sage: center.dimension()
1
sage: center.basis()
Finite family {0: B[0]}
sage: center.ambient() is A
True
sage: [c.lift() for c in center.basis()]
[x + y]

The center of a semisimple algebra is semisimple:

sage: DihedralGroup(6).algebra(QQ).center() in Algebras(QQ).Semisimple()
True

Todo

  • Pickling by construction, as A.center()?
  • Lazy evaluation of _repr_
center_basis()

Return a basis of the center of self.

OUTPUT:

  • a list of elements of self.

See also

center()

EXAMPLES:

sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example(); A
An example of a finite dimensional algebra with basis:
the path algebra of the Kronecker quiver
(containing the arrows a:x->y and b:x->y) over Rational Field
sage: A.center_basis()
(x + y,)
idempotent_lift(x)

Lift an idempotent of the semisimple quotient into an idempotent of self.

Let \(A\) be this finite dimensional algebra and \(\pi\) be the projection \(A \rightarrow \overline{A}\) on its semisimple quotient. Let \(\overline{x}\) be an idempotent of \(\overline A\), and \(x\) any lift thereof in \(A\). This returns an idempotent \(e\) of \(A\) such that \(\pi(e)=\pi(x)\) and \(e\) is a polynomial in \(x\).

INPUT:

  • \(x\) – an element of \(A\) that projects on an idempotent \(\overline x\) of the semisimple quotient of \(A\). Alternatively one may give as input the idempotent \(\overline{x}\), in which case some lift thereof will be taken for \(x\).

OUTPUT: the idempotent \(e\) of self

ALGORITHM:

Iterate the formula \(1 - (1 - x^2)^2\) until having an idempotent.

See [CR1962] for correctness and termination proofs.

EXAMPLES:

sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example()
sage: S = A.semisimple_quotient()
sage: A.idempotent_lift(S.basis()['x'])
x
sage: A.idempotent_lift(A.basis()['y'])
y

Todo

Add some non trivial example

is_commutative()

Return whether self is a commutative algebra.

EXAMPLES:

sage: S4 = SymmetricGroupAlgebra(QQ, 4)
sage: S4.is_commutative()
False
sage: S2 = SymmetricGroupAlgebra(QQ, 2)
sage: S2.is_commutative()
True
is_identity_decomposition_into_orthogonal_idempotents(l)

Return whether l is a decomposition of the identity into orthogonal idempotents.

INPUT:

  • l – a list or iterable of elements of self

EXAMPLES:

sage: A = FiniteDimensionalAlgebrasWithBasis(QQ).example(); A
An example of a finite dimensional algebra with basis:
the path algebra of the Kronecker quiver
(containing the arrows a:x->y and b:x->y) over Rational Field

sage: x,y,a,b = A.algebra_generators(); x,y,a,b
(x, y, a, b)

sage: A.is_identity_decomposition_into_orthogonal_idempotents([A.one()])
True
sage: A.is_identity_decomposition_into_orthogonal_idempotents([x,y])
True
sage: A.is_identity_decomposition_into_orthogonal_idempotents([x+a, y-a])
True

Here the idempotents do not sum up to \(1\):

sage: A.is_identity_decomposition_into_orthogonal_idempotents([x])
False

Here \(1+x\) and \(-x\) are neither idempotent nor orthogonal:

sage: A.is_identity_decomposition_into_orthogonal_idempotents([1+x,-x])
False

With the algebra of the \(0\)-Hecke monoid:

sage: from sage.monoids.hecke_monoid import HeckeMonoid
sage: A = HeckeMonoid(SymmetricGroup(4)).algebra(QQ)
sage: idempotents = A.orthogonal_idempotents_central_mod_radical()
sage: A.is_identity_decomposition_into_orthogonal_idempotents(idempotents)
True

Here are some more counterexamples:

1. Some orthogonal elements summing to \(1\) but not being idempotent:

sage: class PQAlgebra(CombinatorialFreeModule):
....:     def __init__(self, F, p):
....:         # Construct the quotient algebra F[x] / p,
....:         # where p is a univariate polynomial.
....:         R = parent(p); x = R.gen()
....:         I = R.ideal(p)
....:         self._xbar = R.quotient(I).gen()
....:         basis_keys = [self._xbar**i for i in range(p.degree())]
....:         CombinatorialFreeModule.__init__(self, F, basis_keys,
....:                 category=Algebras(F).FiniteDimensional().WithBasis())
....:     def x(self):
....:         return self(self._xbar)
....:     def one(self):
....:         return self.basis()[self.base_ring().one()]
....:     def product_on_basis(self, w1, w2):
....:         return self.from_vector(vector(w1*w2))
sage: R.<x> = PolynomialRing(QQ)
sage: A = PQAlgebra(QQ, x**3 - x**2 + x + 1); y = A.x()
sage: a, b = y, 1-y
sage: A.is_identity_decomposition_into_orthogonal_idempotents((a, b))
False

For comparison:

sage: A = PQAlgebra(QQ, x**2 - x); y = A.x()
sage: a, b = y, 1-y
sage: A.is_identity_decomposition_into_orthogonal_idempotents((a, b))
True
sage: A.is_identity_decomposition_into_orthogonal_idempotents((a, A.zero(), b))
True
sage: A = PQAlgebra(QQ, x**3 - x**2 + x - 1); y = A.x()
sage: a = (y**2 + 1) / 2
sage: b = 1 - a
sage: A.is_identity_decomposition_into_orthogonal_idempotents((a, b))
True
  1. Some idempotents summing to 1 but not orthogonal:

    sage: R.<x> = PolynomialRing(GF(2))
    sage: A = PQAlgebra(GF(2), x)
    sage: a = A.one()
    sage: A.is_identity_decomposition_into_orthogonal_idempotents((a,))
    True
    sage: A.is_identity_decomposition_into_orthogonal_idempotents((a, a, a))
    False
    
  2. Some orthogonal idempotents not summing to the identity:

    sage: A.is_identity_decomposition_into_orthogonal_idempotents((a,a))
    False
    sage: A.is_identity_decomposition_into_orthogonal_idempotents(())
    False
    
isotypic_projective_modules(side='left')

Return the isotypic projective side self-modules.

Let \(P_i\) be representatives of the indecomposable projective side-modules of this finite dimensional algebra \(A\), and \(S_i\) be the associated simple modules.

The regular side representation of \(A\) can be decomposed as a direct sum \(A = \bigoplus_i Q_i\) where each \(Q_i\) is an isotypic projective module; namely \(Q_i\) is the direct sum of \(\dim S_i\) copies of the indecomposable projective module \(P_i\). This decomposition is not unique.

The isotypic projective modules are constructed as \(Q_i=e_iA\), where the \((e_i)_i\) is the decomposition of the identity into orthogonal idempotents obtained by lifting the central orthogonal idempotents of the semisimple quotient of \(A\).

INPUT:

  • side – ‘left’ or ‘right’ (default: ‘left’)

OUTPUT: a list of subspaces of self.

EXAMPLES:

sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example(); A
An example of a finite dimensional algebra with basis:
the path algebra of the Kronecker quiver
(containing the arrows a:x->y and b:x->y) over Rational Field
sage: Q = A.isotypic_projective_modules(side="left"); Q
[Free module generated by {0} over Rational Field,
 Free module generated by {0, 1, 2} over Rational Field]
sage: [[x.lift() for x in Qi.basis()]
....:  for Qi in Q]
[[x],
 [y, a, b]]

We check that the sum of the dimensions of the isotypic projective modules is the dimension of self:

sage: sum([Qi.dimension() for Qi in Q]) == A.dimension()
True
orthogonal_idempotents_central_mod_radical()

Return a family of orthogonal idempotents of self that project on the central orthogonal idempotents of the semisimple quotient.

OUTPUT:

  • a list of orthogonal idempotents obtained by lifting the central orthogonal idempotents of the semisimple quotient.

ALGORITHM:

The orthogonal idempotents of \(A\) are obtained by lifting the central orthogonal idempotents of the semisimple quotient \(\overline{A}\).

Namely, let \((\overline{f_i})\) be the central orthogonal idempotents of the semisimple quotient of \(A\). We recursively construct orthogonal idempotents of \(A\) by the following procedure: assuming \((f_i)_{i < n}\) is a set of already constructed orthogonal idempotent, we construct \(f_k\) by idempotent lifting of \((1-f) g (1-f)\), where \(g\) is any lift of \(\overline{e_k}\) and \(f=\sum_{i<k} f_i\).

See [CR1962] for correctness and termination proofs.

See also

  • Algebras.SemiSimple.FiniteDimensional.WithBasis.ParentMethods.central_orthogonal_idempotents()
  • idempotent_lift()

EXAMPLES:

sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example(); A
An example of a finite dimensional algebra with basis:
the path algebra of the Kronecker quiver
(containing the arrows a:x->y and b:x->y) over Rational Field
sage: A.orthogonal_idempotents_central_mod_radical()
(x, y)
sage: Z12 = Monoids().Finite().example(); Z12
An example of a finite multiplicative monoid: the integers modulo 12
sage: A = Z12.algebra(QQ)
sage: idempotents = A.orthogonal_idempotents_central_mod_radical()
sage: sorted(idempotents, key=str)
[-1/2*B[8] + 1/2*B[4],
 -B[0] + 1/2*B[8] + 1/2*B[4],
 -B[0] + 1/2*B[9] + 1/2*B[3],
 1/2*B[9] - 1/2*B[3],
 1/4*B[1] + 1/2*B[3] + 1/4*B[5] - 1/4*B[7] - 1/2*B[9] - 1/4*B[11],
 1/4*B[1] + 1/4*B[11] - 1/4*B[5] - 1/4*B[7],
 1/4*B[1] - 1/2*B[4] - 1/4*B[5] + 1/4*B[7] + 1/2*B[8] - 1/4*B[11],
 B[0],
 B[0] + 1/4*B[1] - 1/2*B[3] - 1/2*B[4] + 1/4*B[5] + 1/4*B[7] - 1/2*B[8] - 1/2*B[9] + 1/4*B[11]]
sage: sum(idempotents) == 1
True
sage: all(e*e == e for e in idempotents)
True
sage: all(e*f == 0 and f*e == 0 for e in idempotents for f in idempotents if e != f)
True

This is best tested with:

sage: A.is_identity_decomposition_into_orthogonal_idempotents(idempotents)
True

We construct orthogonal idempotents for the algebra of the \(0\)-Hecke monoid:

sage: from sage.monoids.hecke_monoid import HeckeMonoid
sage: A = HeckeMonoid(SymmetricGroup(4)).algebra(QQ)
sage: idempotents = A.orthogonal_idempotents_central_mod_radical()
sage: A.is_identity_decomposition_into_orthogonal_idempotents(idempotents)
True
peirce_decomposition(idempotents=None, check=True)

Return a Peirce decomposition of self.

Let \((e_i)_i\) be a collection of orthogonal idempotents of \(A\) with sum \(1\). The Peirce decomposition of \(A\) is the decomposition of \(A\) into the direct sum of the subspaces \(e_i A e_j\).

With the default collection of orthogonal idempotents, one has

\[\dim e_i A e_j = C_{i,j} \dim S_i \dim S_j\]

where \((S_i)_i\) are the simple modules of \(A\) and \((C_{i,j})_{i, j}\) is the Cartan invariants matrix.

INPUT:

  • idempotents – a list of orthogonal idempotents \((e_i)_{i=0,\ldots,n}\) of the algebra that sum to \(1\) (default: the idempotents returned by orthogonal_idempotents_central_mod_radical())
  • check – (default: True) whether to check that the idempotents are indeed orthogonal and idempotent and sum to \(1\)

OUTPUT:

A list of lists \(l\) such that l[i][j] is the subspace \(e_i A e_j\).

EXAMPLES:

sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example(); A
An example of a finite dimensional algebra with basis:
the path algebra of the Kronecker quiver
(containing the arrows a:x->y and b:x->y) over Rational Field
sage: A.orthogonal_idempotents_central_mod_radical()
(x, y)
sage: decomposition = A.peirce_decomposition(); decomposition
[[Free module generated by {0} over Rational Field,
  Free module generated by {0, 1} over Rational Field],
 [Free module generated by {} over Rational Field,
  Free module generated by {0} over Rational Field]]
sage: [ [[x.lift() for x in decomposition[i][j].basis()]
....:    for j in range(2)]
....:   for i in range(2)]
[[[x], [a, b]],
 [[], [y]]]

We recover that the group algebra of the symmetric group \(S_4\) is a block matrix algebra:

sage: A = SymmetricGroup(4).algebra(QQ)
sage: decomposition = A.peirce_decomposition()   # long time
sage: [[decomposition[i][j].dimension()          # long time (4s)
....:   for j in range(len(decomposition))]
....:  for i in range(len(decomposition))]
[[9, 0, 0, 0, 0],
 [0, 9, 0, 0, 0],
 [0, 0, 4, 0, 0],
 [0, 0, 0, 1, 0],
 [0, 0, 0, 0, 1]]

The dimension of each block is \(d^2\), where \(d\) is the dimension of the corresponding simple module of \(S_4\). The latter are given by:

sage: [p.standard_tableaux().cardinality() for p in Partitions(4)]
[1, 3, 2, 3, 1]
peirce_summand(ei, ej)

Return the Peirce decomposition summand \(e_i A e_j\).

INPUT:

  • self – an algebra \(A\)
  • ei, ej – two idempotents of \(A\)

OUTPUT: \(e_i A e_j\), as a subspace of \(A\).

EXAMPLES:

sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example()
sage: idemp = A.orthogonal_idempotents_central_mod_radical()
sage: A.peirce_summand(idemp[0], idemp[1])
Free module generated by {0, 1} over Rational Field
sage: A.peirce_summand(idemp[1], idemp[0])
Free module generated by {} over Rational Field

We recover the \(2\times2\) block of \(\QQ[S_4]\) corresponding to the unique simple module of dimension \(2\) of the symmetric group \(S_4\):

sage: A4 = SymmetricGroup(4).algebra(QQ)
sage: e = A4.central_orthogonal_idempotents()[2]
sage: A4.peirce_summand(e, e)
Free module generated by {0, 1, 2, 3} over Rational Field
principal_ideal(a, side='left')

Construct the side principal ideal generated by a.

EXAMPLES:

In order to highlight the difference between left and right principal ideals, our first example deals with a non commutative algebra:

sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example(); A
An example of a finite dimensional algebra with basis:
the path algebra of the Kronecker quiver
(containing the arrows a:x->y and b:x->y) over Rational Field
sage: x, y, a, b = A.basis()

In this algebra, multiplication on the right by \(x\) annihilates all basis elements but \(x\):

sage: x*x, y*x, a*x, b*x
(x, 0, 0, 0)

so the left ideal generated by \(x\) is one-dimensional:

sage: Ax = A.principal_ideal(x, side='left'); Ax
Free module generated by {0} over Rational Field
sage: [B.lift() for B in Ax.basis()]
[x]

Multiplication on the left by \(x\) annihilates only \(x\) and fixes the other basis elements:

sage: x*x, x*y, x*a, x*b
(x, 0, a, b)

so the right ideal generated by \(x\) is 3-dimensional:

sage: xA = A.principal_ideal(x, side='right'); xA
Free module generated by {0, 1, 2} over Rational Field
sage: [B.lift() for B in xA.basis()]
[x, a, b]

See also

radical()

Return the Jacobson radical of self.

This uses radical_basis(), whose default implementation handles algebras over fields of characteristic zero or fields of characteristic \(p\) in which we can compute \(x^{1/p}\).

EXAMPLES:

sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example(); A
An example of a finite dimensional algebra with basis:
the path algebra of the Kronecker quiver
(containing the arrows a:x->y and b:x->y) over Rational Field
sage: radical = A.radical(); radical
Radical of An example of a finite dimensional algebra with basis:
the path algebra of the Kronecker quiver
(containing the arrows a:x->y and b:x->y) over Rational Field

The radical is an ideal of \(A\), and thus a finite dimensional non unital associative algebra:

sage: from sage.categories.associative_algebras import AssociativeAlgebras
sage: radical in AssociativeAlgebras(QQ).WithBasis().FiniteDimensional()
True
sage: radical in Algebras(QQ)
False

sage: radical.dimension()
2
sage: radical.basis()
Finite family {0: B[0], 1: B[1]}
sage: radical.ambient() is A
True
sage: [c.lift() for c in radical.basis()]
[a, b]

Todo

  • Tell Sage that the radical is in fact an ideal;
  • Pickling by construction, as A.center();
  • Lazy evaluation of _repr_.
radical_basis()

Return a basis of the Jacobson radical of this algebra.

Note

This implementation handles algebras over fields of characteristic zero (using Dixon’s lemma) or fields of characteristic \(p\) in which we can compute \(x^{1/p}\) [FR1985], [Eb1989].

OUTPUT:

  • a list of elements of self.

EXAMPLES:

sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example(); A
An example of a finite dimensional algebra with basis:
the path algebra of the Kronecker quiver
(containing the arrows a:x->y and b:x->y) over Rational Field
sage: A.radical_basis()
(a, b)

We construct the group algebra of the Klein Four-Group over the rationals:

sage: A = KleinFourGroup().algebra(QQ)

This algebra belongs to the category of finite dimensional algebras over the rationals:

sage: A in Algebras(QQ).FiniteDimensional().WithBasis()
True

Since the field has characteristic \(0\), Maschke’s Theorem tells us that the group algebra is semisimple. So its radical is the zero ideal:

sage: A in Algebras(QQ).Semisimple()
True
sage: A.radical_basis()
()

Let’s work instead over a field of characteristic \(2\):

sage: A = KleinFourGroup().algebra(GF(2))
sage: A in Algebras(GF(2)).Semisimple()
False
sage: A.radical_basis()
(() + (1,2)(3,4), (3,4) + (1,2)(3,4), (1,2) + (1,2)(3,4))

We now implement the algebra \(A = K[x] / (x^p-1)\), where \(K\) is a finite field of characteristic \(p\), and check its radical; alas, we currently need to wrap \(A\) to make it a proper ModulesWithBasis:

sage: class AnAlgebra(CombinatorialFreeModule):
....:     def __init__(self, F):
....:         R.<x> = PolynomialRing(F)
....:         I = R.ideal(x**F.characteristic()-F.one())
....:         self._xbar = R.quotient(I).gen()
....:         basis_keys = [self._xbar**i for i in range(F.characteristic())]
....:         CombinatorialFreeModule.__init__(self, F, basis_keys,
....:                 category=Algebras(F).FiniteDimensional().WithBasis())
....:     def one(self):
....:         return self.basis()[self.base_ring().one()]
....:     def product_on_basis(self, w1, w2):
....:         return self.from_vector(vector(w1*w2))
sage: AnAlgebra(GF(3)).radical_basis()
(B[1] + 2*B[xbar^2], B[xbar] + 2*B[xbar^2])
sage: AnAlgebra(GF(16,'a')).radical_basis()
(B[1] + B[xbar],)
sage: AnAlgebra(GF(49,'a')).radical_basis()
(B[1] + 6*B[xbar^6], B[xbar] + 6*B[xbar^6], B[xbar^2] + 6*B[xbar^6],
 B[xbar^3] + 6*B[xbar^6], B[xbar^4] + 6*B[xbar^6], B[xbar^5] + 6*B[xbar^6])
semisimple_quotient()

Return the semisimple quotient of self.

This is the quotient of self by its radical.

See also

radical()

EXAMPLES:

sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example(); A
An example of a finite dimensional algebra with basis:
the path algebra of the Kronecker quiver
(containing the arrows a:x->y and b:x->y) over Rational Field
sage: a,b,x,y = sorted(A.basis())
sage: S = A.semisimple_quotient(); S
Semisimple quotient of An example of a finite dimensional algebra with basis:
the path algebra of the Kronecker quiver
(containing the arrows a:x->y and b:x->y) over Rational Field
sage: S in Algebras(QQ).Semisimple()
True
sage: S.basis()
Finite family {'x': B['x'], 'y': B['y']}
sage: xs,ys = sorted(S.basis())
sage: (xs + ys) * xs
B['x']

Sanity check: the semisimple quotient of the \(n\)-th descent algebra of the symmetric group is of dimension the number of partitions of \(n\):

sage: [ DescentAlgebra(QQ,n).B().semisimple_quotient().dimension()
....:   for n in range(6) ]
[1, 1, 2, 3, 5, 7]
sage: [Partitions(n).cardinality() for n in range(10)]
[1, 1, 2, 3, 5, 7, 11, 15, 22, 30]

Todo

  • Pickling by construction, as A.semisimple_quotient()?
  • Lazy evaluation of _repr_
class SubcategoryMethods
Cellular()

Return the full subcategory of the cellular objects of self.

EXAMPLES:

sage: Algebras(QQ).FiniteDimensional().WithBasis().Cellular()
Category of finite dimensional cellular algebras with basis
 over Rational Field