from sage.modules.with_basis.indexed_element import IndexedFreeModuleElement
from mjo.eja.eja_operator import FiniteDimensionalEJAOperator
-from mjo.eja.eja_utils import _mat2vec
+from mjo.eja.eja_utils import _mat2vec, _scale
class FiniteDimensionalEJAElement(IndexedFreeModuleElement):
"""
element should always be in terms of minimal idempotents::
sage: J = JordanSpinEJA(4)
- sage: x = sum( i*J.gens()[i] for i in range(len(J.gens())) )
+ sage: x = sum( i*J.monomial(i) for i in range(len(J.gens())) )
sage: x.is_regular()
True
sage: [ c.is_primitive_idempotent()
M = matrix([(self.parent().one()).to_vector()])
old_rank = 1
- # Specifying the row-reduction algorithm can e.g. help over
+ # Specifying the row-reduction algorithm can e.g. help over
# AA because it avoids the RecursionError that gets thrown
# when we have to look too hard for a root.
#
SETUP::
sage: from mjo.eja.eja_algebra import (ComplexHermitianEJA,
- ....: QuaternionHermitianEJA)
+ ....: HadamardEJA,
+ ....: QuaternionHermitianEJA,
+ ....: RealSymmetricEJA)
EXAMPLES::
B = self.parent().matrix_basis()
W = self.parent().matrix_space()
- if self.parent()._matrix_basis_is_cartesian:
+ if hasattr(W, 'cartesian_factors'):
# Aaaaand linear combinations don't work in Cartesian
- # product spaces, even though they provide a method
- # with that name.
+ # product spaces, even though they provide a method with
+ # that name. This is hidden behind an "if" because the
+ # _scale() function is slow.
pairs = zip(B, self.to_vector())
- return sum( ( W(tuple(alpha*b_i for b_i in b))
- for (b,alpha) in pairs ),
- W.zero())
+ return W.sum( _scale(b, alpha) for (b,alpha) in pairs )
else:
# This is just a manual "from_vector()", but of course
# matrix spaces aren't vector spaces in sage, so they
SETUP::
- sage: from mjo.eja.eja_algebra import random_eja
+ sage: from mjo.eja.eja_algebra import (random_eja,
+ ....: HadamardEJA,
+ ....: RealSymmetricEJA)
+
+ EXAMPLES:
+
+ We can create subalgebras of Cartesian product EJAs that are not
+ themselves Cartesian product EJAs (they're just "regular" EJAs)::
+
+ sage: J1 = HadamardEJA(3)
+ sage: J2 = RealSymmetricEJA(2)
+ sage: J = cartesian_product([J1,J2])
+ sage: J.one().subalgebra_generated_by()
+ Euclidean Jordan algebra of dimension 1 over Algebraic Real Field
TESTS:
"""
powers = tuple( self**k for k in range(self.degree()) )
- A = self.parent().subalgebra(powers, associative=True, **kwargs)
+ A = self.parent().subalgebra(powers,
+ associative=True,
+ check_field=False,
+ check_axioms=False,
+ **kwargs)
A.one.set_cache(A(self.parent().one()))
return A