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.
75 def __init__(self
, elt
):
76 superalgebra
= elt
.parent()
78 # First compute the vector subspace spanned by the powers of
80 V
= superalgebra
.vector_space()
81 superalgebra_basis
= [superalgebra
.one()]
82 basis_vectors
= [superalgebra
.one().to_vector()]
83 W
= V
.span_of_basis(basis_vectors
)
84 for exponent
in range(1, V
.dimension()):
85 new_power
= elt
**exponent
86 basis_vectors
.append( new_power
.to_vector() )
88 W
= V
.span_of_basis(basis_vectors
)
89 superalgebra_basis
.append( new_power
)
91 # Vectors weren't independent; bail and keep the
92 # last subspace that worked.
95 # Make the basis hashable for UniqueRepresentation.
96 superalgebra_basis
= tuple(superalgebra_basis
)
98 # Now figure out the entries of the right-multiplication
99 # matrix for the successive basis elements b0, b1,... of
101 field
= superalgebra
.base_ring()
102 n
= len(superalgebra_basis
)
103 mult_table
= [[W
.zero() for i
in range(n
)] for j
in range(n
)]
106 product
= superalgebra_basis
[i
]*superalgebra_basis
[j
]
107 mult_table
[i
][j
] = W
.coordinate_vector(product
.to_vector())
109 # TODO: We'll have to redo this and make it unique again...
112 # The rank is the highest possible degree of a minimal
113 # polynomial, and is bounded above by the dimension. We know
114 # in this case that there's an element whose minimal
115 # polynomial has the same degree as the space's dimension
116 # (remember how we constructed the space?), so that must be
120 category
= superalgebra
.category().Associative()
121 natural_basis
= tuple( b
.natural_representation()
122 for b
in superalgebra_basis
)
124 self
._superalgebra
= superalgebra
125 self
._vector
_space
= W
126 self
._superalgebra
_basis
= superalgebra_basis
129 fdeja
= super(FiniteDimensionalEuclideanJordanElementSubalgebra
, self
)
130 return fdeja
.__init
__(field
,
135 natural_basis
=natural_basis
)
138 def _element_constructor_(self
, elt
):
140 Construct an element of this subalgebra from the given one.
141 The only valid arguments are elements of the parent algebra
142 that happen to live in this subalgebra.
146 sage: from mjo.eja.eja_algebra import RealSymmetricEJA
147 sage: from mjo.eja.eja_subalgebra import FiniteDimensionalEuclideanJordanElementSubalgebra
151 sage: J = RealSymmetricEJA(3)
152 sage: x = sum( i*J.gens()[i] for i in range(6) )
153 sage: K = FiniteDimensionalEuclideanJordanElementSubalgebra(x)
154 sage: [ K(x^k) for k in range(J.rank()) ]
161 # Just as in the superalgebra class, we need to hack
162 # this special case to ensure that random_element() can
163 # coerce a ring zero into the algebra.
166 if elt
in self
.superalgebra():
167 coords
= self
.vector_space().coordinate_vector(elt
.to_vector())
168 return self
.from_vector(coords
)
173 Return the basis-element-index of this algebra's unit element.
180 Return the multiplicative identity element of this algebra.
182 The superclass method computes the identity element, which is
183 beyond overkill in this case: the algebra identity should be our
184 first basis element. We implement this via :meth:`one_basis`
185 because that method can optionally be used by other parts of the
190 sage: from mjo.eja.eja_algebra import (RealCartesianProductEJA,
195 sage: J = RealCartesianProductEJA(5)
197 e0 + e1 + e2 + e3 + e4
198 sage: x = sum(J.gens())
199 sage: A = x.subalgebra_generated_by()
202 sage: A.one().superalgebra_element()
203 e0 + e1 + e2 + e3 + e4
207 The identity element acts like the identity::
209 sage: set_random_seed()
210 sage: J = random_eja().random_element().subalgebra_generated_by()
211 sage: x = J.random_element()
212 sage: J.one()*x == x and x*J.one() == x
215 The matrix of the unit element's operator is the identity::
217 sage: set_random_seed()
218 sage: J = random_eja().random_element().subalgebra_generated_by()
219 sage: actual = J.one().operator().matrix()
220 sage: expected = matrix.identity(J.base_ring(), J.dimension())
221 sage: actual == expected
224 return self
.monomial(self
.one_basis())
227 def superalgebra(self
):
229 Return the superalgebra that this algebra was generated from.
231 return self
._superalgebra
234 def vector_space(self
):
238 sage: from mjo.eja.eja_algebra import RealSymmetricEJA
239 sage: from mjo.eja.eja_subalgebra import FiniteDimensionalEuclideanJordanElementSubalgebra
243 sage: J = RealSymmetricEJA(3)
244 sage: x = sum( i*J.gens()[i] for i in range(6) )
245 sage: K = FiniteDimensionalEuclideanJordanElementSubalgebra(x)
246 sage: K.vector_space()
247 Vector space of degree 6 and dimension 3 over Rational Field
252 sage: (x^0).to_vector()
254 sage: (x^1).to_vector()
256 sage: (x^2).to_vector()
257 (10, 14, 21, 19, 31, 50)
260 return self
._vector
_space
263 Element
= FiniteDimensionalEuclideanJordanElementSubalgebraElement