from sage.matrix.constructor import matrix
+from sage.misc.cachefunc import cached_method
from mjo.eja.eja_algebra import FiniteDimensionalEJA
from mjo.eja.eja_element import FiniteDimensionalEJAElement
sage: J = RealSymmetricEJA(3)
sage: x = sum(J.gens())
sage: x
- e0 + e1 + e2 + e3 + e4 + e5
+ b0 + b1 + b2 + b3 + b4 + b5
sage: A = x.subalgebra_generated_by(orthonormalize=False)
sage: A(x)
- f1
+ c1
sage: A(x).superalgebra_element()
- e0 + e1 + e2 + e3 + e4 + e5
+ b0 + b1 + b2 + b3 + b4 + b5
sage: y = sum(A.gens())
sage: y
- f0 + f1
+ c0 + c1
sage: B = y.subalgebra_generated_by(orthonormalize=False)
sage: B(y)
- g1
+ d1
sage: B(y).superalgebra_element()
- f0 + f1
+ c0 + c1
TESTS:
We can convert back and forth faithfully::
sage: set_random_seed()
- sage: J = random_eja()
+ sage: J = random_eja(field=QQ, orthonormalize=False)
sage: x = J.random_element()
- sage: A = x.subalgebra_generated_by()
+ sage: A = x.subalgebra_generated_by(orthonormalize=False)
sage: A(x).superalgebra_element() == x
True
sage: y = A.random_element()
sage: A(y.superalgebra_element()) == y
True
- sage: B = y.subalgebra_generated_by()
+ sage: B = y.subalgebra_generated_by(orthonormalize=False)
sage: B(y).superalgebra_element() == y
True
"""
- return self.parent().superalgebra()(self.to_matrix())
+ return self.parent().superalgebra_embedding()(self)
TESTS:
- Ensure that our generator names don't conflict with the superalgebra::
+ Ensure that our generator names don't conflict with the
+ superalgebra::
sage: J = JordanSpinEJA(3)
sage: J.one().subalgebra_generated_by().gens()
- (f0,)
+ (c0,)
sage: J = JordanSpinEJA(3, prefix='f')
sage: J.one().subalgebra_generated_by().gens()
(g0,)
- sage: J = JordanSpinEJA(3, prefix='b')
+ sage: J = JordanSpinEJA(3, prefix='a')
sage: J.one().subalgebra_generated_by().gens()
- (c0,)
+ (b0,)
Ensure that we can find subalgebras of subalgebras::
sage: B = A.one().subalgebra_generated_by()
sage: B.dimension()
1
-
"""
def __init__(self, superalgebra, basis, **kwargs):
self._superalgebra = superalgebra
# try to "increment" the parent algebra's prefix, although
# this idea goes out the window fast because some prefixen
# are off-limits.
- prefixen = [ 'f', 'g', 'h', 'a', 'b', 'c', 'd' ]
+ prefixen = ["b","c","d","e","f","g","h","l","m"]
try:
prefix = prefixen[prefixen.index(self._superalgebra.prefix()) + 1]
except ValueError:
jordan_product,
inner_product,
field=field,
+ matrix_space=superalgebra.matrix_space(),
prefix=prefix,
**kwargs)
....: associative=True,
....: orthonormalize=False)
sage: K(J.one())
- f1
+ c1
sage: K(J.one() + x)
- f0 + f1
+ c0 + c1
::
"""
if elt in self.superalgebra():
- return super()._element_constructor_(elt.to_matrix())
+ # If the subalgebra is trivial, its _matrix_span will be empty
+ # but we still want to be able convert the superalgebra's zero()
+ # element into the subalgebra's zero() element. There's no great
+ # workaround for this because sage checks that your basis is
+ # linearly-independent everywhere, so we can't just give it a
+ # basis consisting of the zero element.
+ m = elt.to_matrix()
+ if self.is_trivial() and m.is_zero():
+ return self.zero()
+ else:
+ return super()._element_constructor_(m)
else:
return super()._element_constructor_(elt)
-
- def matrix_space(self):
- """
- Return the matrix space of this algebra, which is identical to
- that of its superalgebra.
-
- This is correct "by definition," and avoids a mismatch when
- the subalgebra is trivial (with no matrix basis elements to
- infer anything from) and the parent is not.
- """
- return self.superalgebra().matrix_space()
-
-
def superalgebra(self):
"""
Return the superalgebra that this algebra was generated from.
return self._superalgebra
+ @cached_method
+ def superalgebra_embedding(self):
+ r"""
+ Return the embedding from this subalgebra into the superalgebra.
+
+ SETUP::
+
+ sage: from mjo.eja.eja_algebra import HadamardEJA
+
+ EXAMPLES::
+
+ sage: J = HadamardEJA(4)
+ sage: A = J.one().subalgebra_generated_by()
+ sage: iota = A.superalgebra_embedding()
+ sage: iota
+ Linear operator between finite-dimensional Euclidean Jordan algebras represented by the matrix:
+ [1/2]
+ [1/2]
+ [1/2]
+ [1/2]
+ Domain: Euclidean Jordan algebra of dimension 1 over Algebraic Real Field
+ Codomain: Euclidean Jordan algebra of dimension 4 over Algebraic Real Field
+ sage: iota(A.one()) == J.one()
+ True
+
+ """
+ from mjo.eja.eja_operator import FiniteDimensionalEJAOperator
+ mm = self._module_morphism(lambda j: self.superalgebra()(self.monomial(j).to_matrix()),
+ codomain=self.superalgebra())
+ return FiniteDimensionalEJAOperator(self,
+ self.superalgebra(),
+ mm.matrix())
+
+
+
Element = FiniteDimensionalEJASubalgebraElement