1. Finish DirectSumEJA: add to_matrix(), random_instance(), one()... methods. Make it subclass RationalBasisEuclideanJordanAlgebra. This is not a general direct sum / cartesian product implementation, it's used only with the other rationalbasis algebras (to make non- simple EJAs out of the simple ones). 2. Add references and start citing them. 3. Implement the octonion simple EJA. 4. Pre-cache charpoly for some small algebras? RealSymmetricEJA(4): sage: F = J.base_ring() sage: a0 = (1/4)*X[4]**2*X[6]**2 - (1/2)*X[2]*X[5]*X[6]**2 - (1/2)*X[3]*X[4]*X[6]*X[7] + (F(2).sqrt()/2)*X[1]*X[5]*X[6]*X[7] + (1/4)*X[3]**2*X[7]**2 - (1/2)*X[0]*X[5]*X[7]**2 + (F(2).sqrt()/2)*X[2]*X[3]*X[6]*X[8] - (1/2)*X[1]*X[4]*X[6*X[8] - (1/2)*X[1]*X[3]*X[7]*X[8] + (F(2).sqrt()/2)*X[0]*X[4]*X[7]*X[8] + (1/4)*X[1]**2*X[8]**2 - (1/2)*X[0]*X[2]*X[8]**2 - (1/2)*X[2]*X[3]**2*X[9] + (F(2).sqrt()/2)*X[1]*X[3]*X[4]*X[9] - (1/2)*X[0]*X[4]**2*X[9] - (1/2)*X[1]**2*X[5]*X[9] + X[0]*X[2]*X[5]*X[9] 5. Compute the scalar in the general natural_inner_product() for matrices, so no overrides are necessary. 6. The main EJA element constructor is happy to convert between e.g. HadamardEJA(3) and JordanSpinEJA(3). 7. Figure out if CombinatorialFreeModule's use of IndexedGenerators can be used to replace the matrix_basis(). 8. Move the "field" argument to a keyword after basis, jp, and ip.