]> gitweb.michael.orlitzky.com - sage.d.git/blobdiff - mjo/eja/eja_algebra.py
eja: normalize the real symmetric matrix basis.
[sage.d.git] / mjo / eja / eja_algebra.py
index 47d247be636c01d59a06a4f48da4d56b63b0f508..992174e45b763e95677588beee2787859c0e64b1 100644 (file)
@@ -502,8 +502,8 @@ class FiniteDimensionalEuclideanJordanAlgebra(CombinatorialFreeModule):
             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]
             )
 
         ::
@@ -678,7 +678,7 @@ class FiniteDimensionalEuclideanJordanAlgebra(CombinatorialFreeModule):
 
             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()
@@ -827,8 +827,9 @@ def _real_symmetric_basis(n, field):
             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)
 
@@ -1190,6 +1191,9 @@ def _matrix_ip(X,Y):
     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):
     """
@@ -1208,7 +1212,7 @@ class RealSymmetricEJA(FiniteDimensionalEuclideanJordanAlgebra):
         sage: e0*e0
         e0
         sage: e1*e1
-        e0 + e2
+        1/2*e0 + 1/2*e2
         sage: e2*e2
         e2
 
@@ -1254,8 +1258,31 @@ class RealSymmetricEJA(FiniteDimensionalEuclideanJordanAlgebra):
         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)
 
@@ -1267,7 +1294,9 @@ class RealSymmetricEJA(FiniteDimensionalEuclideanJordanAlgebra):
                               **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):