+ def product_on_basis(self, i, j):
+ r"""
+ Return the product of the monomials indexed by ``i`` and ``j``.
+
+ This overrides the superclass method because here, both ``i``
+ and ``j`` will be ordered pairs.
+
+ SETUP::
+
+ sage: from mjo.eja.eja_algebra import (HadamardEJA,
+ ....: JordanSpinEJA,
+ ....: QuaternionHermitianEJA,
+ ....: RealSymmetricEJA,)
+
+ EXAMPLES::
+
+ sage: J1 = JordanSpinEJA(2, field=QQ)
+ sage: J2 = RealSymmetricEJA(2, field=QQ, orthonormalize=False)
+ sage: J3 = HadamardEJA(1, field=QQ)
+ sage: K1 = cartesian_product([J1,J2])
+ sage: K2 = cartesian_product([K1,J3])
+ sage: list(K2.basis())
+ [e(0, (0, 0)), e(0, (0, 1)), e(0, (1, 0)), e(0, (1, 1)),
+ e(0, (1, 2)), e(1, 0)]
+ sage: g = K2.gens()
+ sage: (g[0] + 2*g[3]) * (g[1] - 4*g[2])
+ e(0, (0, 1)) - 4*e(0, (1, 1))
+
+ TESTS::
+
+ sage: J1 = RealSymmetricEJA(1,field=QQ)
+ sage: J2 = QuaternionHermitianEJA(1,field=QQ)
+ sage: J = cartesian_product([J1,J2])
+ sage: x = sum(J.gens())
+ sage: x == J.one()
+ True
+ sage: x*x == x
+ True
+
+ """
+ l = self._monomial_to_generator(i)
+ m = self._monomial_to_generator(j)
+ return FiniteDimensionalEJA.product_on_basis(self, l, m)
+
+ def matrix_space(self):
+ r"""
+ Return the space that our matrix basis lives in as a Cartesian
+ product.
+
+ SETUP::
+
+ sage: from mjo.eja.eja_algebra import (HadamardEJA,
+ ....: RealSymmetricEJA)
+
+ EXAMPLES::
+
+ sage: J1 = HadamardEJA(1)
+ sage: J2 = RealSymmetricEJA(2)
+ sage: J = cartesian_product([J1,J2])
+ sage: J.matrix_space()
+ The Cartesian product of (Full MatrixSpace of 1 by 1 dense
+ matrices over Algebraic Real Field, Full MatrixSpace of 2
+ by 2 dense matrices over Algebraic Real Field)
+
+ """
+ from sage.categories.cartesian_product import cartesian_product
+ return cartesian_product( [J.matrix_space()
+ for J in self.cartesian_factors()] )