]> gitweb.michael.orlitzky.com - sage.d.git/blobdiff - mjo/eja/eja_element_subalgebra.py
eja: fix tests and pre-cache ranks.
[sage.d.git] / mjo / eja / eja_element_subalgebra.py
index c058613e1b650a3c3007ad8700d1c36d0b2567c9..608cbc2ed2004235b1f0a356d4a9f89119a2f6c0 100644 (file)
@@ -49,19 +49,18 @@ class FiniteDimensionalEuclideanJordanElementSubalgebra(FiniteDimensionalEuclide
 
         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)
+
         # The rank is the highest possible degree of a minimal
         # polynomial, and is bounded above by the dimension. We know
         # in this case that there's an element whose minimal
         # 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)
+        self.rank.set_cache(W.dimension())
 
 
     def _a_regular_element(self):
@@ -100,12 +99,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())
@@ -120,7 +119,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
@@ -130,7 +129,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
@@ -140,7 +139,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())
@@ -151,7 +150,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())
@@ -163,5 +162,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)
+            # 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))
+