"""
# We take the norm (absolute value) because Octonions() isn't
# smart enough yet to coerce its one() into the base field.
- return (X*Y).trace().abs()
+ return (X*Y).trace().real().abs()
class RealEmbeddedMatrixEJA(MatrixEJA):
@staticmethod
return cls(n, **kwargs)
class OctonionHermitianEJA(FiniteDimensionalEJA, MatrixEJA):
+ r"""
+
+ SETUP::
+ sage: from mjo.eja.eja_algebra import OctonionHermitianEJA
+
+ EXAMPLES:
+
+ The 3-by-3 algebra satisfies the axioms of an EJA::
+
+ sage: OctonionHermitianEJA(3, # long time
+ ....: field=QQ, # long time
+ ....: orthonormalize=False, # long time
+ ....: check_axioms=True) # long time
+ Euclidean Jordan algebra of dimension 27 over Rational Field
+
+ TESTS::
+
+ sage: J = OctonionHermitianEJA(3, # long time
+ ....: field=QQ, # long time
+ ....: orthonormalize=False) # long time
+ sage: J.one.clear_cache() # long time
+ sage: J.one() # long time
+ b0 + b9 + b26
+ sage: J.one().to_matrix() # long time
+ +----+----+----+
+ | e0 | 0 | 0 |
+ +----+----+----+
+ | 0 | e0 | 0 |
+ +----+----+----+
+ | 0 | 0 | e0 |
+ +----+----+----+
+
+ """
def __init__(self, n, field=AA, **kwargs):
if n > 3:
# Otherwise we don't get an EJA.
super().__init__(self._denormalized_basis(n,field),
self.jordan_product,
self.trace_inner_product,
+ field=field,
**kwargs)
# TODO: this could be factored out somehow, but is left here
EXAMPLES::
- sage: B = OctonionHermitianEJA._denormalized_basis(3)
+ sage: B = OctonionHermitianEJA._denormalized_basis(3,QQ)
sage: all( M.is_hermitian() for M in B )
True
sage: len(B)
else:
for e in es:
E_ij = MS.monomial( (i,j,e) )
- E_ij += MS.monomial( (j,i,e.conjugate()) )
+ ec = e.conjugate()
+ # If the conjugate has a negative sign in front
+ # of it, (j,i,ec) won't be a monomial!
+ if (j,i,ec) in MS.indices():
+ E_ij += MS.monomial( (j,i,ec) )
+ else:
+ E_ij -= MS.monomial( (j,i,-ec) )
basis.append(E_ij)
return tuple( basis )