21 /* This is an i, representing some s_i. i starts at 1. */
22 type weyl_reflection = int
23 impl disposable weyl_reflection[:]
24 impl disposable (weyl_reflection, weyl_reflection)[:]
27 There's some sort of dependence on ⟨ σ_G ⟩ in the formula.
28 This is either trivial or Z/2Z. Since I suspect there may be
29 a more elegant (if more complicated) description of the
30 property later, describe this with an opaque object.
32 type Dynkin_automorphism_class = union
33 `trivial_class_for_trivial_sigmaG
34 `trivial_class_for_nontrivial_sigmaG
35 `nontrivial_class_for_nontrivial_sigmaG
37 impl disposable Dynkin_automorphism_class
40 A vector, with entries the coefficients of e_{i-1}; so e_1 is
41 given by c = [ 1, 0, 0, ..., 0][:]
43 Roots are special vectors (so vectors), coroots are vectors
44 in a dual space that have special relations to roots (so are
45 also vectors), and fundamental weights are integral
46 combinations of simple roots (also vectors).
51 impl disposable vector#
52 impl disposable vector#[:]
53 impl t.dupable vector#
56 A chamber weight is q word (a sequence of weyl reflections)
57 and a fundamental weight. We represent the fundamental weight
58 only by its index, ditto for the weyl reflections. The
59 indices are 1-based: e.g. "s_2 s_1 s_2 ω_2" makes sense for
62 The words are not inverted. No reduction is performed. These
63 are all equivalent to some γ_k, but we don't proactively find
66 type chamber_weight = struct
67 word : weyl_reflection[:]
72 Factorization coordinates for elements that admit a Gaussian
73 decomposition. `H (i, v) are generators of the maximal torus
74 / Cartan subgroup, `X (i, v) are generators of the maximal
75 unipotent subgroup, and `Y (i, v) are generators of the
76 opposite unipotent subgroup.
78 i is the index for the generator (1-based), and v is the
81 Certainly any element in the maximal torus can be described
82 by r `H (i, v)s, one each for i = 1, 2, ..., r. The promise
83 of factorization coordinates is that any representation of
84 w_0, the maximal word in the Weyl group, as { i1, ..., in },
85 the maximal unipotent subgroup can be described by
86 coordinates `X (ij, v). That is, any g in N can be written as
88 g = `X(i1, v1) `X(i2, v2) ... `X(in, vn)
90 Actually finding those may be difficult, however.
92 /* This has to be in this file, for some reason */
93 impl disposable yakmo.ratfunc#[:]
94 impl disposable yakmo.ratfunc#[:][:]
97 See below: factorization `H(j, rf) does not (necessarily)
98 correspond to minor [ .k = j, rf ]. Rather,
100 `H(coxeter[j], rf) =~= [ .k = j, rf ]
102 type factorization_coordinate = union
103 `H (weyl_reflection, yakmo.ratfunc#)
104 `X (weyl_reflection, yakmo.ratfunc#)
105 `Y (weyl_reflection, yakmo.ratfunc#)
107 impl disposable factorization_coordinate
108 impl disposable factorization_coordinate[:]
109 impl t.dupable factorization_coordinate
112 k is the index of which simple root c is associated to, based
113 on the ordering given by the Coxeter element. That means that
114 minor_coordinates' k and factorization_coordinates' indices
117 type minor_coordinate = struct
121 impl disposable minor_coordinate
122 impl disposable minor_coordinate[:]
123 impl t.dupable minor_coordinate
126 This is the decomposition, with
132 (N, wo h1 N, u wo h1 wo^-1 h2 wo^2 N)
134 such that [ wo^-1 u ]_{0} = (wo h3 h1 wo^-1 h2)^-1.
136 The ordering should be by the Coxeter element: we should have
137 h1[k] = χ_{ω_{i_k}}(h1); u[k] = χ_{ω_{i_k}}([w_k^-1 u]_0).
138 This is 1-based, so to actually apply the coxeter element
139 you'll need to use c[foo.k - 1].
141 Also, u[k] should be Δ^{γ_k}(u). This means k should ALWAYS
144 type conf_3_star = struct
145 h1 : minor_coordinate[:]
146 h2 : minor_coordinate[:]
147 h3 : minor_coordinate[:]
148 u : minor_coordinate[:]
150 impl disposable conf_3_star#
153 Canonical form of α = (g₀N, g₁N, g₂N, g₃N) as
155 (N, w₀(h₀₂) w₀(h₁₂)⁻¹ u⁻¹ N, w₀ h₀₂ N, Φ⁻¹(v) w₀ h₀₃ N)
157 The ordering should be by the Coxeter element, as in conf_3_star
159 This construction is biased towards psi_02: u is the element
160 of N_{-} used in the 012 part, and v in the 023 part (there
161 may be some rotations involved).
163 type conf_4_star = struct
164 h01 : minor_coordinate[:]
165 h12 : minor_coordinate[:]
166 h02 : minor_coordinate[:]
167 h23 : minor_coordinate[:]
168 h03 : minor_coordinate[:]
169 u : minor_coordinate[:]
170 v : minor_coordinate[:]
174 The indices into T_Q are by simple reflections.
176 A[2] = A-coordinate of vertex "A2"
180 v[2][4] = A-coordinate of vertex "v2;4"
182 v[0][1], v[0][2], and so on are all dummy
184 v[1][0], v[2][0], and so on are all dummy
187 A : yakmo.ratfunc#[:]
188 B : yakmo.ratfunc#[:]
189 C : yakmo.ratfunc#[:]
190 v : yakmo.ratfunc#[:][:]
197 Just two copies of T_Q, and we make sure that they agree on
201 D : yakmo.ratfunc#[:]
202 E : yakmo.ratfunc#[:]
203 F : yakmo.ratfunc#[:]
204 G : yakmo.ratfunc#[:]
205 w : yakmo.ratfunc#[:][:]
209 Exactly the same as TQ02, but called something different for
213 D : yakmo.ratfunc#[:]
214 E : yakmo.ratfunc#[:]
215 F : yakmo.ratfunc#[:]
216 G : yakmo.ratfunc#[:]
217 w : yakmo.ratfunc#[:][:]
222 var fc : factorization_coordinate
224 std.fmtinstall(std.typeof(fc), factorization_coordinatefmt)
227 const factorization_coordinatefmt = {sb, ap, opts
228 var fc = std.vanext(ap)
230 | `X(i, rf): std.sbfmt(sb, "X({}, {})", i, rf)
231 | `Y(i, rf): std.sbfmt(sb, "Y({}, {})", i, rf)
232 | `H(i, rf): std.sbfmt(sb, "H({}, {})", i, rf)
236 impl disposable weyl_reflection[:] =
237 __dispose__ = {x; std.slfree(x)}
240 impl disposable (weyl_reflection, weyl_reflection)[:] =
241 __dispose__ = {x; std.slfree(x)}
244 impl disposable Dynkin_automorphism_class =
248 impl disposable vector# =
250 /* TODO: use t should make v.c __dispose__able, no? */
251 for var j = 0; j < v.c.len; ++j
256 std.bytefree( (v : byte#), sizeof(vector))
260 impl disposable vector#[:] =
269 impl t.dupable vector# =
271 var cdup = std.slalloc(v.c.len)
272 for var j = 0; j < v.c.len; ++j
273 cdup[j] = t.dup(v.c[j])
275 var vbase = [ .c = cdup ]
280 impl disposable yakmo.ratfunc#[:] =
283 /* Dumb type workaround */
284 var xrf = (x : yakmo.ratfunc#)
291 impl disposable yakmo.ratfunc#[:][:] =
294 __dispose__((x : yakmo.ratfunc#[:]))
300 impl disposable factorization_coordinate =
303 | `X (_, l): __dispose__(l)
304 | `Y (_, l): __dispose__(l)
305 | `H (_, l): __dispose__(l)
310 impl disposable factorization_coordinate[:] =
319 impl t.dupable factorization_coordinate =
322 | `H(i, z): -> `H(i, t.dup(z))
323 | `X(i, z): -> `X(i, t.dup(z))
324 | `Y(i, z): -> `Y(i, t.dup(z))
329 impl disposable minor_coordinate =
335 impl disposable minor_coordinate[:] =
344 impl t.dupable minor_coordinate =
346 -> [ .k = x.k, .c = t.dup(x.c) ]
350 impl disposable conf_3_star# =
352 __dispose__(alpha.h1)
353 __dispose__(alpha.h2)
354 __dispose__(alpha.h3)
360 impl disposable T_Q =
369 impl disposable T_Q# =
376 impl t.dupable T_Q# =
379 .A = std.slalloc(x.A.len),
380 .B = std.slalloc(x.B.len),
381 .C = std.slalloc(x.C.len),
382 .v = std.slalloc(x.v.len),
384 for var j = 0; j < x.A.len; ++j
385 xdup.A[j] = t.dup(x.A[j])
387 for var j = 0; j < x.B.len; ++j
388 xdup.B[j] = t.dup(x.B[j])
390 for var j = 0; j < x.C.len; ++j
391 xdup.C[j] = t.dup(x.C[j])
393 for var j = 0; j < x.v.len; ++j
394 xdup.v[j] = std.slalloc(x.v[j].len)
395 for var k = 0; k < xdup.v[j].len; ++k
396 xdup.v[j][k] = t.dup(x.v[j][k])