Finite family {0: e0, 1: e1, 2: e2}
sage: J.natural_basis()
(
- [1 0] [0 1] [0 0]
- [0 0], [1 0], [0 1]
+ [1 0] [ 0 1/2*sqrt2] [0 0]
+ [0 0], [1/2*sqrt2 0], [0 1]
)
::
sage: J = RealSymmetricEJA(2)
sage: J.vector_space()
- Vector space of dimension 3 over Rational Field
+ Vector space of dimension 3 over...
"""
return self.zero().to_vector().parent().ambient_vector_space()
if i == j:
Sij = Eij
else:
- # Beware, orthogonal but not normalized!
Sij = Eij + Eij.transpose()
+ # Now normalize it.
+ Sij = Sij / _real_symmetric_matrix_ip(Sij,Sij).sqrt()
S.append(Sij)
return tuple(S)
Y_mat = Y.natural_representation()
return (X_mat*Y_mat).trace()
+def _real_symmetric_matrix_ip(X,Y):
+ return (X*Y).trace()
+
class RealSymmetricEJA(FiniteDimensionalEuclideanJordanAlgebra):
"""
sage: e0*e0
e0
sage: e1*e1
- e0 + e2
+ 1/2*e0 + 1/2*e2
sage: e2*e2
e2
sage: (x*y).inner_product(z) == y.inner_product(x*z)
True
+ Our basis is normalized with respect to the natural inner product::
+
+ sage: set_random_seed()
+ sage: n = ZZ.random_element(1,5)
+ sage: J = RealSymmetricEJA(n)
+ sage: all( b.norm() == 1 for b in J.gens() )
+ True
+
+ Left-multiplication operators are symmetric because they satisfy
+ the Jordan axiom::
+
+ sage: set_random_seed()
+ sage: n = ZZ.random_element(1,5)
+ sage: x = RealSymmetricEJA(n).random_element()
+ sage: x.operator().matrix().is_symmetric()
+ True
+
"""
def __init__(self, n, field=QQ, **kwargs):
+ if n > 1 and field is QQ:
+ # We'll need sqrt(2) to normalize the basis, and this
+ # winds up in the multiplication table, so the whole
+ # algebra needs to be over the field extension.
+ field = QuadraticField(2, 'sqrt2')
+
S = _real_symmetric_basis(n, field)
Qs = _multiplication_table_from_matrix_basis(S)
**kwargs)
def inner_product(self, x, y):
- return _matrix_ip(x,y)
+ X = x.natural_representation()
+ Y = y.natural_representation()
+ return _real_symmetric_matrix_ip(X,Y)
class ComplexHermitianEJA(FiniteDimensionalEuclideanJordanAlgebra):