X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=mjo%2Feja%2Feja_element.py;h=6812e2807a7ff3c3a4f7253c7af9750f5de8fbb2;hb=0ecada5937cb3c3aa7307029f165996d83a16133;hp=0fae507b328a1c358f7c4e7f88aab30cf5406104;hpb=251e308af6c3a57b418a06546a572af83eade7ec;p=sage.d.git diff --git a/mjo/eja/eja_element.py b/mjo/eja/eja_element.py index 0fae507..6812e28 100644 --- a/mjo/eja/eja_element.py +++ b/mjo/eja/eja_element.py @@ -227,9 +227,9 @@ class FiniteDimensionalEuclideanJordanAlgebraElement(IndexedFreeModuleElement): Ditto for the quaternions:: - sage: J = QuaternionHermitianEJA(3) + sage: J = QuaternionHermitianEJA(2) sage: J.one().inner_product(J.one()) - 3 + 2 TESTS: @@ -396,7 +396,7 @@ class FiniteDimensionalEuclideanJordanAlgebraElement(IndexedFreeModuleElement): sage: X = matrix.random(QQ,3) sage: X = X + X.T sage: J1 = RealSymmetricEJA(3) - sage: J2 = RealSymmetricEJA(3,QQ,orthonormalize=False) + sage: J2 = RealSymmetricEJA(3,field=QQ,orthonormalize=False) sage: expected = X.det() sage: actual1 = J1(X).det() sage: actual2 = J2(X).det() @@ -408,9 +408,9 @@ class FiniteDimensionalEuclideanJordanAlgebraElement(IndexedFreeModuleElement): :: sage: set_random_seed() - sage: J1 = ComplexHermitianEJA(3) - sage: J2 = ComplexHermitianEJA(3,field=QQ,orthonormalize=False) - sage: X = matrix.random(GaussianIntegers(),3) + sage: J1 = ComplexHermitianEJA(2) + sage: J2 = ComplexHermitianEJA(2,field=QQ,orthonormalize=False) + sage: X = matrix.random(GaussianIntegers(), 2) sage: X = X + X.H sage: expected = AA(X.det()) sage: actual1 = J1(J1.real_embed(X)).det() @@ -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(): @@ -1035,22 +1049,19 @@ class FiniteDimensionalEuclideanJordanAlgebraElement(IndexedFreeModuleElement): :: - sage: J = QuaternionHermitianEJA(3) + sage: J = QuaternionHermitianEJA(2) sage: J.one() - e0 + e5 + e14 + e0 + e5 sage: J.one().to_matrix() - [1 0 0 0 0 0 0 0 0 0 0 0] - [0 1 0 0 0 0 0 0 0 0 0 0] - [0 0 1 0 0 0 0 0 0 0 0 0] - [0 0 0 1 0 0 0 0 0 0 0 0] - [0 0 0 0 1 0 0 0 0 0 0 0] - [0 0 0 0 0 1 0 0 0 0 0 0] - [0 0 0 0 0 0 1 0 0 0 0 0] - [0 0 0 0 0 0 0 1 0 0 0 0] - [0 0 0 0 0 0 0 0 1 0 0 0] - [0 0 0 0 0 0 0 0 0 1 0 0] - [0 0 0 0 0 0 0 0 0 0 1 0] - [0 0 0 0 0 0 0 0 0 0 0 1] + [1 0 0 0 0 0 0 0] + [0 1 0 0 0 0 0 0] + [0 0 1 0 0 0 0 0] + [0 0 0 1 0 0 0 0] + [0 0 0 0 1 0 0 0] + [0 0 0 0 0 1 0 0] + [0 0 0 0 0 0 1 0] + [0 0 0 0 0 0 0 1] + """ B = self.parent().matrix_basis() W = self.parent().matrix_space()