return x.trace_inner_product(y)
+ def is_trivial(self):
+ """
+ Return whether or not this algebra is trivial.
+
+ A trivial algebra contains only the zero element.
+
+ SETUP::
+
+ sage: from mjo.eja.eja_algebra import ComplexHermitianEJA
+
+ EXAMPLES::
+
+ sage: J = ComplexHermitianEJA(3)
+ sage: J.is_trivial()
+ False
+ sage: A = J.zero().subalgebra_generated_by()
+ sage: A.is_trivial()
+ True
+
+ """
+ return self.dimension() == 0
+
+
def multiplication_table(self):
"""
Return a visual representation of this algebra's multiplication
return self.linear_combination(zip(self.gens(), coeffs))
+ def random_element(self):
+ # Temporary workaround for https://trac.sagemath.org/ticket/28327
+ if self.is_trivial():
+ return self.zero()
+ else:
+ s = super(FiniteDimensionalEuclideanJordanAlgebra, self)
+ return s.random_element()
+
+
def rank(self):
"""
Return the rank of this EJA.
sage: J.one().is_invertible()
True
- The zero element is never invertible::
+ The zero element is never invertible in a non-trivial algebra::
sage: set_random_seed()
sage: J = random_eja()
- sage: J.zero().is_invertible()
+ sage: (not J.is_trivial()) and J.zero().is_invertible()
False
"""
+ if self.is_zero():
+ if self.parent().is_trivial():
+ return True
+ else:
+ return False
+
# In fact, we only need to know if the constant term is non-zero,
# so we can pass in the field's zero element instead.
zero = self.base_ring().zero()
True
"""
+ if self.is_zero() and not self.parent().is_trivial():
+ # The minimal polynomial of zero in a nontrivial algebra
+ # is "t"; in a trivial algebra it's "1" by convention
+ # (it's an empty product).
+ return 1
return self.subalgebra_generated_by().dimension()
0
"""
+ if self.is_zero():
+ # We would generate a zero-dimensional subalgebra
+ # where the minimal polynomial would be constant.
+ # That might be correct, but only if *this* algebra
+ # is trivial too.
+ if not self.parent().is_trivial():
+ # Pretty sure we know what the minimal polynomial of
+ # the zero operator is going to be. This ensures
+ # consistency of e.g. the polynomial variable returned
+ # in the "normal" case without us having to think about it.
+ return self.operator().minimal_polynomial()
+
A = self.subalgebra_generated_by()
return A(self).operator().minimal_polynomial()