+ return fdeja.__init__(field,
+ mult_table,
+ rank,
+ prefix=prefix,
+ category=category,
+ natural_basis=natural_basis)
+
+
+ def _a_regular_element(self):
+ """
+ Override the superalgebra method to return the one
+ regular element that is sure to exist in this
+ subalgebra, namely the element that generated it.
+
+ SETUP::
+
+ sage: from mjo.eja.eja_algebra import random_eja
+
+ TESTS::
+
+ sage: set_random_seed()
+ sage: J = random_eja().random_element().subalgebra_generated_by()
+ sage: J._a_regular_element().is_regular()
+ True
+
+ """
+ if self.dimension() == 0:
+ return self.zero()
+ else:
+ return self.monomial(1)
+
+
+ def _element_constructor_(self, elt):
+ """
+ Construct an element of this subalgebra from the given one.
+ The only valid arguments are elements of the parent algebra
+ that happen to live in this subalgebra.
+
+ SETUP::
+
+ sage: from mjo.eja.eja_algebra import RealSymmetricEJA
+ sage: from mjo.eja.eja_subalgebra import FiniteDimensionalEuclideanJordanElementSubalgebra
+
+ EXAMPLES::
+
+ sage: J = RealSymmetricEJA(3)
+ sage: x = sum( i*J.gens()[i] for i in range(6) )
+ sage: K = FiniteDimensionalEuclideanJordanElementSubalgebra(x,False)
+ sage: [ K(x^k) for k in range(J.rank()) ]
+ [f0, f1, f2]
+
+ ::
+
+ """
+ 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(self):
+ """
+ Return the multiplicative identity element of this algebra.
+
+ The superclass method computes the identity element, which is
+ beyond overkill in this case: the superalgebra identity
+ restricted to this algebra is its identity. Note that we can't
+ count on the first basis element being the identity -- it migth
+ have been scaled if we orthonormalized the basis.
+
+ 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 over the rationals::
+
+ sage: set_random_seed()
+ sage: x = random_eja().random_element()
+ sage: A = x.subalgebra_generated_by()
+ sage: x = A.random_element()
+ sage: A.one()*x == x and x*A.one() == x
+ True
+
+ The identity element acts like the identity over the algebraic
+ reals with an orthonormal basis::
+
+ sage: set_random_seed()
+ sage: x = random_eja(AA).random_element()
+ sage: A = x.subalgebra_generated_by(orthonormalize_basis=True)
+ sage: x = A.random_element()
+ sage: A.one()*x == x and x*A.one() == x
+ True
+
+ The matrix of the unit element's operator is the identity over
+ the rationals::
+
+ sage: set_random_seed()
+ sage: x = random_eja().random_element()
+ sage: A = x.subalgebra_generated_by()
+ sage: actual = A.one().operator().matrix()
+ sage: expected = matrix.identity(A.base_ring(), A.dimension())
+ sage: actual == expected
+ True
+
+ The matrix of the unit element's operator is the identity over
+ the algebraic reals with an orthonormal basis::
+
+ sage: set_random_seed()
+ sage: x = random_eja(AA).random_element()
+ sage: A = x.subalgebra_generated_by(orthonormalize_basis=True)
+ sage: actual = A.one().operator().matrix()
+ sage: expected = matrix.identity(A.base_ring(), A.dimension())
+ sage: actual == expected
+ True
+
+ """
+ if self.dimension() == 0:
+ return self.zero()
+ else:
+ sa_one = self.superalgebra().one().to_vector()
+ sa_coords = self.vector_space().coordinate_vector(sa_one)
+ return self.from_vector(sa_coords)
+
+
+ def natural_basis_space(self):
+ """
+ Return the natural basis space of this algebra, which is identical
+ to that of its superalgebra.
+
+ This is correct "by definition," and avoids a mismatch when the
+ subalgebra is trivial (with no natural basis to infer anything
+ from) and the parent is not.
+ """
+ return self.superalgebra().natural_basis_space()