From 0ecada5937cb3c3aa7307029f165996d83a16133 Mon Sep 17 00:00:00 2001 From: Michael Orlitzky Date: Thu, 3 Dec 2020 21:51:07 -0500 Subject: [PATCH] eja: mark some cached-value tests as "long time". --- mjo/eja/eja_element.py | 46 +++++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/mjo/eja/eja_element.py b/mjo/eja/eja_element.py index d99a7d8..6812e28 100644 --- a/mjo/eja/eja_element.py +++ b/mjo/eja/eja_element.py @@ -444,8 +444,13 @@ class FiniteDimensionalEuclideanJordanAlgebraElement(IndexedFreeModuleElement): ALGORITHM: - We appeal to the quadratic representation as in Koecher's - Theorem 12 in Chapter III, Section 5. + In general we appeal to the quadratic representation as in + Koecher's Theorem 12 in Chapter III, Section 5. But if the + parent algebra's "characteristic polynomial of" coefficients + happen to be cached, then we use Proposition II.2.4 in Faraut + and Korányi which gives a formula for the inverse based on the + characteristic polynomial and the Cayley-Hamilton theorem for + Euclidean Jordan algebras:: SETUP:: @@ -515,22 +520,19 @@ class FiniteDimensionalEuclideanJordanAlgebraElement(IndexedFreeModuleElement): ....: x.operator().inverse()(J.one()) == x.inverse() ) True - Proposition II.2.4 in Faraut and Korányi gives a formula for - the inverse based on the characteristic polynomial and the - Cayley-Hamilton theorem for Euclidean Jordan algebras:: + Check that the fast (cached) and slow algorithms give the same + answer:: - sage: set_random_seed() - sage: J = ComplexHermitianEJA(3) - sage: x = J.random_element() - sage: while not x.is_invertible(): - ....: x = J.random_element() - sage: r = J.rank() - sage: a = x.characteristic_polynomial().coefficients(sparse=False) - sage: expected = (-1)^(r+1)/x.det() - sage: expected *= sum( a[i+1]*x^i for i in range(r) ) - sage: x.inverse() == expected + sage: set_random_seed() # long time + sage: J = random_eja(field=QQ, orthonormalize=False) # long time + sage: x = J.random_element() # long time + sage: while not x.is_invertible(): # long time + ....: x = J.random_element() # long time + sage: slow = x.inverse() # long time + sage: _ = J._charpoly_coefficients() # long time + sage: fast = x.inverse() # long time + sage: slow == fast # long time True - """ if not self.is_invertible(): raise ValueError("element is not invertible") @@ -587,6 +589,18 @@ class FiniteDimensionalEuclideanJordanAlgebraElement(IndexedFreeModuleElement): sage: (not J.is_trivial()) and J.zero().is_invertible() False + Test that the fast (cached) and slow algorithms give the same + answer:: + + sage: set_random_seed() # long time + sage: J = random_eja(field=QQ, orthonormalize=False) # long time + sage: x = J.random_element() # long time + sage: slow = x.is_invertible() # long time + sage: _ = J._charpoly_coefficients() # long time + sage: fast = x.is_invertible() # long time + sage: slow == fast # long time + True + """ if self.is_zero(): if self.parent().is_trivial(): -- 2.44.2