]> gitweb.michael.orlitzky.com - sage.d.git/blob - mjo/eja/eja_subalgebra.py
4458a7e06d9d905ab276665a210eb7dc8275320b
[sage.d.git] / mjo / eja / eja_subalgebra.py
1 from sage.matrix.constructor import matrix
2
3 from mjo.eja.eja_algebra import FiniteDimensionalEJA
4 from mjo.eja.eja_element import FiniteDimensionalEJAElement
5
6 class FiniteDimensionalEJASubalgebraElement(FiniteDimensionalEJAElement):
7 """
8 SETUP::
9
10 sage: from mjo.eja.eja_algebra import random_eja
11
12 TESTS::
13
14 The matrix representation of an element in the subalgebra is
15 the same as its matrix representation in the superalgebra::
16
17 sage: set_random_seed()
18 sage: x = random_eja(field=QQ,orthonormalize=False).random_element()
19 sage: A = x.subalgebra_generated_by(orthonormalize=False)
20 sage: y = A.random_element()
21 sage: actual = y.to_matrix()
22 sage: expected = y.superalgebra_element().to_matrix()
23 sage: actual == expected
24 True
25
26 The left-multiplication-by operator for elements in the subalgebra
27 works like it does in the superalgebra, even if we orthonormalize
28 our basis::
29
30 sage: set_random_seed()
31 sage: x = random_eja(field=AA).random_element()
32 sage: A = x.subalgebra_generated_by(orthonormalize=True)
33 sage: y = A.random_element()
34 sage: y.operator()(A.one()) == y
35 True
36
37 """
38
39 def superalgebra_element(self):
40 """
41 Return the object in our algebra's superalgebra that corresponds
42 to myself.
43
44 SETUP::
45
46 sage: from mjo.eja.eja_algebra import (RealSymmetricEJA,
47 ....: random_eja)
48
49 EXAMPLES::
50
51 sage: J = RealSymmetricEJA(3)
52 sage: x = sum(J.gens())
53 sage: x
54 b0 + b1 + b2 + b3 + b4 + b5
55 sage: A = x.subalgebra_generated_by(orthonormalize=False)
56 sage: A(x)
57 c1
58 sage: A(x).superalgebra_element()
59 b0 + b1 + b2 + b3 + b4 + b5
60 sage: y = sum(A.gens())
61 sage: y
62 c0 + c1
63 sage: B = y.subalgebra_generated_by(orthonormalize=False)
64 sage: B(y)
65 d1
66 sage: B(y).superalgebra_element()
67 c0 + c1
68
69 TESTS:
70
71 We can convert back and forth faithfully::
72
73 sage: set_random_seed()
74 sage: J = random_eja(field=QQ, orthonormalize=False)
75 sage: x = J.random_element()
76 sage: A = x.subalgebra_generated_by(orthonormalize=False)
77 sage: A(x).superalgebra_element() == x
78 True
79 sage: y = A.random_element()
80 sage: A(y.superalgebra_element()) == y
81 True
82 sage: B = y.subalgebra_generated_by(orthonormalize=False)
83 sage: B(y).superalgebra_element() == y
84 True
85
86 """
87 return self.parent().superalgebra()(self.to_matrix())
88
89
90
91
92 class FiniteDimensionalEJASubalgebra(FiniteDimensionalEJA):
93 """
94 A subalgebra of an EJA with a given basis.
95
96 SETUP::
97
98 sage: from mjo.eja.eja_algebra import (ComplexHermitianEJA,
99 ....: JordanSpinEJA,
100 ....: RealSymmetricEJA)
101 sage: from mjo.eja.eja_subalgebra import FiniteDimensionalEJASubalgebra
102
103 EXAMPLES:
104
105 The following Peirce subalgebras of the 2-by-2 real symmetric
106 matrices do not contain the superalgebra's identity element::
107
108 sage: J = RealSymmetricEJA(2)
109 sage: E11 = matrix(AA, [ [1,0],
110 ....: [0,0] ])
111 sage: E22 = matrix(AA, [ [0,0],
112 ....: [0,1] ])
113 sage: K1 = FiniteDimensionalEJASubalgebra(J, (J(E11),), associative=True)
114 sage: K1.one().to_matrix()
115 [1 0]
116 [0 0]
117 sage: K2 = FiniteDimensionalEJASubalgebra(J, (J(E22),), associative=True)
118 sage: K2.one().to_matrix()
119 [0 0]
120 [0 1]
121
122 TESTS:
123
124 Ensure that our generator names don't conflict with the
125 superalgebra::
126
127 sage: J = JordanSpinEJA(3)
128 sage: J.one().subalgebra_generated_by().gens()
129 (c0,)
130 sage: J = JordanSpinEJA(3, prefix='f')
131 sage: J.one().subalgebra_generated_by().gens()
132 (g0,)
133 sage: J = JordanSpinEJA(3, prefix='a')
134 sage: J.one().subalgebra_generated_by().gens()
135 (b0,)
136
137 Ensure that we can find subalgebras of subalgebras::
138
139 sage: A = ComplexHermitianEJA(3).one().subalgebra_generated_by()
140 sage: B = A.one().subalgebra_generated_by()
141 sage: B.dimension()
142 1
143 """
144 def __init__(self, superalgebra, basis, **kwargs):
145 self._superalgebra = superalgebra
146 V = self._superalgebra.vector_space()
147 field = self._superalgebra.base_ring()
148
149 # A half-assed attempt to ensure that we don't collide with
150 # the superalgebra's prefix (ignoring the fact that there
151 # could be super-superelgrbas in scope). If possible, we
152 # try to "increment" the parent algebra's prefix, although
153 # this idea goes out the window fast because some prefixen
154 # are off-limits.
155 prefixen = ["b","c","d","e","f","g","h","l","m"]
156 try:
157 prefix = prefixen[prefixen.index(self._superalgebra.prefix()) + 1]
158 except ValueError:
159 prefix = prefixen[0]
160
161 # The superalgebra constructor expects these to be in original matrix
162 # form, not algebra-element form.
163 matrix_basis = tuple( b.to_matrix() for b in basis )
164 def jordan_product(x,y):
165 return (self._superalgebra(x)*self._superalgebra(y)).to_matrix()
166
167 def inner_product(x,y):
168 return self._superalgebra(x).inner_product(self._superalgebra(y))
169
170 super().__init__(matrix_basis,
171 jordan_product,
172 inner_product,
173 field=field,
174 matrix_space=superalgebra.matrix_space(),
175 prefix=prefix,
176 **kwargs)
177
178
179
180 def _element_constructor_(self, elt):
181 """
182 Construct an element of this subalgebra from the given one.
183 The only valid arguments are elements of the parent algebra
184 that happen to live in this subalgebra.
185
186 SETUP::
187
188 sage: from mjo.eja.eja_algebra import RealSymmetricEJA
189 sage: from mjo.eja.eja_subalgebra import FiniteDimensionalEJASubalgebra
190
191 EXAMPLES::
192
193 sage: J = RealSymmetricEJA(3)
194 sage: X = matrix(AA, [ [0,0,1],
195 ....: [0,1,0],
196 ....: [1,0,0] ])
197 sage: x = J(X)
198 sage: basis = ( x, x^2 ) # x^2 is the identity matrix
199 sage: K = FiniteDimensionalEJASubalgebra(J,
200 ....: basis,
201 ....: associative=True,
202 ....: orthonormalize=False)
203 sage: K(J.one())
204 c1
205 sage: K(J.one() + x)
206 c0 + c1
207
208 ::
209
210 """
211 if elt in self.superalgebra():
212 return super()._element_constructor_(elt.to_matrix())
213 else:
214 return super()._element_constructor_(elt)
215
216
217 def superalgebra(self):
218 """
219 Return the superalgebra that this algebra was generated from.
220 """
221 return self._superalgebra
222
223
224 Element = FiniteDimensionalEJASubalgebraElement