From 04c747a5236ac46517483366b127340070d2dd46 Mon Sep 17 00:00:00 2001 From: Michael Orlitzky Date: Wed, 10 Mar 2021 14:01:48 -0500 Subject: [PATCH] eja: more charpoly coefficient caching. --- mjo/eja/eja_algebra.py | 15 ++++- mjo/eja/eja_cache.py | 143 +++++++++++++++++++++++++++++------------ 2 files changed, 113 insertions(+), 45 deletions(-) diff --git a/mjo/eja/eja_algebra.py b/mjo/eja/eja_algebra.py index 587d8e3..a10e2a3 100644 --- a/mjo/eja/eja_algebra.py +++ b/mjo/eja/eja_algebra.py @@ -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: diff --git a/mjo/eja/eja_cache.py b/mjo/eja/eja_cache.py index 73405b3..8498321 100644 --- a/mjo/eja/eja_cache.py +++ b/mjo/eja/eja_cache.py @@ -1,42 +1,101 @@ -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 -- 2.44.2