]> gitweb.michael.orlitzky.com - sage.d.git/blobdiff - mjo/eja/eja_subalgebra.py
eja: choose subalgebra generator prefix smarter.
[sage.d.git] / mjo / eja / eja_subalgebra.py
index 22fa870fb551624f9b9c47f181cd8aa023944cb6..c43e53f2b030ed920e6cc22d10c3097c4b704cec 100644 (file)
@@ -71,6 +71,25 @@ class FiniteDimensionalEuclideanJordanElementSubalgebraElement(FiniteDimensional
 class FiniteDimensionalEuclideanJordanElementSubalgebra(FiniteDimensionalEuclideanJordanAlgebra):
     """
     The subalgebra of an EJA generated by a single element.
+
+    SETUP::
+
+        sage: from mjo.eja.eja_algebra import 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,)
+
     """
     def __init__(self, elt):
         superalgebra = elt.parent()
@@ -106,8 +125,17 @@ class FiniteDimensionalEuclideanJordanElementSubalgebra(FiniteDimensionalEuclide
                 product = superalgebra_basis[i]*superalgebra_basis[j]
                 mult_table[i][j] = W.coordinate_vector(product.to_vector())
 
-        # TODO: We'll have to redo this and make it unique again...
-        prefix = 'f'
+        # 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(superalgebra.prefix()) + 1]
+        except ValueError:
+            prefix = prefixen[0]
 
         # The rank is the highest possible degree of a minimal
         # polynomial, and is bounded above by the dimension. We know
@@ -157,11 +185,73 @@ class FiniteDimensionalEuclideanJordanElementSubalgebra(FiniteDimensionalEuclide
         ::
 
         """
+        if elt == 0:
+            # Just as in the superalgebra class, we need to hack
+            # this special case to ensure that random_element() can
+            # coerce a ring zero into the algebra.
+            return self.zero()
+
         if elt in self.superalgebra():
             coords = self.vector_space().coordinate_vector(elt.to_vector())
             return self.from_vector(coords)
 
 
+    def one_basis(self):
+        """
+        Return the basis-element-index of this algebra's unit element.
+        """
+        return 0
+
+
+    def one(self):
+        """
+        Return the multiplicative identity element of this algebra.
+
+        The superclass method computes the identity element, which is
+        beyond overkill in this case: the algebra identity should be our
+        first basis element. We implement this via :meth:`one_basis`
+        because that method can optionally be used by other parts of the
+        category framework.
+
+        SETUP::
+
+            sage: from mjo.eja.eja_algebra import (RealCartesianProductEJA,
+            ....:                                  random_eja)
+
+        EXAMPLES::
+
+            sage: J = RealCartesianProductEJA(5)
+            sage: J.one()
+            e0 + e1 + e2 + e3 + e4
+            sage: x = sum(J.gens())
+            sage: A = x.subalgebra_generated_by()
+            sage: A.one()
+            f0
+            sage: A.one().superalgebra_element()
+            e0 + e1 + e2 + e3 + e4
+
+        TESTS:
+
+        The identity element acts like the identity::
+
+            sage: set_random_seed()
+            sage: J = random_eja().random_element().subalgebra_generated_by()
+            sage: x = J.random_element()
+            sage: J.one()*x == x and x*J.one() == x
+            True
+
+        The matrix of the unit element's operator is the identity::
+
+            sage: set_random_seed()
+            sage: J = random_eja().random_element().subalgebra_generated_by()
+            sage: actual = J.one().operator().matrix()
+            sage: expected = matrix.identity(J.base_ring(), J.dimension())
+            sage: actual == expected
+            True
+        """
+        return self.monomial(self.one_basis())
+
+
     def superalgebra(self):
         """
         Return the superalgebra that this algebra was generated from.