2. Inputs and outputs the underlying matrix with respect to COLUMN
vectors, unlike the parent class.
- 3. Allows us to add morphisms in the obvious way.
-
- 4. Allows us to invert morphisms.
+ 3. Allows us to add, multiply (compose), and invert morphisms in
+ the obvious way.
If this seems a bit heavyweight, it is. I would have been happy to
use a the ring morphism that underlies the finite-dimensional
algebra morphism, but they don't seem to be callable on elements of
- our EJA, and you can't add/invert them.
+ our EJA, and you can't add/multiply/invert them.
"""
def __add__(self, other):
return FiniteDimensionalEuclideanJordanAlgebraMorphism(self.parent(),
A.inverse())
+ def __mul__(self, other):
+ """
+ Compose two EJA morphisms using multiplicative notation.
+
+ EXAMPLES::
+
+ sage: J = RealSymmetricEJA(3)
+ sage: x = J.zero()
+ sage: y = J.one()
+ sage: x.operator() * y.operator()
+ Morphism from Euclidean Jordan algebra of degree 6 over Rational
+ Field to Euclidean Jordan algebra of degree 6 over Rational Field
+ given by matrix
+ [0 0 0 0 0 0]
+ [0 0 0 0 0 0]
+ [0 0 0 0 0 0]
+ [0 0 0 0 0 0]
+ [0 0 0 0 0 0]
+ [0 0 0 0 0 0]
+
+ TESTS::
+
+ sage: set_random_seed()
+ sage: J = random_eja()
+ sage: x = J.random_element()
+ sage: y = J.random_element()
+ sage: (x.operator() * y.operator()) in J.Hom(J)
+ True
+
+ """
+ if not other.codomain() is self.domain():
+ raise ValueError("(co)domains must agree for composition")
+
+ return FiniteDimensionalEuclideanJordanAlgebraMorphism(
+ self.parent(),
+ self.matrix()*other.matrix() )
+
+
def _repr_(self):
"""
We override only the representation that is shown to the user,