]> gitweb.michael.orlitzky.com - sage.d.git/blobdiff - mjo/eja/eja_element.py
eja: fix cartesian products of cartesian product EJAs.
[sage.d.git] / mjo / eja / eja_element.py
index 347aa3c211278a15a691944c9a559076c5817acf..876777eff745fb2610dbce5f6856b6fa619a580b 100644 (file)
@@ -1077,7 +1077,9 @@ class FiniteDimensionalEJAElement(IndexedFreeModuleElement):
         SETUP::
 
             sage: from mjo.eja.eja_algebra import (ComplexHermitianEJA,
-            ....:                                  QuaternionHermitianEJA)
+            ....:                                  HadamardEJA,
+            ....:                                  QuaternionHermitianEJA,
+            ....:                                  RealSymmetricEJA)
 
         EXAMPLES::
 
@@ -1107,14 +1109,35 @@ class FiniteDimensionalEJAElement(IndexedFreeModuleElement):
             [0 0 0 0 0 0 1 0]
             [0 0 0 0 0 0 0 1]
 
+        This also works in Cartesian product algebras::
+
+            sage: J1 = HadamardEJA(1)
+            sage: J2 = RealSymmetricEJA(2)
+            sage: J = cartesian_product([J1,J2])
+            sage: x = sum(J.gens())
+            sage: x.to_matrix()[0]
+            [1]
+            sage: x.to_matrix()[1]
+            [                  1 0.7071067811865475?]
+            [0.7071067811865475?                   1]
+
         """
         B = self.parent().matrix_basis()
         W = self.parent().matrix_space()
 
-        # This is just a manual "from_vector()", but of course
-        # matrix spaces aren't vector spaces in sage, so they
-        # don't have a from_vector() method.
-        return W.linear_combination( zip(B, self.to_vector()) )
+        if self.parent()._matrix_basis_is_cartesian:
+            # Aaaaand linear combinations don't work in Cartesian
+            # product spaces, even though they provide a method
+            # with that name.
+            pairs = zip(B, self.to_vector())
+            return sum( ( W(tuple(alpha*b_i for b_i in b))
+                          for (b,alpha) in pairs ),
+                        W.zero())
+        else:
+            # This is just a manual "from_vector()", but of course
+            # matrix spaces aren't vector spaces in sage, so they
+            # don't have a from_vector() method.
+            return W.linear_combination( zip(B, self.to_vector()) )
 
 
 
@@ -1380,7 +1403,20 @@ class FiniteDimensionalEJAElement(IndexedFreeModuleElement):
 
         SETUP::
 
-            sage: from mjo.eja.eja_algebra import random_eja
+            sage: from mjo.eja.eja_algebra import (random_eja,
+            ....:                                  HadamardEJA,
+            ....:                                  RealSymmetricEJA)
+
+        EXAMPLES:
+
+        We can create subalgebras of Cartesian product EJAs that are not
+        themselves Cartesian product EJAs (they're just "regular" EJAs)::
+
+            sage: J1 = HadamardEJA(3)
+            sage: J2 = RealSymmetricEJA(2)
+            sage: J = cartesian_product([J1,J2])
+            sage: J.one().subalgebra_generated_by()
+            Euclidean Jordan algebra of dimension 1 over Algebraic Real Field
 
         TESTS:
 
@@ -1413,12 +1449,8 @@ class FiniteDimensionalEJAElement(IndexedFreeModuleElement):
             True
 
         """
-        from mjo.eja.eja_subalgebra import FiniteDimensionalEJASubalgebra
         powers = tuple( self**k for k in range(self.degree()) )
-        A = FiniteDimensionalEJASubalgebra(self.parent(),
-                                           powers,
-                                           associative=True,
-                                           **kwargs)
+        A = self.parent().subalgebra(powers, associative=True, **kwargs)
         A.one.set_cache(A(self.parent().one()))
         return A
 
@@ -1619,39 +1651,3 @@ class FiniteDimensionalEJAElement(IndexedFreeModuleElement):
 
         """
         return self.trace_inner_product(self).sqrt()
-
-
-
-class CartesianProductEJAElement(FiniteDimensionalEJAElement):
-
-    def to_matrix(self):
-        r"""
-        SETUP::
-
-            sage: from mjo.eja.eja_algebra import (HadamardEJA,
-            ....:                                  RealSymmetricEJA)
-
-        EXAMPLES::
-
-            sage: J1 = HadamardEJA(1)
-            sage: J2 = RealSymmetricEJA(2)
-            sage: J = cartesian_product([J1,J2])
-            sage: x = sum(J.gens())
-            sage: x.to_matrix()[0]
-            [1]
-            sage: x.to_matrix()[1]
-            [                  1 0.7071067811865475?]
-            [0.7071067811865475?                   1]
-
-        """
-        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.
-        pairs = zip(B, self.to_vector())
-        return sum( ( W(tuple(alpha*b_i for b_i in b))
-                      for (b,alpha) in pairs ),
-                    W.zero())
-