]> gitweb.michael.orlitzky.com - sage.d.git/commitdiff
eja: more charpoly coefficient caching.
authorMichael Orlitzky <michael@orlitzky.com>
Wed, 10 Mar 2021 19:01:48 +0000 (14:01 -0500)
committerMichael Orlitzky <michael@orlitzky.com>
Wed, 10 Mar 2021 19:01:48 +0000 (14:01 -0500)
mjo/eja/eja_algebra.py
mjo/eja/eja_cache.py

index 587d8e339463adaafb0a390ec164e76a6e5ca0c4..a10e2a37f30313c54e0d0682c524c71f0e5af416 100644 (file)
@@ -2150,6 +2150,15 @@ class QuaternionHermitianEJA(MatrixEJA, RationalBasisEJA, ConcreteEJA):
         A = QuaternionMatrixAlgebra(n, scalars=field)
         super().__init__(A, **kwargs)
 
+        from mjo.eja.eja_cache import quaternion_hermitian_eja_coeffs
+        a = quaternion_hermitian_eja_coeffs(self)
+        if a is not None:
+            if self._rational_algebra is None:
+                self._charpoly_coefficients.set_cache(a)
+            else:
+                self._rational_algebra._charpoly_coefficients.set_cache(a)
+
+
 
     @staticmethod
     def _max_random_instance_size():
@@ -2281,9 +2290,9 @@ class OctonionHermitianEJA(MatrixEJA, RationalBasisEJA, ConcreteEJA):
         A = OctonionMatrixAlgebra(n, scalars=field)
         super().__init__(A, **kwargs)
 
-        if n == 3:
-            from mjo.eja.eja_cache import albert_eja_coeffs
-            a = albert_eja_coeffs(self.coordinate_polynomial_ring())
+        from mjo.eja.eja_cache import octonion_hermitian_eja_coeffs
+        a = octonion_hermitian_eja_coeffs(self)
+        if a is not None:
             if self._rational_algebra is None:
                 self._charpoly_coefficients.set_cache(a)
             else:
