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()