]> gitweb.michael.orlitzky.com - sage.d.git/blobdiff - mjo/eja/euclidean_jordan_algebra.py
eja: add an implementation warning for characteristic_polynomial().
[sage.d.git] / mjo / eja / euclidean_jordan_algebra.py
index 74c0bf1cb11e38460f39aef4920fa70f60d02409..b31322f9b1a2ee23a4451e249efd8734455d4595 100644 (file)
@@ -140,6 +140,20 @@ class FiniteDimensionalEuclideanJordanAlgebra(FiniteDimensionalAlgebra):
     @cached_method
     def characteristic_polynomial(self):
         """
+
+        .. WARNING::
+
+            This implementation doesn't guarantee that the polynomial
+            denominator in the coefficients is not identically zero, so
+            theoretically it could crash. The way that this is handled
+            in e.g. Faraut and Koranyi is to use a basis that guarantees
+            the denominator is non-zero. But, doing so requires knowledge
+            of at least one regular element, and we don't even know how
+            to do that. The trade-off is that, if we use the standard basis,
+            the resulting polynomial will accept the "usual" coordinates. In
+            other words, we don't have to do a change of basis before e.g.
+            computing the trace or determinant.
+
         EXAMPLES:
 
         The characteristic polynomial in the spin algebra is given in
@@ -1233,6 +1247,47 @@ class FiniteDimensionalEuclideanJordanAlgebra(FiniteDimensionalAlgebra):
         def trace_inner_product(self, other):
             """
             Return the trace inner product of myself and ``other``.
+
+            TESTS:
+
+            The trace inner product is commutative::
+
+                sage: set_random_seed()
+                sage: J = random_eja()
+                sage: x = J.random_element(); y = J.random_element()
+                sage: x.trace_inner_product(y) == y.trace_inner_product(x)
+                True
+
+            The trace inner product is bilinear::
+
+                sage: set_random_seed()
+                sage: J = random_eja()
+                sage: x = J.random_element()
+                sage: y = J.random_element()
+                sage: z = J.random_element()
+                sage: a = QQ.random_element();
+                sage: actual = (a*(x+z)).trace_inner_product(y)
+                sage: expected = ( a*x.trace_inner_product(y) +
+                ....:              a*z.trace_inner_product(y) )
+                sage: actual == expected
+                True
+                sage: actual = x.trace_inner_product(a*(y+z))
+                sage: expected = ( a*x.trace_inner_product(y) +
+                ....:              a*x.trace_inner_product(z) )
+                sage: actual == expected
+                True
+
+            The trace inner product satisfies the compatibility
+            condition in the definition of a Euclidean Jordan algebra::
+
+                sage: set_random_seed()
+                sage: J = random_eja()
+                sage: x = J.random_element()
+                sage: y = J.random_element()
+                sage: z = J.random_element()
+                sage: (x*y).trace_inner_product(z) == y.trace_inner_product(x*z)
+                True
+
             """
             if not other in self.parent():
                 raise TypeError("'other' must live in the same algebra")