index 73405b347648714b7b8329c0fb2fcfd8b3a35808..84983211c47a95222e39bf988094d1ca176c71ee 100644 (file)
-def albert_eja_coeffs(R):
-    X = R.gens()
-    a0 = ( X[9]*X[10]**2 + X[9]*X[11]**2 + X[9]*X[12]**2 + X[9]*X[13]**2 +
-           X[9]*X[14]**2 + X[9]*X[15]**2 + X[9]*X[16]**2 + X[9]*X[17]**2 -
-           2*X[1]*X[10]*X[18] - 2*X[2]*X[11]*X[18] - 2*X[3]*X[12]*X[18] -
-           2*X[4]*X[13]*X[18] - 2*X[5]*X[14]*X[18] - 2*X[6]*X[15]*X[18] -
-           2*X[7]*X[16]*X[18] - 2*X[8]*X[17]*X[18] + X[0]*X[18]**2 +
-           2*X[2]*X[10]*X[19] - 2*X[1]*X[11]*X[19] + 2*X[4]*X[12]*X[19] -
-           2*X[3]*X[13]*X[19] + 2*X[6]*X[14]*X[19] - 2*X[5]*X[15]*X[19] -
-           2*X[8]*X[16]*X[19] + 2*X[7]*X[17]*X[19] + X[0]*X[19]**2 +
-           2*X[3]*X[10]*X[20] - 2*X[4]*X[11]*X[20] - 2*X[1]*X[12]*X[20] +
-           2*X[2]*X[13]*X[20] + 2*X[7]*X[14]*X[20] + 2*X[8]*X[15]*X[20] -
-           2*X[5]*X[16]*X[20] - 2*X[6]*X[17]*X[20] + X[0]*X[20]**2 +
-           2*X[4]*X[10]*X[21] + 2*X[3]*X[11]*X[21] - 2*X[2]*X[12]*X[21] -
-           2*X[1]*X[13]*X[21] + 2*X[8]*X[14]*X[21] - 2*X[7]*X[15]*X[21] +
-           2*X[6]*X[16]*X[21] - 2*X[5]*X[17]*X[21] + X[0]*X[21]**2 +
-           2*X[5]*X[10]*X[22] - 2*X[6]*X[11]*X[22] - 2*X[7]*X[12]*X[22] -
-           2*X[8]*X[13]*X[22] - 2*X[1]*X[14]*X[22] + 2*X[2]*X[15]*X[22] +
-           2*X[3]*X[16]*X[22] + 2*X[4]*X[17]*X[22] + X[0]*X[22]**2 +
-           2*X[6]*X[10]*X[23] + 2*X[5]*X[11]*X[23] - 2*X[8]*X[12]*X[23] +
-           2*X[7]*X[13]*X[23] - 2*X[2]*X[14]*X[23] - 2*X[1]*X[15]*X[23] -
-           2*X[4]*X[16]*X[23] + 2*X[3]*X[17]*X[23] + X[0]*X[23]**2 +
-           2*X[7]*X[10]*X[24] + 2*X[8]*X[11]*X[24] + 2*X[5]*X[12]*X[24] -
-           2*X[6]*X[13]*X[24] - 2*X[3]*X[14]*X[24] + 2*X[4]*X[15]*X[24] -
-           2*X[1]*X[16]*X[24] - 2*X[2]*X[17]*X[24] + X[0]*X[24]**2 +
-           2*X[8]*X[10]*X[25] - 2*X[7]*X[11]*X[25] + 2*X[6]*X[12]*X[25] +
-           2*X[5]*X[13]*X[25] - 2*X[4]*X[14]*X[25] - 2*X[3]*X[15]*X[25] +
-           2*X[2]*X[16]*X[25] - 2*X[1]*X[17]*X[25] + X[0]*X[25]**2 +
-           X[1]**2*X[26] + X[2]**2*X[26] + X[3]**2*X[26] + X[4]**2*X[26] +
-           X[5]**2*X[26] + X[6]**2*X[26] + X[7]**2*X[26] + X[8]**2*X[26] -
-           X[0]*X[9]*X[26] )
-
-    a1 = ( -X[1]**2 - X[2]**2 - X[3]**2 - X[4]**2 - X[5]**2 - X[6]**2 -
-           X[7]**2 - X[8]**2 + X[0]*X[9] - X[10]**2 - X[11]**2 -
-           X[12]**2 - X[13]**2 - X[14]**2 - X[15]**2 - X[16]**2 -
-           X[17]**2 - X[18]**2 - X[19]**2 - X[20]**2 - X[21]**2 -
-           X[22]**2 - X[23]**2 - X[24]**2 - X[25]**2 + X[0]*X[26] +
-           X[9]*X[26] )
-
-    a2 = -X[0] - X[9] - X[26]
-
-    return (a0,a1,a2)
+r"""
+Cached characteristic polynomial coefficients for a few of the
+example algebras. These take a long time to compute, so it makes more
+sense to cache them and then only test that the cached values are
+correct every once in a while.
+
+The function used to turn SageMath's output into the appropriate input
+can be found in the eja_utils module.
+"""
+
+def quaternion_hermitian_eja_coeffs(J):
+    X = J.coordinate_polynomial_ring().gens()
+
+    if J.dimension() == 1:    # n == 1
+        a0 = -X[0]
+        return (a0,)
+
+    elif J.dimension() == 6:  # n == 2
+        a0 = -X[1]**2 - X[2]**2 - X[3]**2 - X[4]**2 + X[0]*X[5]
+        a1 = -X[0] - X[5]
+        return (a0,a1)
+
+    elif J.dimension() == 15: # n == 3
+        a0 = ( X[5]*X[6]**2 + X[5]*X[7]**2 + X[5]*X[8]**2 + X[5]*X[9]**2 -
+               2*X[1]*X[6]*X[10] - 2*X[2]*X[7]*X[10] - 2*X[3]*X[8]*X[10] -
+               2*X[4]*X[9]*X[10] + X[0]*X[10]**2 + 2*X[2]*X[6]*X[11] -
+               2*X[1]*X[7]*X[11] + 2*X[4]*X[8]*X[11] - 2*X[3]*X[9]*X[11] +
+               X[0]*X[11]**2 + 2*X[3]*X[6]*X[12] - 2*X[4]*X[7]*X[12] -
+               2*X[1]*X[8]*X[12] + 2*X[2]*X[9]*X[12] + X[0]*X[12]**2 +
+               2*X[4]*X[6]*X[13] + 2*X[3]*X[7]*X[13] - 2*X[2]*X[8]*X[13] -
+               2*X[1]*X[9]*X[13] + X[0]*X[13]**2 + X[1]**2*X[14] +
+               X[2]**2*X[14] + X[3]**2*X[14] + X[4]**2*X[14] -
+               X[0]*X[5]*X[14] )
+        a1 = ( -X[1]**2 - X[2]**2 - X[3]**2 - X[4]**2 + X[0]*X[5] -
+               X[6]**2 - X[7]**2 - X[8]**2 - X[9]**2 - X[10]**2 -
+               X[11]**2 - X[12]**2 - X[13]**2 + X[0]*X[14] + X[5]*X[14] )
+
+        a2 = -X[0] - X[5] - X[14]
+
+        return (a0,a1,a2)
+
+    # Don't know them
+    return None
+
+def octonion_hermitian_eja_coeffs(J):
+    X = J.coordinate_polynomial_ring().gens()
+
+    if J.dimension() == 1:    # n == 1
+        a0 = -X[0]
+        return (a0,)
+
+    elif J.dimension() == 10: # n == 2
+        a0 = ( -X[1]**2 - X[2]**2 - X[3]**2 - X[4]**2 - X[5]**2 -
+               X[6]**2 - X[7]**2 - X[8]**2 + X[0]*X[9] )
+        a1 = -X[0] - X[9]
+        return (a0,a1)
+
+    elif J.dimension() == 27: # n == 3
+        a0 = ( X[9]*X[10]**2 + X[9]*X[11]**2 + X[9]*X[12]**2 + X[9]*X[13]**2 +
+               X[9]*X[14]**2 + X[9]*X[15]**2 + X[9]*X[16]**2 + X[9]*X[17]**2 -
+               2*X[1]*X[10]*X[18] - 2*X[2]*X[11]*X[18] - 2*X[3]*X[12]*X[18] -
+               2*X[4]*X[13]*X[18] - 2*X[5]*X[14]*X[18] - 2*X[6]*X[15]*X[18] -
+               2*X[7]*X[16]*X[18] - 2*X[8]*X[17]*X[18] + X[0]*X[18]**2 +
+               2*X[2]*X[10]*X[19] - 2*X[1]*X[11]*X[19] + 2*X[4]*X[12]*X[19] -
+               2*X[3]*X[13]*X[19] + 2*X[6]*X[14]*X[19] - 2*X[5]*X[15]*X[19] -
+               2*X[8]*X[16]*X[19] + 2*X[7]*X[17]*X[19] + X[0]*X[19]**2 +
+               2*X[3]*X[10]*X[20] - 2*X[4]*X[11]*X[20] - 2*X[1]*X[12]*X[20] +
+               2*X[2]*X[13]*X[20] + 2*X[7]*X[14]*X[20] + 2*X[8]*X[15]*X[20] -
+               2*X[5]*X[16]*X[20] - 2*X[6]*X[17]*X[20] + X[0]*X[20]**2 +
+               2*X[4]*X[10]*X[21] + 2*X[3]*X[11]*X[21] - 2*X[2]*X[12]*X[21] -
+               2*X[1]*X[13]*X[21] + 2*X[8]*X[14]*X[21] - 2*X[7]*X[15]*X[21] +
+               2*X[6]*X[16]*X[21] - 2*X[5]*X[17]*X[21] + X[0]*X[21]**2 +
+               2*X[5]*X[10]*X[22] - 2*X[6]*X[11]*X[22] - 2*X[7]*X[12]*X[22] -
+               2*X[8]*X[13]*X[22] - 2*X[1]*X[14]*X[22] + 2*X[2]*X[15]*X[22] +
+               2*X[3]*X[16]*X[22] + 2*X[4]*X[17]*X[22] + X[0]*X[22]**2 +
+               2*X[6]*X[10]*X[23] + 2*X[5]*X[11]*X[23] - 2*X[8]*X[12]*X[23] +
+               2*X[7]*X[13]*X[23] - 2*X[2]*X[14]*X[23] - 2*X[1]*X[15]*X[23] -
+               2*X[4]*X[16]*X[23] + 2*X[3]*X[17]*X[23] + X[0]*X[23]**2 +
+               2*X[7]*X[10]*X[24] + 2*X[8]*X[11]*X[24] + 2*X[5]*X[12]*X[24] -
+               2*X[6]*X[13]*X[24] - 2*X[3]*X[14]*X[24] + 2*X[4]*X[15]*X[24] -
+               2*X[1]*X[16]*X[24] - 2*X[2]*X[17]*X[24] + X[0]*X[24]**2 +
+               2*X[8]*X[10]*X[25] - 2*X[7]*X[11]*X[25] + 2*X[6]*X[12]*X[25] +
+               2*X[5]*X[13]*X[25] - 2*X[4]*X[14]*X[25] - 2*X[3]*X[15]*X[25] +
+               2*X[2]*X[16]*X[25] - 2*X[1]*X[17]*X[25] + X[0]*X[25]**2 +
+               X[1]**2*X[26] + X[2]**2*X[26] + X[3]**2*X[26] + X[4]**2*X[26] +
+               X[5]**2*X[26] + X[6]**2*X[26] + X[7]**2*X[26] + X[8]**2*X[26] -
+               X[0]*X[9]*X[26] )
+
+        a1 = ( -X[1]**2 - X[2]**2 - X[3]**2 - X[4]**2 - X[5]**2 - X[6]**2 -
+               X[7]**2 - X[8]**2 + X[0]*X[9] - X[10]**2 - X[11]**2 -
+               X[12]**2 - X[13]**2 - X[14]**2 - X[15]**2 - X[16]**2 -
+               X[17]**2 - X[18]**2 - X[19]**2 - X[20]**2 - X[21]**2 -
+               X[22]**2 - X[23]**2 - X[24]**2 - X[25]**2 + X[0]*X[26] +
+               X[9]*X[26] )
+
+        a2 = -X[0] - X[9] - X[26]
+
+        return (a0,a1,a2)
+
+    # Don't know them
+    return None