Orbiter 2022
Combinatorial Objects
sims.cpp
Go to the documentation of this file.
1// sims.cpp
2//
3// Anton Betten
4// December 21, 2003
5
7#include "group_actions.h"
8
9
10using namespace std;
11
12
13namespace orbiter {
14namespace layer3_group_actions {
15namespace groups {
16
18{
19 A = NULL;
20 my_base_len = 0;
21 nb_images = 0;
22 images = NULL;
23 gen_depth = NULL;
24 gen_perm = NULL;
25 nb_gen = NULL;
27 path = NULL;
28 images = NULL;
29 orbit_len = NULL;
30 orbit = NULL;
31 orbit_inv = NULL;
32 prev = NULL;
33 label = NULL;
34 //Path = NULL;
35 //Label = NULL;
36 Elt1 = NULL;
37 Elt2 = NULL;
38 Elt3 = NULL;
39 Elt4 = NULL;
40 strip1 = NULL;
41 strip2 = NULL;
42 eltrk1 = NULL;
43 eltrk2 = NULL;
44 eltrk3 = NULL;
45 cosetrep = NULL;
46 cosetrep_tmp = NULL;
47 schreier_gen = NULL;
48 schreier_gen1 = NULL;
49 //null();
50
51}
52
54{
55 A = NULL;
56 my_base_len = 0;
57 nb_images = 0;
58 images = NULL;
59 gen_depth = NULL;
60 gen_perm = NULL;
61 nb_gen = NULL;
63 path = NULL;
64 images = NULL;
65 orbit_len = NULL;
66 orbit = NULL;
67 orbit_inv = NULL;
68 prev = NULL;
69 label = NULL;
70 //Path = NULL;
71 //Label = NULL;
72 Elt1 = NULL;
73 Elt2 = NULL;
74 Elt3 = NULL;
75 Elt4 = NULL;
76 strip1 = NULL;
77 strip2 = NULL;
78 eltrk1 = NULL;
79 eltrk2 = NULL;
80 eltrk3 = NULL;
81 cosetrep = NULL;
82 cosetrep_tmp = NULL;
83 schreier_gen = NULL;
84 schreier_gen1 = NULL;
85}
86
87sims::sims(actions::action *A, int verbose_level)
88{
89 init(A, verbose_level);
90}
91
93{
94 freeself();
95}
96
98{
99 int i;
100 int f_v = FALSE;
101
102 if (f_v) {
103 cout << "sims::freeself freeing gen_depth" << endl;
104 }
105 if (gen_depth) {
107 }
108 if (gen_perm) {
110 }
111 if (nb_gen) {
113 }
114 if (path) {
115 FREE_int(path);
116 }
117
118 if (f_v) {
119 cout << "sims::freeself freeing orbit, "
120 "my_base_len=" << my_base_len << endl;
121 }
122 if (orbit) {
123 for (i = 0; i < my_base_len; i++) {
124 if (f_v) {
125 cout << "sims::freeself freeing orbit i=" << i << endl;
126 }
127 if (f_v) {
128 cout << "sims::freeself freeing orbit[i]" << endl;
129 }
130 FREE_int(orbit[i]);
131 if (f_v) {
132 cout << "sims::freeself freeing orbit_inv[i]" << endl;
133 }
134 FREE_int(orbit_inv[i]);
135 if (f_v) {
136 cout << "sims::freeself freeing prev[i]" << endl;
137 }
138 FREE_int(prev[i]);
139 if (f_v) {
140 cout << "sims::freeself freeing label[i]" << endl;
141 }
142 FREE_int(label[i]);
143 }
144 if (f_v) {
145 cout << "sims::freeself freeing orbit"<< endl;
146 }
147 FREE_pint(orbit);
148 FREE_pint(orbit_inv);
149 FREE_pint(prev);
150 FREE_pint(label);
151 }
152#if 0
153 if (Path) {
154 FREE_int(Path);
155 }
156 if (Label) {
157 FREE_int(Label);
158 }
159#endif
160 if (f_v) {
161 cout << "sims::freeself freeing orbit_len" << endl;
162 }
163 if (orbit_len) {
164 FREE_int(orbit_len);
165 }
166 if (Elt1) {
167 FREE_int(Elt1);
168 }
169 if (Elt2) {
170 FREE_int(Elt2);
171 }
172 if (Elt3) {
173 FREE_int(Elt3);
174 }
175 if (Elt4) {
176 FREE_int(Elt4);
177 }
178 if (strip1) {
179 FREE_int(strip1);
180 }
181 if (strip2) {
182 FREE_int(strip2);
183 }
184 if (eltrk1) {
185 FREE_int(eltrk1);
186 }
187 if (eltrk2) {
188 FREE_int(eltrk2);
189 }
190 if (eltrk3) {
191 FREE_int(eltrk3);
192 }
193 if (cosetrep) {
194 FREE_int(cosetrep);
195 }
196 if (cosetrep_tmp) {
197 FREE_int(cosetrep_tmp);
198 }
199 if (schreier_gen) {
200 FREE_int(schreier_gen);
201 }
202 if (schreier_gen1) {
203 FREE_int(schreier_gen1);
204 }
205 A = NULL;
206 if (f_v) {
207 cout << "sims::freeself before delete_images" << endl;
208 }
210 if (f_v) {
211 cout << "sims::freeself before after_images" << endl;
212 }
213 null();
214 if (f_v) {
215 cout << "sims::freeself done" << endl;
216 }
217};
218
220{
221 int i;
222
223 if (images) {
224 for (i = 0; i < nb_images; i++) {
225 FREE_int(images[i]);
226 }
227 nb_images = 0;
229 images = NULL;
230 }
231}
232
233void sims::init_images(int nb_images)
234{
235#if 0
236 int i, j; //, a;
237
238 cout << "sims::init_images" << endl;
239 if (A == NULL) {
240 cout << "sims::init_images() action is NULL" << endl;
241 exit(1);
242 }
246 for (i = 0; i < nb_images; i++) {
247 images[i] = NEW_int(A->degree);
248 for (j = 0; j < A->degree; j++) {
249 images[i][j] = -1;
250 //a = A->image_of(gens.ith(i), j);
251 //images[i][j] = a;
252 //images[i][A->degree + a] = j;
253 }
254 }
255#else
256 //cout << "sims::init_images doing nothing" << endl;
257#endif
258}
259
261{
262#if 0
263 int **new_images = NEW_pint(nb_images + 1);
264 int i, j; //, a;
265
266 new_images[nb_images] = NEW_int(A->degree);
267 for (j = 0; j < A->degree; j++) {
268 new_images[nb_images][j] = -1;
269 }
270 //for (j = 0; j < 2 * A->degree; j++) {
271 //new_images[i][j] = -1;
272 //a = A->image_of(gens.ith(nb_images), j);
273 //new_images[nb_images][j] = a;
274 //new_images[nb_images][A->degree + a] = j;
275 //}
276 for (i = 0; i < nb_images; i++) {
277 new_images[i] = images[i];
278 }
279 if (images)
281 images = new_images;
282 nb_images++;
283#else
284 //cout << "sims::images_append doing nothing" << endl;
285
286#endif
287}
288
289void sims::init(actions::action *A, int verbose_level)
290// initializes the trivial group with the base as given in A
291{
292 int i;
293 int f_v = (verbose_level >= 1);
294
295 if (f_v) {
296 cout << "sims::init action=" << A->label << endl;
297 }
298
299 if (f_v) {
300 cout << "sims::init before init_without_base" << endl;
301 }
302 init_without_base(A, verbose_level);
303 if (f_v) {
304 cout << "sims::init after init_without_base" << endl;
305 }
306
307#if 0
308 if (A->Stabilizer_chain) {
310 }
311 else {
312 cout << "sims::init A->Stabilizer_chain == NULL, setting my_base_len to degree" << endl;
314 }
315#endif
316
317 if (f_v) {
318 cout << "sims::init my_base_len=" << my_base_len << endl;
319 }
320 if (f_v) {
321 cout << "sims::init allocating orbit" << endl;
322 }
323 orbit = NEW_pint(my_base_len);
324 if (f_v) {
325 cout << "sims::init allocating orbit_inv" << endl;
326 }
327 orbit_inv = NEW_pint(my_base_len);
328 if (f_v) {
329 cout << "sims::init allocating prev" << endl;
330 }
331 prev = NEW_pint(my_base_len);
332 if (f_v) {
333 cout << "sims::init allocating label" << endl;
334 }
335 label = NEW_pint(my_base_len);
336
338 if (f_v) {
339 cout << "sims::init transversal_length=" << transversal_length << endl;
340 }
341 for (i = 0; i < my_base_len; i++) {
342 if (f_v) {
343 cout << "sims::init allocating orbit " << i << " / " << my_base_len << endl;
344 }
345 orbit[i] = NEW_int(transversal_length);
346 orbit_inv[i] = NEW_int(transversal_length);
347 prev[i] = NEW_int(transversal_length);
348 label[i] = NEW_int(transversal_length);
349 }
350 //Path = NEW_int(A->degree + 1);
351 //Label = NEW_int(A->degree + 1);
352
354
355
357 for (i = 0; i <= my_base_len; i++) {
358 nb_gen[i] = 0;
359 }
360
362
363 orbit_len = NEW_int(my_base_len);
364
365 for (i = 0; i < my_base_len; i++) {
366 if (f_v) {
367 cout << "sims::init before initialize_table " << i << " / " << my_base_len << endl;
368 }
369 initialize_table(i, verbose_level);
370 orbit_len[i] = 1;
371 }
372 if (f_v) {
373 cout << "sims::init done" << endl;
374 }
375
376}
377
378void sims::init_cyclic_group_from_generator(actions::action *A, int *Elt, int verbose_level)
379// initializes the cyclic group generated by Elt with the base as given in A
380{
381 int f_v = (verbose_level >= 1);
382 sims *H;
383
384 if (f_v) {
385 cout << "sims::init_cyclic_group_from_generator action=" << A->label << endl;
386 }
387
389 Elt, verbose_level);
390
391 *this = *H;
392 H->null();
393
394 if (f_v) {
395 cout << "sims::init_cyclic_group_from_generator done" << endl;
396 }
397}
398
399
400void sims::init_without_base(actions::action *A, int verbose_level)
401{
402 int f_v = (verbose_level >= 1);
403
404 if (f_v) {
405 cout << "sims::init_without_base action=" << A->label << endl;
406 }
407 sims::A = A;
408 nb_images = 0;
409 images = NULL;
410
413 if (f_v) {
414 cout << "sims::init_without_base my_base_len=" << my_base_len << endl;
415 }
416
417 gens.init(A, verbose_level - 2);
418 gens_inv.init(A, verbose_level - 2);
419
420#if 0
421 Path = NEW_int(my_base_len + 1);
422 Label = NEW_int(my_base_len + 1);
423#endif
424
426
427 Elt1 = NEW_int(A->elt_size_in_int);
428 Elt2 = NEW_int(A->elt_size_in_int);
429 Elt3 = NEW_int(A->elt_size_in_int);
430 Elt4 = NEW_int(A->elt_size_in_int);
431 strip1 = NEW_int(A->elt_size_in_int);
432 strip2 = NEW_int(A->elt_size_in_int);
433 eltrk1 = NEW_int(A->elt_size_in_int);
434 eltrk2 = NEW_int(A->elt_size_in_int);
435 eltrk3 = NEW_int(A->elt_size_in_int);
436 cosetrep = NEW_int(A->elt_size_in_int);
437 cosetrep_tmp = NEW_int(A->elt_size_in_int);
438 schreier_gen = NEW_int(A->elt_size_in_int);
439 schreier_gen1 = NEW_int(A->elt_size_in_int);
440 if (f_v) {
441 cout << "sims::init_without_base done" << endl;
442 }
443}
444
445void sims::reallocate_base(int old_base_len, int verbose_level)
446{
447 int f_v = (verbose_level >= 1);
448 int i;
449 int *old_nb_gen = nb_gen;
450 int *old_path = path;
451 int *old_orbit_len = orbit_len;
452 int **old_orbit = orbit;
453 int **old_orbit_inv = orbit_inv;
454 int **old_prev = prev;
455 int **old_label = label;
456#if 0
457 int *old_Path = Path;
458 int *old_Label = Label;
459#endif
460
461 if (f_v) {
462 cout << "sims::reallocate_base from "
463 << old_base_len << " to " << A->base_len() << endl;
464 }
465
467 if (f_v) {
468 cout << "sims::reallocate_base my_base_len=" << my_base_len << endl;
469 }
470
473 orbit_len = NEW_int(my_base_len);
474 orbit = NEW_pint(my_base_len);
475 orbit_inv = NEW_pint(my_base_len);
476 prev = NEW_pint(my_base_len);
477 label = NEW_pint(my_base_len);
478#if 0
479 Path = NEW_int(my_base_len + 1);
480 Label = NEW_int(my_base_len + 1);
481#endif
482 for (i = 0; i < old_base_len; i++) {
483 if (f_v) {
484 cout << "sims::reallocate_base i=" << i << " / " << old_base_len << endl;
485 }
486 nb_gen[i] = old_nb_gen[i];
487 path[i] = old_path[i];
488 orbit_len[i] = old_orbit_len[i];
489 orbit[i] = old_orbit[i];
490 orbit_inv[i] = old_orbit_inv[i];
491 prev[i] = old_prev[i];
492 label[i] = old_label[i];
493 }
494 for (i = old_base_len; i < my_base_len; i++) {
495 if (f_v) {
496 cout << "sims::reallocate_base i=" << i << " / " << old_base_len << endl;
497 }
498 nb_gen[i] = 0;
499 path[i] = 0;
500 orbit[i] = NEW_int(A->degree);
501 orbit_inv[i] = NEW_int(A->degree);
502 prev[i] = NEW_int(A->degree);
503 label[i] = NEW_int(A->degree);
504 if (f_v) {
505 cout << "sims::reallocate_base before initialize_table" << endl;
506 }
507 initialize_table(i, 0 /* verbose_level */);
508 if (f_v) {
509 cout << "sims::reallocate_base after initialize_table" << endl;
510 }
511 if (f_v) {
512 cout << "sims::reallocate_base before init_trivial_orbit" << endl;
513 }
514 init_trivial_orbit(i, verbose_level);
515 if (f_v) {
516 cout << "sims::reallocate_base after init_trivial_orbit" << endl;
517 }
518 }
519 nb_gen[my_base_len] = 0;
520#if 0
521 nb_gen[A->base_len - 1] = old_nb_gen[A->base_len - 1];
522 nb_gen[A->base_len] = 0;
523 path[A->base_len - 1] = 0;
524 orbit[A->base_len - 1] = NEW_int(A->degree);
525 orbit_inv[A->base_len - 1] = NEW_int(A->degree);
526 prev[A->base_len - 1] = NEW_int(A->degree);
527 label[A->base_len - 1] = NEW_int(A->degree);
530#endif
531 if (old_nb_gen) {
532 FREE_int(old_nb_gen);
533 }
534 if (old_path) {
535 FREE_int(old_path);
536 }
537 if (old_orbit_len) {
538 FREE_int(old_orbit_len);
539 }
540 if (old_orbit) {
541 FREE_pint(old_orbit);
542 }
543 if (old_orbit_inv) {
544 FREE_pint(old_orbit_inv);
545 }
546 if (old_prev) {
547 FREE_pint(old_prev);
548 }
549 if (old_label) {
550 FREE_pint(old_label);
551 }
552#if 0
553 if (old_Path)
554 FREE_int(old_Path);
555 if (old_Label)
556 FREE_int(old_Label);
557#endif
558 if (f_v) {
559 cout << "sims::reallocate_base done" << endl;
560 }
561}
562
563void sims::initialize_table(int i, int verbose_level)
564{
565 int f_v = (verbose_level >= 1);
567 int j;
568
569 if (f_v) {
570 cout << "sims::initialize_table" << endl;
571 }
572 Combi.perm_identity(orbit[i], transversal_length);
573 Combi.perm_identity(orbit_inv[i], transversal_length);
574 for (j = 0; j < transversal_length; j++) {
575 prev[i][j] = -1;
576 label[i][j] = -1;
577 }
578 orbit_len[i] = 0;
579 if (f_v) {
580 cout << "sims::initialize_table done" << endl;
581 }
582}
583
584void sims::init_trivial_group(int verbose_level)
585// clears the generators array,
586// and sets the i-th transversal to contain
587// only the i-th base point (for all i).
588{
589 int f_v = (verbose_level >= 2);
590 int f_vv = (verbose_level >= 3);
591 int i;
592
593 if (f_v) {
594 cout << "sims::init_trivial_group" << endl;
595 }
596 if (A->Stabilizer_chain == NULL) {
597 cout << "sims::init_trivial_group A->Stabilizer_chain == NULL" << endl;
598 return;
599 }
600 if (my_base_len != A->base_len()) {
601 cout << "sims::init_trivial_group: "
602 "my_base_len != A->base_len" << endl;
603 exit(1);
604 }
605 if (f_vv) {
606 cout << "before init_generators" << endl;
607 }
608 init_generators(0, NULL, verbose_level - 3);
609 for (i = 0; i < my_base_len; i++) {
610 if (f_vv) {
611 cout << "sims::init_trivial_group before init_trivial_orbit i=" << i << endl;
612 }
613 init_trivial_orbit(i, verbose_level);
614 }
615 if (f_v) {
616 cout << "sims::init_trivial_group done" << endl;
617 }
618}
619
620void sims::init_trivial_orbit(int i, int verbose_level)
621{
622 int f_v = (verbose_level >= 1);
623 int coset_of_base_point;
624 int bi;
625
626 if (f_v) {
627 cout << "sims::init_trivial_orbit i=" << i << endl;
628 }
629 if (my_base_len != A->base_len()) {
630 cout << "sims::init_trivial_orbit: "
631 "my_base_len != A->base_len" << endl;
632 exit(1);
633 }
634 bi = A->base_i(i);
635 if (f_v) {
636 cout << "sims::init_trivial_orbit bi=" << bi << endl;
637 }
638
639 if (f_v) {
640 cout << "sims::init_trivial_orbit before get_orbit_inv" << endl;
641 }
642 coset_of_base_point = get_orbit_inv(i, bi);
643 if (f_v) {
644 cout << "sims::init_trivial_orbit after get_orbit_inv" << endl;
645 cout << "sims::init_trivial_orbit coset_of_base_point = " << coset_of_base_point << endl;
646 }
647
648 if (coset_of_base_point) {
649 swap_points(i, coset_of_base_point, 0);
650 }
651 //cout << "sims::init_trivial_orbit " << i
652 // << " : " << A->base[i] << endl;
653 //cout << "orbit[i][0] = " << orbit[i][0] << endl;
654 orbit_len[i] = 1;
655 if (f_v) {
656 cout << "sims::init_trivial_orbit i=" << i << " done" << endl;
657 }
658}
659
661 int verbose_level)
662{
663 int f_v = (verbose_level >= 1);
664
665 if (f_v) {
666 cout << "sims::init_generators" << endl;
667 cout << "generators.len=" << generators.len << endl;
668 }
669 if (generators.len) {
670 init_generators(generators.len,
671 generators.ith(0), verbose_level);
672 }
673 else {
674 init_generators(generators.len, NULL, verbose_level);
675 }
676 if (f_v) {
677 cout << "sims::init_generators done" << endl;
678 }
679}
680
681void sims::init_generators(int nb, int *elt,
682 int verbose_level)
683// copies the given elements into the generator array,
684// then computes depth and perm
685{
686 int f_v = (verbose_level >= 1);
687 int f_vv = (verbose_level >= 2);
688 int f_vvv = (verbose_level >= 3);
689 int i;
690
691 if (f_v) {
692 cout << "sims::init_generators nb = " << nb << endl;
693 }
694 gens.allocate(nb, verbose_level - 2);
695 gens_inv.allocate(nb, verbose_level - 2);
696 for (i = 0; i < nb; i++) {
697 if (f_vv) {
698 cout << "sims::init_generators "
699 "i = " << i << " / " << nb << ":" << endl;
700 }
701 gens.copy_in(i, elt + i * A->elt_size_in_int);
702 if (f_vvv) {
704 elt + i * A->elt_size_in_int, cout);
705 }
706 A->element_invert(elt + i * A->elt_size_in_int,
707 gens_inv.ith(i), FALSE);
708 }
709 if (f_v) {
710 cout << "sims::init_generators before init_images" << endl;
711 }
712 init_images(nb);
713 if (f_v) {
714 cout << "sims::init_generators "
715 "before init_generator_depth_and_perm" << endl;
716 }
717 init_generator_depth_and_perm(verbose_level);
718 if (f_v) {
719 cout << "sims::init_generators done" << endl;
720 }
721}
722
723void sims::init_generators_by_hdl(int nb_gen, int *gen_hdl, int verbose_level)
724{
725 int i;
726 int f_v = (verbose_level >= 1);
727
728 if (f_v) {
729 cout << "sims::init_generators_by_hdl" << endl;
730 }
731 gens.allocate(nb_gen, verbose_level - 2);
732 gens_inv.allocate(nb_gen, verbose_level - 2);
733
734 for (i = 0; i < nb_gen; i++) {
735 //cout << "sims::init_generators i = " << i << endl;
736 A->element_retrieve(gen_hdl[i], gens.ith(i), FALSE);
738 }
741 if (f_v) {
742 cout << "sims::init_generators_by_hdl done" << endl;
743 }
744
745}
746
748{
749 int f_v = (verbose_level >= 1);
750 int f_vv = (verbose_level >= 2);
751 int i, j, d;
752
753 if (f_v) {
754 cout << "sims::init_generator_depth_and_perm" << endl;
755 cout << "gens.len=" << gens.len << endl;
756 cout << "action=" << A->label << endl;
757 }
758 if (my_base_len != A->base_len()) {
759 cout << "sims::init_generator_depth_and_perm "
760 "my_base_len != A->base_len" << endl;
761 exit(1);
762 }
763
764 for (i = 0; i <= A->base_len(); i++) {
765 nb_gen[i] = 0;
766 }
769 for (i = 0; i < gens.len; i++) {
770 gen_perm[i] = i;
772 if (f_vv) {
773 cout << "generator " << i
774 << " has depth " << gen_depth[i] << endl;
775 }
776 if (i) {
777 if (gen_depth[i] > gen_depth[i - 1]) {
778 cout << "sims::init_generator_depth_and_perm "
779 "generators must be of decreasing depth" << endl;
780 cout << "i=" << i << endl;
781 cout << "gens.len=" << gens.len << endl;
782 cout << "gen_depth[i]=" << gen_depth[i] << endl;
783 cout << "gen_depth[i - 1]=" << gen_depth[i - 1] << endl;
784 exit(1);
785 }
786 }
787 }
788 nb_gen[A->base_len()] = 0;
789 for (i = 0; i < gens.len; i++) {
790 d = gen_depth[i];
791 for (j = d; j >= 0; j--) {
792 nb_gen[j]++;
793 }
794 }
795 if (f_v) {
797 }
798 if (f_v) {
799 cout << "sims::init_generator_depth_and_perm done" << endl;
800 }
801}
802
803void sims::add_generator(int *elt, int verbose_level)
804// adds elt to list of generators,
805// computes the depth of the element,
806// updates the arrays gen_depth, gen_perm and nb_gen accordingly
807// does not change the transversals
808{
809 int f_v = (verbose_level >= 1);
810 int old_nb_gen, idx, depth, i;
811 int *new_gen_depth;
812 int *new_gen_perm;
813
814 if (f_v) {
815 cout << "sims::add_generator verbose_level=" << verbose_level << endl;
816 cout << "sims::add_generator generator no " << gens.len << " is:" << endl;
817 A->element_print_quick(elt, cout);
818 cout << endl;
819 cout << "sims::add_generator my_base_len=" << my_base_len << endl;
820 cout << "sims::add_generator A->base_len()=" << A->base_len() << endl;
821 }
822 if (f_v) {
823 cout << "sims::add_generator before adding the generator:" << endl;
825 }
826 if (my_base_len != A->base_len()) {
827 cout << "sims::add_generator: "
828 "my_base_len != A->base_len" << endl;
829 exit(1);
830 }
831
832 if (f_v) {
833 cout << "sims::add_generator "
834 "allocating new_gen_depth and new_gen_perm" << endl;
835 }
836
837 new_gen_depth = NEW_int(gens.len + 1);
838 new_gen_perm = NEW_int(gens.len + 1);
839
840
841 if (f_v) {
842 cout << "sims::add_generator "
843 "copying gen_depth and gen_perm over" << endl;
844 }
845 old_nb_gen = idx = gens.len;
846 for (i = 0; i < old_nb_gen; i++) {
847 new_gen_depth[i] = gen_depth[i];
848 new_gen_perm[i] = gen_perm[i];
849 }
850 if (gen_depth) {
851 if (f_v) {
852 cout << "sims::add_generator "
853 "freeing gen_depth/gen_perm" << endl;
854 }
857 }
858 gen_depth = new_gen_depth;
859 gen_perm = new_gen_perm;
860
861 if (f_v) {
862 cout << "sims::add_generator "
863 "before gens.append" << endl;
864 }
865 gens.append(elt, verbose_level - 2);
866 if (f_v) {
867 cout << "sims::add_generator "
868 "before gens_inv.append" << endl;
869 }
870 gens_inv.append(elt, verbose_level - 2);
871 if (f_v) {
872 cout << "sims::add_generator "
873 "before A->element_invert" << endl;
874 }
875 A->element_invert(elt, gens_inv.ith(idx), FALSE);
876
877 if (f_v) {
878 cout << "sims::add_generator "
879 "before images_append" << endl;
880 }
882 if (f_v) {
883 cout << "sims::add_generator "
884 "after images_append" << endl;
885 }
886
887
888 if (f_v) {
889 cout << "sims::add_generator "
890 "before generator_depth(idx)" << endl;
891 }
892 depth = generator_depth(idx);
893 if (f_v) {
894 cout << "sims::add_generator "
895 "depth = " << depth << endl;
896 }
897 new_gen_depth[idx] = depth;
898 for (i = old_nb_gen - 1; i >= nb_gen[depth]; i--) {
899 gen_perm[i + 1] = gen_perm[i];
900 }
901 gen_perm[nb_gen[depth]] = idx;
902 for (i = depth; i >= 0; i--) {
903 nb_gen[i]++;
904 }
905
906 if (f_v) {
907 cout << "sims::add_generator after adding the generator:" << endl;
909 }
910
911 if (f_v) {
912 cout << "sims::add_generator done" << endl;
913 }
914}
915
916
917
918
919int sims::generator_depth(int gen_idx)
920// returns the index of the first base point
921// which is moved by a given generator.
922{
923 int i, bi, j;
924
925 for (i = 0; i < A->base_len(); i++) {
926 bi = A->base_i(i);
927 j = get_image(bi, gen_idx);
928 if (j != bi) {
929 return i;
930 }
931 }
932 return A->base_len();
933}
934
936// returns the index of the first base point
937// which is moved by the given element
938{
939 int i, bi, j;
940
941 for (i = 0; i < A->base_len(); i++) {
942 bi = A->base_i(i);
943 j = get_image(bi, elt);
944 if (j != bi) {
945 return i;
946 }
947 }
948 return A->base_len();
949}
950
952{
954
955 //cout << "sims::group_order before D.multiply_up" << endl;
956 //cout << "A->base_len=" << A->base_len << endl;
957 //cout << "orbit_len=";
958 //int_vec_print(cout, orbit_len, A->base_len);
959 //cout << endl;
960 D.multiply_up(go, orbit_len, my_base_len /*A->base_len()*/, 0);
961 //cout << "sims::group_order after D.multiply_up" << endl;
962}
963
965{
966 int f_v = (verbose_level >= 1);
968
969 if (f_v) {
970 cout << "sims::group_order_verbose" << endl;
971 }
972 //cout << "sims::group_order before D.multiply_up" << endl;
973 //cout << "A->base_len=" << A->base_len << endl;
974 //cout << "orbit_len=";
975 //int_vec_print(cout, orbit_len, A->base_len);
976 //cout << endl;
977 D.multiply_up(go, orbit_len, my_base_len /*A->base_len()*/, verbose_level);
978 //cout << "sims::group_order after D.multiply_up" << endl;
979 if (f_v) {
980 cout << "sims::group_order_verbose done" << endl;
981 }
982}
983
985{
986 int f_v = (verbose_level >= 1);
988
989 if (f_v) {
990 cout << "sims::subgroup_order_verbose" << endl;
991 }
992 //cout << "sims::group_order before D.multiply_up" << endl;
993 //cout << "A->base_len=" << A->base_len << endl;
994 //cout << "orbit_len=";
995 //int_vec_print(cout, orbit_len, A->base_len);
996 //cout << endl;
997 D.multiply_up(go, orbit_len + level, my_base_len - level, verbose_level);
998 //cout << "sims::group_order after D.multiply_up" << endl;
999 if (f_v) {
1000 cout << "sims::subgroup_order_verbose done" << endl;
1001 }
1002}
1003
1005{
1007
1008 group_order(go);
1009 return go.as_lint();
1010}
1011
1013{
1014 int j = last_moved_base_point();
1015
1016 if (j == -1) {
1017 return TRUE;
1018 }
1019 else {
1020 return FALSE;
1021 }
1022}
1023
1025// j == -1 means the group is trivial
1026{
1027 int j;
1028
1029 for (j = A->base_len() - 1; j >= 0; j--) {
1030 if (orbit_len[j] != 1) {
1031 break;
1032 }
1033 }
1034 return j;
1035}
1036
1037int sims::get_image(int i, int gen_idx)
1038// get the image of a point i under
1039// generator gen_idx, goes through a
1040// table of stored images by default.
1041// Computes the image only if not yet available.
1042{
1043 int a;
1044
1045 if (nb_images == 0 || images == NULL) {
1046 a = A->element_image_of(i, gens.ith(gen_idx), 0);
1047 return a;
1048 //cout << "sims::get_image() images == NULL" << endl;
1049 //exit(1);
1050 }
1051 a = images[gen_idx][i];
1052#if 1
1053 if (a == -1) {
1054 a = A->element_image_of(i, gens.ith(gen_idx), 0);
1055 images[gen_idx][i] = a;
1056 //images[gen_idx][A->degree + a] = i;
1057 }
1058#endif
1059 return a;
1060}
1061
1062int sims::get_image(int i, int *elt)
1063// get the image of a point i under a given group element,
1064// does not goes through a table.
1065{
1066 return A->element_image_of(i, elt, FALSE);
1067}
1068
1069void sims::swap_points(int lvl, int i, int j)
1070// swaps two points given by their cosets
1071{
1072 int pi, pj;
1073
1074 pi = orbit[lvl][i];
1075 pj = orbit[lvl][j];
1076 orbit[lvl][i] = pj;
1077 orbit[lvl][j] = pi;
1078 orbit_inv[lvl][pi] = j;
1079 orbit_inv[lvl][pj] = i;
1080}
1081
1083{
1084 long int h, l;
1085
1086 for (h = A->base_len() - 1; h >= 0; h--) {
1087 l = orbit_len[h];
1088
1089 path[h] = a % l;
1090 a = a / l;
1091 }
1092}
1093
1095{
1096 long int h, a;
1097
1098 a = 0;
1099 for (h = 0; h < A->base_len(); h++) {
1100 if (h) {
1101 a *= orbit_len[h];
1102 }
1103 a += path[h];
1104 }
1105 return a;
1106}
1107
1108void sims::element_from_path(int *elt, int verbose_level)
1109// given coset representatives in path[], the corresponding
1110// element is multiplied.
1111// uses eltrk1, eltrk2, eltrk3
1112{
1113 int f_v = (verbose_level >= 1);
1114 int f_vv = (verbose_level >= 2);
1115 int i, j;
1116
1117 if (f_v) {
1118 cout << "sims::element_from_path" << endl;
1119 }
1120 if (f_vv) {
1121 cout << "path=";
1122 Int_vec_print(cout, path, A->base_len());
1123 cout << endl;
1124 cout << "A->degree=" << A->degree << endl;
1125 }
1126#if 0
1127 if (f_v) {
1128 cout << "i : orbit[0][i] : orbit_inv[0][i] : "
1129 "prev[0][i] : label[0][i]" << endl;
1130 for (i = 0; i < A->degree; i++) {
1131 cout << setw(5) << i
1132 << " : " << setw(5) << orbit[0][i]
1133 << " : " << setw(5) << orbit_inv[0][i]
1134 << " : " << setw(5) << prev[0][i]
1135 << " : " << setw(5) << label[0][i]
1136 << endl;
1137 }
1138 }
1139#endif
1140
1141 A->element_one(eltrk1, FALSE);
1142 for (i = 0; i < A->base_len(); i++) {
1143 j = path[i];
1144 if (f_v) {
1145 cout << "sims::element_from_path level "
1146 << i << " coset " << j << " before coset_rep" << endl;
1147 }
1148 coset_rep(eltrk3, i, j, verbose_level);
1149
1150
1151 if (f_v) {
1152 cout << "sims::element_from_path level "
1153 << i << " coset " << j << " after coset_rep" << endl;
1154 }
1155
1156 if (f_vv) {
1157 cout << "sims::element_from_path level "
1158 << i << " coset " << j << ":" << endl;
1159 cout << "cosetrep:" << endl;
1160 A->element_print_quick(eltrk3, cout);
1161 cout << endl;
1162 }
1163
1164 //A->element_print_as_permutation(cosetrep, cout);
1165 //cout << endl;
1166
1167 // pre multiply the coset representative:
1168 A->element_mult(eltrk3, eltrk1, eltrk2, 0);
1169 A->element_move(eltrk2, eltrk1, 0);
1170 }
1171 A->element_move(eltrk1, elt, 0);
1172 if (f_v) {
1173 cout << "sims::element_from_path done" << endl;
1174 }
1175}
1176
1178// very specialized routine, used in backtrack.cpp
1179// action_is_minimal_recursion
1180// used coset_rep_inv instead of coset_rep,
1181// multiplies left-to-right
1182//
1183// given coset representatives in path[],
1184// the corresponding
1185// element is multiplied.
1186// uses eltrk1, eltrk2
1187{
1188 int i, j;
1189
1190#if 0
1191 cout << "sims::element_from_path() path=";
1192 for (i = 0; i < A->base_len; i++) {
1193 cout << path[i] << " ";
1194 }
1195 cout << endl;
1196#endif
1197 A->element_one(eltrk1, FALSE);
1198 for (i = 0; i < A->base_len(); i++) {
1199 j = path[i];
1200
1201 coset_rep_inv(eltrk3, i, j, 0 /* verbose_level */);
1202
1203 //A->element_print_as_permutation(eltrk3, cout);
1204 //cout << endl;
1205
1206 // pre multiply the coset representative:
1207 A->element_mult(eltrk1, eltrk3, eltrk2, FALSE);
1208 A->element_move(eltrk2, eltrk1, FALSE);
1209 }
1210 A->element_move(eltrk1, elt, FALSE);
1211}
1212
1214 int *elt, int verbose_level)
1215// Returns group element whose rank is a.
1216// the elements represented by the chain
1217// are enumerated 0, ... go - 1
1218// with the convention that 0 always stands
1219// for the identity element.
1220// The computed group element will be computed into Elt1
1221{
1222 int f_v = (verbose_level >= 1);
1223 int ii, l, r;
1226
1227 if (f_v) {
1228 cout << "sims::element_unrank rk=" << a << endl;
1229 }
1230 for (ii = A->base_len() - 1; ii >= 0; ii--) {
1231 l = orbit_len[ii];
1232
1233 D.integral_division_by_int(a, l, q, r);
1234 q.assign_to(a);
1235
1236 path[ii] = r;
1237 //cout << r << " ";
1238 }
1239 //cout << endl;
1240 if (f_v) {
1241 cout << "sims::element_unrank path=";
1242 Int_vec_print(cout, path, A->base_len());
1243 cout << endl;
1244 }
1245 element_from_path(elt, 0);
1246 if (f_v) {
1247 cout << "sims::element_unrank done" << endl;
1248 }
1249}
1250
1252// Returns group element whose rank is a.
1253// the elements represented by the chain
1254// are enumerated 0, ... go - 1
1255// with the convention that 0 always stands
1256// for the identity element.
1257// The computed group element will be computed into Elt1
1258{
1259 int ii, l, r;
1262
1263 for (ii = A->base_len() - 1; ii >= 0; ii--) {
1264 l = orbit_len[ii];
1265
1266 D.integral_division_by_int(a, l, q, r);
1267 q.assign_to(a);
1268
1269 path[ii] = r;
1270 //cout << r << " ";
1271 }
1272 //cout << endl;
1273 element_from_path(elt, 0);
1274}
1275
1277// Computes the rank of the element in elt into a.
1278// uses eltrk1, eltrk2
1279{
1280 long int i, j, bi, jj, l;
1283
1284 A->element_move(elt, eltrk1, FALSE);
1285 a.zero();
1286 for (i = 0; i < A->base_len(); i++) {
1287 bi = A->base_i(i);
1288 l = orbit_len[i];
1289
1290 if (i > 0) {
1291 b.create(l, __FILE__, __LINE__);
1292 D.mult(a, b, c);
1293 c.assign_to(a);
1294 }
1295
1296 jj = A->element_image_of(bi, eltrk1, FALSE);
1297 //cout << "at level " << i << ", maps bi = "
1298 // << bi << " to " << jj << endl;
1299 j = orbit_inv[i][jj];
1300 if (j >= orbit_len[i]) {
1301 cout << "sims::element_rank() j >= orbit_len[i]" << endl;
1302 cout << "i=" << i << endl;
1303 cout << "jj=bi^elt=" << jj << endl;
1304 cout << "j=orbit_inv[i][jj]=" << j << endl;
1305 cout << "base=";
1306 Lint_vec_print(cout, A->get_base(), A->base_len());
1307 cout << endl;
1308 cout << "orbit_len=";
1309 Int_vec_print(cout, orbit_len, A->base_len());
1310 cout << endl;
1311 cout << "elt=" << endl;
1312 A->element_print(eltrk1, cout);
1313 exit(1);
1314 }
1315 b.create(j, __FILE__, __LINE__);
1316 D.add(a, b, c);
1317 c.assign_to(a);
1318
1319 coset_rep_inv(eltrk3, i, j, 0 /* verbose_level */);
1320
1321 A->element_mult(eltrk1, eltrk3, eltrk2, FALSE);
1322 A->element_move(eltrk2, eltrk1, FALSE);
1323 }
1324}
1325
1326void sims::element_unrank_lint(long int rk, int *Elt, int verbose_level)
1327{
1328 int f_v = (verbose_level >= 1);
1329 //longinteger_object a;
1330
1331 if (f_v) {
1332 cout << "sims::element_unrank_lint rk=" << rk << endl;
1333 }
1334 //a.create(rk);
1335 //element_unrank(a, Elt);
1336 path_unrank_lint(rk);
1337 if (f_v) {
1338 cout << "sims::element_unrank_lint path=";
1339 Int_vec_print(cout, path, A->base_len());
1340 cout << endl;
1341 }
1342 element_from_path(Elt, 0);
1343
1344}
1345
1346void sims::element_unrank_lint(long int rk, int *Elt)
1347{
1348 //longinteger_object a;
1349
1350 //a.create(rk);
1351 element_unrank_lint(rk, Elt, 0);
1352}
1353
1354long int sims::element_rank_lint(int *Elt)
1355{
1357
1358 element_rank(a, Elt);
1359 return a.as_lint();
1360}
1361
1363{
1364 int i, j, bi, jj; //, l;
1365
1366 A->element_move(elt, eltrk1, FALSE);
1367 for (i = 0; i < A->base_len(); i++) {
1368 bi = A->base_i(i);
1369 //l = orbit_len[i];
1370
1371
1372 jj = A->element_image_of(bi, eltrk1, FALSE);
1373 //cout << "at level " << i << ", maps bi = "
1374 // << bi << " to " << jj << endl;
1375 j = orbit_inv[i][jj];
1376 if (j >= orbit_len[i]) {
1377 return FALSE;
1378 }
1379
1380 coset_rep_inv(eltrk3, i, j, 0 /* verbose_level */);
1381
1382 A->element_mult(eltrk1, eltrk3, eltrk2, FALSE);
1383 A->element_move(eltrk2, eltrk1, FALSE);
1384 }
1385 return TRUE;
1386}
1387
1389{
1391 int i, j, goi;
1392 int *elt = NEW_int(A->elt_size_in_int);
1393
1394 group_order(go);
1395 goi = go.as_int();
1396 for (i = 0; i < goi; i++) {
1397 a.create(i, __FILE__, __LINE__);
1398 element_unrank(a, elt);
1399 cout << i << " : " << endl;
1400 A->element_print(elt, cout);
1401 cout << " : ";
1402 A->element_print_as_permutation(elt, cout);
1403 element_rank(b, elt);
1404 j = b.as_int();
1405 cout << " : " << j << endl;
1406 if (i != j) {
1407 cout << "error in sims::test_element_rank_unrank" << endl;
1408 exit(1);
1409 }
1410 }
1411 FREE_int(elt);
1412}
1413
1414void sims::coset_rep(int *Elt, int i, int j, int verbose_level)
1415// computes a coset representative in
1416// transversal i which maps
1417// the i-th base point to the point
1418// which is in coset j of the i-th basic orbit.
1419// j is a coset, not a point
1420// result is in cosetrep
1421{
1422 int f_v = (verbose_level >= 1);
1423 int f_vv = (verbose_level >= 2);
1424 int bi0, bij;
1425
1426 if (f_v) {
1427 cout << "sims::coset_rep i=" << i << " j=" << j << " verbose_level=" << verbose_level << endl;
1428 }
1429
1430 bi0 = get_orbit(i, 0);
1431 bij = get_orbit(i, j);
1432 if (f_v) {
1433 cout << "sims::coset_rep bi0=" << bi0 << " bij=" << bij << endl;
1434 }
1435
1436 int depth;
1437 int *Path;
1438 int *Label;
1439 int *gen;
1440 int h, a;
1441
1442 if (f_v) {
1443 cout << "sims::coset_rep "
1444 "before compute_coset_rep_path" << endl;
1445 }
1446 compute_coset_rep_path(i, j, depth, Path, Label, verbose_level - 2);
1447 if (f_v) {
1448 cout << "sims::coset_rep "
1449 "after compute_coset_rep_path" << endl;
1450 cout << "sims::coset_rep depth=" << depth << endl;
1451 cout << "sims::coset_rep Path=";
1452 Int_vec_print(cout, Path, depth);
1453 cout << endl;
1454 cout << "sims::coset_rep Label=";
1455 Int_vec_print(cout, Label, depth);
1456 cout << endl;
1457 }
1458
1459 A->element_one(cosetrep, 0);
1460 for (h = 0; h < depth; h++) {
1461 if (f_v) {
1462 cout << "sims::coset_rep " << h << " / " << depth
1463 << " Label[" << h << "]=" << Label[h] << endl;
1464 }
1465 gen = gens.ith(Label[h]);
1466 if (f_vv) {
1467 cout << "sims::coset_rep gen=:" << endl;
1468 A->element_print_quick(gen, cout);
1469 }
1470 A->element_mult(cosetrep, gen, cosetrep_tmp, 0);
1471 A->element_move(cosetrep_tmp, cosetrep, 0);
1472 a = A->element_image_of(orbit[i][0], cosetrep,
1473 0 /* verbose_level */);
1474 if (f_vv) {
1475 cout << "sims::coset_rep cosetrep*gen=:" << endl;
1476 A->element_print_quick(cosetrep, cout);
1477 }
1478 if (f_v) {
1479 cout << "sims::coset_rep " << bi0 << " -> " << a << endl;
1480 }
1481 }
1482
1483
1484 FREE_int(Path);
1485 FREE_int(Label);
1486
1487 if (f_v) {
1488 cout << "sims::coset_rep i=" << i << " j=" << j << endl;
1489 }
1490 a = A->element_image_of(bi0, cosetrep, 0 /* verbose_level */);
1491 if (f_v) {
1492 cout << "sims::coset_rep " << bi0 << " -> " << a << endl;
1493 }
1494 if (a != bij) {
1495 cout << "sims::coset_rep a != bij" << endl;
1496 exit(1);
1497 }
1498 A->element_move(cosetrep, Elt, 0);
1499 if (f_vv) {
1500 cout << "sims::coset_rep cosetrep:" << endl;
1501 A->element_print_quick(Elt, cout);
1502 }
1503 if (f_v) {
1504 cout << "sims::coset_rep done" << endl;
1505 }
1506}
1507
1508int sims::compute_coset_rep_depth(int i, int j, int verbose_level)
1509{
1510 int f_v = (verbose_level >= 1);
1511 //int f_vv = (verbose_level >= 1);
1512 int p, depth, jj;
1513
1514 if (f_v) {
1515 cout << "sims::compute_coset_rep_depth "
1516 "i=" << i << " j=" << j << endl;
1517 }
1518 if (j >= orbit_len[i]) {
1519 cout << "sims::compute_coset_rep_depth "
1520 "fatal: j >= orbit_len[i]" << endl;
1521 cout << "sims::compute_coset_rep_depth "
1522 "i=" << i << " j=" << j << endl;
1523 cout << "orbit_len[i]=" << orbit_len[i] << endl;
1524 exit(1);
1525 }
1526 depth = 0;
1527 jj = j;
1528 while (TRUE) {
1529 p = prev[i][jj];
1530 if (p == -1) {
1531 break;
1532 }
1533 jj = orbit_inv[i][p];
1534 depth++;
1535 }
1536 if (f_v) {
1537 cout << "sims::compute_coset_rep_depth "
1538 "i=" << i << " j=" << j
1539 << " depth = " << depth << endl;
1540 }
1541 return depth;
1542}
1543
1544void sims::compute_coset_rep_path(int i, int j, int &depth,
1545 int *&Path, int *&Label,
1546 int verbose_level)
1547{
1548 int f_v = (verbose_level >= 1);
1549 int f_vv = (verbose_level >= 2);
1550 int p, d, jj;
1551
1552 if (f_v) {
1553 cout << "sims::compute_coset_rep_path "
1554 "i=" << i << " j=" << j << endl;
1555 }
1556
1557
1558 if (f_v) {
1559 cout << "sims::compute_coset_rep_path "
1560 "before compute_coset_rep_depth" << endl;
1561 }
1562 depth = compute_coset_rep_depth(i, j, verbose_level - 2);
1563 if (f_v) {
1564 cout << "sims::compute_coset_rep_path "
1565 "after compute_coset_rep_depth" << endl;
1566 }
1567
1568 if (f_v) {
1569 cout << "sims::compute_coset_rep_path "
1570 "depth = " << depth << endl;
1571 }
1572
1573
1574 Path = NEW_int(depth + 1);
1575 Label = NEW_int(depth);
1576
1577 jj = j;
1578 d = 0;
1579 while (TRUE) {
1580
1581 if (f_vv) {
1582 cout << "Path[" << depth - d
1583 << "]=" << jj << endl;
1584 }
1585 Path[depth - d] = jj;
1586
1587 p = prev[i][jj];
1588 if (f_vv) {
1589 cout << "p=" << p << endl;
1590 }
1591
1592 if (p == -1) {
1593 break;
1594 }
1595 else {
1596 if (f_vv) {
1597 cout << "Label[" << depth - 1 - d
1598 << "]=" << label[i][jj] << endl;
1599 }
1600 Label[depth - 1 - d] = label[i][jj];
1601 }
1602 jj = orbit_inv[i][p];
1603 if (f_vv) {
1604 cout << "jj=" << jj << endl;
1605 }
1606 d++;
1607 }
1608 if (d != depth) {
1609 cout << "sims::compute_coset_rep_path "
1610 "d != depth" << endl;
1611 exit(1);
1612 }
1613 if (f_vv) {
1614 cout << "sims::compute_coset_rep_path path = ";
1615 Int_vec_print(cout, Path, depth + 1);
1616 cout << endl;
1617 cout << "sims::compute_coset_rep_path label = ";
1618 Int_vec_print(cout, Label, depth);
1619 cout << endl;
1620 }
1621 if (f_v) {
1622 cout << "sims::compute_coset_rep_path "
1623 "i=" << i << " j=" << j
1624 << " depth = " << depth << " done" << endl;
1625 }
1626}
1627
1628void sims::coset_rep_inv(int *Elt, int i, int j, int verbose_level)
1629// computes the inverse element of what coset_rep computes,
1630// i.e. an element which maps the j-th point in the orbit to the
1631// i-th base point.
1632// j is a coset, not a point
1633// result is in cosetrep
1634{
1635 int f_v = (verbose_level >= 1);
1636 int f_vv = (verbose_level >= 2);
1637 int a;
1638 int bi0, bij;
1639
1640 if (f_v) {
1641 cout << "sims::coset_rep_inv i=" << i << " j=" << j << endl;
1642 }
1643
1644 bi0 = get_orbit(i, 0);
1645 bij = get_orbit(i, j);
1646 if (f_v) {
1647 cout << "sims::coset_rep_inv i=" << i << " j=" << j
1648 << " bi0=" << bi0 << " bij=" << bij << endl;
1649 }
1650
1651 if (f_v) {
1652 cout << "sims::coset_rep_inv before "
1653 "coset_rep(i,j)" << endl;
1654 }
1655 coset_rep(Elt, i, j, verbose_level - 2);
1656 if (f_v) {
1657 cout << "sims::coset_rep_inv "
1658 "coset_rep(i=" << i << " j=" << j << ") done" << endl;
1659 cout << "cosetrep:" << endl;
1660 A->element_print_quick(Elt, cout);
1661 }
1662 a = A->element_image_of(bi0, Elt, 0 /* verbose_level */);
1663 if (a != bij) {
1664
1665 cout << "sims::coset_rep_inv a != get_orbit(i, 0)" << endl;
1666 cout << "i=" << i << " j=" << j << endl;
1667 cout << "get_orbit(i, 0)=" << bi0
1668 << " get_orbit(i, j)=" << bij << endl;
1669 cout << "a=" << a << endl;
1670
1671 cout << "cosetrep:" << endl;
1672 A->element_print_quick(Elt, cout);
1673 exit(1);
1674 }
1675
1676 A->element_invert(Elt, cosetrep_tmp, 0 /* verbose_level */);
1677 A->element_move(cosetrep_tmp, Elt, 0 /* verbose_level */);
1678 if (f_vv) {
1679 cout << "cosetrep^-1=:" << endl;
1680 A->element_print_quick(Elt, cout);
1681 }
1682 a = A->element_image_of(bij, Elt, 0 /* verbose_level */);
1683 if (f_v) {
1684 cout << "cosetrep^-1 maps " << orbit[i][j]
1685 << " to " << a << endl;
1686 }
1687 if (a != bi0) {
1688 cout << "sims::coset_rep_inv a != bi0" << endl;
1689 cout << "cosetrep^-1 maps " << bij
1690 << " to " << a << endl;
1691 exit(1);
1692 }
1693
1694 if (f_vv) {
1695 cout << "cosetrep:" << endl;
1696 A->element_print_quick(Elt, cout);
1697 }
1698 if (f_v) {
1699 cout << "sims::coset_rep_inv i=" << i
1700 << " j=" << j << " done" << endl;
1701 }
1702}
1703
1706 int *tl, int verbose_level)
1707{
1708 int i, nbg, nbg1, j, k = 0, gen_idx;
1709 int f_v = (verbose_level >= 1);
1710 int f_vv = (verbose_level >= 2);
1711 //int f_vvv = (verbose_level >= 3);
1712
1713 if (f_v) {
1714 cout << "sims::extract_strong_generators_in_order" << endl;
1715 cout << "A->base_len=" << A->base_len() << endl;
1716 cout << "gens.len=" << gens.len << endl;
1717 cout << "extract_strong_generators_in_order nb_gen=" << endl;
1718 Int_vec_print(cout, nb_gen, A->base_len() + 1);
1719 cout << endl;
1720 cout << "extract_strong_generators_in_order gen_perm=" << endl;
1722 cout << endl;
1724 //if (f_vv) {
1725 //print(0);
1726 //}
1727 }
1728
1729 SG.init(A, verbose_level - 2);
1730 SG.allocate(gens.len, verbose_level - 2);
1731 for (i = A->base_len() - 1; i >= 0; i--) {
1732 if (f_v) {
1733 cout << "sims::extract_strong_generators_in_order "
1734 "level i=" << i << endl;
1735 }
1736 nbg = nb_gen[i];
1737 nbg1 = nb_gen[i + 1];
1738 //cout << "i=" << i << " nbg1=" << nbg1
1739 // << " nbg=" << nbg << endl;
1740 if (f_v) {
1741 cout << "sims::extract_strong_generators_in_order level i=" << i
1742 << " nbg1=" << nbg1 << " nbg=" << nbg << endl;
1743 }
1744 for (j = nbg1; j < nbg; j++) {
1745 gen_idx = gen_perm[j];
1746 //cout << "gen_idx=" << gen_idx << endl;
1747 if (f_v) {
1748 cout << "sims::extract_strong_generators_in_order "
1749 "the " << k << "-th strong generator "
1750 "is generator "
1751 << j << " at position " << gen_idx << endl;
1752
1753 cout << "moving generator " << gen_idx
1754 << " to position " << k << endl;
1755 cout << "before:" << endl;
1756 A->element_print(gens.ith(gen_idx), cout);
1757 cout << endl;
1758 }
1759 A->element_move(gens.ith(gen_idx), SG.ith(k), FALSE);
1760 if (f_vv) {
1761 cout << "sims::extract_strong_generators_in_order "
1762 "the " << k << "-th strong "
1763 "generator is generator "
1764 << j << " at position " << gen_idx << endl;
1765 A->element_print(SG.ith(k), cout);
1766 cout << endl;
1767 }
1768 k++;
1769 }
1770 tl[i] = orbit_len[i];
1771 }
1772 if (k < SG.len) {
1773 cout << "sims::extract_strong_generators_in_order warning" << endl;
1774 cout << "k = " << k << endl;
1775 cout << "SG.len = " << SG.len << endl;
1776 SG.len = k;
1777 exit(1);
1778 }
1779 if (f_v) {
1780 cout << "sims::extract_strong_generators_in_order done, "
1781 "found " << SG.len << " strong generators" << endl;
1782 }
1783 if (f_v) {
1784 cout << "sims::extract_strong_generators_in_order" << endl;
1785 cout << "transversal length:" << endl;
1786 for (i = 0; i < A->base_len(); i++) {
1787 cout << tl[i];
1788 if (i < A->base_len() - 1) {
1789 cout << ", ";
1790 }
1791 }
1792 cout << endl;
1793 cout << "sims::extract_strong_generators_in_order "
1794 "strong generators are:" << endl;
1795 SG.print(cout);
1796 cout << endl;
1797 }
1798 if (f_v) {
1799 cout << "sims::extract_strong_generators_in_order done" << endl;
1800 }
1801}
1802
1803void sims::random_schreier_generator(int *Elt, int verbose_level)
1804// computes random Schreier generator
1805{
1806 int i, r1, r2, pt, pt1, pt1b, pt2, pt2_coset;
1807 int *gen, gen_idx, nbg;
1808 int f_v = (verbose_level >= 1);
1809 int f_vv = (verbose_level >= 2);
1810 int f_vvv = (verbose_level >= 3);
1812
1813 if (f_v) {
1814 cout << "sims:random_schreier_generator" << endl;
1815 cout << "sims:random_schreier_generator my_base_len=" << my_base_len << endl;
1816 cout << "sims:random_schreier_generator orbit_len=";
1817 Int_vec_print(cout, orbit_len, my_base_len);
1818 cout << endl;
1819 cout << "sims:random_schreier_generator base:" << endl;
1820 for (i = 0; i < my_base_len; i++) {
1821 cout << i << " : " << get_orbit(i, 0) << endl;
1822 }
1823 }
1824 if (nb_gen[0] == 0) {
1825 if (f_vv) {
1826 cout << "sims::random_schreier_generator "
1827 "nb_gen[0] == 0, choosing the identity" << endl;
1828 }
1829 A->element_one(Elt, 0 /* verbose_level */);
1830 goto finish;
1831 }
1832 while (TRUE) {
1833 if (f_vv) {
1834 cout << "sims::random_schreier_generator "
1835 "iteration" << endl;
1836 cout << "sims:random_schreier_generator orbit_len=";
1837 Int_vec_print(cout, orbit_len, my_base_len);
1838 cout << endl;
1839 }
1840 // get a random level:
1842 pt = get_orbit(i, 0);
1843 if (f_vv) {
1844 cout << "sims::random_schreier_generator "
1845 "i=" << i << " orbit_len[i]=" << orbit_len[i]
1846 << " base_pt=" << pt << " nb_gen[i]=" << nb_gen[i] << endl;
1847 }
1848
1849 // get a random coset:
1850 r1 = Os.random_integer(orbit_len[i]);
1851 pt1 = get_orbit(i, r1);
1852 if (f_vv) {
1853 cout << "sims::random_schreier_generator "
1854 "picking coset r1=" << r1 << " / " << orbit_len[i]
1855 << " with image point " << pt1 << endl;
1856 }
1857 if (f_vv) {
1858 cout << "sims::random_schreier_generator "
1859 "random level " << i << ", base pt " << pt
1860 << ", random coset " << r1 << " of an orbit of length "
1861 << orbit_len[i] << ", image pt " << pt1 << endl;
1862 }
1863 if (f_vv) {
1864 cout << "sims::random_schreier_generator "
1865 "before coset_rep" << endl;
1866 }
1867
1868 coset_rep(eltrk3, i, r1, verbose_level - 2);
1869 if (f_vv) {
1870 cout << "sims::random_schreier_generator "
1871 "after coset_rep" << endl;
1872 cout << "checking image of pt=" << pt << endl;
1873 }
1874 pt1b = A->element_image_of(pt, eltrk3, 0/*verbose_level*/);
1875
1876 if (f_vvv) {
1877 cout << "sims::random_schreier_generator "
1878 "coset rep maps " << pt << " to " << pt1b << endl;
1879 }
1880 if (pt1b != pt1) {
1881 cout << "sims::random_schreier_generator "
1882 "fatal: not the same point" << endl;
1883 cout << "action " << A->label << endl;
1884 cout << "level i=" << i << endl;
1885 cout << "coset r1=" << r1 << endl;
1886 cout << "base pt=" << pt << endl;
1887 cout << "image pt1=" << pt1 << endl;
1888 cout << "image under cosetrep pt1b=" << pt1b << endl;
1889 cout << "basic orbit " << i << ":" << endl;
1891 pt1b = A->element_image_of(pt, eltrk3, FALSE);
1892 cout << "cosetrep:" << endl;
1893 A->element_print(eltrk3, cout);
1894 cout << endl;
1895 coset_rep(eltrk3, i, r1, 10 /* verbose_level */);
1896 exit(1);
1897 }
1898
1899 // get a random generator:
1900 nbg = nb_gen[i];
1901 if (nbg == 0) {
1902 continue;
1903 }
1904 r2 = Os.random_integer(nbg);
1905 if (f_vv) {
1906 cout << "sims::random_schreier_generator picking "
1907 "generator " << r2 << " / " << nbg << endl;
1908 }
1909 gen_idx = gen_perm[r2];
1910 if (f_vv) {
1911 cout << "sims::random_schreier_generator picking "
1912 "generator " << r2 << " / " << nbg
1913 << " gen_idx=" << gen_idx << endl;
1914 }
1915 gen = gens.ith(gen_idx);
1916 if (f_vvv) {
1917 cout << "sims::random_schreier_generator "
1918 "random level " << i << ", random coset " << r1
1919 << ", random generator " << r2
1920 << " of " << nb_gen[i] << endl;
1921 cout << "sims::random_schreier_generator "
1922 "gen = " << endl;
1923 A->element_print(gen, cout);
1924 }
1925 break;
1926 }
1927
1928 if (f_vv) {
1929 cout << "sims::random_schreier_generator "
1930 "after the while loop" << endl;
1931 cout << "cosetrep:" << endl;
1932 //A->element_print(eltrk3, cout);
1933 cout << "maps " << pt << " to " << pt1
1934 << " : checking: " << pt << " -> ";
1935 pt1b = A->element_image_of(pt, eltrk3, FALSE);
1936 cout << pt1b;
1937 cout << endl;
1938 }
1939
1940 if (f_vv) {
1941 cout << "sims::random_schreier_generator "
1942 "after the while loop" << endl;
1943 cout << "gen=" << endl;
1944 A->element_print(gen, cout);
1945 }
1946 A->element_mult(eltrk3, gen, schreier_gen1, 0);
1947 if (f_vv) {
1948 cout << "sims::random_schreier_generator "
1949 "after the while loop" << endl;
1950 cout << "sims::random_schreier_generator cosetrep * gen=" << endl;
1951 //A->element_print(schreier_gen1, cout);
1952 }
1953 pt2 = A->element_image_of(pt, schreier_gen1, 0);
1954
1955
1956 if (f_vv) {
1957 cout << "sims::random_schreier_generator cosetrep * gen maps " << pt
1958 << " to " << pt2 << endl;
1959 }
1960
1961
1962 //cout << "maps " << pt << " to " << pt2 << endl;
1963 pt2_coset = orbit_inv[i][pt2];
1964
1965 if (f_vv) {
1966 cout << "sims::random_schreier_generator pt2_coset = " << pt2_coset << endl;
1967 }
1968
1969 if (pt2_coset >= orbit_len[i]) {
1970
1971
1972 A->element_move(schreier_gen1, Elt, 0);
1973 cout << "sims::random_schreier_generator schreier generator is " << endl;
1974 A->element_print(Elt, cout);
1975 cout << endl;
1976
1977 if (f_v) {
1978 cout << "sims::random_schreier_generator done early" << endl;
1979 }
1980 return;
1981
1982#if 0
1983 cout << "sims::random_schreier_generator "
1984 "fatal: additional pt " << pt2 << " reached from "
1985 << pt << " under generator " << i << endl;
1986 print(TRUE);
1987 cout << "level = " << i << endl;
1988 cout << "coset1 = " << r1 << endl;
1989 cout << "generator = " << r2 << endl;
1990 cout << "pt2 = " << pt2 << endl;
1991 cout << "coset2 = " << pt2_coset << endl;
1992 cout << "orbit_len = " << orbit_len[i] << endl;
1993 cout << "cosetrep: " << endl;
1994 A->element_print(cosetrep, cout);
1995 cout << endl;
1996 cout << "gen: " << endl;
1997 A->element_print(gen, cout);
1998 cout << endl;
1999 exit(1);
2000#endif
2001
2002 }
2003
2004 coset_rep_inv(eltrk3, i, pt2_coset, 0 /*verbose_level - 2*/);
2005
2006 if (f_vv) {
2007 cout << "sims::random_schreier_generator cosetrep(" << pt2 << ")^-1=" << endl;
2008 A->element_print(eltrk3, cout);
2009 }
2010 int pt2b;
2011
2012 pt2b = A->element_image_of(pt2, eltrk3, FALSE);
2013 if (f_vv) {
2014 cout << "sims::random_schreier_generator cosetrep(" << pt2 << ")^-1 maps "
2015 << pt2 << " to " << pt2b << endl;
2016 }
2017 if (pt2b != pt) {
2018 cout << "sims::random_schreier_generator "
2019 "pt2b != pt" << endl;
2020 cout << "cosetrep(" << pt2 << ")^-1 maps "
2021 << pt2 << " to " << pt2b << endl;
2022 cout << "pt=" << pt << endl;
2023 exit(1);
2024 }
2025
2026 A->element_mult(schreier_gen1, eltrk3, schreier_gen, 0);
2027 if (f_vv) {
2028 cout << "sims::random_schreier_generator "
2029 "after the while loop" << endl;
2030 cout << "cosetrep * gen * cosetrep("
2031 << pt2 << ")^-1=" << endl;
2032 A->element_print(schreier_gen, cout);
2033 }
2034
2035 if (A->element_image_of(pt, schreier_gen, 0) != pt) {
2036 int im;
2037
2038 cout << "sims::random_schreier_generator() "
2039 "fatal: schreier generator does not stabilize pt" << endl;
2040 cout << "pt=" << pt << endl;
2041 cout << "schreier generator:" << endl;
2042 A->element_print(schreier_gen, cout);
2043 im = A->element_image_of(pt, schreier_gen, TRUE);
2044 cout << "im = " << im << endl;
2045 exit(1);
2046 }
2047 A->element_move(schreier_gen, Elt, 0);
2048
2049finish:
2050 if (f_vv) {
2051 cout << "sims::random_schreier_generator "
2052 "random Schreier generator:" << endl;
2053 A->element_print(Elt, cout);
2054 }
2055 if (f_v) {
2056 cout << "sims::random_schreier_generator done" << endl;
2057 }
2058}
2059
2061 long int elt_rk, int *perm, int verbose_level)
2062{
2063 int f_v = (verbose_level >= 1);
2064
2065 if (f_v) {
2066 cout << "sims::element_as_permutation" << endl;
2067 }
2068 int *Elt;
2069
2070 Elt = NEW_int(A->elt_size_in_int);
2071
2072 element_unrank_lint(elt_rk, Elt);
2073
2074 A_special->element_as_permutation(Elt, perm, 0);
2075
2076
2077 FREE_int(Elt);
2078 if (f_v) {
2079 cout << "sims::element_as_permutation done" << endl;
2080 }
2081}
2082
2083
2084int sims::least_moved_point_at_level(int lvl, int verbose_level)
2085// returns -1 if there are no generators
2086{
2087 int f_v = (verbose_level >= 1);
2088 int f_vv = (verbose_level >= 2);
2089 int i, j, h, nbg, gen_idx, least_moved_point = -1;
2090
2091 if (f_v) {
2092 cout << "sims::least_moved_point_at_level lvl=" << lvl << endl;
2093 }
2094 nbg = nb_gen[lvl];
2095 if (f_v) {
2096 cout << "sims::least_moved_point_at_level nbg=" << nbg << endl;
2097 }
2098 for (h = 0; h < nbg; h++) {
2099 gen_idx = gen_perm[h];
2100 if (f_vv) {
2101 cout << "sims::least_moved_point_at_level h=" << h << endl;
2102 cout << "gen_idx=" << gen_idx << endl;
2103 A->element_print_quick(gens.ith(gen_idx), cout);
2104 }
2105 for (i = 0; i < A->degree; i++) {
2106 j = A->element_image_of(i, gens.ith(gen_idx), 0);
2107 if (j != i) {
2108 break;
2109 }
2110 }
2111 if (i < A->degree) {
2112 if (least_moved_point == -1 || i < least_moved_point) {
2113 least_moved_point = i;
2114 }
2115 }
2116 }
2117 if (f_v) {
2118 cout << "sims::least_moved_point_at_level lvl = "
2119 << lvl << ", least moved point = "
2120 << least_moved_point << endl;
2121 }
2122 return least_moved_point;
2123}
2124
2125int sims::get_orbit(int i, int j)
2126{
2127 if (orbit == NULL) {
2128 cout << "sims::get_orbit orbit == NULL i=" << i << " j=" << j << endl;
2129 exit(1);
2130 }
2131 if (i < 0 || i >= my_base_len) {
2132 cout << "sims::get_orbit i < 0 || i >= A->base_len(), i = " << i << endl;
2133 cout << "my_base_len=" << my_base_len << endl;
2134 exit(1);
2135 }
2136 if (orbit[i] == NULL) {
2137 cout << "sims::get_orbit orbit[i] == NULL i=" << i << " j=" << j << endl;
2138 exit(1);
2139 }
2140#if 1
2141 if (j >= transversal_length) {
2142 cout << "sims::get_orbit j >= transversal_length" << endl;
2143 cout << "j=" << j << endl;
2144 cout << "transversal_length=" << transversal_length << endl;
2145 exit(1);
2146 }
2147#endif
2148 return orbit[i][j];
2149}
2150
2151int sims::get_orbit_inv(int i, int j)
2152{
2153 if (orbit_inv == NULL) {
2154 cout << "sims::get_orbit_inv orbit_inv == NULL i=" << i << " j=" << j << endl;
2155 exit(1);
2156 }
2157 if (i < 0 || i >= my_base_len) {
2158 cout << "sims::get_orbit i < 0 || i >= my_base_len, i = " << i << endl;
2159 cout << "my_base_len=" << my_base_len << endl;
2160 exit(1);
2161 }
2162 if (orbit_inv[i] == NULL) {
2163 cout << "sims::get_orbit_inv orbit_inv[i] == NULL i=" << i << " j=" << j << endl;
2164 exit(1);
2165 }
2166#if 1
2167 if (j >= transversal_length) {
2168 cout << "sims::get_orbit_inv j >= transversal_length" << endl;
2169 cout << "j=" << j << endl;
2170 cout << "transversal_length=" << transversal_length << endl;
2171 exit(1);
2172 }
2173#endif
2174 return orbit_inv[i][j];
2175}
2176
2178{
2179 if (i < 0 || i >= my_base_len) {
2180 cout << "sims::get_orbit_length i < 0 || i >= my_base_len, i = " << i << endl;
2181 cout << "my_base_len=" << my_base_len << endl;
2182 exit(1);
2183 }
2184 return orbit_len[i];
2185}
2186
2187void sims::get_orbit(int orbit_idx, std::vector<int> &Orb, int verbose_level)
2188{
2189 int f_v = (verbose_level >= 1);
2190
2191 if (f_v) {
2192 cout << "sims::get_orbit" << endl;
2193 }
2194 int len, i;
2195
2196 len = orbit_len[orbit_idx];
2197 for (i = 0; i < len; i++) {
2198 Orb.push_back(orbit[orbit_idx][i]);
2199 }
2200 if (f_v) {
2201 cout << "sims::get_orbit done" << endl;
2202 }
2203}
2204
2206 data_structures_groups::vector_ge *&vec, int verbose_level)
2207{
2208
2209 int f_v = (verbose_level >= 1);
2210
2211 if (f_v) {
2212 cout << "sims::all_elements" << endl;
2213 }
2214
2216 long int i, goi;
2217
2218 group_order(go);
2219 goi = go.as_int();
2220
2222 vec->init(A, 0 /*verbose_level*/);
2223 vec->allocate(goi, verbose_level);
2224
2225
2226 for (i = 0; i < goi; i++) {
2227 element_unrank_lint(i, vec->ith(i));
2228 }
2229
2230 if (f_v) {
2231 cout << "sims::all_elements done" << endl;
2232 }
2233}
2234
2235
2236void sims::all_elements_save_csv(std::string &fname, int verbose_level)
2237{
2238
2239 int f_v = (verbose_level >= 1);
2241
2242 if (f_v) {
2243 cout << "sims::all_elements_save_csv" << endl;
2244 }
2245
2247
2248 all_elements(vec, verbose_level);
2249
2250
2251 vec->save_csv(fname, verbose_level);
2252 if (f_v) {
2253 cout << "sims::all_elements_save_csv Written file " << fname << " of size " << Fio.file_size(fname) << endl;
2254 }
2255
2256 FREE_OBJECT(vec);
2257
2258 if (f_v) {
2259 cout << "sims::all_elements_save_csv done" << endl;
2260 }
2261}
2262
2263
2264}}}
2265
2266
2267
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)
void add(longinteger_object &a, longinteger_object &b, longinteger_object &c)
void integral_division_by_int(longinteger_object &a, int b, longinteger_object &q, int &r)
void mult(longinteger_object &a, longinteger_object &b, longinteger_object &c)
a class to represent arbitrary precision integers
Definition: ring_theory.h:366
void create(long int i, const char *file, int line)
a permutation group in a fixed action.
Definition: actions.h:99
void element_print_quick(void *elt, std::ostream &ost)
Definition: action_cb.cpp:353
void element_print(void *elt, std::ostream &ost)
Definition: action_cb.cpp:347
void element_retrieve(int hdl, void *elt, int verbose_level)
Definition: action_cb.cpp:301
void element_mult(void *a, void *b, void *ab, int verbose_level)
Definition: action_cb.cpp:315
stabilizer_chain_base_data * Stabilizer_chain
Definition: actions.h:178
void element_invert(void *a, void *av, int verbose_level)
Definition: action_cb.cpp:322
void element_one(void *elt, int verbose_level)
Definition: action_cb.cpp:224
void element_as_permutation(void *elt, int *perm, int verbose_level)
Definition: action_cb.cpp:436
void element_move(void *a, void *b, int verbose_level)
Definition: action_cb.cpp:335
groups::sims * create_sims_from_single_generator_without_target_group_order(int *Elt, int verbose_level)
void element_print_as_permutation(void *elt, std::ostream &ost)
Definition: action_cb.cpp:421
long int element_image_of(long int a, void *elt, int verbose_level)
Definition: action_cb.cpp:198
void save_csv(std::string &fname, int verbose_level)
Definition: vector_ge.cpp:751
void init(actions::action *A, int verbose_level)
Definition: vector_ge.cpp:55
a permutation group represented via a stabilizer chain
Definition: groups.h:1273
void init_trivial_orbit(int i, int verbose_level)
Definition: sims.cpp:620
void element_unrank(ring_theory::longinteger_object &a, int *elt, int verbose_level)
Definition: sims.cpp:1213
void coset_rep_inv(int *Elt, int i, int j, int verbose_level_le)
Definition: sims.cpp:1628
void init_cyclic_group_from_generator(actions::action *A, int *Elt, int verbose_level)
Definition: sims.cpp:378
void element_rank(ring_theory::longinteger_object &a, int *elt)
Definition: sims.cpp:1276
void element_from_path(int *elt, int verbose_level)
Definition: sims.cpp:1108
void swap_points(int lvl, int i, int j)
Definition: sims.cpp:1069
void init(actions::action *A, int verbose_level)
Definition: sims.cpp:289
void extract_strong_generators_in_order(data_structures_groups::vector_ge &SG, int *tl, int verbose_level)
Definition: sims.cpp:1704
void group_order(ring_theory::longinteger_object &go)
Definition: sims.cpp:951
void compute_coset_rep_path(int i, int j, int &depth, int *&Path, int *&Label, int verbose_level)
Definition: sims.cpp:1544
void init_trivial_group(int verbose_level)
Definition: sims.cpp:584
void element_as_permutation(actions::action *A_special, long int elt_rk, int *perm, int verbose_level)
Definition: sims.cpp:2060
int least_moved_point_at_level(int lvl, int verbose_level)
Definition: sims.cpp:2084
int get_image(int i, int gen_idx)
Definition: sims.cpp:1037
void initialize_table(int i, int verbose_level)
Definition: sims.cpp:563
void init_generators_by_hdl(int nb_gen, int *gen_hdl, int verbose_level)
Definition: sims.cpp:723
void group_order_verbose(ring_theory::longinteger_object &go, int verbose_level)
Definition: sims.cpp:964
void all_elements(data_structures_groups::vector_ge *&vec, int verbose_level)
Definition: sims.cpp:2205
void subgroup_order_verbose(ring_theory::longinteger_object &go, int level, int verbose_level)
Definition: sims.cpp:984
int compute_coset_rep_depth(int i, int j, int verbose_level)
Definition: sims.cpp:1508
data_structures_groups::vector_ge gens
Definition: groups.h:1280
void element_unrank_lint(long int rk, int *Elt, int verbose_level)
Definition: sims.cpp:1326
void add_generator(int *elt, int verbose_level)
Definition: sims.cpp:803
void random_schreier_generator(int *Elt, int verbose_level)
Definition: sims.cpp:1803
void coset_rep(int *Elt, int i, int j, int verbose_level)
Definition: sims.cpp:1414
void all_elements_save_csv(std::string &fname, int verbose_level)
Definition: sims.cpp:2236
data_structures_groups::vector_ge gens_inv
Definition: groups.h:1281
void reallocate_base(int old_base_len, int verbose_level)
Definition: sims.cpp:445
void init_generators(data_structures_groups::vector_ge &generators, int verbose_level)
Definition: sims.cpp:660
void init_without_base(actions::action *A, int verbose_level)
Definition: sims.cpp:400
void init_generator_depth_and_perm(int verbose_level)
Definition: sims.cpp:747
#define FREE_int(p)
Definition: foundations.h:640
#define NEW_pint(n)
Definition: foundations.h:627
#define NEW_OBJECT(type)
Definition: foundations.h:638
#define Lint_vec_print(A, B, C)
Definition: foundations.h:686
#define FREE_OBJECT(p)
Definition: foundations.h:651
#define NEW_int(n)
Definition: foundations.h:625
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define FREE_pint(p)
Definition: foundations.h:641
#define Int_vec_print(A, B, C)
Definition: foundations.h:685
the orbiter library for the classification of combinatorial objects