from sage.modules.free_module import VectorSpace
from sage.modules.with_basis.indexed_element import IndexedFreeModuleElement
-# TODO: make this unnecessary somehow.
-from sage.misc.lazy_import import lazy_import
-lazy_import('mjo.eja.eja_algebra', 'FiniteDimensionalEuclideanJordanAlgebra')
-lazy_import('mjo.eja.eja_element_subalgebra',
- 'FiniteDimensionalEuclideanJordanElementSubalgebra')
from mjo.eja.eja_operator import FiniteDimensionalEuclideanJordanAlgebraOperator
from mjo.eja.eja_utils import _mat2vec
sage: from mjo.eja.eja_algebra import (JordanSpinEJA,
....: TrivialEJA,
+ ....: RealSymmetricEJA,
+ ....: ComplexHermitianEJA,
....: random_eja)
EXAMPLES::
sage: x,y = J.random_elements(2)
sage: (x*y).det() == x.det()*y.det()
True
+
+ The determinant in matrix algebras is just the usual determinant::
+
+ sage: set_random_seed()
+ sage: X = matrix.random(QQ,3)
+ sage: X = X + X.T
+ sage: J1 = RealSymmetricEJA(3)
+ sage: J2 = RealSymmetricEJA(3,field=QQ,orthonormalize=False)
+ sage: expected = X.det()
+ sage: actual1 = J1(X).det()
+ sage: actual2 = J2(X).det()
+ sage: actual1 == expected
+ True
+ sage: actual2 == expected
+ True
+
+ ::
+
+ sage: set_random_seed()
+ sage: J1 = ComplexHermitianEJA(3)
+ sage: J2 = ComplexHermitianEJA(3,field=QQ,orthonormalize=False)
+ sage: X = matrix.random(GaussianIntegers(),3)
+ sage: X = X + X.H
+ sage: expected = AA(X.det())
+ sage: actual1 = J1(J1.real_embed(X)).det()
+ sage: actual2 = J2(J2.real_embed(X)).det()
+ sage: expected == actual1
+ True
+ sage: expected == actual2
+ True
+
"""
P = self.parent()
r = P.rank()
zero, but we need the characteristic polynomial for the
determinant. The minimal polynomial is a lot easier to get,
so we use Corollary 2 in Chapter V of Koecher to check
- whether or not the paren't algebra's zero element is a root
+ whether or not the parent algebra's zero element is a root
of this element's minimal polynomial.
That is... unless the coefficients of our algebra's
sage: n_max = RealSymmetricEJA._max_random_instance_size()
sage: n = ZZ.random_element(1, n_max)
sage: J1 = RealSymmetricEJA(n)
- sage: J2 = RealSymmetricEJA(n,normalize_basis=False)
+ sage: J2 = RealSymmetricEJA(n,orthonormalize=False)
sage: X = random_matrix(AA,n)
sage: X = X*X.transpose()
sage: x1 = J1(X)
- def natural_representation(self):
+ def to_matrix(self):
"""
- Return a more-natural representation of this element.
+ Return an (often more natural) representation of this element as a
+ matrix.
- Every finite-dimensional Euclidean Jordan Algebra is a
- direct sum of five simple algebras, four of which comprise
- Hermitian matrices. This method returns the original
- "natural" representation of this element as a Hermitian
- matrix, if it has one. If not, you get the usual representation.
+ Every finite-dimensional Euclidean Jordan Algebra is a direct
+ sum of five simple algebras, four of which comprise Hermitian
+ matrices. This method returns a "natural" matrix
+ representation of this element as either a Hermitian matrix or
+ column vector.
SETUP::
sage: J = ComplexHermitianEJA(3)
sage: J.one()
e0 + e3 + e8
- sage: J.one().natural_representation()
+ sage: J.one().to_matrix()
[1 0 0 0 0 0]
[0 1 0 0 0 0]
[0 0 1 0 0 0]
sage: J = QuaternionHermitianEJA(3)
sage: J.one()
e0 + e5 + e14
- sage: J.one().natural_representation()
+ sage: J.one().to_matrix()
[1 0 0 0 0 0 0 0 0 0 0 0]
[0 1 0 0 0 0 0 0 0 0 0 0]
[0 0 1 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 1 0 0]
[0 0 0 0 0 0 0 0 0 0 1 0]
[0 0 0 0 0 0 0 0 0 0 0 1]
-
"""
- B = self.parent().natural_basis()
- W = self.parent().natural_basis_space()
+ B = self.parent().matrix_basis()
+ W = self.parent().matrix_space()
# This is just a manual "from_vector()", but of course
# matrix spaces aren't vector spaces in sage, so they
# don't have a from_vector() method.
- return W.linear_combination(zip(B,self.to_vector()))
+ return W.linear_combination( zip(B, self.to_vector()) )
def norm(self):
True
"""
+ from mjo.eja.eja_element_subalgebra import FiniteDimensionalEuclideanJordanElementSubalgebra
return FiniteDimensionalEuclideanJordanElementSubalgebra(self, orthonormalize_basis)