From: Michael Orlitzky Date: Fri, 26 Jul 2019 17:03:37 +0000 (-0400) Subject: eja: add composition (multiplication) for morphisms. X-Git-Url: https://gitweb.michael.orlitzky.com/?a=commitdiff_plain;h=aff15cd0c15bd9953531b1d54041f2d90f1d1cff;p=sage.d.git eja: add composition (multiplication) for morphisms. The whatever-superclass composition of morphisms returned a formal composition, which can't be treated like a morphism itself. Since all of our morphisms are represented by matrices, we can simply perform the composition ourself via matrix multiplication to return something useful. --- diff --git a/mjo/eja/euclidean_jordan_algebra.py b/mjo/eja/euclidean_jordan_algebra.py index 78fa6b7..d459ebe 100644 --- a/mjo/eja/euclidean_jordan_algebra.py +++ b/mjo/eja/euclidean_jordan_algebra.py @@ -30,14 +30,13 @@ class FiniteDimensionalEuclideanJordanAlgebraMorphism(FiniteDimensionalAlgebraMo 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): @@ -125,6 +124,44 @@ class FiniteDimensionalEuclideanJordanAlgebraMorphism(FiniteDimensionalAlgebraMo 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,