X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=mjo%2Feja%2Feja_element.py;h=2976a38f91a986b7e5f2fafd7a24560d29411755;hb=6d32150d3f7c175473a1d590facce1ea7c5ca77a;hp=1cf93cce6127b476796cdc130bfd98cfb7f21e41;hpb=7a4d25a9e4be093d2452ffb1e5a9834abcb33553;p=sage.d.git diff --git a/mjo/eja/eja_element.py b/mjo/eja/eja_element.py index 1cf93cc..2976a38 100644 --- a/mjo/eja/eja_element.py +++ b/mjo/eja/eja_element.py @@ -1220,6 +1220,17 @@ class FiniteDimensionalEuclideanJordanAlgebraElement(IndexedFreeModuleElement): sage: l0*c0 + l1*c1 == x True + The spectral decomposition should work in subalgebras, too:: + + sage: J = RealSymmetricEJA(4) + sage: (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9) = J.gens() + sage: A = 2*e5 - 2*e8 + sage: (lambda1, c1) = A.spectral_decomposition()[1] + sage: (J0, J5, J1) = J.peirce_decomposition(c1) + sage: (f0, f1, f2) = J1.gens() + sage: f0.spectral_decomposition() + [(0, 1.000000000000000?*f2), (1, 1.000000000000000?*f0)] + """ A = self.subalgebra_generated_by(orthonormalize_basis=True) result = [] @@ -1227,6 +1238,37 @@ class FiniteDimensionalEuclideanJordanAlgebraElement(IndexedFreeModuleElement): result.append( (evalue, proj(A.one()).superalgebra_element()) ) return result + def full_spectral_decomposition(self): + if self.is_zero(): + # Following the convention that the empty sum is the + # algebra's additive identity. + return [] + + A = self.subalgebra_generated_by(orthonormalize_basis=True) + if A.dimension() == 1: + # I'm a scalar multiple of the identity element + s = self.norm() / A.one().norm() + return [(s, self * ~s)] + + result = [] + for (evalue, proj) in A(self).operator().spectral_decomposition(): + c = proj(A.one()).superalgebra_element() + + # We know that "c" here is idempotent, so the only question is + # whether or not it can be decomposed further. + if c.is_primitive_idempotent(): + result.append( (evalue, c) ) + else: + for b in A.gens(): + b_decomp = b.full_spectral_decomposition() + if len(b_decomp) > 1: + for (a,y) in b_decomp: + y_sup = y.superalgebra_element() + eigenvecs = [ r[1] for r in result ] + if not y_sup in eigenvecs: + result.append( ( evalue*a, y_sup) ) + return result + def subalgebra_generated_by(self, orthonormalize_basis=False): """ Return the associative subalgebra of the parent EJA generated