Orbiter 2022
Combinatorial Objects
stabilizer_chain_base_data.cpp
Go to the documentation of this file.
1/*
2 * stabilizer_chain_base_data.cpp
3 *
4 * Created on: May 26, 2019
5 * Author: betten
6 */
7
8
9
11#include "group_actions.h"
12
13
14using namespace std;
15
16
17namespace orbiter {
18namespace layer3_group_actions {
19namespace actions {
20
21
22
24{
25 A = NULL;
26 f_has_base = FALSE;
27 base_len = 0;
28 base = NULL;
29 transversal_length = NULL;
30 orbit = NULL;
31 orbit_inv = NULL;
32 path = NULL;
33}
34
36{
38}
39
41{
42 int i;
43 int f_v = FALSE;
44
45 if (f_v) {
46 cout << "stabilizer_chain_base_data::free_base_data" << endl;
47 }
48 if (base) {
49 FREE_lint(base);
50 base = NULL;
51 }
52 if (transversal_length) {
53 FREE_int(transversal_length);
54 transversal_length = NULL;
55 }
56 if (orbit) {
57 if (f_v) {
58 cout << "stabilizer_chain_base_data::free_base_data "
59 "freeing " << base_len << " orbits" << endl;
60 }
61 for (i = 0; i < base_len; i++) {
62 if (f_v) {
63 cout << "deleting orbit " << i << endl;
64 }
65 FREE_lint(orbit[i]);
66 orbit[i] = NULL;
67 if (f_v) {
68 cout << "deleting orbit_inv " << i << endl;
69 }
70 FREE_lint(orbit_inv[i]);
71 orbit_inv[i] = NULL;
72 }
73 FREE_plint(orbit);
74 orbit = NULL;
75 FREE_plint(orbit_inv);
76 orbit_inv = NULL;
77 }
78 if (path) {
79 FREE_int(path);
80 path = NULL;
81 }
82 f_has_base = FALSE;
83 if (f_v) {
84 cout << "stabilizer_chain_base_data::free_base_data finished" << endl;
85 }
86}
87
88
90 int base_len, int verbose_level)
91{
92 int f_v = (verbose_level >= 1);
93 int i, j;
94
95 if (f_v) {
96 cout << "stabilizer_chain_base_data::allocate_base_data "
97 "base_len=" << base_len << " degree=" << A->degree << endl;
98 }
99 if (f_has_base) {
101 }
102 f_has_base = TRUE;
103
104 stabilizer_chain_base_data::A = A;
105 stabilizer_chain_base_data::base_len = base_len;
106 base = NEW_lint(base_len);
107 transversal_length = NEW_int(base_len);
108 path = NEW_int(base_len);
109
111 orbit = NEW_plint(base_len);
112 orbit_inv = NEW_plint(base_len);
113 for (i = 0; i < base_len; i++) {
114 orbit[i] = NEW_lint(A->degree);
115 orbit_inv[i] = NEW_lint(A->degree);
116 for (j = 0; j < A->degree; j++) {
117 orbit[i][j] = -1;
118 orbit_inv[i][j] = -1;
119 }
120 }
121 }
122 else {
123 cout << "stabilizer_chain_base_data::allocate_base_data degree is too large" << endl;
124 orbit = NULL;
125 orbit_inv = NULL;
126 }
127 if (f_v) {
128 cout << "stabilizer_chain_base_data::allocate_base_data done" << endl;
129 }
130}
131
133{
134
136 int i, j;
137 long int *old_base;
138 int *old_transversal_length;
139 long int **old_orbit;
140 long int **old_orbit_inv;
141 int *old_path;
142 old_base = base;
143 old_transversal_length = transversal_length;
144 old_orbit = orbit;
145 old_orbit_inv = orbit_inv;
146 old_path = path;
147
148 base = NEW_lint(base_len + 1);
149 transversal_length = NEW_int(base_len + 1);
150 orbit = NEW_plint(base_len + 1);
151 orbit_inv = NEW_plint(base_len + 1);
152 path = NEW_int(base_len + 1);
153 orbit[base_len] = NEW_lint(A->degree);
154 orbit_inv[base_len] = NEW_lint(A->degree);
155 for (i = 0; i < base_len; i++) {
156 base[i] = old_base[i];
157 transversal_length[i] = old_transversal_length[i];
158 orbit[i] = old_orbit[i];
159 orbit_inv[i] = old_orbit_inv[i];
160 path[i] = old_path[i];
161 }
162 base[base_len] = new_base_point;
163 transversal_length[base_len] = 1;
164 for (j = 0; j < A->degree; j++) {
165 orbit[base_len][j] = -1;
166 orbit_inv[base_len][j] = -1;
167 }
168 base_len++;
169 if (old_base)
170 FREE_lint(old_base);
171 if (old_transversal_length)
172 FREE_int(old_transversal_length);
173 if (old_orbit)
174 FREE_plint(old_orbit);
175 if (old_orbit_inv)
176 FREE_plint(old_orbit_inv);
177 if (old_path)
178 FREE_int(old_path);
179 }
180 else {
181 cout << "stabilizer_chain_base_data::reallocate_base degree is too large" << endl;
182 }
183}
184
186{
187 int f_v = (verbose_level >= 1);
188
189 if (f_v) {
190 cout << "stabilizer_chain_base_data::init_base_from_sims, "
191 "base length " << base_len << endl;
192 //G->print(TRUE);
193 }
195 int i, j, k, l;
196
197 for (i = 0; i < base_len; i++) {
198 k = G->get_orbit_length(i);
199 transversal_length[i] = k;
200 }
201 for (i = 0; i < base_len; i++) {
202 //cout << "i = " << i << " base[i]="
203 // << base[i] << " tl[i]=" << tl[i] << endl;
204 //base[i] = bi = base[i];
205 //transversal_length[i] = tl[i];
206 //cout << "a" << endl;
207 for (j = 0; j < A->degree; j++) {
208 orbit[i][j] = -1;
209 orbit_inv[i][j] = -1;
210 }
211 k = transversal_length[i];
212 //cout << "b: bi=" << bi << " k=" << k << endl;
213 for (j = 0; j < k; j++) {
214 //cout << "j" << j << endl;
215 //cout << G->orbit[i][j] << " " << endl;
216 orbit[i][j] = l = G->get_orbit(i, j);
217 orbit_inv[i][l] = j;
218 }
219 //cout << endl;
220 //cout << "c" << endl;
221 for (j = 0; j < A->degree; j++) {
222 if (orbit_inv[i][j] == -1) {
223 //cout << "adding " << j << " : k=" << k << endl;
224 orbit[i][k] = j;
225 orbit_inv[i][j] = k;
226 k++;
227 }
228 }
229 if (k != A->degree) {
230 cout << "k != degree" << endl;
231 cout << "transversal " << i << " k = " << k << endl;
232 exit(1);
233 }
234
235 }
236 }
237 else {
238 cout << "stabilizer_chain_base_data::init_base_from_sims degree is too large" << endl;
239 }
240 if (f_v) {
241 cout << "stabilizer_chain_base_data::init_base_from_sims done" << endl;
242 }
243}
244
246{
247 return f_has_base;
248}
249
251{
252 return base_len;
253}
254
256{
257 return base[i];
258}
259
261{
262 return base;
263}
264
266{
267 return transversal_length[i];
268}
269
271{
272 return transversal_length;
273}
274
276{
278 return orbit[i][j];
279 }
280 else {
281 cout << "stabilizer_chain_base_data::orbit_ij degree is too large" << endl;
282 exit(1);
283 }
284}
285
287{
289 return orbit_inv[i][j];
290 }
291 else {
292 cout << "stabilizer_chain_base_data::orbit_inv_ij degree is too large" << endl;
293 exit(1);
294 }
295}
296
298{
299 return path[i];
300}
301
303{
305
306 D.multiply_up(go, transversal_length, base_len, 0 /* verbose_level */);
307}
308
310 field_theory::finite_field *F, int n, int f_semilinear, int degree,
311 int verbose_level)
312{
313 int f_v = (verbose_level >= 1);
314
315 if (f_v) {
316 cout << "stabilizer_chain_base_data::init_projective_matrix_group" << endl;
317 }
319
321
322
324 f_semilinear,
325 base_len, degree,
326 base, transversal_length,
327 orbit, orbit_inv,
328 verbose_level - 1);
329 }
330 else {
331 cout << "stabilizer_chain_base_data::init_projective_matrix_group degree is too large" << endl;
332 exit(1);
333 }
334 if (f_v) {
335 cout << "stabilizer_chain_base_data::init_projective_matrix_group done" << endl;
336 }
337}
338
340 field_theory::finite_field *F, int n, int f_semilinear, int degree,
341 int verbose_level)
342{
343 int f_v = (verbose_level >= 1);
344
345 if (f_v) {
346 cout << "stabilizer_chain_base_data::init_affine_matrix_group" << endl;
347 }
349
351
353 f_semilinear,
354 base_len, degree,
355 base, transversal_length,
356 verbose_level - 1);
357
358 //no orbit, orbit_inv
359 }
360 else {
361 cout << "stabilizer_chain_base_data::init_affine_matrix_group degree is too large" << endl;
362 exit(1);
363 }
364
365 if (f_v) {
366 cout << "stabilizer_chain_base_data::init_affine_matrix_group done" << endl;
367 }
368}
369
371 field_theory::finite_field *F, int n, int f_semilinear, int degree,
372 int verbose_level)
373{
374 int f_v = (verbose_level >= 1);
375
376 if (f_v) {
377 cout << "stabilizer_chain_base_data::init_linear_matrix_group" << endl;
378 }
380
382
384 f_semilinear,
385 base_len, degree,
386 base, transversal_length,
387 verbose_level - 1);
388
389 //no orbit, orbit_inv
390 }
391 else {
392 cout << "stabilizer_chain_base_data::init_linear_matrix_group degree is too large" << endl;
393 exit(1);
394 }
395
396
397 if (f_v) {
398 cout << "stabilizer_chain_base_data::init_linear_matrix_group done" << endl;
399 }
400}
401
402
403}}}
404
405
#define STABILIZER_CHAIN_DATA_MAX_DEGREE
Definition: actions.h:1208
generators for various classes of groups
Definition: algebra.h:286
void general_linear_matrix_group_base_and_transversal_length(int n, field_theory::finite_field *F, int f_semilinear, int base_len, int degree, long int *base, int *transversal_length, int verbose_level)
void projective_matrix_group_base_and_orbits(int n, field_theory::finite_field *F, int f_semilinear, int base_len, int degree, long int *base, int *transversal_length, long int **orbit, long int **orbit_inv, int verbose_level)
void affine_matrix_group_base_and_transversal_length(int n, field_theory::finite_field *F, int f_semilinear, int base_len, int degree, long int *base, int *transversal_length, int verbose_level)
domain to compute with objects of type longinteger
Definition: ring_theory.h:240
void multiply_up(longinteger_object &a, int *x, int len, int verbose_level)
a class to represent arbitrary precision integers
Definition: ring_theory.h:366
a permutation group in a fixed action.
Definition: actions.h:99
void init_affine_matrix_group(field_theory::finite_field *F, int n, int f_semilinear, int degree, int verbose_level)
void init_linear_matrix_group(field_theory::finite_field *F, int n, int f_semilinear, int degree, int verbose_level)
void init_projective_matrix_group(field_theory::finite_field *F, int n, int f_semilinear, int degree, int verbose_level)
a permutation group represented via a stabilizer chain
Definition: groups.h:1273
#define NEW_plint(n)
Definition: foundations.h:629
#define FREE_int(p)
Definition: foundations.h:640
#define FREE_plint(p)
Definition: foundations.h:643
#define NEW_int(n)
Definition: foundations.h:625
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define FREE_lint(p)
Definition: foundations.h:642
#define NEW_lint(n)
Definition: foundations.h:628
the orbiter library for the classification of combinatorial objects