]> gitweb.michael.orlitzky.com - sage.d.git/blobdiff - mjo/eja/eja_element_subalgebra.py
eja: don't compute an unused vector space for the element subalgebra.
[sage.d.git] / mjo / eja / eja_element_subalgebra.py
index 7cf3f3702adb5832a7ef4bb86a80b24431d87a54..a26381b12dbe649d5dad9bc0cd056adbb1606f62 100644 (file)
@@ -28,10 +28,6 @@ class FiniteDimensionalEuclideanJordanElementSubalgebra(FiniteDimensionalEuclide
 
             # Pick those out of the list of all powers.
             superalgebra_basis = tuple(map(powers.__getitem__, ind_rows))
-
-            # If our superalgebra is a subalgebra of something else, then
-            # these vectors won't have the right coordinates for
-            # V.span_of_basis() unless we use V.from_vector() on them.
             basis_vectors = map(power_vectors.__getitem__, ind_rows)
         else:
             # If we're going to orthonormalize the basis anyway, we
@@ -47,7 +43,11 @@ class FiniteDimensionalEuclideanJordanElementSubalgebra(FiniteDimensionalEuclide
             superalgebra_basis = [ self._superalgebra.from_vector(b)
                                    for b in basis_vectors ]
 
-        W = V.span_of_basis( V.from_vector(v) for v in basis_vectors )
+        fdeja = super(FiniteDimensionalEuclideanJordanElementSubalgebra, self)
+        fdeja.__init__(self._superalgebra,
+                       superalgebra_basis,
+                       category=category,
+                       check_axioms=False)
 
         # The rank is the highest possible degree of a minimal
         # polynomial, and is bounded above by the dimension. We know
@@ -55,71 +55,7 @@ class FiniteDimensionalEuclideanJordanElementSubalgebra(FiniteDimensionalEuclide
         # polynomial has the same degree as the space's dimension
         # (remember how we constructed the space?), so that must be
         # its rank too.
-        rank = W.dimension()
-
-        fdeja = super(FiniteDimensionalEuclideanJordanElementSubalgebra, self)
-        return fdeja.__init__(self._superalgebra,
-                              superalgebra_basis,
-                              rank=rank,
-                              category=category)
-
-
-    def _a_regular_element(self):
-        """
-        Override the superalgebra method to return the one
-        regular element that is sure to exist in this
-        subalgebra, namely the element that generated it.
-
-        SETUP::
-
-            sage: from mjo.eja.eja_algebra import random_eja
-
-        TESTS::
-
-            sage: set_random_seed()
-            sage: J = random_eja().random_element().subalgebra_generated_by()
-            sage: J._a_regular_element().is_regular()
-            True
-
-        """
-        if self.dimension() == 0:
-            return self.zero()
-        else:
-            return self.monomial(1)
-
-
-    def _element_constructor_(self, elt):
-        """
-        Construct an element of this subalgebra from the given one.
-        The only valid arguments are elements of the parent algebra
-        that happen to live in this subalgebra.
-
-        SETUP::
-
-            sage: from mjo.eja.eja_algebra import RealSymmetricEJA
-            sage: from mjo.eja.eja_element_subalgebra import FiniteDimensionalEuclideanJordanElementSubalgebra
-
-        EXAMPLES::
-
-            sage: J = RealSymmetricEJA(3)
-            sage: x = sum( i*J.gens()[i] for i in range(6) )
-            sage: K = FiniteDimensionalEuclideanJordanElementSubalgebra(x,False)
-            sage: [ K(x^k) for k in range(J.rank()) ]
-            [f0, f1, f2]
-
-        ::
-
-        """
-        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)
-
+        self.rank.set_cache(self.dimension())
 
 
     def one(self):
@@ -134,12 +70,12 @@ class FiniteDimensionalEuclideanJordanElementSubalgebra(FiniteDimensionalEuclide
 
         SETUP::
 
-            sage: from mjo.eja.eja_algebra import (RealCartesianProductEJA,
+            sage: from mjo.eja.eja_algebra import (HadamardEJA,
             ....:                                  random_eja)
 
         EXAMPLES::
 
-            sage: J = RealCartesianProductEJA(5)
+            sage: J = HadamardEJA(5)
             sage: J.one()
             e0 + e1 + e2 + e3 + e4
             sage: x = sum(J.gens())
@@ -154,7 +90,7 @@ class FiniteDimensionalEuclideanJordanElementSubalgebra(FiniteDimensionalEuclide
         The identity element acts like the identity over the rationals::
 
             sage: set_random_seed()
-            sage: x = random_eja().random_element()
+            sage: x = random_eja(field=QQ).random_element()
             sage: A = x.subalgebra_generated_by()
             sage: x = A.random_element()
             sage: A.one()*x == x and x*A.one() == x
@@ -164,7 +100,7 @@ class FiniteDimensionalEuclideanJordanElementSubalgebra(FiniteDimensionalEuclide
         reals with an orthonormal basis::
 
             sage: set_random_seed()
-            sage: x = random_eja(AA).random_element()
+            sage: x = random_eja().random_element()
             sage: A = x.subalgebra_generated_by(orthonormalize_basis=True)
             sage: x = A.random_element()
             sage: A.one()*x == x and x*A.one() == x
@@ -174,7 +110,7 @@ class FiniteDimensionalEuclideanJordanElementSubalgebra(FiniteDimensionalEuclide
         the rationals::
 
             sage: set_random_seed()
-            sage: x = random_eja().random_element()
+            sage: x = random_eja(field=QQ).random_element()
             sage: A = x.subalgebra_generated_by()
             sage: actual = A.one().operator().matrix()
             sage: expected = matrix.identity(A.base_ring(), A.dimension())
@@ -185,7 +121,7 @@ class FiniteDimensionalEuclideanJordanElementSubalgebra(FiniteDimensionalEuclide
         the algebraic reals with an orthonormal basis::
 
             sage: set_random_seed()
-            sage: x = random_eja(AA).random_element()
+            sage: x = random_eja().random_element()
             sage: A = x.subalgebra_generated_by(orthonormalize_basis=True)
             sage: actual = A.one().operator().matrix()
             sage: expected = matrix.identity(A.base_ring(), A.dimension())
@@ -197,54 +133,10 @@ class FiniteDimensionalEuclideanJordanElementSubalgebra(FiniteDimensionalEuclide
             return self.zero()
         else:
             sa_one = self.superalgebra().one().to_vector()
-            sa_coords = self.vector_space().coordinate_vector(sa_one)
-            return self.from_vector(sa_coords)
-
-
-    def natural_basis_space(self):
-        """
-        Return the natural basis space of this algebra, which is identical
-        to that of its superalgebra.
-
-        This is correct "by definition," and avoids a mismatch when the
-        subalgebra is trivial (with no natural basis to infer anything
-        from) and the parent is not.
-        """
-        return self.superalgebra().natural_basis_space()
-
-
-    def superalgebra(self):
-        """
-        Return the superalgebra that this algebra was generated from.
-        """
-        return self._superalgebra
-
-
-    def vector_space(self):
-        """
-        SETUP::
-
-            sage: from mjo.eja.eja_algebra import RealSymmetricEJA
-            sage: from mjo.eja.eja_element_subalgebra import FiniteDimensionalEuclideanJordanElementSubalgebra
-
-        EXAMPLES::
-
-            sage: J = RealSymmetricEJA(3)
-            sage: x = J.monomial(0) + 2*J.monomial(2) + 5*J.monomial(5)
-            sage: K = FiniteDimensionalEuclideanJordanElementSubalgebra(x,False)
-            sage: K.vector_space()
-            Vector space of degree 6 and dimension 3 over...
-            User basis matrix:
-            [ 1  0  1  0  0  1]
-            [ 1  0  2  0  0  5]
-            [ 1  0  4  0  0 25]
-            sage: (x^0).to_vector()
-            (1, 0, 1, 0, 0, 1)
-            sage: (x^1).to_vector()
-            (1, 0, 2, 0, 0, 5)
-            sage: (x^2).to_vector()
-            (1, 0, 4, 0, 0, 25)
-
-        """
-        return self._vector_space
+            # The extra hackery is because foo.to_vector() might not
+            # live in foo.parent().vector_space()!
+            coords = sum( a*b for (a,b)
+                          in zip(sa_one,
+                                 self.superalgebra().vector_space().basis()) )
+            return self.from_vector(self.vector_space().coordinate_vector(coords))