X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=mjo%2Feja%2Feja_algebra.py;h=389efbf77219acff73db032e848e34d8da1670e9;hb=9632a965029feadbb70d18574f8704812ed71321;hp=8bee7297fa170c0faf47610dc0ac435a881531fb;hpb=7dd1a157df55b7aad13baf051d2930524d300c78;p=sage.d.git diff --git a/mjo/eja/eja_algebra.py b/mjo/eja/eja_algebra.py index 8bee729..389efbf 100644 --- a/mjo/eja/eja_algebra.py +++ b/mjo/eja/eja_algebra.py @@ -773,6 +773,108 @@ class FiniteDimensionalEuclideanJordanAlgebra(CombinatorialFreeModule): return (J0, J5, J1) + def a_jordan_frame(self): + r""" + Generate a Jordan frame for this algebra. + + This implementation is based on the so-called "central + orthogonal idempotents" implemented for (semisimple) centers + of SageMath ``FiniteDimensionalAlgebrasWithBasis``. Since all + Euclidean Jordan algebas are commutative (and thus equal to + their own centers) and semisimple, the method should work more + or less as implemented, if it ever worked in the first place. + (I don't know the justification for the original implementation. + yet). + + How it works: we loop through the algebras generators, looking + for their eigenspaces. If there's more than one eigenspace, + and if they result in more than one subalgebra, then we split + those subalgebras recursively until we get to subalgebras of + dimension one (whose idempotent is the unit element). Why does + some generator have to produce at least two subalgebras? I + dunno. But it seems to work. + + 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(),) + + for g in self.gens(): + eigenpairs = g.operator().matrix().right_eigenspaces() + if len(eigenpairs) >= 2: + subalgebras = [] + for eigval, eigspace in eigenpairs: + # Make sub-EJAs from the matrix eigenspaces... + sb = tuple( self.from_vector(b) for b in eigspace.basis() ) + try: + # This will fail if e.g. the eigenspace basis + # contains two elements and their product + # isn't a linear combination of the two of + # them (i.e. the generated EJA isn't actually + # two dimensional). + s = FiniteDimensionalEuclideanJordanSubalgebra(self, sb) + subalgebras.append(s) + except ArithmeticError as e: + if str(e) == "vector is not in free module": + # Ignore only the "not a sub-EJA" error + pass + + if len(subalgebras) >= 2: + # apply this method recursively. + return tuple( c.superalgebra_element() + for subalgebra in subalgebras + 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 + # implementation I stole says that this should work because of Schur's Lemma, + # so I personally blame Schur's Lemma if it does not. + raise Exception("Schur's Lemma didn't work!") + + def random_elements(self, count): """ Return ``count`` random elements as a tuple.