Orbiter 2022
Combinatorial Objects
interface_perm_group.cpp
Go to the documentation of this file.
1// interface_perm_group.cpp
2//
3// Anton Betten
4//
5// started: November 13, 2007
6// last change: November 9, 2010
7// moved here from interface.cpp: January 30, 2014
8
9
10
11
13#include "group_actions.h"
14
15
16using namespace std;
17
18
19namespace orbiter {
20namespace layer3_group_actions {
21namespace actions {
22
23
24// #############################################################################
25// interface functions: permutation group
26// #############################################################################
27
28
29static long int perm_group_element_image_of(action &A, long int a,
30 void *elt, int verbose_level);
31static void perm_group_element_one(action &A,
32 void *elt, int verbose_level);
33static int perm_group_element_is_one(action &A,
34 void *elt, int verbose_level);
35static void perm_group_element_unpack(action &A,
36 void *elt, void *Elt, int verbose_level);
37static void perm_group_element_pack(action &A,
38 void *Elt, void *elt, int verbose_level);
39static void perm_group_element_retrieve(action &A,
40 int hdl, void *elt, int verbose_level);
41static int perm_group_element_store(action &A,
42 void *elt, int verbose_level);
43static void perm_group_element_mult(action &A,
44 void *a, void *b, void *ab, int verbose_level);
45static void perm_group_element_invert(action &A,
46 void *a, void *av, int verbose_level);
47static void perm_group_element_move(action &A,
48 void *a, void *b, int verbose_level);
49static void perm_group_element_dispose(action &A,
50 int hdl, int verbose_level);
51static void perm_group_element_print(action &A,
52 void *elt, std::ostream &ost);
53static void perm_group_element_print_latex(action &A,
54 void *elt, std::ostream &ost);
55static void perm_group_element_print_latex_with_print_point_function(
56 action &A,
57 void *elt, std::ostream &ost,
58 void (*point_label)(std::stringstream &sstr, long int pt, void *data),
59 void *point_label_data);
60static void perm_group_element_print_verbose(action &A,
61 void *elt, std::ostream &ost);
62static void perm_group_element_code_for_make_element(action &A,
63 void *elt, int *data);
64static void perm_group_element_print_for_make_element(action &A,
65 void *elt, std::ostream &ost);
66static void perm_group_element_print_for_make_element_no_commas(
67 action &A, void *elt, std::ostream &ost);
68static void perm_group_print_point(action &A, long int a, std::ostream &ost);
69
70
72{
73 label.assign("function_pointers_permutation_group");
74 ptr_element_image_of = perm_group_element_image_of;
78 ptr_element_one = perm_group_element_one;
79 ptr_element_is_one = perm_group_element_is_one;
80 ptr_element_unpack = perm_group_element_unpack;
81 ptr_element_pack = perm_group_element_pack;
82 ptr_element_retrieve = perm_group_element_retrieve;
83 ptr_element_store = perm_group_element_store;
84 ptr_element_mult = perm_group_element_mult;
85 ptr_element_invert = perm_group_element_invert;
87 ptr_element_move = perm_group_element_move;
88 ptr_element_dispose = perm_group_element_dispose;
89 ptr_element_print = perm_group_element_print;
90 ptr_element_print_quick = perm_group_element_print; // no quick version here!
91 ptr_element_print_latex = perm_group_element_print_latex;
93 perm_group_element_print_latex_with_print_point_function;
94 ptr_element_print_verbose = perm_group_element_print_verbose;
96 perm_group_element_code_for_make_element;
98 perm_group_element_print_for_make_element;
100 perm_group_element_print_for_make_element_no_commas;
101 ptr_print_point = perm_group_print_point;
102}
103
104static long int perm_group_element_image_of(action &A,
105 long int a, void *elt, int verbose_level)
106{
107 int f_v = (verbose_level >= 1);
109 int *Elt = (int *) elt;
110 long int b;
111
112 if (f_v) {
113 cout << "perm_group_element_image_of "
114 "image of " << a;
115 }
116 if (G.f_product_action) {
117 if (a < G.offset) {
118 b = Elt[a];
119 }
120 else {
121 int /*x,*/ y, xx, yy;
122
123 a -= G.offset;
124 //x = a / G.n;
125 y = a % G.n;
126 xx = Elt[a];
127 yy = Elt[G.m + y] - G.m;
128 b = xx * G.n + yy + G.offset;
129 }
130 }
131 else {
132 b = Elt[a];
133 }
134 if (f_v) {
135 cout << " is " << b << endl;
136 }
137 return b;
138}
139
140static void perm_group_element_one(action &A,
141 void *elt, int verbose_level)
142{
143 int f_v = (verbose_level >= 1);
144 groups::permutation_representation_domain &G = *A.G.perm_grp;
145 int *Elt = (int *) elt;
146
147 if (f_v) {
148 cout << "perm_group_element_one ";
149 }
150 G.one(Elt);
151}
152
153static int perm_group_element_is_one(action &A, void *elt, int verbose_level)
154{
155 int f_v = (verbose_level >= 1);
156 groups::permutation_representation_domain &G = *A.G.perm_grp;
157 int *Elt = (int *) elt;
158 int f_is_one;
159
160 if (f_v) {
161 cout << "perm_group_element_is_one ";
162 }
163 f_is_one = G.is_one(Elt);
164 if (f_v) {
165 if (f_is_one)
166 cout << " YES" << endl;
167 else
168 cout << " NO" << endl;
169 }
170 return f_is_one;
171}
172
173static void perm_group_element_unpack(action &A,
174 void *elt, void *Elt, int verbose_level)
175{
176 int f_v = (verbose_level >= 1);
177 groups::permutation_representation_domain &G = *A.G.perm_grp;
178 int *Elt1 = (int *) Elt;
179 uchar *elt1 = (uchar *)elt;
180
181 if (f_v) {
182 cout << "perm_group_element_unpack" << endl;
183 }
184 G.unpack(elt1, Elt1);
185}
186
187static void perm_group_element_pack(action &A,
188 void *Elt, void *elt, int verbose_level)
189{
190 int f_v = (verbose_level >= 1);
191 groups::permutation_representation_domain &G = *A.G.perm_grp;
192 int *Elt1 = (int *) Elt;
193 uchar *elt1 = (uchar *)elt;
194
195 if (f_v) {
196 cout << "perm_group_element_pack" << endl;
197 }
198 G.pack(Elt1, elt1);
199}
200
201static void perm_group_element_retrieve(action &A,
202 int hdl, void *elt, int verbose_level)
203{
204 int f_v = (verbose_level >= 1);
205 groups::permutation_representation_domain &G = *A.G.perm_grp;
206 int *Elt = (int *) elt;
207 uchar *p_elt;
208
209 if (f_v) {
210 cout << "perm_group_element_retrieve hdl = " << hdl << endl;
211 }
212
213#if 0
214 if (FALSE /* A.f_group_order_is_small */) {
215 //cout << "Eltrk1=" << G.Eltrk1 << endl;
216 //cout << "Eltrk2=" << G.Eltrk2 << endl;
217 //cout << "Eltrk3=" << G.Eltrk3 << endl;
218 int i, j, ii, l, q, r;
219 int a;
220
221 a = hdl;
222 for (ii = A.base_len - 1; ii >= 0; ii--) {
223 l = A.transversal_length[ii];
224
225 r = a % l;
226 q = a / l;
227 a = q;
228
229 A.path[ii] = r;
230 //cout << r << " ";
231 }
232 //cout << endl;
233 A.element_one(G.Eltrk1, 0);
234 for (i = 0; i < A.base_len; i++) {
235 j = A.path[i];
236
237
238 // pre multiply the coset representative:
239 A.element_mult(A.transversal_reps[i] +
240 j * A.elt_size_in_int, G.Eltrk1, G.Eltrk2, 0);
241 A.element_move(G.Eltrk2, G.Eltrk1, 0);
242 }
243 A.element_move(G.Eltrk1, Elt, 0);
244
245 }
246 else {
247#endif
248 p_elt = G.Elts->s_i(hdl);
249 G.unpack(p_elt, Elt);
250 //}
251 if (f_v) {
252 G.print(Elt, cout);
253 }
254}
255
256static int perm_group_element_store(action &A, void *elt, int verbose_level)
257{
258 int f_v = (verbose_level >= 1);
259 groups::permutation_representation_domain &G = *A.G.perm_grp;
260 int *Elt = (int *) elt;
261 int hdl;
262
263 if (f_v) {
264 cout << "perm_group_element_store()" << endl;
265 }
266#if 0
267 if (FALSE /* A.f_group_order_is_small */) {
268 int i, j, bi, jj, l;
269 int a;
270
271 //cout << "perm_group_element_store" << endl;
272 A.element_move(elt, G.Eltrk1, 0);
273 a = 0;
274 for (i = 0; i < A.base_len; i++) {
275 bi = A.base[i];
276 l = A.transversal_length[i];
277 //cout << "i=" << i << " bi=" << bi
278 //<< " l=" << l << " a=" << a << endl;
279
280 if (i > 0) {
281 a *= l;
282 }
283
284 jj = A.element_image_of(bi, G.Eltrk1, 0);
285 j = A.orbit_inv[i][jj];
286 //cout << "at level " << i << ", maps bi = "
287 //<< bi << " to " << jj << " which is coset " << j << endl;
288 if (j >= l) {
289 cout << "perm_group_element_store() j >= l" << endl;
290 exit(1);
291 }
292 a += j;
293
294 //A.element_print(A.transversal_reps[i] +
295 // j * A.elt_size_in_int, cout);
296 //perm_print_list(cout, A.transversal_reps[i] +
297 // j * A.elt_size_in_int, G.degree);
298
299 G.invert(A.transversal_reps[i] +
300 j * A.elt_size_in_int, G.Eltrk2);
301
302 //cout << "after invert ";
303 //perm_print_list(cout, G.Eltrk2, G.degree);
304 //A.element_print(G.Eltrk2, cout);
305
306 //cout << "Eltrk1=" << G.Eltrk1 << endl;
307 //cout << "Eltrk2=" << G.Eltrk2 << endl;
308 //cout << "Eltrk3=" << G.Eltrk3 << endl;
309 A.element_mult(G.Eltrk1, G.Eltrk2, G.Eltrk3, 0);
310 //cout << "after mult, stripped to ";
311 //perm_print_list(cout, G.Eltrk3, G.degree);
312 //A.element_print(G.Eltrk3, cout);
313
314
315 A.element_move(G.Eltrk3, G.Eltrk1, 0);
316 //cout << "stripped to ";
317 //A.element_print(G.Eltrk1, cout);
318
319 }
320 //cout << endl;
321 hdl = a;
322 }
323 else {
324#endif
325 G.pack(Elt, G.elt1);
326 hdl = G.Elts->store(G.elt1);
327 //}
328 if (f_v) {
329 cout << "hdl = " << hdl << endl;
330 }
331 return hdl;
332}
333
334static void perm_group_element_mult(action &A,
335 void *a, void *b, void *ab, int verbose_level)
336{
337 int f_v = (verbose_level >= 1);
338 groups::permutation_representation_domain &G = *A.G.perm_grp;
339 int *AA = (int *) a;
340 int *BB = (int *) b;
341 int *AB = (int *) ab;
343
344 if (f_v) {
345 cout << "perm_group_element_mult degree=" << G.degree << endl;
346 cout << "A=" << endl;
347 Combi.perm_print_list(cout, AA, G.degree);
348 G.print(AA, cout);
349 cout << "B=" << endl;
350 Combi.perm_print_list(cout, BB, G.degree);
351 G.print(BB, cout);
352 }
353 G.mult(AA, BB, AB);
354 if (f_v) {
355 cout << "degree=" << G.degree << endl;
356 cout << "AB=" << endl;
357 Combi.perm_print_list(cout, AB, G.degree);
358 G.print(AB, cout);
359 }
360}
361
362static void perm_group_element_invert(action &A,
363 void *a, void *av, int verbose_level)
364{
365 int f_v = (verbose_level >= 1);
366 groups::permutation_representation_domain &G = *A.G.perm_grp;
367 int *AA = (int *) a;
368 int *AAv = (int *) av;
369
370 if (f_v) {
371 cout << "perm_group_element_invert" << endl;
372 cout << "A=" << endl;
373 G.print(AA, cout);
374 }
375 G.invert(AA, AAv);
376 if (f_v) {
377 cout << "Av=" << endl;
378 G.print(AAv, cout);
379 }
380}
381
382static void perm_group_element_move(action &A,
383 void *a, void *b, int verbose_level)
384{
385 int f_v = (verbose_level >= 1);
386 groups::permutation_representation_domain &G = *A.G.perm_grp;
387 int *AA = (int *) a;
388 int *BB = (int *) b;
389
390 if (f_v) {
391 cout << "perm_group_element_move" << endl;
392 }
393 G.copy(AA, BB);
394}
395
396static void perm_group_element_dispose(action &A,
397 int hdl, int verbose_level)
398{
399 int f_v = (verbose_level >= 1);
400 groups::permutation_representation_domain &G = *A.G.perm_grp;
401
402 if (f_v) {
403 cout << "perm_group_element_dispose hdl = " << hdl << endl;
404 }
405 if (FALSE /* A.f_group_order_is_small */) {
406 // do nothing
407 }
408 else {
409 G.Elts->dispose(hdl);
410 }
411}
412
413static void perm_group_element_print(action &A,
414 void *elt, ostream &ost)
415{
416 groups::permutation_representation_domain &G = *A.G.perm_grp;
417 int *Elt = (int *) elt;
418
419 //cout << "perm_group_element_print" << endl;
420 G.print(Elt, ost);
421 //ost << endl;
422 //cout << "perm_group_element_print done" << endl;
423 //G.print_with_action(&A, Elt, ost);
424}
425
426static void perm_group_element_print_latex(action &A,
427 void *elt, ostream &ost)
428{
429 groups::permutation_representation_domain &G = *A.G.perm_grp;
430 int *Elt = (int *) elt;
431
432 G.print(Elt, ost);
433 //G.print_with_action(&A, Elt, ost);
434}
435
436static void perm_group_element_print_latex_with_print_point_function(
437 action &A,
438 void *elt, std::ostream &ost,
439 void (*point_label)(std::stringstream &sstr, long int pt, void *data),
440 void *point_label_data)
441{
442 groups::permutation_representation_domain &G = *A.G.perm_grp;
443 int *Elt = (int *) elt;
444
445 G.print_with_print_point_function(Elt, ost, point_label, point_label_data);
446 //G.print_with_action(&A, Elt, ost);
447
448}
449
450static void perm_group_element_print_verbose(action &A,
451 void *elt, ostream &ost)
452{
453 groups::permutation_representation_domain &G = *A.G.perm_grp;
454 int *Elt = (int *) elt;
455
456 G.print(Elt, ost);
457}
458
459static void perm_group_element_code_for_make_element(action &A,
460 void *elt, int *data)
461{
462 groups::permutation_representation_domain &G = *A.G.perm_grp;
463 int *Elt = (int *) elt;
464
465 G.code_for_make_element(Elt, data);
466}
467
468static void perm_group_element_print_for_make_element(action &A,
469 void *elt, ostream &ost)
470{
471 groups::permutation_representation_domain &G = *A.G.perm_grp;
472 int *Elt = (int *) elt;
473
474 G.print_for_make_element(Elt, ost);
475}
476
477static void perm_group_element_print_for_make_element_no_commas(action &A,
478 void *elt, ostream &ost)
479{
480 groups::permutation_representation_domain &G = *A.G.perm_grp;
481 int *Elt = (int *) elt;
482
483 G.print_for_make_element_no_commas(Elt, ost);
484}
485
486
487static void perm_group_print_point(action &A, long int a, ostream &ost)
488{
489 groups::permutation_representation_domain &G = *A.G.perm_grp;
490
491 if (G.f_product_action) {
492 if (a < G.offset) {
493 cout << "r_{" << a << "}";
494 }
495 else {
496 int x, y;
497
498 a -= G.offset;
499 x = a / G.n;
500 y = a % G.n;
501 cout << "(" << x << "," << y << ")";
502 }
503 }
504 else {
505 ost << a;
506 }
507}
508
509}}}
510
511
512
void(* ptr_element_print_for_make_element)(action &A, void *elt, std::ostream &ost)
Definition: actions.h:1113
void(* ptr_element_dispose)(action &A, int hdl, int verbose_level)
Definition: actions.h:1102
int(* ptr_element_linear_entry_frobenius)(action &A, void *elt, int verbose_level)
Definition: actions.h:1091
void(* ptr_element_transpose)(action &A, void *a, void *at, int verbose_level)
Definition: actions.h:1100
void(* ptr_element_print)(action &A, void *elt, std::ostream &ost)
Definition: actions.h:1103
void(* ptr_element_print_latex_with_print_point_function)(action &A, void *elt, std::ostream &ost, void(*point_label)(std::stringstream &sstr, long int pt, void *data), void *point_label_data)
Definition: actions.h:1106
void(* ptr_element_print_quick)(action &A, void *elt, std::ostream &ost)
Definition: actions.h:1104
int(* ptr_element_linear_entry_ij)(action &A, void *elt, int i, int j, int verbose_level)
Definition: actions.h:1090
void(* ptr_element_unpack)(action &A, void *elt, void *Elt, int verbose_level)
Definition: actions.h:1094
void(* ptr_element_move)(action &A, void *a, void *b, int verbose_level)
Definition: actions.h:1101
void(* ptr_element_image_of_low_level)(action &A, int *input, int *output, void *elt, int verbose_level)
Definition: actions.h:1089
int(* ptr_element_is_one)(action &A, void *elt, int verbose_level)
Definition: actions.h:1093
long int(* ptr_element_image_of)(action &A, long int a, void *elt, int verbose_level)
Definition: actions.h:1088
void(* ptr_element_print_for_make_element_no_commas)(action &A, void *elt, std::ostream &ost)
Definition: actions.h:1114
void(* ptr_print_point)(action &A, long int i, std::ostream &ost)
Definition: actions.h:1111
void(* ptr_element_invert)(action &A, void *a, void *av, int verbose_level)
Definition: actions.h:1099
void(* ptr_element_print_latex)(action &A, void *elt, std::ostream &ost)
Definition: actions.h:1105
void(* ptr_element_one)(action &A, void *elt, int verbose_level)
Definition: actions.h:1092
void(* ptr_element_print_verbose)(action &A, void *elt, std::ostream &ost)
Definition: actions.h:1110
void(* ptr_element_code_for_make_element)(action &A, void *elt, int *data)
Definition: actions.h:1112
void(* ptr_element_retrieve)(action &A, int hdl, void *elt, int verbose_level)
Definition: actions.h:1096
void(* ptr_element_pack)(action &A, void *Elt, void *elt, int verbose_level)
Definition: actions.h:1095
int(* ptr_element_store)(action &A, void *elt, int verbose_level)
Definition: actions.h:1097
void(* ptr_element_mult)(action &A, void *a, void *b, void *ab, int verbose_level)
Definition: actions.h:1098
a permutation group in a fixed action.
Definition: actions.h:99
a domain for permutation groups whose elements are given in the permutation representation
Definition: groups.h:715
unsigned char uchar
Definition: foundations.h:204
#define FALSE
Definition: foundations.h:234
the orbiter library for the classification of combinatorial objects
groups::permutation_representation_domain * perm_grp