1. Finish CartesisnProductEJA: add to_matrix(), random_instance(), one()... methods. This will require rethinking what a "matrix representation" and "matrix space" means for a cartesian product algebra. Do we want our matrix basis to consist of ordered pairs (or triples, or...)? Should the matrix_space() of the algebra be the cartesian product of the factors' matrix spaces? Can the FDEJA initializer be made to work on tuples, or will it need to be overridden? 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. The main EJA element constructor is happy to convert between e.g. HadamardEJA(3) and JordanSpinEJA(3). 6. Profile the construction of "large" matrix algebras (like the 15-dimensional QuaternionHermitianAlgebra(3)) to find out why they're so slow.