]> gitweb.michael.orlitzky.com - sage.d.git/blob - mjo/eja/eja_cache.py
eja: rename operator_inner_product -> operator_trace inner_product.
[sage.d.git] / mjo / eja / eja_cache.py
1 r"""
2 Cached characteristic polynomial coefficients for a few of the
3 example algebras. These take a long time to compute, so it makes more
4 sense to cache them and then only test that the cached values are
5 correct every once in a while. And they're in this separate file
6 because they are visually horrific.
7
8 SageMath's output can be converted back into "input form" using a sed
9 script, for example:
10
11 $ sed -e 's/\^/\*\*/g' -e 's/X\([0-9][0-9]*\)/X\[\1\]/g' <input>
12
13 The simple algebras _not_ represented here all have rank two or less,
14 and are "easy" to compute even over the algebraic reals.
15 """
16
17 def real_symmetric_eja_coeffs(J):
18 X = J.coordinate_polynomial_ring().gens()
19
20 if J.dimension() == 3: # n == 2
21 a0 = -X[1]**2 + X[0]*X[2]
22 a1 = -X[0] - X[2]
23 return (a0,a1)
24
25 elif J.dimension() == 6: # n == 3
26 a0 = ( X[2]*X[3]**2 - 2*X[1]*X[3]*X[4] + X[0]*X[4]**2 +
27 X[1]**2*X[5] - X[0]*X[2]*X[5] )
28 a1 = ( -X[1]**2 + X[0]*X[2] - X[3]**2 - X[4]**2 +
29 X[0]*X[5] + X[2]*X[5] )
30 a2 = -X[0] - X[2] - X[5]
31 return (a0,a1,a2)
32
33 elif J.dimension() == 10: # n == 4
34 a0 = ( X[4]**2*X[6]**2 - X[2]*X[5]*X[6]**2 -
35 2*X[3]*X[4]*X[6]*X[7] + 2*X[1]*X[5]*X[6]*X[7] +
36 X[3]**2*X[7]**2 - X[0]*X[5]*X[7]**2 +
37 2*X[2]*X[3]*X[6]*X[8] - 2*X[1]*X[4]*X[6]*X[8] -
38 2*X[1]*X[3]*X[7]*X[8] + 2*X[0]*X[4]*X[7]*X[8] +
39 X[1]**2*X[8]**2 - X[0]*X[2]*X[8]**2 -
40 X[2]*X[3]**2*X[9] + 2*X[1]*X[3]*X[4]*X[9] -
41 X[0]*X[4]**2*X[9] - X[1]**2*X[5]*X[9] +
42 X[0]*X[2]*X[5]*X[9] )
43
44 a1 = ( X[2]*X[3]**2 - 2*X[1]*X[3]*X[4] + X[0]*X[4]**2 +
45 X[1]**2*X[5] - X[0]*X[2]*X[5] + X[2]*X[6]**2 +
46 X[5]*X[6]**2 - 2*X[1]*X[6]*X[7] + X[0]*X[7]**2 +
47 X[5]*X[7]**2 - 2*X[3]*X[6]*X[8] - 2*X[4]*X[7]*X[8] +
48 X[0]*X[8]**2 + X[2]*X[8]**2 + X[1]**2*X[9] -
49 X[0]*X[2]*X[9] + X[3]**2*X[9] + X[4]**2*X[9] -
50 X[0]*X[5]*X[9] - X[2]*X[5]*X[9] )
51
52 a2 = ( -X[1]**2 + X[0]*X[2] - X[3]**2 - X[4]**2 +
53 X[0]*X[5] + X[2]*X[5] - X[6]**2 - X[7]**2 -
54 X[8]**2 + X[0]*X[9] + X[2]*X[9] + X[5]*X[9] )
55
56 a3 = -X[0] - X[2] - X[5] - X[9]
57
58 return (a0,a1,a2,a3)
59
60 # Don't know them
61 return None
62
63
64 def complex_hermitian_eja_coeffs(J):
65 X = J.coordinate_polynomial_ring().gens()
66
67 if J.dimension() == 4: # n == 2
68 a0 = -X[1]**2 - X[2]**2 + X[0]*X[3]
69 a1 = -X[0] - X[3]
70 return (a0,a1)
71
72 elif J.dimension() == 9: # n == 3
73 a0 = ( X[3]*X[4]**2 + X[3]*X[5]**2 - 2*X[1]*X[4]*X[6] -
74 2*X[2]*X[5]*X[6] + X[0]*X[6]**2 + 2*X[2]*X[4]*X[7] -
75 2*X[1]*X[5]*X[7] + X[0]*X[7]**2 + X[1]**2*X[8] +
76 X[2]**2*X[8] - X[0]*X[3]*X[8] )
77
78 a1 = ( -X[1]**2 - X[2]**2 + X[0]*X[3] - X[4]**2 - X[5]**2 -
79 X[6]**2 - X[7]**2 + X[0]*X[8] + X[3]*X[8] )
80
81 a2 = -X[0] - X[3] - X[8]
82
83 return (a0,a1,a2)
84
85 elif J.dimension() == 16: # n == 4
86 a0 = ( X[6]**2*X[9]**2 + X[7]**2*X[9]**2 - X[3]*X[8]*X[9]**2 +
87 X[6]**2*X[10]**2 + X[7]**2*X[10]**2 - X[3]*X[8]*X[10]**2 -
88 2*X[4]*X[6]*X[9]*X[11] - 2*X[5]*X[7]*X[9]*X[11] +
89 2*X[1]*X[8]*X[9]*X[11] - 2*X[5]*X[6]*X[10]*X[11] +
90 2*X[4]*X[7]*X[10]*X[11] + 2*X[2]*X[8]*X[10]*X[11] +
91 X[4]**2*X[11]**2 + X[5]**2*X[11]**2 - X[0]*X[8]*X[11]**2 +
92 2*X[5]*X[6]*X[9]*X[12] - 2*X[4]*X[7]*X[9]*X[12] -
93 2*X[2]*X[8]*X[9]*X[12] - 2*X[4]*X[6]*X[10]*X[12] -
94 2*X[5]*X[7]*X[10]*X[12] + 2*X[1]*X[8]*X[10]*X[12] +
95 X[4]**2*X[12]**2 + X[5]**2*X[12]**2 - X[0]*X[8]*X[12]**2 +
96 2*X[3]*X[4]*X[9]*X[13] - 2*X[1]*X[6]*X[9]*X[13] +
97 2*X[2]*X[7]*X[9]*X[13] + 2*X[3]*X[5]*X[10]*X[13] -
98 2*X[2]*X[6]*X[10]*X[13] - 2*X[1]*X[7]*X[10]*X[13] -
99 2*X[1]*X[4]*X[11]*X[13] - 2*X[2]*X[5]*X[11]*X[13] +
100 2*X[0]*X[6]*X[11]*X[13] + 2*X[2]*X[4]*X[12]*X[13] -
101 2*X[1]*X[5]*X[12]*X[13] + 2*X[0]*X[7]*X[12]*X[13] +
102 X[1]**2*X[13]**2 + X[2]**2*X[13]**2 - X[0]*X[3]*X[13]**2 -
103 2*X[3]*X[5]*X[9]*X[14] + 2*X[2]*X[6]*X[9]*X[14] +
104 2*X[1]*X[7]*X[9]*X[14] + 2*X[3]*X[4]*X[10]*X[14] -
105 2*X[1]*X[6]*X[10]*X[14] + 2*X[2]*X[7]*X[10]*X[14] -
106 2*X[2]*X[4]*X[11]*X[14] + 2*X[1]*X[5]*X[11]*X[14] -
107 2*X[0]*X[7]*X[11]*X[14] - 2*X[1]*X[4]*X[12]*X[14] -
108 2*X[2]*X[5]*X[12]*X[14] + 2*X[0]*X[6]*X[12]*X[14] +
109 X[1]**2*X[14]**2 + X[2]**2*X[14]**2 - X[0]*X[3]*X[14]**2 -
110 X[3]*X[4]**2*X[15] - X[3]*X[5]**2*X[15] +
111 2*X[1]*X[4]*X[6]*X[15] + 2*X[2]*X[5]*X[6]*X[15] -
112 X[0]*X[6]**2*X[15] - 2*X[2]*X[4]*X[7]*X[15] +
113 2*X[1]*X[5]*X[7]*X[15] - X[0]*X[7]**2*X[15] -
114 X[1]**2*X[8]*X[15] - X[2]**2*X[8]*X[15] +
115 X[0]*X[3]*X[8]*X[15] )
116
117 a1 = ( X[3]*X[4]**2 + X[3]*X[5]**2 - 2*X[1]*X[4]*X[6] -
118 2*X[2]*X[5]*X[6] + X[0]*X[6]**2 + 2*X[2]*X[4]*X[7] -
119 2*X[1]*X[5]*X[7] + X[0]*X[7]**2 + X[1]**2*X[8] +
120 X[2]**2*X[8] - X[0]*X[3]*X[8] + X[3]*X[9]**2 +
121 X[8]*X[9]**2 + X[3]*X[10]**2 + X[8]*X[10]**2 -
122 2*X[1]*X[9]*X[11] - 2*X[2]*X[10]*X[11] + X[0]*X[11]**2 +
123 X[8]*X[11]**2 + 2*X[2]*X[9]*X[12] - 2*X[1]*X[10]*X[12] +
124 X[0]*X[12]**2 + X[8]*X[12]**2 - 2*X[4]*X[9]*X[13] -
125 2*X[5]*X[10]*X[13] - 2*X[6]*X[11]*X[13] -
126 2*X[7]*X[12]*X[13] + X[0]*X[13]**2 + X[3]*X[13]**2 +
127 2*X[5]*X[9]*X[14] - 2*X[4]*X[10]*X[14] +
128 2*X[7]*X[11]*X[14] - 2*X[6]*X[12]*X[14] + X[0]*X[14]**2 +
129 X[3]*X[14]**2 + X[1]**2*X[15] + X[2]**2*X[15] -
130 X[0]*X[3]*X[15] + X[4]**2*X[15] + X[5]**2*X[15] +
131 X[6]**2*X[15] + X[7]**2*X[15] - X[0]*X[8]*X[15] -
132 X[3]*X[8]*X[15] )
133
134 a2 = ( -X[1]**2 - X[2]**2 + X[0]*X[3] - X[4]**2 - X[5]**2 -
135 X[6]**2 - X[7]**2 + X[0]*X[8] + X[3]*X[8] - X[9]**2 -
136 X[10]**2 - X[11]**2 - X[12]**2 - X[13]**2 - X[14]**2 +
137 X[0]*X[15] + X[3]*X[15] + X[8]*X[15] )
138
139 a3 = -X[0] - X[3] - X[8] - X[15]
140
141 return (a0,a1,a2,a3)
142
143 # Don't know them
144 return None
145
146
147 def quaternion_hermitian_eja_coeffs(J):
148 X = J.coordinate_polynomial_ring().gens()
149
150 if J.dimension() == 6: # n == 2
151 a0 = -X[1]**2 - X[2]**2 - X[3]**2 - X[4]**2 + X[0]*X[5]
152 a1 = -X[0] - X[5]
153 return (a0,a1)
154
155 elif J.dimension() == 15: # n == 3
156 a0 = ( X[5]*X[6]**2 + X[5]*X[7]**2 + X[5]*X[8]**2 + X[5]*X[9]**2 -
157 2*X[1]*X[6]*X[10] - 2*X[2]*X[7]*X[10] - 2*X[3]*X[8]*X[10] -
158 2*X[4]*X[9]*X[10] + X[0]*X[10]**2 + 2*X[2]*X[6]*X[11] -
159 2*X[1]*X[7]*X[11] + 2*X[4]*X[8]*X[11] - 2*X[3]*X[9]*X[11] +
160 X[0]*X[11]**2 + 2*X[3]*X[6]*X[12] - 2*X[4]*X[7]*X[12] -
161 2*X[1]*X[8]*X[12] + 2*X[2]*X[9]*X[12] + X[0]*X[12]**2 +
162 2*X[4]*X[6]*X[13] + 2*X[3]*X[7]*X[13] - 2*X[2]*X[8]*X[13] -
163 2*X[1]*X[9]*X[13] + X[0]*X[13]**2 + X[1]**2*X[14] +
164 X[2]**2*X[14] + X[3]**2*X[14] + X[4]**2*X[14] -
165 X[0]*X[5]*X[14] )
166 a1 = ( -X[1]**2 - X[2]**2 - X[3]**2 - X[4]**2 + X[0]*X[5] -
167 X[6]**2 - X[7]**2 - X[8]**2 - X[9]**2 - X[10]**2 -
168 X[11]**2 - X[12]**2 - X[13]**2 + X[0]*X[14] + X[5]*X[14] )
169
170 a2 = -X[0] - X[5] - X[14]
171
172 return (a0,a1,a2)
173
174 # Don't know them
175 return None
176
177 def octonion_hermitian_eja_coeffs(J):
178 X = J.coordinate_polynomial_ring().gens()
179
180 if J.dimension() == 10: # n == 2
181 a0 = ( -X[1]**2 - X[2]**2 - X[3]**2 - X[4]**2 - X[5]**2 -
182 X[6]**2 - X[7]**2 - X[8]**2 + X[0]*X[9] )
183 a1 = -X[0] - X[9]
184 return (a0,a1)
185
186 elif J.dimension() == 27: # n == 3
187 a0 = ( X[9]*X[10]**2 + X[9]*X[11]**2 + X[9]*X[12]**2 + X[9]*X[13]**2 +
188 X[9]*X[14]**2 + X[9]*X[15]**2 + X[9]*X[16]**2 + X[9]*X[17]**2 -
189 2*X[1]*X[10]*X[18] - 2*X[2]*X[11]*X[18] - 2*X[3]*X[12]*X[18] -
190 2*X[4]*X[13]*X[18] - 2*X[5]*X[14]*X[18] - 2*X[6]*X[15]*X[18] -
191 2*X[7]*X[16]*X[18] - 2*X[8]*X[17]*X[18] + X[0]*X[18]**2 +
192 2*X[2]*X[10]*X[19] - 2*X[1]*X[11]*X[19] + 2*X[4]*X[12]*X[19] -
193 2*X[3]*X[13]*X[19] + 2*X[6]*X[14]*X[19] - 2*X[5]*X[15]*X[19] -
194 2*X[8]*X[16]*X[19] + 2*X[7]*X[17]*X[19] + X[0]*X[19]**2 +
195 2*X[3]*X[10]*X[20] - 2*X[4]*X[11]*X[20] - 2*X[1]*X[12]*X[20] +
196 2*X[2]*X[13]*X[20] + 2*X[7]*X[14]*X[20] + 2*X[8]*X[15]*X[20] -
197 2*X[5]*X[16]*X[20] - 2*X[6]*X[17]*X[20] + X[0]*X[20]**2 +
198 2*X[4]*X[10]*X[21] + 2*X[3]*X[11]*X[21] - 2*X[2]*X[12]*X[21] -
199 2*X[1]*X[13]*X[21] + 2*X[8]*X[14]*X[21] - 2*X[7]*X[15]*X[21] +
200 2*X[6]*X[16]*X[21] - 2*X[5]*X[17]*X[21] + X[0]*X[21]**2 +
201 2*X[5]*X[10]*X[22] - 2*X[6]*X[11]*X[22] - 2*X[7]*X[12]*X[22] -
202 2*X[8]*X[13]*X[22] - 2*X[1]*X[14]*X[22] + 2*X[2]*X[15]*X[22] +
203 2*X[3]*X[16]*X[22] + 2*X[4]*X[17]*X[22] + X[0]*X[22]**2 +
204 2*X[6]*X[10]*X[23] + 2*X[5]*X[11]*X[23] - 2*X[8]*X[12]*X[23] +
205 2*X[7]*X[13]*X[23] - 2*X[2]*X[14]*X[23] - 2*X[1]*X[15]*X[23] -
206 2*X[4]*X[16]*X[23] + 2*X[3]*X[17]*X[23] + X[0]*X[23]**2 +
207 2*X[7]*X[10]*X[24] + 2*X[8]*X[11]*X[24] + 2*X[5]*X[12]*X[24] -
208 2*X[6]*X[13]*X[24] - 2*X[3]*X[14]*X[24] + 2*X[4]*X[15]*X[24] -
209 2*X[1]*X[16]*X[24] - 2*X[2]*X[17]*X[24] + X[0]*X[24]**2 +
210 2*X[8]*X[10]*X[25] - 2*X[7]*X[11]*X[25] + 2*X[6]*X[12]*X[25] +
211 2*X[5]*X[13]*X[25] - 2*X[4]*X[14]*X[25] - 2*X[3]*X[15]*X[25] +
212 2*X[2]*X[16]*X[25] - 2*X[1]*X[17]*X[25] + X[0]*X[25]**2 +
213 X[1]**2*X[26] + X[2]**2*X[26] + X[3]**2*X[26] + X[4]**2*X[26] +
214 X[5]**2*X[26] + X[6]**2*X[26] + X[7]**2*X[26] + X[8]**2*X[26] -
215 X[0]*X[9]*X[26] )
216
217 a1 = ( -X[1]**2 - X[2]**2 - X[3]**2 - X[4]**2 - X[5]**2 - X[6]**2 -
218 X[7]**2 - X[8]**2 + X[0]*X[9] - X[10]**2 - X[11]**2 -
219 X[12]**2 - X[13]**2 - X[14]**2 - X[15]**2 - X[16]**2 -
220 X[17]**2 - X[18]**2 - X[19]**2 - X[20]**2 - X[21]**2 -
221 X[22]**2 - X[23]**2 - X[24]**2 - X[25]**2 + X[0]*X[26] +
222 X[9]*X[26] )
223
224 a2 = -X[0] - X[9] - X[26]
225
226 return (a0,a1,a2)
227
228 # Don't know them
229 return None