]> gitweb.michael.orlitzky.com - sage.d.git/commitdiff
eja: use cached charpoly for element inverse() if possible.
authorMichael Orlitzky <michael@orlitzky.com>
Wed, 25 Nov 2020 04:43:17 +0000 (23:43 -0500)
committerMichael Orlitzky <michael@orlitzky.com>
Wed, 25 Nov 2020 04:43:17 +0000 (23:43 -0500)
mjo/eja/TODO
mjo/eja/eja_element.py

index 3c63d3b97796031de5ecf914f3051d8e47b93967..87cdcbcb57c781449590f999b0f14589da705d0e 100644 (file)
@@ -30,9 +30,7 @@
    the usual one. Then for the basis to be orthonormal, we would need
    to divide e.g. (1,0,0) by <(1,0,0),(1,0,0)> = 2 to normalize it.
 
-8. Use charpoly for inverse itself?
+8. Pre-cache charpoly for some small algebras?
 
-9. Pre-cache charpoly for some small algebras?
-
-10. Compute the scalar in the general natural_inner_product() for
-    matrices, so no overrides are necessary.
\ No newline at end of file
+9. Compute the scalar in the general natural_inner_product() for
+   matrices, so no overrides are necessary.
\ No newline at end of file
index 739bff334c5aa2069dbf09244e7a7fa39ceaccb3..5a0b213296beaa301c1b891311cdba65ce98534f 100644 (file)
@@ -507,6 +507,14 @@ class FiniteDimensionalEuclideanJordanAlgebraElement(IndexedFreeModuleElement):
         if not self.is_invertible():
             raise ValueError("element is not invertible")
 
+        if self.parent()._charpoly_coefficients.is_in_cache():
+            # We can invert using our charpoly if it will be fast to
+            # compute. If the coefficients are cached, our rank had
+            # better be too!
+            r = self.parent().rank()
+            a = self.characteristic_polynomial().coefficients(sparse=False)
+            return (-1)**(r+1)*sum(a[i+1]*self**i for i in range(r))/self.det()
+
         return (~self.quadratic_representation())(self)