1 from sage
.matrix
.constructor
import matrix
3 from mjo
.eja
.eja_algebra
import FiniteDimensionalEuclideanJordanAlgebra
4 from mjo
.eja
.eja_element
import FiniteDimensionalEuclideanJordanAlgebraElement
6 class FiniteDimensionalEuclideanJordanSubalgebraElement(FiniteDimensionalEuclideanJordanAlgebraElement
):
10 sage: from mjo.eja.eja_algebra import random_eja
14 The natural representation of an element in the subalgebra is
15 the same as its natural representation in the superalgebra::
17 sage: set_random_seed()
18 sage: A = random_eja().random_element().subalgebra_generated_by()
19 sage: y = A.random_element()
20 sage: actual = y.natural_representation()
21 sage: expected = y.superalgebra_element().natural_representation()
22 sage: actual == expected
25 The left-multiplication-by operator for elements in the subalgebra
26 works like it does in the superalgebra, even if we orthonormalize
29 sage: set_random_seed()
30 sage: x = random_eja(AA).random_element()
31 sage: A = x.subalgebra_generated_by(orthonormalize_basis=True)
32 sage: y = A.random_element()
33 sage: y.operator()(A.one()) == y
38 def superalgebra_element(self
):
40 Return the object in our algebra's superalgebra that corresponds
45 sage: from mjo.eja.eja_algebra import (RealSymmetricEJA,
50 sage: J = RealSymmetricEJA(3)
51 sage: x = sum(J.gens())
53 e0 + e1 + e2 + e3 + e4 + e5
54 sage: A = x.subalgebra_generated_by()
57 sage: A(x).superalgebra_element()
58 e0 + e1 + e2 + e3 + e4 + e5
62 We can convert back and forth faithfully::
64 sage: set_random_seed()
65 sage: J = random_eja()
66 sage: x = J.random_element()
67 sage: A = x.subalgebra_generated_by()
68 sage: A(x).superalgebra_element() == x
70 sage: y = A.random_element()
71 sage: A(y.superalgebra_element()) == y
75 return self
.parent().superalgebra().linear_combination(
76 zip(self
.parent()._superalgebra
_basis
, self
.to_vector()) )
81 class FiniteDimensionalEuclideanJordanSubalgebra(FiniteDimensionalEuclideanJordanAlgebra
):
83 A subalgebra of an EJA with a given basis.
87 sage: from mjo.eja.eja_algebra import (ComplexHermitianEJA,
92 Ensure that our generator names don't conflict with the superalgebra::
94 sage: J = JordanSpinEJA(3)
95 sage: J.one().subalgebra_generated_by().gens()
97 sage: J = JordanSpinEJA(3, prefix='f')
98 sage: J.one().subalgebra_generated_by().gens()
100 sage: J = JordanSpinEJA(3, prefix='b')
101 sage: J.one().subalgebra_generated_by().gens()
104 Ensure that we can find subalgebras of subalgebras::
106 sage: A = ComplexHermitianEJA(3).one().subalgebra_generated_by()
107 sage: B = A.one().subalgebra_generated_by()
112 def __init__(self
, superalgebra
, basis
, rank
=None, category
=None):
113 self
._superalgebra
= superalgebra
114 V
= self
._superalgebra
.vector_space()
115 field
= self
._superalgebra
.base_ring()
117 category
= self
._superalgebra
.category()
119 # A half-assed attempt to ensure that we don't collide with
120 # the superalgebra's prefix (ignoring the fact that there
121 # could be super-superelgrbas in scope). If possible, we
122 # try to "increment" the parent algebra's prefix, although
123 # this idea goes out the window fast because some prefixen
125 prefixen
= [ 'f', 'g', 'h', 'a', 'b', 'c', 'd' ]
127 prefix
= prefixen
[prefixen
.index(self
._superalgebra
.prefix()) + 1]
131 basis_vectors
= [ b
.to_vector() for b
in basis
]
132 superalgebra_basis
= [ self
._superalgebra
.from_vector(b
)
133 for b
in basis_vectors
]
135 W
= V
.span_of_basis( V
.from_vector(v
) for v
in basis_vectors
)
136 n
= len(superalgebra_basis
)
137 mult_table
= [[W
.zero() for i
in range(n
)] for j
in range(n
)]
140 product
= superalgebra_basis
[i
]*superalgebra_basis
[j
]
141 # product.to_vector() might live in a vector subspace
142 # if our parent algebra is already a subalgebra. We
143 # use V.from_vector() to make it "the right size" in
145 product_vector
= V
.from_vector(product
.to_vector())
146 mult_table
[i
][j
] = W
.coordinate_vector(product_vector
)
148 natural_basis
= tuple( b
.natural_representation()
149 for b
in superalgebra_basis
)
152 self
._vector
_space
= W
153 self
._superalgebra
_basis
= superalgebra_basis
156 fdeja
= super(FiniteDimensionalEuclideanJordanSubalgebra
, self
)
157 return fdeja
.__init
__(field
,
162 natural_basis
=natural_basis
)
166 def _element_constructor_(self
, elt
):
168 Construct an element of this subalgebra from the given one.
169 The only valid arguments are elements of the parent algebra
170 that happen to live in this subalgebra.
174 sage: from mjo.eja.eja_algebra import RealSymmetricEJA
175 sage: from mjo.eja.eja_subalgebra import FiniteDimensionalEuclideanJordanSubalgebra
179 sage: J = RealSymmetricEJA(3)
180 sage: x = sum( i*J.gens()[i] for i in range(6) )
181 sage: basis = tuple( x^k for k in range(J.rank()) )
182 sage: K = FiniteDimensionalEuclideanJordanSubalgebra(J,basis)
183 sage: [ K(x^k) for k in range(J.rank()) ]
189 if elt
not in self
.superalgebra():
190 raise ValueError("not an element of this subalgebra")
192 coords
= self
.vector_space().coordinate_vector(elt
.to_vector())
193 return self
.from_vector(coords
)
197 def natural_basis_space(self
):
199 Return the natural basis space of this algebra, which is identical
200 to that of its superalgebra.
202 This is correct "by definition," and avoids a mismatch when the
203 subalgebra is trivial (with no natural basis to infer anything
204 from) and the parent is not.
206 return self
.superalgebra().natural_basis_space()
209 def superalgebra(self
):
211 Return the superalgebra that this algebra was generated from.
213 return self
._superalgebra
216 def vector_space(self
):
220 sage: from mjo.eja.eja_algebra import RealSymmetricEJA
221 sage: from mjo.eja.eja_subalgebra import FiniteDimensionalEuclideanJordanSubalgebra
225 sage: J = RealSymmetricEJA(3)
226 sage: x = J.monomial(0) + 2*J.monomial(2) + 5*J.monomial(5)
227 sage: basis = (x^0, x^1, x^2)
228 sage: K = FiniteDimensionalEuclideanJordanSubalgebra(J,basis)
229 sage: K.vector_space()
230 Vector space of degree 6 and dimension 3 over...
235 sage: (x^0).to_vector()
237 sage: (x^1).to_vector()
239 sage: (x^2).to_vector()
243 return self
._vector
_space
246 Element
= FiniteDimensionalEuclideanJordanSubalgebraElement