)
+ def is_isomorphism(self):
+ r"""
+ Return whether or not this operator is a Jordan isomorphism.
+
+ SETUP::
+
+ sage: from mjo.eja.eja_algebra import (HadamardEJA,
+ ....: TrivialEJA,
+ ....: random_eja)
+ sage: from mjo.eja.eja_operator import EJAOperator
+
+ EXAMPLES:
+
+ The zero operator is a Jordan isomorphism in the trivial algebra::
+
+ sage: J = TrivialEJA()
+ sage: J.zero().operator().is_isomorphism()
+ True
+
+ This counterexample in Section III.5 of Faraut & Koranyi is a
+ Jordan automorphism but not an isometry (which is tested
+ independently in :meth:`is_isometry`)::
+
+ sage: J1 = HadamardEJA(1)
+ sage: J2 = HadamardEJA(1, prefix='c') # ensures J2 is not J1
+ sage: J2._inner_product_matrix = 2*J1._inner_product_matrix
+ sage: J = cartesian_product([J1,J2])
+ sage: M = matrix(J1.base_ring(), [[0,1],[1,0]])
+ sage: L = EJAOperator(J,J,M)
+ sage: L.is_isomorphism()
+ True
+
+ TESTS:
+
+ The identity operator is always a Jordan isomorphism::
+
+ sage: J = random_eja()
+ sage: J.one().operator().is_isomorphism()
+ True
+
+ The zero operator is never a Jordan isomorphism in a
+ nontrivial algebra::
+
+ sage: J = random_eja()
+ sage: not J.is_trivial() and J.zero().operator().is_isomorphism()
+ False
+
+ """
+ return self.is_invertible() and self.is_homomorphism()
+
+
def matrix(self):
"""
Return the matrix representation of this operator with respect