]> gitweb.michael.orlitzky.com - sage.d.git/blobdiff - mjo/eja/eja_subalgebra.py
eja: compute a natural basis for subalgebras.
[sage.d.git] / mjo / eja / eja_subalgebra.py
index 0ff3519fa15ba4eb1e968ca64d92e69326368b1e..5ac0a77c7a9ab27929f4c3e1d73238d93e1ccd1b 100644 (file)
@@ -8,6 +8,28 @@ from mjo.eja.eja_element import FiniteDimensionalEuclideanJordanAlgebraElement
 class FiniteDimensionalEuclideanJordanElementSubalgebra(FiniteDimensionalEuclideanJordanAlgebra):
     """
     The subalgebra of an EJA generated by a single element.
+
+    SETUP::
+
+        sage: from mjo.eja.eja_algebra import FiniteDimensionalEuclideanJordanAlgebra
+
+    TESTS:
+
+    Ensure that non-clashing names are chosen::
+
+        sage: m1 = matrix.identity(QQ,2)
+        sage: m2 = matrix(QQ, [[0,1],
+        ....:                  [1,0]])
+        sage: J = FiniteDimensionalEuclideanJordanAlgebra(QQ,
+        ....:                                             [m1,m2],
+        ....:                                             2,
+        ....:                                             names='f')
+        sage: J.variable_names()
+        ('f0', 'f1')
+        sage: A = sum(J.gens()).subalgebra_generated_by()
+        sage: A.variable_names()
+        ('g0', 'g1')
+
     """
     @staticmethod
     def __classcall_private__(cls, elt):
@@ -72,15 +94,20 @@ class FiniteDimensionalEuclideanJordanElementSubalgebra(FiniteDimensionalEuclide
         # powers.
         assume_associative=True
 
-        # TODO: Un-hard-code this. It should be possible to get the "next"
-        # name based on the parent's generator names.
-        names = 'f'
-        names = normalize_names(W.dimension(), names)
+        # Figure out a non-conflicting set of names to use.
+        valid_names = ['f','g','h','a','b','c','d']
+        name_idx = 0
+        names = normalize_names(W.dimension(), valid_names[0])
+        # This loops so long as the list of collisions is nonempty.
+        # Just crash if we run out of names without finding a set that
+        # don't conflict with the parent algebra.
+        while [y for y in names if y in superalgebra.variable_names()]:
+            name_idx += 1
+            names = normalize_names(W.dimension(), valid_names[name_idx])
 
         cat = superalgebra.category().Associative()
-
-        # TODO: compute this and actually specify it.
-        natural_basis = None
+        natural_basis = tuple( b.natural_representation()
+                               for b in superalgebra_basis )
 
         fdeja = super(FiniteDimensionalEuclideanJordanElementSubalgebra, cls)
         return fdeja.__classcall__(cls,
@@ -156,6 +183,26 @@ class FiniteDimensionalEuclideanJordanElementSubalgebra(FiniteDimensionalEuclide
 
 
     class Element(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
+
+        """
         def __init__(self, A, elt=None):
             """
             SETUP::