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