1 from sage
.matrix
.constructor
import matrix
3 from mjo
.eja
.eja_algebra
import FiniteDimensionalEuclideanJordanAlgebra
4 from mjo
.eja
.eja_element
import FiniteDimensionalEuclideanJordanAlgebraElement
7 class FiniteDimensionalEuclideanJordanElementSubalgebraElement(FiniteDimensionalEuclideanJordanAlgebraElement
):
11 sage: from mjo.eja.eja_algebra import random_eja
15 The natural representation of an element in the subalgebra is
16 the same as its natural representation in the superalgebra::
18 sage: set_random_seed()
19 sage: A = random_eja().random_element().subalgebra_generated_by()
20 sage: y = A.random_element()
21 sage: actual = y.natural_representation()
22 sage: expected = y.superalgebra_element().natural_representation()
23 sage: actual == expected
28 def superalgebra_element(self
):
30 Return the object in our algebra's superalgebra that corresponds
35 sage: from mjo.eja.eja_algebra import (RealSymmetricEJA,
40 sage: J = RealSymmetricEJA(3)
41 sage: x = sum(J.gens())
43 e0 + e1 + e2 + e3 + e4 + e5
44 sage: A = x.subalgebra_generated_by()
47 sage: A(x).superalgebra_element()
48 e0 + e1 + e2 + e3 + e4 + e5
52 We can convert back and forth faithfully::
54 sage: set_random_seed()
55 sage: J = random_eja()
56 sage: x = J.random_element()
57 sage: A = x.subalgebra_generated_by()
58 sage: A(x).superalgebra_element() == x
60 sage: y = A.random_element()
61 sage: A(y.superalgebra_element()) == y
65 return self
.parent().superalgebra().linear_combination(
66 zip(self
.parent()._superalgebra
_basis
, self
.to_vector()) )
71 class FiniteDimensionalEuclideanJordanElementSubalgebra(FiniteDimensionalEuclideanJordanAlgebra
):
73 The subalgebra of an EJA generated by a single element.
77 sage: from mjo.eja.eja_algebra import (ComplexHermitianEJA,
82 Ensure that our generator names don't conflict with the superalgebra::
84 sage: J = JordanSpinEJA(3)
85 sage: J.one().subalgebra_generated_by().gens()
87 sage: J = JordanSpinEJA(3, prefix='f')
88 sage: J.one().subalgebra_generated_by().gens()
90 sage: J = JordanSpinEJA(3, prefix='b')
91 sage: J.one().subalgebra_generated_by().gens()
94 Ensure that we can find subalgebras of subalgebras::
96 sage: A = ComplexHermitianEJA(3).one().subalgebra_generated_by()
97 sage: B = A.one().subalgebra_generated_by()
102 def __init__(self
, elt
):
103 self
._superalgebra
= elt
.parent()
104 category
= self
._superalgebra
.category().Associative()
105 V
= self
._superalgebra
.vector_space()
106 field
= self
._superalgebra
.base_ring()
108 # A half-assed attempt to ensure that we don't collide with
109 # the superalgebra's prefix (ignoring the fact that there
110 # could be super-superelgrbas in scope). If possible, we
111 # try to "increment" the parent algebra's prefix, although
112 # this idea goes out the window fast because some prefixen
114 prefixen
= [ 'f', 'g', 'h', 'a', 'b', 'c', 'd' ]
116 prefix
= prefixen
[prefixen
.index(self
._superalgebra
.prefix()) + 1]
121 # Short circuit because 0^0 == 1 is going to make us
122 # think we have a one-dimensional algebra otherwise.
123 natural_basis
= tuple()
126 self
._vector
_space
= V
.zero_subspace()
127 self
._superalgebra
_basis
= []
128 fdeja
= super(FiniteDimensionalEuclideanJordanElementSubalgebra
,
130 return fdeja
.__init
__(field
,
135 natural_basis
=natural_basis
)
138 # First compute the vector subspace spanned by the powers of
140 superalgebra_basis
= [self
._superalgebra
.one()]
141 # If our superalgebra is a subalgebra of something else, then
142 # superalgebra.one().to_vector() won't have the right
143 # coordinates unless we use V.from_vector() below.
144 basis_vectors
= [V
.from_vector(self
._superalgebra
.one().to_vector())]
145 W
= V
.span_of_basis(basis_vectors
)
146 for exponent
in range(1, V
.dimension()):
147 new_power
= elt
**exponent
148 basis_vectors
.append( V
.from_vector(new_power
.to_vector()) )
150 W
= V
.span_of_basis(basis_vectors
)
151 superalgebra_basis
.append( new_power
)
153 # Vectors weren't independent; bail and keep the
154 # last subspace that worked.
157 # Make the basis hashable for UniqueRepresentation.
158 superalgebra_basis
= tuple(superalgebra_basis
)
160 # Now figure out the entries of the right-multiplication
161 # matrix for the successive basis elements b0, b1,... of
163 n
= len(superalgebra_basis
)
164 mult_table
= [[W
.zero() for i
in range(n
)] for j
in range(n
)]
167 product
= superalgebra_basis
[i
]*superalgebra_basis
[j
]
168 # product.to_vector() might live in a vector subspace
169 # if our parent algebra is already a subalgebra. We
170 # use V.from_vector() to make it "the right size" in
172 product_vector
= V
.from_vector(product
.to_vector())
173 mult_table
[i
][j
] = W
.coordinate_vector(product_vector
)
175 # The rank is the highest possible degree of a minimal
176 # polynomial, and is bounded above by the dimension. We know
177 # in this case that there's an element whose minimal
178 # polynomial has the same degree as the space's dimension
179 # (remember how we constructed the space?), so that must be
183 natural_basis
= tuple( b
.natural_representation()
184 for b
in superalgebra_basis
)
187 self
._vector
_space
= W
188 self
._superalgebra
_basis
= superalgebra_basis
191 fdeja
= super(FiniteDimensionalEuclideanJordanElementSubalgebra
, self
)
192 return fdeja
.__init
__(field
,
197 natural_basis
=natural_basis
)
200 def _element_constructor_(self
, elt
):
202 Construct an element of this subalgebra from the given one.
203 The only valid arguments are elements of the parent algebra
204 that happen to live in this subalgebra.
208 sage: from mjo.eja.eja_algebra import RealSymmetricEJA
209 sage: from mjo.eja.eja_subalgebra import FiniteDimensionalEuclideanJordanElementSubalgebra
213 sage: J = RealSymmetricEJA(3)
214 sage: x = sum( i*J.gens()[i] for i in range(6) )
215 sage: K = FiniteDimensionalEuclideanJordanElementSubalgebra(x)
216 sage: [ K(x^k) for k in range(J.rank()) ]
223 # Just as in the superalgebra class, we need to hack
224 # this special case to ensure that random_element() can
225 # coerce a ring zero into the algebra.
228 if elt
in self
.superalgebra():
229 coords
= self
.vector_space().coordinate_vector(elt
.to_vector())
230 return self
.from_vector(coords
)
235 Return the basis-element-index of this algebra's unit element.
242 Return the multiplicative identity element of this algebra.
244 The superclass method computes the identity element, which is
245 beyond overkill in this case: the algebra identity should be our
246 first basis element. We implement this via :meth:`one_basis`
247 because that method can optionally be used by other parts of the
252 sage: from mjo.eja.eja_algebra import (RealCartesianProductEJA,
257 sage: J = RealCartesianProductEJA(5)
259 e0 + e1 + e2 + e3 + e4
260 sage: x = sum(J.gens())
261 sage: A = x.subalgebra_generated_by()
264 sage: A.one().superalgebra_element()
265 e0 + e1 + e2 + e3 + e4
269 The identity element acts like the identity::
271 sage: set_random_seed()
272 sage: J = random_eja().random_element().subalgebra_generated_by()
273 sage: x = J.random_element()
274 sage: J.one()*x == x and x*J.one() == x
277 The matrix of the unit element's operator is the identity::
279 sage: set_random_seed()
280 sage: J = random_eja().random_element().subalgebra_generated_by()
281 sage: actual = J.one().operator().matrix()
282 sage: expected = matrix.identity(J.base_ring(), J.dimension())
283 sage: actual == expected
286 if self
.dimension() == 0:
289 return self
.monomial(self
.one_basis())
292 def superalgebra(self
):
294 Return the superalgebra that this algebra was generated from.
296 return self
._superalgebra
299 def vector_space(self
):
303 sage: from mjo.eja.eja_algebra import RealSymmetricEJA
304 sage: from mjo.eja.eja_subalgebra import FiniteDimensionalEuclideanJordanElementSubalgebra
308 sage: J = RealSymmetricEJA(3)
309 sage: x = sum( i*J.gens()[i] for i in range(6) )
310 sage: K = FiniteDimensionalEuclideanJordanElementSubalgebra(x)
311 sage: K.vector_space()
312 Vector space of degree 6 and dimension 3 over Rational Field
317 sage: (x^0).to_vector()
319 sage: (x^1).to_vector()
321 sage: (x^2).to_vector()
322 (10, 14, 21, 19, 31, 50)
325 return self
._vector
_space
328 Element
= FiniteDimensionalEuclideanJordanElementSubalgebraElement