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``.
# 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.
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::
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::
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::