Squaring in the subalgebra should be the same thing as
squaring in the superalgebra::
+ sage: set_random_seed()
sage: J = eja_ln(5)
sage: x = J.random_element()
sage: u = x.subalgebra_generated_by().random_element()
W = V.span( mat2vec(s) for s in S )
for s in S:
- # Brute force the right-multiplication-by-s matrix by looping
+ # Brute force the multiplication-by-s matrix by looping
# through all elements of the basis and doing the computation
- # to find out what the corresponding row should be.
+ # to find out what the corresponding row should be. BEWARE:
+ # these multiplication tables won't be symmetric! It therefore
+ # becomes REALLY IMPORTANT that the underlying algebra
+ # constructor uses ROW vectors and not COLUMN vectors. That's
+ # why we're computing rows here and not columns.
Q_rows = []
for t in S:
this_row = mat2vec((s*t + t*s)/2)
Qs.append(Q)
return FiniteDimensionalEuclideanJordanAlgebra(field,Qs,rank=dimension)
+
+
+def random_eja():
+ """
+ Return a "random" finite-dimensional Euclidean Jordan Algebra.
+
+ ALGORITHM:
+
+ For now, we choose a random natural number ``n`` (greater than zero)
+ and then give you back one of the following:
+
+ * The cartesian product of the rational numbers ``n`` times; this is
+ ``QQ^n`` with the Hadamard product.
+
+ * The Jordan spin algebra on ``QQ^n``.
+
+ * The ``n``-by-``n`` rational symmetric matrices with the symmetric
+ product.
+
+ Later this might be extended to return Cartesian products of the
+ EJAs above.
+
+ TESTS::
+
+ sage: random_eja()
+ Euclidean Jordan algebra of degree...
+
+ """
+ n = ZZ.random_element(1,10).abs()
+ constructor = choice([eja_rn, eja_ln, eja_sn])
+ return constructor(dimension=n, field=QQ)