]> gitweb.michael.orlitzky.com - sage.d.git/commitdiff
eja: use charpoly coefficients to implement det() for elements.
authorMichael Orlitzky <michael@orlitzky.com>
Tue, 23 Jul 2019 04:48:07 +0000 (00:48 -0400)
committerMichael Orlitzky <michael@orlitzky.com>
Mon, 29 Jul 2019 03:19:01 +0000 (23:19 -0400)
mjo/eja/euclidean_jordan_algebra.py

index a0ba1c68bb30bf54383807c52961ad82e4a69f03..74c0bf1cb11e38460f39aef4920fa70f60d02409 100644 (file)
@@ -548,22 +548,37 @@ class FiniteDimensionalEuclideanJordanAlgebra(FiniteDimensionalAlgebra):
 
                 sage: J = JordanSpinEJA(2)
                 sage: e0,e1 = J.gens()
-                sage: x = e0 + e1
+                sage: x = sum( J.gens() )
                 sage: x.det()
                 0
+
+            ::
+
                 sage: J = JordanSpinEJA(3)
                 sage: e0,e1,e2 = J.gens()
-                sage: x = e0 + e1 + e2
+                sage: x = sum( J.gens() )
                 sage: x.det()
                 -1
 
+            TESTS:
+
+            An element is invertible if and only if its determinant is
+            non-zero::
+
+                sage: set_random_seed()
+                sage: x = random_eja().random_element()
+                sage: x.is_invertible() == (x.det() != 0)
+                True
+
             """
-            cs = self.characteristic_polynomial().coefficients(sparse=False)
-            r = len(cs) - 1
-            if r >= 0:
-                return cs[0] * (-1)**r
-            else:
-                raise ValueError('charpoly had no coefficients')
+            P = self.parent()
+            r = P.rank()
+            p = P._charpoly_coeff(0)
+            # The _charpoly_coeff function already adds the factor of
+            # -1 to ensure that _charpoly_coeff(0) is really what
+            # appears in front of t^{0} in the charpoly. However,
+            # we want (-1)^r times THAT for the determinant.
+            return ((-1)**r)*p(*self.vector())
 
 
         def inverse(self):
@@ -602,17 +617,12 @@ class FiniteDimensionalEuclideanJordanAlgebra(FiniteDimensionalAlgebra):
                 sage: J.one().inverse() == J.one()
                 True
 
-            If an element has an inverse, it acts like one. TODO: this
-            can be a lot less ugly once ``is_invertible`` doesn't crash
-            on irregular elements::
+            If an element has an inverse, it acts like one::
 
                 sage: set_random_seed()
                 sage: J = random_eja()
                 sage: x = J.random_element()
-                sage: try:
-                ....:     x.inverse()*x == J.one()
-                ....: except:
-                ....:     True
+                sage: (not x.is_invertible()) or (x.inverse()*x == J.one())
                 True
 
             """