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 = []
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