]> gitweb.michael.orlitzky.com - sage.d.git/commitdiff
eja: begin working on a new constructor.
authorMichael Orlitzky <michael@orlitzky.com>
Fri, 27 Nov 2020 13:00:26 +0000 (08:00 -0500)
committerMichael Orlitzky <michael@orlitzky.com>
Fri, 27 Nov 2020 13:00:26 +0000 (08:00 -0500)
mjo/eja/eja_algebra.py
mjo/eja/eja_utils.py

index adcf75503d2a55add4c32dc56380396abd1f8d9d..44d83147bbeceb4acae52d573749545dec3c4b99 100644 (file)
@@ -1025,6 +1025,75 @@ class FiniteDimensionalEuclideanJordanAlgebra(CombinatorialFreeModule):
 
     Element = FiniteDimensionalEuclideanJordanAlgebraElement
 
+class RationalBasisEuclideanJordanAlgebraNg(FiniteDimensionalEuclideanJordanAlgebra):
+    def __init__(self,
+                 field,
+                 basis,
+                 jordan_product,
+                 inner_product,
+                 orthonormalize=True,
+                 prefix='e',
+                 category=None,
+                 check_field=True,
+                 check_axioms=True):
+
+        n = len(basis)
+        vector_basis = basis
+
+        from sage.matrix.matrix import is_Matrix
+        basis_is_matrices = False
+
+        degree = 0
+        if n > 0:
+            if is_Matrix(basis[0]):
+                basis_is_matrices = True
+                vector_basis = tuple( map(_mat2vec,basis) )
+                degree = basis[0].nrows()**2
+            else:
+                degree = basis[0].degree()
+
+        V = VectorSpace(field, degree)
+
+        self._deorthonormalization_matrix = matrix.identity(field,n)
+        if orthonormalize:
+            A = matrix(field, vector_basis)
+            # uh oh, this is only the "usual" inner product
+            Q,R = A.gram_schmidt(orthonormal=True)
+            self._deorthonormalization_matrix = R.inverse().transpose()
+            vector_basis = Q.rows()
+            W = V.span_of_basis( vector_basis )
+            if basis_is_matrices:
+                from mjo.eja.eja_utils import _vec2mat
+                basis = tuple( map(_vec2mat,vector_basis) )
+
+        mult_table = [ [0 for i in range(n)] for j in range(n) ]
+        ip_table = [ [0 for i in range(n)] for j in range(n) ]
+
+        for i in range(n):
+            for j in range(i+1):
+                # do another mat2vec because the multiplication
+                # table is in terms of vectors
+                elt = _mat2vec(jordan_product(basis[i],basis[j]))
+                elt = W.coordinate_vector(elt)
+                mult_table[i][j] = elt
+                mult_table[j][i] = elt
+                ip = inner_product(basis[i],basis[j])
+                ip_table[i][j] = ip
+                ip_table[j][i] = ip
+
+        self._inner_product_matrix = matrix(field,ip_table)
+
+        if basis_is_matrices:
+            for m in basis:
+                m.set_immutable()
+
+        super().__init__(field,
+                         mult_table,
+                         prefix,
+                         category,
+                         basis,
+                         check_field,
+                         check_axioms)
 
 class RationalBasisEuclideanJordanAlgebra(FiniteDimensionalEuclideanJordanAlgebra):
     r"""
index b6b0a0327c19842ce654023b00bf6e0b9af539a1..cbbf1e3a7bb0f1f66c9820121831d09d76895751 100644 (file)
@@ -1,4 +1,9 @@
+from sage.functions.other import sqrt
+from sage.matrix.constructor import matrix
 from sage.modules.free_module_element import vector
 
 def _mat2vec(m):
         return vector(m.base_ring(), m.list())
+
+def _vec2mat(v):
+        return matrix(v.base_ring(), sqrt(v.degree()), v.list())