]> gitweb.michael.orlitzky.com - sage.d.git/blobdiff - mjo/eja/eja_element.py
eja: special subalgebra handling for Cartesian product EJAs.
[sage.d.git] / mjo / eja / eja_element.py
index 235047a153f0594bf450987ae2988a5873d92f36..df14666d85df17d8005432ecad777b4a8d0f9076 100644 (file)
@@ -1722,7 +1722,31 @@ class FiniteDimensionalEJAElement(IndexedFreeModuleElement):
         return self.trace_inner_product(self).sqrt()
 
 
-class CartesianProductEJAElement(FiniteDimensionalEJAElement):
+class CartesianProductParentEJAElement(FiniteDimensionalEJAElement):
+    r"""
+    An intermediate class for elements that have a Cartesian
+    product as their parent algebra.
+
+    This is needed because the ``to_matrix`` method (which gives you a
+    representation from the superalgebra) needs to do special stuff
+    for Cartesian products. Specifically, an EJA subalgebra of a
+    Cartesian product EJA will not itself be a Cartesian product (it
+    has its own basis) -- but we want ``to_matrix()`` to be able to
+    give us a Cartesian product representation.
+    """
+    def to_matrix(self):
+        # An override is necessary to call our custom _scale().
+        B = self.parent().matrix_basis()
+        W = self.parent().matrix_space()
+
+        # Aaaaand linear combinations don't work in Cartesian
+        # product spaces, even though they provide a method with
+        # that name. This is hidden in a subclass because the
+        # _scale() function is slow.
+        pairs = zip(B, self.to_vector())
+        return W.sum( _scale(b, alpha) for (b,alpha) in pairs )
+
+class CartesianProductEJAElement(CartesianProductParentEJAElement):
     def det(self):
         r"""
         Compute the determinant of this product-element using the
@@ -1734,15 +1758,3 @@ class CartesianProductEJAElement(FiniteDimensionalEJAElement):
         """
         from sage.misc.misc_c import prod
         return prod( f.det() for f in self.cartesian_factors() )
-
-    def to_matrix(self):
-        # An override is necessary to call our custom _scale().
-        B = self.parent().matrix_basis()
-        W = self.parent().matrix_space()
-
-        # Aaaaand linear combinations don't work in Cartesian
-        # product spaces, even though they provide a method with
-        # that name. This is hidden behind an "if" because the
-        # _scale() function is slow.
-        pairs = zip(B, self.to_vector())
-        return W.sum( _scale(b, alpha) for (b,alpha) in pairs )