# matrix for the successive basis elements b0, b1,... of
# that subspace.
field = superalgebra.base_ring()
- mult_table = []
- for b_right in superalgebra_basis:
- b_right_cols = []
- # The first column of the left-multiplication matrix by
- # b1 is what we get if we apply that matrix to b1. The
- # second column of the left-multiplication matrix by b1
- # is what we get when we apply that matrix to b2...
- for b_left in superalgebra_basis:
- # Multiply in the original EJA, but then get the
- # coordinates from the subalgebra in terms of its
- # basis.
- this_col = W.coordinates((b_left*b_right).to_vector())
- b_right_cols.append(this_col)
- b_right_matrix = matrix.column(field, b_right_cols)
- mult_table.append(b_right_matrix)
-
- for m in mult_table:
- m.set_immutable()
- mult_table = tuple(mult_table)
+ n = len(superalgebra_basis)
+ mult_table = [[W.zero() for i in range(n)] for j in range(n)]
+ for i in range(n):
+ for j in range(n):
+ product = superalgebra_basis[i]*superalgebra_basis[j]
+ mult_table[i][j] = W.coordinate_vector(product.to_vector())
# TODO: We'll have to redo this and make it unique again...
prefix = 'f'
::
"""
+ if elt == 0:
+ # Just as in the superalgebra class, we need to hack
+ # this special case to ensure that random_element() can
+ # coerce a ring zero into the algebra.
+ return self.zero()
+
if elt in self.superalgebra():
coords = self.vector_space().coordinate_vector(elt.to_vector())
return self.from_vector(coords)
+ def one_basis(self):
+ """
+ Return the basis-element-index of this algebra's unit element.
+ """
+ return 0
+
+
+ def one(self):
+ """
+ Return the multiplicative identity element of this algebra.
+
+ The superclass method computes the identity element, which is
+ beyond overkill in this case: the algebra identity should be our
+ first basis element. We implement this via :meth:`one_basis`
+ because that method can optionally be used by other parts of the
+ category framework.
+
+ SETUP::
+
+ sage: from mjo.eja.eja_algebra import (RealCartesianProductEJA,
+ ....: random_eja)
+
+ EXAMPLES::
+
+ sage: J = RealCartesianProductEJA(5)
+ sage: J.one()
+ e0 + e1 + e2 + e3 + e4
+ sage: x = sum(J.gens())
+ sage: A = x.subalgebra_generated_by()
+ sage: A.one()
+ f0
+ sage: A.one().superalgebra_element()
+ e0 + e1 + e2 + e3 + e4
+
+ TESTS:
+
+ The identity element acts like the identity::
+
+ sage: set_random_seed()
+ sage: J = random_eja().random_element().subalgebra_generated_by()
+ sage: x = J.random_element()
+ sage: J.one()*x == x and x*J.one() == x
+ True
+
+ The matrix of the unit element's operator is the identity::
+
+ sage: set_random_seed()
+ sage: J = random_eja().random_element().subalgebra_generated_by()
+ sage: actual = J.one().operator().matrix()
+ sage: expected = matrix.identity(J.base_ring(), J.dimension())
+ sage: actual == expected
+ True
+ """
+ return self.monomial(self.one_basis())
+
+
def superalgebra(self):
"""
Return the superalgebra that this algebra was generated from.