]> gitweb.michael.orlitzky.com - sage.d.git/blobdiff - mjo/eja/eja_algebra.py
eja: move the element constructor into the parent algebra class.
[sage.d.git] / mjo / eja / eja_algebra.py
index 5e9c07c01be4bb5ac13644c5335a8b45304c6b7e..d06efb59b14c1c7ecf1fb3fda375168ded981e6e 100644 (file)
@@ -61,6 +61,68 @@ class FiniteDimensionalEuclideanJordanAlgebra(CombinatorialFreeModule):
         self.print_options(bracket='')
 
 
+    def _element_constructor_(self, elt):
+        """
+        Construct an element of this algebra from its natural
+        representation.
+
+        This gets called only after the parent element _call_ method
+        fails to find a coercion for the argument.
+
+        SETUP::
+
+            sage: from mjo.eja.eja_algebra import (JordanSpinEJA,
+            ....:                                  RealCartesianProductEJA,
+            ....:                                  RealSymmetricEJA)
+
+        EXAMPLES:
+
+        The identity in `S^n` is converted to the identity in the EJA::
+
+            sage: J = RealSymmetricEJA(3)
+            sage: I = matrix.identity(QQ,3)
+            sage: J(I) == J.one()
+            True
+
+        This skew-symmetric matrix can't be represented in the EJA::
+
+            sage: J = RealSymmetricEJA(3)
+            sage: A = matrix(QQ,3, lambda i,j: i-j)
+            sage: J(A)
+            Traceback (most recent call last):
+            ...
+            ArithmeticError: vector is not in free module
+
+        TESTS:
+
+        Ensure that we can convert any element of the two non-matrix
+        simple algebras (whose natural representations are their usual
+        vector representations) back and forth faithfully::
+
+            sage: set_random_seed()
+            sage: J = RealCartesianProductEJA(5)
+            sage: x = J.random_element()
+            sage: J(x.to_vector().column()) == x
+            True
+            sage: J = JordanSpinEJA(5)
+            sage: x = J.random_element()
+            sage: J(x.to_vector().column()) == x
+            True
+
+        """
+        natural_basis = self.natural_basis()
+        if elt not in natural_basis[0].matrix_space():
+            raise ValueError("not a naturally-represented algebra element")
+
+        # Thanks for nothing! Matrix spaces aren't vector
+        # spaces in Sage, so we have to figure out its
+        # natural-basis coordinates ourselves.
+        V = VectorSpace(elt.base_ring(), elt.nrows()*elt.ncols())
+        W = V.span_of_basis( _mat2vec(s) for s in natural_basis )
+        coords =  W.coordinate_vector(_mat2vec(elt))
+        return self.from_vector(coords)
+
+
     def _repr_(self):
         """
         Return a string representation of ``self``.
@@ -206,7 +268,7 @@ class FiniteDimensionalEuclideanJordanAlgebra(CombinatorialFreeModule):
         # We want the middle equivalent thing in our matrix, but use
         # the first equivalent thing instead so that we can pass in
         # standard coordinates.
-        x = J(W(R.gens()))
+        x = J.from_vector(W(R.gens()))
 
         # Handle the zeroth power separately, because computing
         # the unit element in J is mathematically suspect.
@@ -1008,12 +1070,12 @@ class RealSymmetricEJA(FiniteDimensionalEuclideanJordanAlgebra):
 
     TESTS:
 
-    The degree of this algebra is `(n^2 + n) / 2`::
+    The dimension of this algebra is `(n^2 + n) / 2`::
 
         sage: set_random_seed()
         sage: n = ZZ.random_element(1,5)
         sage: J = RealSymmetricEJA(n)
-        sage: J.degree() == (n^2 + n)/2
+        sage: J.dimension() == (n^2 + n)/2
         True
 
     The Jordan multiplication is what we think it is::
@@ -1060,12 +1122,12 @@ class ComplexHermitianEJA(FiniteDimensionalEuclideanJordanAlgebra):
 
     TESTS:
 
-    The degree of this algebra is `n^2`::
+    The dimension of this algebra is `n^2`::
 
         sage: set_random_seed()
         sage: n = ZZ.random_element(1,5)
         sage: J = ComplexHermitianEJA(n)
-        sage: J.degree() == n^2
+        sage: J.dimension() == n^2
         True
 
     The Jordan multiplication is what we think it is::
@@ -1120,12 +1182,12 @@ class QuaternionHermitianEJA(FiniteDimensionalEuclideanJordanAlgebra):
 
     TESTS:
 
-    The degree of this algebra is `n^2`::
+    The dimension of this algebra is `n^2`::
 
         sage: set_random_seed()
         sage: n = ZZ.random_element(1,5)
         sage: J = QuaternionHermitianEJA(n)
-        sage: J.degree() == 2*(n^2) - n
+        sage: J.dimension() == 2*(n^2) - n
         True
 
     The Jordan multiplication is what we think it is::