from sage.modules.with_basis.indexed_element import IndexedFreeModuleElement
from mjo.eja.eja_operator import FiniteDimensionalEJAOperator
-from mjo.eja.eja_utils import _mat2vec, _scale
+from mjo.eja.eja_utils import _scale
+
class FiniteDimensionalEJAElement(IndexedFreeModuleElement):
"""
SETUP::
- sage: from mjo.eja.eja_algebra import HadamardEJA
+ sage: from mjo.eja.eja_algebra import (random_eja,
+ ....: HadamardEJA)
EXAMPLES:
to zero on that element::
sage: set_random_seed()
- sage: x = HadamardEJA(3).random_element()
+ sage: x = random_eja().random_element()
sage: p = x.characteristic_polynomial()
- sage: x.apply_univariate_polynomial(p)
- 0
+ sage: x.apply_univariate_polynomial(p).is_zero()
+ True
The characteristic polynomials of the zero and unit elements
should be what we think they are in a subalgebra, too::
sage: set_random_seed()
sage: d_max = RealSymmetricEJA._max_random_instance_dimension()
- sage: n = ZZ.random_element(1, d_max)
+ sage: d = ZZ.random_element(1, d_max)
+ sage: n = RealSymmetricEJA._max_random_instance_size(d)
sage: J1 = RealSymmetricEJA(n)
sage: J2 = RealSymmetricEJA(n,orthonormalize=False)
sage: X = random_matrix(AA,n)
B = self.parent().matrix_basis()
W = self.parent().matrix_space()
- if hasattr(W, 'cartesian_factors'):
- # Aaaaand linear combinations don't work in Cartesian
- # 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 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
- # don't have a from_vector() method.
- return W.linear_combination( zip(B, self.to_vector()) )
+ # 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()) )
sage: (J0, J5, J1) = J.peirce_decomposition(c1)
sage: (f0, f1, f2) = J1.gens()
sage: f0.spectral_decomposition()
- [(0, c2), (1, c0)]
+ [(0, 1.000000000000000?*c2), (1, 1.000000000000000?*c0)]
"""
A = self.subalgebra_generated_by(orthonormalize=True)
"""
return self.trace_inner_product(self).sqrt()
+
+
+class CartesianProductEJAElement(FiniteDimensionalEJAElement):
+ def det(self):
+ r"""
+ Compute the determinant of this product-element using the
+ determianants of its factors.
+
+ This result Follows from the spectral decomposition of (say)
+ the pair `(x,y)` in terms of the Jordan frame `\left\{ (c_1,
+ 0),(c_2, 0),...,(0,d_1),(0,d_2),... \right\}.
+ """
+ from sage.misc.misc_c import prod
+ return prod( f.det() for f in self.cartesian_factors() )
+
+ def to_matrix(self):
+ # An override is necessary to call our custom _scale().
+ B = self.parent().matrix_basis()
+ W = self.parent().matrix_space()
+
+ # Aaaaand linear combinations don't work in Cartesian
+ # 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 W.sum( _scale(b, alpha) for (b,alpha) in pairs )