]> gitweb.michael.orlitzky.com - sage.d.git/commitdiff
eja: simplify "span of powers" computation in subalgebras.
authorMichael Orlitzky <michael@orlitzky.com>
Mon, 26 Aug 2019 00:13:28 +0000 (20:13 -0400)
committerMichael Orlitzky <michael@orlitzky.com>
Mon, 26 Aug 2019 00:13:28 +0000 (20:13 -0400)
mjo/eja/eja_subalgebra.py

index 646da2fb8b649c11baa226833085c26564d75d46..8f6e56b55f309d10967ee5aae2bb8b2fe7261566 100644 (file)
@@ -137,25 +137,20 @@ class FiniteDimensionalEuclideanJordanElementSubalgebra(FiniteDimensionalEuclide
 
         # First compute the vector subspace spanned by the powers of
         # the given element.
-        superalgebra_basis = [self._superalgebra.one()]
+        powers = [ elt**k for k in range(V.dimension()) ]
+        power_vectors = [ p.to_vector() for p in powers ]
+
+        # Figure out which powers form a linearly-independent set.
+        ind_rows = matrix(field, power_vectors).pivot_rows()
+
+        # Pick those out of the list of all powers.
+        superalgebra_basis = tuple(map(powers.__getitem__, ind_rows))
+
         # If our superalgebra is a subalgebra of something else, then
-        # superalgebra.one().to_vector() won't have the right
-        # coordinates unless we use V.from_vector() below.
-        basis_vectors = [V.from_vector(self._superalgebra.one().to_vector())]
-        W = V.span_of_basis(basis_vectors)
-        for exponent in range(1, V.dimension()):
-            new_power = elt**exponent
-            basis_vectors.append( V.from_vector(new_power.to_vector()) )
-            try:
-                W = V.span_of_basis(basis_vectors)
-                superalgebra_basis.append( new_power )
-            except ValueError:
-                # Vectors weren't independent; bail and keep the
-                # last subspace that worked.
-                break
-
-        # Make the basis hashable for UniqueRepresentation.
-        superalgebra_basis = tuple(superalgebra_basis)
+        # these vectors won't have the right coordinates for
+        # V.span_of_basis() unless we use V.from_vector() on them.
+        basis_vectors = map(power_vectors.__getitem__, ind_rows)
+        W = V.span_of_basis( V.from_vector(v) for v in basis_vectors )
 
         # Now figure out the entries of the right-multiplication
         # matrix for the successive basis elements b0, b1,... of