]> gitweb.michael.orlitzky.com - sage.d.git/blobdiff - mjo/eja/eja_element_subalgebra.py
eja: refactor the element subalgebra stuff into generic subalgebra.
[sage.d.git] / mjo / eja / eja_element_subalgebra.py
index 2a82940f51c47c44aea0efdc47a202c243319ba6..7cf3f3702adb5832a7ef4bb86a80b24431d87a54 100644 (file)
 from sage.matrix.constructor import matrix
 
-from mjo.eja.eja_algebra import FiniteDimensionalEuclideanJordanAlgebra
-from mjo.eja.eja_element import FiniteDimensionalEuclideanJordanAlgebraElement
+from mjo.eja.eja_subalgebra import FiniteDimensionalEuclideanJordanSubalgebra
 
-class FiniteDimensionalEuclideanJordanElementSubalgebraElement(FiniteDimensionalEuclideanJordanAlgebraElement):
-    """
-    SETUP::
 
-        sage: from mjo.eja.eja_algebra import random_eja
-
-    TESTS::
-
-    The natural representation of an element in the subalgebra is
-    the same as its natural representation in the superalgebra::
-
-        sage: set_random_seed()
-        sage: A = random_eja().random_element().subalgebra_generated_by()
-        sage: y = A.random_element()
-        sage: actual = y.natural_representation()
-        sage: expected = y.superalgebra_element().natural_representation()
-        sage: actual == expected
-        True
-
-    The left-multiplication-by operator for elements in the subalgebra
-    works like it does in the superalgebra, even if we orthonormalize
-    our basis::
-
-        sage: set_random_seed()
-        sage: x = random_eja(AA).random_element()
-        sage: A = x.subalgebra_generated_by(orthonormalize_basis=True)
-        sage: y = A.random_element()
-        sage: y.operator()(A.one()) == y
-        True
-
-    """
-
-    def superalgebra_element(self):
-        """
-        Return the object in our algebra's superalgebra that corresponds
-        to myself.
-
-        SETUP::
-
-            sage: from mjo.eja.eja_algebra import (RealSymmetricEJA,
-            ....:                                  random_eja)
-
-        EXAMPLES::
-
-            sage: J = RealSymmetricEJA(3)
-            sage: x = sum(J.gens())
-            sage: x
-            e0 + e1 + e2 + e3 + e4 + e5
-            sage: A = x.subalgebra_generated_by()
-            sage: A(x)
-            f1
-            sage: A(x).superalgebra_element()
-            e0 + e1 + e2 + e3 + e4 + e5
-
-        TESTS:
-
-        We can convert back and forth faithfully::
-
-            sage: set_random_seed()
-            sage: J = random_eja()
-            sage: x = J.random_element()
-            sage: A = x.subalgebra_generated_by()
-            sage: A(x).superalgebra_element() == x
-            True
-            sage: y = A.random_element()
-            sage: A(y.superalgebra_element()) == y
-            True
-
-        """
-        return self.parent().superalgebra().linear_combination(
-          zip(self.parent()._superalgebra_basis, self.to_vector()) )
-
-
-
-
-class FiniteDimensionalEuclideanJordanElementSubalgebra(FiniteDimensionalEuclideanJordanAlgebra):
-    """
-    The subalgebra of an EJA generated by a single element.
-
-    SETUP::
-
-        sage: from mjo.eja.eja_algebra import (ComplexHermitianEJA,
-        ....:                                  JordanSpinEJA)
-
-    TESTS:
-
-    Ensure that our generator names don't conflict with the superalgebra::
-
-        sage: J = JordanSpinEJA(3)
-        sage: J.one().subalgebra_generated_by().gens()
-        (f0,)
-        sage: J = JordanSpinEJA(3, prefix='f')
-        sage: J.one().subalgebra_generated_by().gens()
-        (g0,)
-        sage: J = JordanSpinEJA(3, prefix='b')
-        sage: J.one().subalgebra_generated_by().gens()
-        (c0,)
-
-    Ensure that we can find subalgebras of subalgebras::
-
-        sage: A = ComplexHermitianEJA(3).one().subalgebra_generated_by()
-        sage: B = A.one().subalgebra_generated_by()
-        sage: B.dimension()
-        1
-
-    """
+class FiniteDimensionalEuclideanJordanElementSubalgebra(FiniteDimensionalEuclideanJordanSubalgebra):
     def __init__(self, elt, orthonormalize_basis):
         self._superalgebra = elt.parent()
         category = self._superalgebra.category().Associative()
         V = self._superalgebra.vector_space()
         field = self._superalgebra.base_ring()
 
-        # A half-assed attempt to ensure that we don't collide with
-        # the superalgebra's prefix (ignoring the fact that there
-        # could be super-superelgrbas in scope). If possible, we
-        # try to "increment" the parent algebra's prefix, although
-        # this idea goes out the window fast because some prefixen
-        # are off-limits.
-        prefixen = [ 'f', 'g', 'h', 'a', 'b', 'c', 'd' ]
-        try:
-            prefix = prefixen[prefixen.index(self._superalgebra.prefix()) + 1]
-        except ValueError:
-            prefix = prefixen[0]
-
         # This list is guaranteed to contain all independent powers,
         # because it's the maximal set of powers that could possibly
         # be independent (by a dimension argument).
@@ -165,17 +48,6 @@ class FiniteDimensionalEuclideanJordanElementSubalgebra(FiniteDimensionalEuclide
                                    for b in basis_vectors ]
 
         W = V.span_of_basis( V.from_vector(v) for v in basis_vectors )
-        n = len(superalgebra_basis)
-        mult_table = [[W.zero() for i in range(n)] for j in range(n)]
-        for i in range(n):
-            for j in range(n):
-                product = superalgebra_basis[i]*superalgebra_basis[j]
-                # product.to_vector() might live in a vector subspace
-                # if our parent algebra is already a subalgebra. We
-                # use V.from_vector() to make it "the right size" in
-                # that case.
-                product_vector = V.from_vector(product.to_vector())
-                mult_table[i][j] = W.coordinate_vector(product_vector)
 
         # The rank is the highest possible degree of a minimal
         # polynomial, and is bounded above by the dimension. We know
@@ -185,21 +57,11 @@ class FiniteDimensionalEuclideanJordanElementSubalgebra(FiniteDimensionalEuclide
         # its rank too.
         rank = W.dimension()
 
-        natural_basis = tuple( b.natural_representation()
-                               for b in superalgebra_basis )
-
-
-        self._vector_space = W
-        self._superalgebra_basis = superalgebra_basis
-
-
         fdeja = super(FiniteDimensionalEuclideanJordanElementSubalgebra, self)
-        return fdeja.__init__(field,
-                              mult_table,
-                              rank,
-                              prefix=prefix,
-                              category=category,
-                              natural_basis=natural_basis)
+        return fdeja.__init__(self._superalgebra,
+                              superalgebra_basis,
+                              rank=rank,
+                              category=category)
 
 
     def _a_regular_element(self):
@@ -386,5 +248,3 @@ class FiniteDimensionalEuclideanJordanElementSubalgebra(FiniteDimensionalEuclide
         """
         return self._vector_space
 
-
-    Element = FiniteDimensionalEuclideanJordanElementSubalgebraElement