"""
-Euclidean Jordan Algebras. These are formally-real Jordan Algebras;
-specifically those where u^2 + v^2 = 0 implies that u = v = 0. They
-are used in optimization, and have some additional nice methods beyond
-what can be supported in a general Jordan Algebra.
-
+Representations and constructions for Euclidean Jordan algebras.
+
+A Euclidean Jordan algebra is a Jordan algebra that has some
+additional properties:
+
+ 1. It is finite-dimensional.
+ 2. Its scalar field is the real numbers.
+ 3a. An inner product is defined on it, and...
+ 3b. That inner product is compatible with the Jordan product
+ in the sense that `<x*y,z> = <y,x*z>` for all elements
+ `x,y,z` in the algebra.
+
+Every Euclidean Jordan algebra is formally-real: for any two elements
+`x` and `y` in the algebra, `x^{2} + y^{2} = 0` implies that `x = y =
+0`. Conversely, every finite-dimensional formally-real Jordan algebra
+can be made into a Euclidean Jordan algebra with an appropriate choice
+of inner-product.
+
+Formally-real Jordan algebras were originally studied as a framework
+for quantum mechanics. Today, Euclidean Jordan algebras are crucial in
+symmetric cone optimization, since every symmetric cone arises as the
+cone of squares in some Euclidean Jordan algebra.
+
+It is known that every Euclidean Jordan algebra decomposes into an
+orthogonal direct sum (essentially, a Cartesian product) of simple
+algebras, and that moreover, up to Jordan-algebra isomorphism, there
+are only five families of simple algebras. We provide constructions
+for these simple algebras:
+
+ * :class:`BilinearFormEJA`
+ * :class:`RealSymmetricEJA`
+ * :class:`ComplexHermitianEJA`
+ * :class:`QuaternionHermitianEJA`
+
+Missing from this list is the algebra of three-by-three octononion
+Hermitian matrices, as there is (as of yet) no implementation of the
+octonions in SageMath. In addition to these, we provide two other
+example constructions,
+
+ * :class:`HadamardEJA`
+ * :class:`TrivialEJA`
+
+The Jordan spin algebra is a bilinear form algebra where the bilinear
+form is the identity. The Hadamard EJA is simply a Cartesian product
+of one-dimensional spin algebras. And last but not least, the trivial
+EJA is exactly what you think. Cartesian products of these are also
+supported using the usual ``cartesian_product()`` function; as a
+result, we support (up to isomorphism) all Euclidean Jordan algebras
+that don't involve octonions.
SETUP::
sage: random_eja()
Euclidean Jordan algebra of dimension...
-
"""
from itertools import repeat
INPUT:
- - basis -- a tuple of basis elements in "matrix form," which
- must be the same form as the arguments to ``jordan_product``
- and ``inner_product``. In reality, "matrix form" can be either
- vectors, matrices, or a Cartesian product (ordered tuple)
- of vectors or matrices. All of these would ideally be vector
- spaces in sage with no special-casing needed; but in reality
- we turn vectors into column-matrices and Cartesian products
- `(a,b)` into column matrices `(a,b)^{T}` after converting
- `a` and `b` themselves.
-
- - jordan_product -- function of two ``basis`` elements (in
- matrix form) that returns their jordan product, also in matrix
- form; this will be applied to ``basis`` to compute a
- multiplication table for the algebra.
-
- - inner_product -- function of two ``basis`` elements (in matrix
- form) that returns their inner product. This will be applied
- to ``basis`` to compute an inner-product table (basically a
- matrix) for this algebra.
+ - ``basis`` -- a tuple; a tuple of basis elements in "matrix
+ form," which must be the same form as the arguments to
+ ``jordan_product`` and ``inner_product``. In reality, "matrix
+ form" can be either vectors, matrices, or a Cartesian product
+ (ordered tuple) of vectors or matrices. All of these would
+ ideally be vector spaces in sage with no special-casing
+ needed; but in reality we turn vectors into column-matrices
+ and Cartesian products `(a,b)` into column matrices
+ `(a,b)^{T}` after converting `a` and `b` themselves.
+
+ - ``jordan_product`` -- a function; afunction of two ``basis``
+ elements (in matrix form) that returns their jordan product,
+ also in matrix form; this will be applied to ``basis`` to
+ compute a multiplication table for the algebra.
+
+ - ``inner_product`` -- a function; a function of two ``basis``
+ elements (in matrix form) that returns their inner
+ product. This will be applied to ``basis`` to compute an
+ inner-product table (basically a matrix) for this algebra.
+
+ - ``field`` -- a subfield of the reals (default: ``AA``); the scalar
+ field for the algebra.
+
+ - ``orthonormalize`` -- boolean (default: ``True``); whether or
+ not to orthonormalize the basis. Doing so is expensive and
+ generally rules out using the rationals as your ``field``, but
+ is required for spectral decompositions.
+
"""
Element = FiniteDimensionalEJAElement
FiniteDimensionalEJA.CartesianProduct = CartesianProductEJA
+class RationalBasisCartesianProductEJA(CartesianProductEJA,
+ RationalBasisEJA):
+ r"""
+ A separate class for products of algebras for which we know a
+ rational basis.
+
+ SETUP::
+
+ sage: from mjo.eja.eja_algebra import (JordanSpinEJA,
+ ....: RealSymmetricEJA)
+
+ EXAMPLES:
+
+ This gives us fast characteristic polynomial computations in
+ product algebras, too::
+
+
+ sage: J1 = JordanSpinEJA(2)
+ sage: J2 = RealSymmetricEJA(3)
+ sage: J = cartesian_product([J1,J2])
+ sage: J.characteristic_polynomial_of().degree()
+ 5
+ sage: J.rank()
+ 5
+
+ """
+ def __init__(self, algebras, **kwargs):
+ CartesianProductEJA.__init__(self, algebras, **kwargs)
+
+ self._rational_algebra = None
+ if self.vector_space().base_field() is not QQ:
+ self._rational_algebra = cartesian_product([
+ r._rational_algebra for r in algebras
+ ])
+
+
+RationalBasisEJA.CartesianProduct = RationalBasisCartesianProductEJA
+
random_eja = ConcreteEJA.random_instance