return (J0, J5, J1)
- def orthogonal_idempotents(self):
+ def a_jordan_frame(self):
r"""
- Generate a set of `r` orthogonal idempotents for this algebra,
- where `r` is its rank.
+ Generate a Jordan frame for this algebra.
This implementation is based on the so-called "central
orthogonal idempotents" implemented for (semisimple) centers
Beware that Koecher defines the "center" of a Jordan algebra to
be something else, because the usual definition is stupid in a
(necessarily commutative) Jordan algebra.
+
+ SETUP::
+
+ sage: from mjo.eja.eja_algebra import (random_eja,
+ ....: JordanSpinEJA,
+ ....: TrivialEJA)
+
+ EXAMPLES:
+
+ A Jordan frame for the trivial algebra has to be empty
+ (zero-length) since its rank is zero. More to the point, there
+ are no non-zero idempotents in the trivial EJA. This does not
+ cause any problems so long as we adopt the convention that the
+ empty sum is zero, since then the sole element of the trivial
+ EJA has an (empty) spectral decomposition::
+
+ sage: J = TrivialEJA()
+ sage: J.a_jordan_frame()
+ ()
+
+ A one-dimensional algebra has rank one (equal to its dimension),
+ and only one primitive idempotent, namely the algebra's unit
+ element::
+
+ sage: J = JordanSpinEJA(1)
+ sage: J.a_jordan_frame()
+ (e0,)
+
+ TESTS::
+
+ sage: J = random_eja()
+ sage: c = J.a_jordan_frame()
+ sage: all( x^2 == x for x in c )
+ True
+ sage: r = len(c)
+ sage: all( c[i]*c[j] == c[i]*(i==j) for i in range(r)
+ ....: for j in range(r) )
+ True
+
"""
+ if self.dimension() == 0:
+ return ()
if self.dimension() == 1:
- return [self.one()]
+ return (self.one(),)
for g in self.gens():
eigenpairs = g.operator().matrix().right_eigenspaces()
# apply this method recursively.
return tuple( c.superalgebra_element()
for subalgebra in subalgebras
- for c in subalgebra.orthogonal_idempotents() )
+ for c in subalgebra.a_jordan_frame() )
# If we got here, the algebra didn't decompose, at least not when we looked at
# the eigenspaces corresponding only to basis elements of the algebra. The