]> gitweb.michael.orlitzky.com - sage.d.git/commitdiff
eja: add currently-busted subalgebra_idempotent() method.
authorMichael Orlitzky <michael@orlitzky.com>
Tue, 25 Jun 2019 23:17:31 +0000 (19:17 -0400)
committerMichael Orlitzky <michael@orlitzky.com>
Mon, 29 Jul 2019 03:19:01 +0000 (23:19 -0400)
mjo/eja/euclidean_jordan_algebra.py

index 28e2a0b7a7ca354d83b77708382bb17b04028072..2ec45cf537661f359ef6cf4e34c578c238f80b31 100644 (file)
@@ -320,6 +320,57 @@ class FiniteDimensionalEuclideanJordanAlgebra(FiniteDimensionalAlgebra):
             return elt.is_nilpotent()
 
 
+        def subalgebra_idempotent(self):
+            """
+            Find an idempotent in the associative subalgebra I generate
+            using Proposition 2.3.5 in Baes.
+            """
+            if self.is_nilpotent():
+                raise ValueError("this only works with non-nilpotent elements!")
+
+            V = self.span_of_powers()
+            J = self.subalgebra_generated_by()
+            # Mis-design warning: the basis used for span_of_powers()
+            # and subalgebra_generated_by() must be the same, and in
+            # the same order!
+            u = J(V.coordinates(self.vector()))
+
+            # The image of the matrix of left-u^m-multiplication
+            # will be minimal for some natural number s...
+            s = 0
+            minimal_dim = V.dimension()
+            for i in xrange(1, V.dimension()):
+                this_dim = (u**i).matrix().image().dimension()
+                if this_dim < minimal_dim:
+                    minimal_dim = this_dim
+                    s = i
+
+            # Now minimal_matrix should correspond to the smallest
+            # non-zero subspace in Baes's (or really, Koecher's)
+            # proposition.
+            #
+            # However, we need to restrict the matrix to work on the
+            # subspace... or do we? Can't we just solve, knowing that
+            # A(c) = u^(s+1) should have a solution in the big space,
+            # too?
+            u_next = u**(s+1)
+            A = u_next.matrix()
+            c_coordinates = A.solve_right(u_next.vector())
+
+            # Now c_coordinates is the idempotent we want, but it's in
+            # the coordinate system of the subalgebra.
+            #
+            # We need the basis for J, but as elements of the parent algebra.
+            #
+            #
+            # TODO: this is buggy, but it's probably because the
+            # multiplication table for the subalgebra is wrong! The
+            # matrices should be symmetric I bet.
+            basis = [self.parent(v) for v in V.basis()]
+            return self.parent().linear_combination(zip(c_coordinates, basis))
+
+
+
         def characteristic_polynomial(self):
             return self.matrix().characteristic_polynomial()