1 1. Add CartesianProductEJA.
3 2. Add references and start citing them.
5 3. Implement the octonion simple EJA.
7 4. Override random_instance(), one(), et cetera in DirectSumEJA.
9 5. Switch to QQ in *all* algebras for _charpoly_coefficients().
10 This only works when we know that the basis can be rationalized...
11 which is the case at least for the concrete EJAs we provide,
14 6. Pass already_echelonized (default: False) and echelon_basis
15 (default: None) into the subalgebra constructor. The value of
16 already_echelonized can be passed to V.span_of_basis() to save
17 some time, and using e.g. FreeModule_submodule_with_basis_field
18 we may somehow be able to pass the echelon basis straight in to
21 This may require supporting "basis" as a list of basis vectors
22 (as opposed to superalgebra elements) in the subalgebra constructor.
24 7. The inner product should be an *argument* to the main EJA
25 constructor. Afterwards, the basis normalization step should be
26 optional (and enabled by default) for ALL algebras, since any
27 algebra can have a nonstandard inner-product and its basis can be
28 normalized with respect to that inner- product. For example, the
29 HadamardEJA could be equipped with an inner- product that is twice
30 the usual one. Then for the basis to be orthonormal, we would need
31 to divide e.g. (1,0,0) by <(1,0,0),(1,0,0)> = 2 to normalize it.
33 8. Pre-cache charpoly for some small algebras?
37 sage: F = J.base_ring()
38 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]
40 9. Compute the scalar in the general natural_inner_product() for
41 matrices, so no overrides are necessary.
43 10. The main EJA element constructor is happy to convert between
44 e.g. HadamardEJA(3) and JordanSpinEJA(3).
46 11. Figure out if CombinatorialFreeModule's use of IndexedGenerators
47 can be used to replace the matrix_basis().
49 12. Move the "field" argument to a keyword after basis, jp, and ip.
51 13. Instead of storing the multiplication and inner-product tables in
52 RationalBasisEuclideanJordanAlgebra, why not just create the
53 algebra over QQ in the constructor and save that? They're globally
54 unique, so we won't wind up with multiple copies.