Orbiter 2022
Combinatorial Objects
strong_generators.cpp
Go to the documentation of this file.
1// strong_generators.cpp
2//
3// Anton Betten
4// December 4, 2013
5
7#include "group_actions.h"
8
9
10using namespace std;
11
12
13namespace orbiter {
14namespace layer3_group_actions {
15namespace groups {
16
17
18
20{
21 null();
22}
23
25{
26 freeself();
27}
28
30{
31 A = NULL;
32 tl = NULL;
33 gens = NULL;
34}
35
37{
38 if (tl) {
39 FREE_int(tl);
40 }
41 if (gens) {
43 }
44 null();
45}
46
48{
49 actions::action *my_A;
50 int *my_tl;
52
53 my_A = A;
54 A = SG->A;
55 SG->A = my_A;
56
57 my_tl = tl;
58 tl = SG->tl;
59 SG->tl = my_tl;
60
61 my_gens = gens;
62 gens = SG->gens;
63 SG->gens = my_gens;
64
65}
66
68{
69 init(A, 0);
70}
71
72void strong_generators::init(actions::action *A, int verbose_level)
73{
74 int f_v = (verbose_level >= 1);
75
76 if (f_v) {
77 cout << "strong_generators::init" << endl;
78 }
80 if (f_v) {
81 cout << "strong_generators::init done" << endl;
82 }
83}
84
86{
87 int f_v = (verbose_level >= 1);
88 //int f_vv = (verbose_level >= 2);
89
90 if (f_v) {
91 cout << "strong_generators::init_from_sims" << endl;
92 cout << "action = " << S->A->label << endl;
93 cout << "base_len = " << S->A->base_len() << endl;
94 }
95 A = S->A;
96 tl = NEW_int(A->base_len());
98 if (f_v) {
99 cout << "strong_generators::init_from_sims before "
100 "S->extract_strong_generators_in_order" << endl;
101 }
103 verbose_level - 5);
104 if (f_v) {
105 cout << "strong_generators::init_from_sims after "
106 "S->extract_strong_generators_in_order" << endl;
107 cout << "strong_generators::init_from_sims tl=";
108 Int_vec_print(cout, tl, A->base_len());
109 cout << endl;
110 }
111 if (f_v) {
112 cout << "strong_generators::init_from_sims done" << endl;
113 }
114}
115
117 char *ascii_coding, int verbose_level)
118{
119 int f_v = (verbose_level >= 1);
120 int f_vv = (verbose_level >= 2);
123
124 if (f_v) {
125 cout << "strong_generators::init_from_ascii_coding" << endl;
126 }
128 G->init(A, verbose_level - 2);
129 if (f_vv) {
130 cout << "strong_generators::init_from_ascii_coding "
131 "before G->init_ascii_coding_to_sims" << endl;
132 }
133 G->init_ascii_coding_to_sims(ascii_coding, verbose_level - 2);
134 if (f_vv) {
135 cout << "strong_generators::init_from_ascii_coding "
136 "after G->init_ascii_coding_to_sims" << endl;
137 }
138
139
140 G->S->group_order(go);
141
142 if (f_vv) {
143 cout << "strong_generators::init_from_ascii_coding "
144 "Group order=" << go << endl;
145 }
146
147 init_from_sims(G->S, 0 /* verbose_level */);
148
149 FREE_OBJECT(G);
150 if (f_v) {
151 cout << "strong_generators::init_from_ascii_coding "
152 "done" << endl;
153 }
154}
155
156
158{
160
162 S->init_copy(this, 0);
163 return S;
164}
165
167 int verbose_level)
168{
169 int f_v = (verbose_level >= 1);
170 //int f_vv = (verbose_level >= 2);
171 int i;
172
173 if (f_v) {
174 cout << "strong_generators::init_copy" << endl;
175 }
176 A = S->A;
177 tl = NEW_int(A->base_len());
178 //cout << "strong_generators::init_copy before int_vec_copy" << endl;
179 Int_vec_copy(S->tl, tl, A->base_len());
181 gens->init(A, verbose_level - 2);
182 gens->allocate(S->gens->len, verbose_level - 2);
183 for (i = 0; i < S->gens->len; i++) {
184 //cout << "strong_generators::init_copy before
185 // element_move i=" << i << endl;
186 A->element_move(S->gens->ith(i), gens->ith(i), 0);
187 }
188 if (f_v) {
189 cout << "strong_generators::init_copy done" << endl;
190 }
191}
192
194 std::vector<int> &gen_handle,
195 std::vector<int> &tl,
196 int verbose_level)
197{
198 int f_v = (verbose_level >= 1);
199 int i;
200
201 if (f_v) {
202 cout << "strong_generators::init_by_hdl_and_with_tl" << endl;
203 }
204
205
206 init(A, 0);
208 for (i = 0; i < A->base_len(); i++) {
210 }
212 gens->init(A, verbose_level - 2);
213 gens->allocate(gen_handle.size(), verbose_level - 2);
214 for (i = 0; i < gen_handle.size(); i++) {
215 A->element_retrieve(gen_handle[i], gens->ith(i), 0);
216 }
217
218
219 if (f_v) {
220 cout << "strong_generators::init_by_hdl_and_with_tl done" << endl;
221 }
222}
223
224
226 int *gen_hdl, int nb_gen, int verbose_level)
227{
228 int f_v = (verbose_level >= 1);
229 int i;
230
231 if (f_v) {
232 cout << "strong_generators::init_by_hdl" << endl;
233 }
234 init(A, 0);
235 tl = NEW_int(A->base_len());
236 for (i = 0; i < A->base_len(); i++) {
237 tl[i] = 1;
238 }
240 gens->init(A, verbose_level - 2);
241 gens->allocate(nb_gen, verbose_level - 2);
242 for (i = 0; i < nb_gen; i++) {
243 A->element_retrieve(gen_hdl[i], gens->ith(i), 0);
244 }
245 if (f_v) {
246 cout << "strong_generators::init_by_hdl done" << endl;
247 }
248}
249
251 actions::action *A, sims *parent_group_S, int *data,
252 int nb_elements, long int group_order, data_structures_groups::vector_ge *&nice_gens,
253 int verbose_level)
254{
255 int f_v = (verbose_level >= 1);
256
257 if (f_v) {
258 cout << "strong_generators::init_from_permutation_representation" << endl;
259 }
260 if (group_order == 0) {
261 cout << "strong_generators::init_from_permutation_representation "
262 "group_order == 0" << endl;
263 exit(1);
264 }
265 if (group_order < 0) {
266 cout << "strong_generators::init_from_permutation_representation "
267 "group_order < 0" << endl;
268 cout << "group_order=" << group_order << endl;
269 exit(1);
270 }
271 init(A, verbose_level - 2);
272
273 //vector_ge *nice_gens;
275
276 if (f_v) {
277 cout << "strong_generators::init_from_permutation_representation "
278 "before nice_gens->init_from_permutation_representation" << endl;
279 }
280 nice_gens->init_from_permutation_representation(A, parent_group_S, data,
281 nb_elements, verbose_level - 3);
282 if (f_v) {
283 cout << "strong_generators::init_from_permutation_representation "
284 "after nice_gens->init_from_permutation_representation" << endl;
285 }
286
287 sims *S;
288
289 if (f_v) {
290 cout << "strong_generators::init_from_permutation_representation before "
291 "A->create_sims_from_generators_with_target_group_order_int" << endl;
292 }
294 nice_gens, group_order, verbose_level - 3);
295 if (f_v) {
296 cout << "strong_generators::init_from_permutation_representation after "
297 "A->create_sims_from_generators_with_target_group_order_int" << endl;
298 }
299
300 if (f_v) {
301 cout << "strong_generators::init_from_permutation_representation "
302 "before init_from_sims" << endl;
303 }
304 init_from_sims(S, verbose_level - 3);
305 if (f_v) {
306 cout << "strong_generators::init_from_permutation_representation "
307 "after init_from_sims" << endl;
308 }
309
310 //tl = NEW_int(A->base_len);
311 //int_vec_copy(transversal_length, tl, A->base_len);
312
313 //FREE_OBJECT(my_gens);
314 if (f_v) {
315 cout << "strong_generators::init_from_permutation_representation "
316 "done, found a group of order " << group_order << endl;
317 }
318}
319
321 int nb_elements, int elt_size, int *transversal_length,
323 int verbose_level)
324{
325 int f_v = (verbose_level >= 1);
326
327 if (f_v) {
328 cout << "strong_generators::init_from_data" << endl;
329 }
330 init(A, verbose_level - 2);
333
334 gens->init_from_data(A, data,
335 nb_elements, elt_size, verbose_level);
336
337 nice_gens->init_from_data(A, data,
338 nb_elements, elt_size, verbose_level);
339
340 tl = NEW_int(A->base_len());
341 Int_vec_copy(transversal_length, tl, A->base_len());
342
343 if (f_v) {
344 cout << "strong_generators::init_from_data done" << endl;
345 }
346}
347
349 actions::action *A, int *data,
350 int nb_elements, int elt_size, const char *ascii_target_go,
352 int verbose_level)
353{
354 int f_v = (verbose_level >= 1);
356
357 if (f_v) {
358 cout << "strong_generators::init_from_data_with_target_go_ascii" << endl;
359 }
361 target_go.create_from_base_10_string(ascii_target_go);
362 if (f_v) {
363 cout << "strong_generators::init_from_data_with_target_go_ascii before init_from_data_with_target_go" << endl;
364 }
366 elt_size, nb_elements, target_go,
367 nice_gens,
368 verbose_level);
369 if (f_v) {
370 cout << "strong_generators::init_from_data_with_target_go_ascii after init_from_data_with_target_go" << endl;
371 }
372 if (f_v) {
373 cout << "strong_generators::init_from_data_with_target_go_ascii done" << endl;
374 }
375}
376
378 actions::action *A, int *data_gens,
379 int data_gens_size, int nb_gens,
382 int verbose_level)
383{
384 int f_v = (verbose_level >= 1);
385 int i;
386
387 if (f_v) {
388 cout << "strong_generators::init_from_data_with_target_go" << endl;
389 }
390
392
393 //vector_ge *my_gens;
394
396 nice_gens->init(A, verbose_level - 2);
397 nice_gens->allocate(nb_gens, verbose_level - 2);
398 for (i = 0; i < nb_gens; i++) {
399 if (f_v) {
400 cout << "strong_generators::init_from_data_with_target_go "
401 << i << " / " << nb_gens << endl;
402 }
403
404 A->make_element(nice_gens->ith(i),
405 data_gens + i * data_gens_size,
406 verbose_level);
407 }
408 if (f_v) {
409 cout << "strong_generators::init_from_data_with_target_go "
410 "generators are:" << endl;
411 nice_gens->print_quick(cout);
412 }
413
415
417
418 if (f_v) {
419 cout << "strong_generators::init_from_data_with_target_go before A->generators_to_strong_generators" << endl;
420 }
422 TRUE /* f_target_go */, target_go,
423 nice_gens, SG,
424 verbose_level - 1);
425 if (f_v) {
426 cout << "strong_generators::init_from_data_with_target_go after A->generators_to_strong_generators" << endl;
427 }
428
429 if (f_v) {
430 cout << "strong_generators::init_from_data_with_target_go "
431 "strong generators are:" << endl;
432 SG->print_generators(cout);
433 }
434
435 //FREE_OBJECT(my_gens);
436
437 if (gens) {
439 }
440 gens = SG->gens;
441 SG->gens = NULL;
442 if (tl) {
443 FREE_int(tl);
444 }
445 tl = SG->tl;
446 SG->tl = NULL;
447
448 FREE_OBJECT(SG);
449
450 if (f_v) {
451 cout << "strong_generators::init_from_data_with_target_go done" << endl;
452 }
453}
454
456 actions::action *A, std::string &generators_data,
457 std::string &go_text,
458 int verbose_level)
459{
460 int f_v = (verbose_level >= 1);
461 //int i;
462
463 if (f_v) {
464 cout << "strong_generators::init_from_data_with_go" << endl;
465 }
466
467
468 int *gens_data;
469 int gens_data_sz;
470 int nb_elements;
471
472 Int_vec_scan(generators_data, gens_data, gens_data_sz);
473 cout << "gens_data = ";
474 Int_vec_print(cout, gens_data, gens_data_sz);
475 cout << endl;
476 cout << "go_text = " << go_text << endl;
477
478
479 init(A);
480
481
482 nb_elements = gens_data_sz / A->make_element_size;
483
484 //strong_generators *Gens;
486 //int orbit_length;
487
488 //Gens = NEW_OBJECT(strong_generators);
489
490 cout << "before SG->init_from_data_with_target_go_ascii" << endl;
492 gens_data,
493 nb_elements, A->make_element_size,
494 go_text.c_str(),
495 nice_gens,
496 verbose_level);
497
498
499 FREE_OBJECT(nice_gens);
500
501 if (f_v) {
502 cout << "strong_generators::init_from_data_with_go done" << endl;
503 }
504
505}
506void
508 schreier *Sch,
509 int pt, int &orbit_idx, ring_theory::longinteger_object &full_group_order,
510 int verbose_level)
511{
512 int f_v = (verbose_level >= 1);
513 int *Elt;
515
516 if (f_v) {
517 cout << "strong_generators::init_point_stabilizer_of_arbitrary_"
518 "point_through_schreier" << endl;
519 }
520 Elt = NEW_int(A->elt_size_in_int);
521 Sch->transporter_from_point_to_orbit_rep(pt, orbit_idx, Elt,
522 0 /* verbose_level */);
523
525 SG0->init(A);
526
528 full_group_order, verbose_level);
529 init_generators_for_the_conjugate_group_aGav(SG0, Elt, 0 /* verbose_level */);
530
531 FREE_OBJECT(SG0);
532 FREE_int(Elt);
533 if (f_v) {
534 cout << "strong_generators::init_point_stabilizer_of_arbitrary_"
535 "point_through_schreier done" << endl;
536 }
537}
538
540 schreier *Sch,
541 int orbit_idx, ring_theory::longinteger_object &full_group_order,
542 int verbose_level)
543{
544 int f_v = (verbose_level >= 1);
545 sims *Stab;
546
547 if (f_v) {
548 cout << "strong_generators::init_point_stabilizer_orbit_rep_schreier" << endl;
549 }
550 Sch->point_stabilizer(A, full_group_order,
551 Stab, orbit_idx, verbose_level);
552 init_from_sims(Stab, 0 /* verbose_level */);
553 FREE_OBJECT(Stab);
554 if (f_v) {
555 cout << "strong_generators::init_point_stabilizer_orbit_rep_schreier done" << endl;
556 }
557}
558
560 strong_generators *SG, int *Elt_a, int verbose_level)
561{
562 int f_v = (verbose_level >= 1);
565 //int i;
566
567 if (f_v) {
568 cout << "strong_generators::init_generators_for_the_conjugate_group_avGa" << endl;
569 }
570
571 SG->group_order(go);
572 if (f_v) {
573 cout << "strong_generators::init_generators_for_the_conjugate_group_avGa go=" << go << endl;
574 }
576
577#if 0
578 gens->init(SG->A);
579 gens->allocate(SG->gens->len);
580 for (i = 0; i < SG->gens->len; i++) {
581 A->element_conjugate_bvab(SG->gens->ith(i), Elt_a,
582 gens->ith(i), 0 /* verbose_level */);
583 }
584#else
585 if (f_v) {
586 cout << "strong_generators::init_generators_for_the_conjugate_group_avGa before gens->init_conjugate_svas_of" << endl;
587 }
588 gens->init_conjugate_svas_of(SG->gens, Elt_a, verbose_level);
589 if (f_v) {
590 cout << "strong_generators::init_generators_for_the_conjugate_group_avGa after gens->init_conjugate_svas_of" << endl;
591 }
592#endif
593
595
596 if (f_v) {
597 cout << "strong_generators::init_generators_for_the_conjugate_group_avGa "
598 "before generators_to_strong_generators" << endl;
599 }
601 TRUE /* f_target_go */, go,
602 gens, SG1,
603 0 /*verbose_level*/);
604
605 swap_with(SG1);
607 FREE_OBJECT(SG1);
608
609 if (f_v) {
610 cout << "strong_generators::init_generators_for_the_conjugate_group_avGa done" << endl;
611 }
612}
613
615 strong_generators *SG, int *Elt_a, int verbose_level)
616{
617 int f_v = (verbose_level >= 1);
620 //int i;
621
622 if (f_v) {
623 cout << "strong_generators::init_generators_for_the_conjugate_group_aGav" << endl;
624 }
625
626 SG->group_order(go);
627 if (f_v) {
628 cout << "strong_generators::init_generators_for_the_conjugate_group_aGav go=" << go << endl;
629 }
631
632#if 0
633 gens->init(SG->A);
634 gens->allocate(SG->gens->len);
635 for (i = 0; i < SG->gens->len; i++) {
636 if (f_v) {
637 cout << i << " / " << SG->gens->len << ":" << endl;
638 }
639 SG->A->element_conjugate_babv(SG->gens->ith(i),
640 Elt_a, gens->ith(i), verbose_level);
641 }
642#else
643 gens->init_conjugate_sasv_of(SG->gens, Elt_a, 0 /* verbose_level */);
644#endif
645
647
648 if (f_v) {
649 cout << "strong_generators::init_generators_for_the_conjugate_group_aGav "
650 "before generators_to_strong_generators" << endl;
651 }
653 TRUE /* f_target_go */, go,
654 gens, SG1,
655 0 /*verbose_level*/);
656 if (f_v) {
657 cout << "strong_generators::init_generators_for_the_conjugate_group_aGav "
658 "after generators_to_strong_generators" << endl;
659 }
660
661 swap_with(SG1);
663 FREE_OBJECT(SG1);
664
665 if (f_v) {
666 cout << "strong_generators::init_generators_for_the_conjugate_group_aGav done" << endl;
667 }
668}
669
671 strong_generators *SG, int verbose_level)
672{
673 int f_v = (verbose_level >= 1);
676 int i;
677
678 if (f_v) {
679 cout << "strong_generators::init_transposed_group" << endl;
680 }
681
682 SG->group_order(go);
684
685 gens->init(A, verbose_level - 2);
686 gens->allocate(SG->gens->len, verbose_level - 2);
687 for (i = 0; i < SG->gens->len; i++) {
688 if (f_v) {
689 cout << "before element_transpose " << i << " / "
690 << SG->gens->len << ":" << endl;
691 A->element_print_quick(SG->gens->ith(i), cout);
692 }
693 A->element_transpose(SG->gens->ith(i), gens->ith(i),
694 0 /* verbose_level*/);
695 if (f_v) {
696 cout << "after element_transpose " << i << " / "
697 << SG->gens->len << ":" << endl;
698 A->element_print_quick(gens->ith(i), cout);
699 }
700 }
701
703
704 if (f_v) {
705 cout << "strong_generators::init_transposed_group "
706 "before A->generators_to_strong_generators" << endl;
707 }
709 TRUE /* f_target_go */, go,
710 gens, SG1,
711 verbose_level);
712 if (f_v) {
713 cout << "strong_generators::init_transposed_group "
714 "after A->generators_to_strong_generators" << endl;
715 }
716
717 swap_with(SG1);
719 FREE_OBJECT(SG1);
720
721 if (f_v) {
722 cout << "strong_generators::init_transposed_group done" << endl;
723 }
724}
725
727 strong_generators *subgroup, int *data, int index,
728 int verbose_level)
729{
730 int f_v = (verbose_level >= 1);
731 int i;
734
735 if (f_v) {
736 cout << "strong_generators::init_group_extension" << endl;
737 }
738
739 A = subgroup->A;
740
742 int nb_gens;
743
745 my_gens->init(A, verbose_level - 2);
746 nb_gens = subgroup->gens->len;
747 my_gens->allocate(nb_gens + 1, verbose_level - 2);
748 for (i = 0; i < nb_gens; i++) {
749 A->element_move(subgroup->gens->ith(i), my_gens->ith(i), 0);
750 }
751 A->make_element(my_gens->ith(nb_gens), data, 0);
752
753 subgroup->group_order(target_go);
754 D.mult_integer_in_place(target_go, index);
755
757
759
760 if (f_v) {
761 cout << "strong_generators::init_group_extension "
762 "before generators_to_strong_generators, "
763 "target_go=" << target_go << endl;
764 }
765
767 TRUE /* f_target_go */, target_go,
768 my_gens, SG,
769 0 /*verbose_level*/);
770
771 if (FALSE) {
772 cout << "strong_generators::init_group_extension "
773 "strong generators are:" << endl;
774 SG->print_generators(cout);
775 }
776
777 FREE_OBJECT(my_gens);
778
779 if (gens) {
781 }
782 gens = SG->gens;
783 SG->gens = NULL;
784 if (tl) {
785 FREE_int(tl);
786 }
787 tl = SG->tl;
788 SG->tl = NULL;
789
790 FREE_OBJECT(SG);
791
792 if (f_v) {
793 cout << "strong_generators::init_group_extension done" << endl;
794 }
795}
796
799 data_structures_groups::vector_ge *new_gens, int index,
800 int verbose_level)
801{
802 int f_v = (verbose_level >= 1);
803 int i;
806
807 if (f_v) {
808 cout << "strong_generators::init_group_extension" << endl;
809 }
810
811 A = subgroup->A;
812
814 int nb_gens, nb_new_gens;
815
817 my_gens->init(A, verbose_level - 2);
818 nb_gens = subgroup->gens->len;
819 nb_new_gens = new_gens->len;
820 my_gens->allocate(nb_gens + nb_new_gens, verbose_level - 2);
821 for (i = 0; i < nb_gens; i++) {
822 A->element_move(subgroup->gens->ith(i), my_gens->ith(i), 0);
823 }
824 for (i = 0; i < nb_new_gens; i++) {
825 A->element_move(new_gens->ith(i), my_gens->ith(nb_gens + i), 0);
826 }
827
828 if (f_v) {
829 cout << "strong_generators::init_group_extension "
830 "my_gens=" << endl;
831 my_gens->print_quick(cout);
832 }
833
834
835 subgroup->group_order(target_go);
836 D.mult_integer_in_place(target_go, index);
837
838 if (f_v) {
839 cout << "strong_generators::init_group_extension "
840 "target_go=" << target_go << endl;
841 cout << "A=" << endl;
842 A->print_info();
843 }
844
846
848
849 if (f_v) {
850 cout << "strong_generators::init_group_extension "
851 "before generators_to_strong_generators, "
852 "target_go=" << target_go << endl;
853 }
854
856 TRUE /* f_target_go */, target_go,
857 my_gens, SG,
858 0 /*verbose_level - 2*/);
859
860 if (FALSE) {
861 cout << "strong_generators::init_group_extension "
862 "strong generators are:" << endl;
863 SG->print_generators(cout);
864 }
865
866 FREE_OBJECT(my_gens);
867
868 if (gens) {
870 }
871 gens = SG->gens;
872 SG->gens = NULL;
873 if (tl) {
874 FREE_int(tl);
875 }
876 tl = SG->tl;
877 SG->tl = NULL;
878
879 FREE_OBJECT(SG);
880
881 if (f_v) {
882 cout << "strong_generators::init_group_extension "
883 "done" << endl;
884 }
885}
886
888 const char *rank_vector_text,
889 const char *subgroup_order_text, sims *S,
890 int *&subgroup_gens_idx, int &nb_subgroup_gens,
891 int verbose_level)
892{
893 int f_v = (verbose_level >= 1);
895
896 if (f_v) {
897 cout << "strong_generators::switch_to_subgroup" << endl;
898 }
899
900
901 //sims *S;
902
903 //S = create_sims(0 /* verbose_level */);
904
905
906 Int_vec_scan(rank_vector_text, subgroup_gens_idx, nb_subgroup_gens);
907 if (f_v) {
908 cout << "strong_generators::switch_to_subgroup "
909 "after scanning: ";
910 Int_vec_print(cout, subgroup_gens_idx, nb_subgroup_gens);
911 cout << endl;
912 }
913
914
916
918 my_gens->init(A, verbose_level - 2);
920 rank_vector_text, S, verbose_level);
921
922
923 if (f_v) {
924 cout << "strong_generators::switch_to_subgroup "
925 "chosen generators:" << endl;
926 my_gens->print_quick(cout);
927 }
928
929 target_go.create_from_base_10_string(subgroup_order_text);
930
931
933
935
937 TRUE /* f_target_go */, target_go,
938 my_gens, SG,
939 0 /*verbose_level*/);
940
941 if (FALSE) {
942 cout << "strong_generators::switch_to_subgroup "
943 "strong generators are:" << endl;
944 SG->print_generators(cout);
945 }
946
947 FREE_OBJECT(my_gens);
948
949 if (gens) {
951 }
952 gens = SG->gens;
953 SG->gens = NULL;
954 if (tl) {
955 FREE_int(tl);
956 }
957 tl = SG->tl;
958 SG->tl = NULL;
959
960 FREE_OBJECT(SG);
961
962 if (f_v) {
963 cout << "strong_generators::switch_to_subgroup done" << endl;
964 }
965}
966
968 int *subgroup_gens_idx, int nb_subgroup_gens,
969 const char *subgroup_order_text,
970 sims *S,
971 int verbose_level)
972{
973 int f_v = (verbose_level >= 1);
975
976 if (f_v) {
977 cout << "strong_generators::init_subgroup" << endl;
978 }
979
980
982
984
986 my_gens->init(A, verbose_level - 2);
988 subgroup_gens_idx, nb_subgroup_gens, S, verbose_level);
989
990
991 if (f_v) {
992 cout << "strong_generators::init_subgroup "
993 "chosen generators:" << endl;
994 my_gens->print_quick(cout);
995 }
996
997 target_go.create_from_base_10_string(subgroup_order_text);
998
999
1001
1003
1005 TRUE /* f_target_go */, target_go,
1006 my_gens, SG,
1007 0 /*verbose_level*/);
1008
1009 if (FALSE) {
1010 cout << "strong_generators::init_subgroup "
1011 "strong generators are:" << endl;
1012 SG->print_generators(cout);
1013 }
1014
1015 FREE_OBJECT(my_gens);
1016
1017 if (gens) {
1019 }
1020 gens = SG->gens;
1021 SG->gens = NULL;
1022 if (tl) {
1023 FREE_int(tl);
1024 }
1025 tl = SG->tl;
1026 SG->tl = NULL;
1027
1028 FREE_OBJECT(SG);
1029
1030 if (f_v) {
1031 cout << "strong_generators::init_subgroup done" << endl;
1032 }
1033}
1034
1036 actions::action *A,
1037 int nb_subgroup_gens,
1038 int *subgroup_gens,
1039 std::string &subgroup_order_text,
1041 int verbose_level)
1042{
1043 int f_v = (verbose_level >= 1);
1045
1046 if (f_v) {
1047 cout << "strong_generators::init_subgroup_by_generators" << endl;
1048 }
1049
1050
1052
1053 //vector_ge *my_gens;
1054
1056 nice_gens->init(A, verbose_level - 2);
1057 nice_gens->allocate(nb_subgroup_gens, verbose_level - 2);
1058 for (int h = 0; h < nb_subgroup_gens; h++) {
1059 if (f_v) {
1060 cout << "strong_generators::init_subgroup_by_generators "
1061 "generator " << h << " / " << nb_subgroup_gens << endl;
1062 }
1063 A->make_element(nice_gens->ith(h), subgroup_gens + h * A->make_element_size, verbose_level);
1064 }
1065
1066
1067 if (f_v) {
1068 cout << "strong_generators::init_subgroup_by_generators "
1069 "chosen generators:" << endl;
1070 nice_gens->print_quick(cout);
1071 }
1072
1073 target_go.create_from_base_10_string(subgroup_order_text);
1074
1075
1077
1079
1081 TRUE /* f_target_go */, target_go,
1082 nice_gens, SG,
1083 0 /*verbose_level*/);
1084
1085 if (FALSE) {
1086 cout << "strong_generators::init_subgroup_by_generators "
1087 "strong generators are:" << endl;
1088 SG->print_generators(cout);
1089 }
1090
1091 //FREE_OBJECT(my_gens);
1092
1093 if (gens) {
1095 }
1096 gens = SG->gens;
1097 SG->gens = NULL;
1098 if (tl) {
1099 FREE_int(tl);
1100 }
1101 tl = SG->tl;
1102 SG->tl = NULL;
1103
1104 FREE_OBJECT(SG);
1105
1106 if (f_v) {
1107 cout << "strong_generators::init_subgroup_by_generators done" << endl;
1108 }
1109}
1110
1111
1113{
1114 int f_v = (verbose_level >= 1);
1115 sims *S;
1116
1117
1118 if (f_v) {
1119 cout << "strong_generators::create_sims verbose_level=" << verbose_level << endl;
1120 }
1121
1122 if (gens == NULL) {
1123 cout << "strong_generators::create_sims "
1124 "gens == NULL" << endl;
1125 exit(1);
1126 }
1127 if (f_v) {
1128 cout << "strong_generators::create_sims before "
1129 "create_sims_from_generators_with_target_group_order_factorized" << endl;
1130 }
1132 gens, tl, A->base_len(), verbose_level - 2);
1133
1134 if (f_v) {
1135 cout << "strong_generators::create_sims after "
1136 "create_sims_from_generators_with_target_group_order_factorized" << endl;
1137 }
1138
1139 if (f_v) {
1140 cout << "strong_generators::create_sims done" << endl;
1141 }
1142 return S;
1143}
1144
1146 actions::action *A_given, int verbose_level)
1147{
1148 int f_v = (verbose_level >= 1);
1149 sims *S;
1150
1151
1152 if (f_v) {
1153 cout << "strong_generators::create_sims_in_different_action" << endl;
1154 }
1155
1156 if (gens == NULL) {
1157 cout << "strong_generators::create_sims_in_different_action "
1158 "gens == NULL" << endl;
1159 exit(1);
1160 }
1162 gens, tl, A->base_len(),
1163 0 /* verbose_level */);
1164
1165 if (f_v) {
1166 cout << "strong_generators::create_sims_in_different_action "
1167 "done" << endl;
1168 }
1169 return S;
1170}
1171
1173 data_structures_groups::vector_ge *coset_reps, int group_index,
1174 int verbose_level)
1175{
1176 int f_v = (verbose_level >= 1);
1177 int f_vv = (verbose_level >= 2);
1178 sims *S;
1180 int *tl1;
1181 int *coset_reps_vec;
1182 int i;
1183
1184 if (f_v) {
1185 cout << "strong_generators::add_generators" << endl;
1186 }
1187 if (f_vv) {
1188 cout << "group_index=" << group_index << endl;
1189 cout << "action=";
1190 A->print_info();
1191 }
1192
1193 coset_reps_vec = NEW_int(group_index * A->elt_size_in_int);
1194 for (i = 0; i < group_index; i++) {
1195 A->element_move(coset_reps->ith(i),
1196 coset_reps_vec + i * A->elt_size_in_int, 0);
1197 }
1198
1200 tl1 = NEW_int(A->base_len());
1201
1202 S = create_sims(verbose_level - 1);
1203
1205 coset_reps_vec, group_index,
1206 *gens1, tl1,
1207 verbose_level - 2);
1208
1209 FREE_int(coset_reps_vec);
1210
1211 if (gens) {
1213 }
1214 if (tl) {
1215 FREE_int(tl);
1216 }
1217 gens = gens1;
1218 tl = tl1;
1219
1220 FREE_OBJECT(S);
1221 if (f_v) {
1222 cout << "strong_generators::add_generators done" << endl;
1223 }
1224}
1225
1227 int *Elt, int group_index, int verbose_level)
1228{
1229 int f_v = (verbose_level >= 1);
1230 sims *S;
1232 int *tl1;
1233
1234 if (f_v) {
1235 cout << "strong_generators::add_single_generator" << endl;
1236 cout << "action=";
1237 A->print_info();
1238 }
1239
1241 tl1 = NEW_int(A->base_len());
1242
1243 S = create_sims(verbose_level - 1);
1244
1246 Elt, 1, group_index,
1247 *gens1, tl1,
1248 verbose_level);
1249
1250 if (gens) {
1252 }
1253 if (tl) {
1254 FREE_int(tl);
1255 }
1256 gens = gens1;
1257 tl = tl1;
1258
1259 FREE_OBJECT(S);
1260 if (f_v) {
1261 cout << "strong_generators::add_single_generator "
1262 "done" << endl;
1263 }
1264}
1265
1267{
1269
1270 D.multiply_up(go, tl, A->base_len(), 0 /* verbose_level */);
1271}
1272
1274{
1277
1278 D.multiply_up(go, tl, A->base_len(), 0 /* verbose_level */);
1279 return go.as_lint();
1280}
1281
1283{
1285
1286 group_order(go);
1287 ost << go;
1288}
1289
1291{
1292 int verbose_level = 1;
1293 int f_v = (verbose_level >= 1);
1294 int i;
1295
1296 if (f_v) {
1297 cout << "strong_generators::print_generators_gap" << endl;
1298 }
1299 ost << "Generators in GAP format are:" << endl;
1300 if (A->degree < 200) {
1301 ost << "G := Group([";
1302 for (i = 0; i < gens->len; i++) {
1303 if (f_v) {
1304 cout << "strong_generators::print_generators_gap i=" << i << " / " << gens->len << endl;
1305 }
1307 gens->ith(i), ost,
1308 1 /*offset*/,
1309 TRUE /* f_do_it_anyway_even_for_big_degree */,
1310 FALSE /* f_print_cycles_of_length_one */,
1311 0 /* verbose_level*/);
1312 if (i < gens->len - 1) {
1313 ost << ", " << endl;
1314 }
1315 }
1316 ost << "]);" << endl;
1317 }
1318 else {
1319 ost << "too big to print" << endl;
1320 }
1321 if (f_v) {
1322 cout << "strong_generators::print_generators_gap done" << endl;
1323 }
1324}
1325
1326
1328{
1329 int i;
1330
1331 ost << "Generators in GAP format are:" << endl;
1332 if (A->degree < 200) {
1333 ost << "G := Group([";
1334 for (i = 0; i < gens->len; i++) {
1336 gens->ith(i), ost,
1337 1 /*offset*/,
1338 TRUE /* f_do_it_anyway_even_for_big_degree */,
1339 FALSE /* f_print_cycles_of_length_one */,
1340 0 /* verbose_level*/);
1341 if (i < gens->len - 1) {
1342 ost << ", " << endl;
1343 }
1344 }
1345 ost << "]);" << endl;
1346 }
1347 else {
1348 ost << "too big to print" << endl;
1349 }
1350}
1351
1352
1354{
1355 int i, j, a;
1356
1357 ost << "Generators in compact permutation form are:" << endl;
1358 if (A->degree < 200) {
1359 ost << gens->len << " " << A->degree << endl;
1360 for (i = 0; i < gens->len; i++) {
1361 for (j = 0; j < A->degree; j++) {
1362 a = A->element_image_of(j,
1363 gens->ith(i), 0 /* verbose_level */);
1364 ost << a << " ";
1365 }
1366 ost << endl;
1367 }
1368 ost << "-1" << endl;
1369 }
1370 else {
1371 ost << "too big to print" << endl;
1372 }
1373}
1374
1376{
1377 int i;
1379
1380 cout << "strong_generators::print_generators computing group order" << endl;
1381 group_order(go);
1382 ost << "Strong generators for a group of order "
1383 << go << " tl=";
1384 Int_vec_print(cout, tl, A->base_len());
1385 ost << endl;
1386
1387 for (i = 0; i < gens->len; i++) {
1388 ost << "generator " << i << " / "
1389 << gens->len << " is: " << endl;
1390 A->element_print(gens->ith(i), ost);
1391 ost << "as permutation: " << endl;
1392 if (A->degree < 400) {
1394 gens->ith(i), ost,
1395 0 /* offset*/,
1396 TRUE /* f_do_it_anyway_even_for_big_degree*/,
1397 TRUE /* f_print_cycles_of_length_one*/,
1398 0 /* verbose_level*/);
1399 //A->element_print_as_permutation(SG->gens->ith(i), cout);
1400 ost << endl;
1401 }
1402 else {
1403 ost << "too big to print" << endl;
1404 }
1405 }
1406
1407 ost << "Generators as permutations are:" << endl;
1408
1409
1410
1411 if (A->degree < 400) {
1412 for (i = 0; i < gens->len; i++) {
1414 ost << endl;
1415 }
1416 }
1417 else {
1418 ost << "too big to print" << endl;
1419 }
1420}
1421
1423{
1424 int i;
1426
1427 group_order(go);
1428
1429 ost << "The stabilizer of order $" << go
1430 << "$ is generated by:\\\\" << endl;
1431
1432 for (i = 0; i < gens->len; i++) {
1433
1434 string label;
1435 char str[1000];
1436
1437 sprintf(str, "g_{%d} = ", i + 1);
1438 label.assign(str);
1439
1440 //A->element_print_latex_with_extras(gens->ith(i), label, ost);
1441
1442 ost << "$" << str << "$ ";
1443
1444 //A->element_print_latex_not_in_math_mode(gens->ith(i), ost);
1445
1446 if (A->f_is_linear) {
1447 ost << "$";
1448 A->element_print_latex(gens->ith(i), ost);
1449 ost << "$";
1450 }
1451 else {
1452 A->element_print_latex(gens->ith(i), ost);
1453 }
1454
1455 //ost << "\\\\" << endl;
1456
1457
1458 int n, ord;
1459
1460 ord = A->element_order(gens->ith(i));
1461
1462 ost << " of order " << ord;
1463
1464 n = A->count_fixed_points(gens->ith(i), 0 /* verbose_level */);
1465 ost << " and with " << n << " fixed points.\\\\" << endl;
1466
1467 }
1468 ost << endl << "\\bigskip" << endl;
1469
1471
1472}
1473
1475{
1476 int i;
1478
1479 group_order(go);
1480 cout << "Strong generators for a group of "
1481 "order " << go << " tl=";
1482 Int_vec_print(cout, tl, A->base_len());
1483 cout << endl;
1484 A->print_base();
1485 for (i = 0; i < gens->len; i++) {
1486 //cout << "Generator " << i << " / "
1487 // << gens->len << " is:" << endl;
1488 A->print_for_make_element(cout, gens->ith(i));
1489 cout << endl;
1490 }
1491}
1492
1494 const char *fname)
1495{
1496 int i;
1499
1500 {
1501 ofstream f(fname);
1502 group_order(go);
1503 f << gens->len << " " << go << endl;
1504 for (i = 0; i < gens->len; i++) {
1505 //cout << "Generator " << i << " / "
1506 //<< gens->len << " is:" << endl;
1508 f << endl;
1509 }
1510 }
1511 cout << "Written file " << fname << " of size "
1512 << Fio.file_size(fname) << endl;
1513}
1514
1516{
1517 int i, sgn;
1519
1520 group_order(go);
1521 cout << "Strong generators for a group of order " << go << " tl=";
1522 Int_vec_print(cout, tl, A->base_len());
1523 cout << endl;
1524 for (i = 0; i < gens->len; i++) {
1525 cout << "Generator " << i << " / " << gens->len << " is:" << endl;
1526 A->element_print(gens->ith(i), cout);
1527
1529 cout << " sgn=" << sgn;
1530 cout << endl;
1531 }
1532}
1533
1535{
1536 int i;
1537
1538 for (i = 0; i < gens->len; i++) {
1539 //cout << "Generator " << i << " / "
1540 // << gens->len << " is:" << endl;
1542 gens->ith(i), ost,
1543 1 /* offset */,
1544 TRUE /* f_do_it_anyway_even_for_big_degree */,
1545 FALSE /* f_print_cycles_of_length_one */,
1546 0 /* verbose_level */);
1547 if (i < gens->len - 1) {
1548 ost << ", " << endl;
1549 }
1550 }
1551}
1552
1553void strong_generators::export_magma(actions::action *A, std::ostream &ost, int verbose_level)
1554{
1555 int f_v = (verbose_level >= 1);
1556
1557 if (f_v) {
1558 cout << "strong_generators::export_magma" << endl;
1559 A->print_info();
1560 }
1561 if (A->type_G == matrix_group_t) {
1562 matrix_group *M;
1563 int *Elt;
1564 int h, i, j;
1565
1566 M = A->get_matrix_group();
1567 if (M->f_semilinear) {
1568 cout << "cannot export to magma if semilinear" << endl;
1569 return;
1570 }
1572
1573 F = M->GFq;
1574 if (F->e > 1) {
1575 int a;
1576
1577 if (f_v) {
1578 cout << "strong_generators::export_magma extension field" << endl;
1579 }
1580 ost << "F<w>:=GF(" << F->q << ");" << endl;
1581 ost << "G := GeneralLinearGroup(" << M->n << ", F);" << endl;
1582 ost << "H := sub< G | ";
1583 for (h = 0; h < gens->len; h++) {
1584 Elt = gens->ith(h);
1585 ost << "[";
1586 for (i = 0; i < M->n; i++) {
1587 for (j = 0; j < M->n; j++) {
1588 a = Elt[i * M->n + j];
1589 if (a < F->p) {
1590 ost << a;
1591 }
1592 else {
1593 ost << "w^" << F->log_alpha(a);
1594 }
1595 if (j < M->n - 1) {
1596 ost << ",";
1597 }
1598 }
1599 if (i < M->n - 1) {
1600 ost << ", ";
1601 }
1602 }
1603 ost << "]";
1604 if (h < gens->len - 1) {
1605 ost << ", " << endl;
1606 }
1607 }
1608 ost << " >;" << endl;
1609
1610 }
1611 else {
1612 ost << "G := GeneralLinearGroup(" << M->n << ", GF(" << F->q << "));" << endl;
1613 ost << "H := sub< G | ";
1614 for (h = 0; h < gens->len; h++) {
1615 Elt = gens->ith(h);
1616 ost << "[";
1617 for (i = 0; i < M->n; i++) {
1618 for (j = 0; j < M->n; j++) {
1619 ost << Elt[i * M->n + j];
1620 if (j < M->n - 1) {
1621 ost << ",";
1622 }
1623 }
1624 if (i < M->n - 1) {
1625 ost << ", ";
1626 }
1627 }
1628 ost << "]";
1629 if (h < gens->len - 1) {
1630 ost << ", " << endl;
1631 }
1632 }
1633 ost << " >;" << endl;
1634 }
1635 }
1636 if (f_v) {
1637 cout << "strong_generators::export_magma done" << endl;
1638 }
1639}
1640
1641
1642//GL42 := GeneralLinearGroup(4, GF(2));
1643//> Ominus42 := sub< GL42 | [1,0,0,0, 1,1,0,1, 1,0,1,0, 0,0,0,1 ],
1644//> [0,1,0,0, 1,0,0,0, 0,0,1,0, 0,0,0,1 ],
1645//> [0,1,0,0, 1,0,0,0, 0,0,1,0, 0,0,1,1 ] >;
1646
1647
1648void strong_generators::canonical_image_GAP(std::string &input_set_text, std::ostream &ost)
1649{
1650 int i;
1651
1652 //ost << "Generators in GAP format are:" << endl;
1653 ost << "G := Group([";
1654 for (i = 0; i < gens->len; i++) {
1656 gens->ith(i), ost,
1657 1 /*offset*/,
1658 TRUE /* f_do_it_anyway_even_for_big_degree */,
1659 FALSE /* f_print_cycles_of_length_one */,
1660 0 /* verbose_level*/);
1661 if (i < gens->len - 1) {
1662 ost << ", " << endl;
1663 }
1664 }
1665 ost << "]);" << endl;
1666
1667 long int *set;
1668 int sz;
1670 std::string output;
1671
1672
1673 Lint_vec_scan(input_set_text, set, sz);
1674
1675 // add one because GAP is 1-based:
1676 for (i = 0; i < sz; i++) {
1677 set[i]++;
1678 }
1679
1680 ST.create_comma_separated_list(output, set, sz);
1681
1682 ost << "LoadPackage(\"images\");" << endl;
1683 ost << "MinimalImage(G, [" << output << "], OnSets);" << endl;
1684}
1685
1686
1688{
1690}
1691
1693{
1694 int i;
1696
1697 group_order(go);
1698 ost << "Strong generators for a group of order " << go << ":" << endl;
1699 ost << "$$" << endl;
1700 for (i = 0; i < gens->len; i++) {
1701 //cout << "Generator " << i << " / " << gens->len
1702 // << " is:" << endl;
1703 A->element_print_latex(gens->ith(i), ost);
1704 if (i < gens->len - 1) {
1705 ost << ", " << endl;
1706 }
1707 if (((i + 1) % 1) == 0 && i < gens->len - 1) {
1708 ost << "$$" << endl;
1709 ost << "$$" << endl;
1710 }
1711 }
1712 ost << "$$" << endl;
1714}
1715
1717{
1718 int i;
1719
1720 for (i = 0; i < gens->len; i++) {
1721 //cout << "Generator " << i << " / " << gens->len
1722 // << " is:" << endl;
1724 ost << "\\\\" << endl;
1725 }
1726}
1727
1729{
1730 int i;
1732
1733 group_order(go);
1734 ost << "Strong generators for a group of order " << go << ":" << endl;
1735 ost << "$$" << endl;
1736 for (i = 0; i < gens->len; i++) {
1737 //cout << "Generator " << i << " / " << gens->len
1738 // << " is:" << endl;
1740 if (i < gens->len - 1) {
1741 ost << ", " << endl;
1742 }
1743 if (((i + 1) % 1) == 0 && i < gens->len - 1) {
1744 ost << "$$" << endl;
1745 ost << "$$" << endl;
1746 }
1747 }
1748 ost << "$$" << endl;
1749 for (i = 0; i < gens->len; i++) {
1750 //cout << "Generator " << i << " / " << gens->len
1751 // << " is:" << endl;
1753 ost << "\\\\" << endl;
1754 }
1755}
1756
1757
1759 actions::action *A_given,
1760 std::ostream &ost,
1761 void (*point_label)(stringstream &sstr, long int pt, void *data),
1762 void *point_label_data)
1763{
1764 int i;
1766
1767 group_order(go);
1768 ost << "Strong generators for a group of order " << go << ":" << endl;
1769 //ost << "$$" << endl;
1770 for (i = 0; i < gens->len; i++) {
1771 cout << "Generator " << i << " / " << gens->len << " is:" << endl;
1772 ost << "$$" << endl;
1773 A->element_print_latex(gens->ith(i), ost);
1774 ost << "$$" << endl;
1775 ost << "$$" << endl;
1777 gens->ith(i), ost,
1778 point_label, point_label_data);
1779 ost << "$$" << endl;
1780 }
1781 //ost << "$$" << endl;
1782 for (i = 0; i < gens->len; i++) {
1783 //cout << "Generator " << i << " / " << gens->len
1784 // << " is:" << endl;
1786 ost << "\\\\" << endl;
1787 }
1788
1789 for (i = 0; i < gens->len; i++) {
1790 ost << "$";
1791 A_given->element_print_latex(gens->ith(i), ost);
1792 ost << "$\\\\" << endl;
1793 }
1794
1795}
1796
1798{
1799 int i;
1801
1802 group_order(go);
1803 ost << "Strong generators for a group of order " << go << ":\\\\" << endl;
1804 for (i = 0; i < gens->len; i++) {
1805 //ost << "";
1807 ost << "\\\\" << endl;
1808 }
1809}
1810
1811
1813{
1814 int i;
1816
1817 group_order(go);
1818 cout << "Strong generators for a group of order "
1819 << go << ":" << endl;
1820 for (i = 0; i < gens->len; i++) {
1821 cout << "Generator " << i << " / "
1822 << gens->len << " is:" << endl;
1823 A->element_print(gens->ith(i), cout);
1824 if (A->degree < 1000) {
1826 cout << endl;
1827 }
1828 else {
1829 cout << "strong_generators::print_generators_as_permutations "
1830 "the degree is too large, we won't print "
1831 "the permutation representation" << endl;
1832 }
1833 }
1834}
1835
1837 std::ostream &ost, actions::action *A2)
1838{
1839 int i;
1841
1842 group_order(go);
1843 ost << "Strong generators for a group of order " << go << ":" << endl;
1844 ost << "\\\\" << endl;
1845 for (i = 0; i < gens->len; i++) {
1846 ost << "Generator " << i << " / "
1847 << gens->len << " is: $" << endl;
1848 //A->element_print(gens->ith(i), cout);
1849 if (A->degree < 1000) {
1851 }
1852 else {
1853 cout << "strong_generators::print_generators_as_permutations_tex "
1854 "the degree is too large, we won't print "
1855 "the permutation representation" << endl;
1856 }
1857 ost << "$\\\\" << endl;
1858 }
1859}
1860
1862 std::ostream &ost, actions::action *A2)
1863{
1864 int i;
1865
1866 for (i = 0; i < gens->len; i++) {
1867 ost << "Generator " << i << " / "
1868 << gens->len << " is:" << endl;
1869 ost << "$$" << endl;
1870 A2->element_print_latex(gens->ith(i), ost);
1871 //ost << endl;
1872 ost << "$$" << endl;
1873 ost << "as permutation:" << endl;
1874 //ost << "$$" << endl;
1875 if (A2->degree < 1000) {
1877 }
1878 else {
1879 cout << "strong_generators::print_with_given_action "
1880 "the degree is too large, we won't print "
1881 "the permutation representation" << endl;
1882 ost << "too big to print";
1883 }
1884 //ost << endl;
1885 //ost << "$$" << endl;
1886 ost << "\\\\" << endl;
1887 }
1888}
1889
1891{
1892 long int i;
1894 sims *S;
1895 int *Elt;
1896
1897 Elt = NEW_int(A->elt_size_in_int);
1898 group_order(go);
1899 S = create_sims(0 /*verbose_level */);
1900 ost << "Group elements for a group of order " << go << " tl=";
1901 Int_vec_print(ost, tl, A->base_len());
1902 ost << "\\\\" << endl;
1903 for (i = 0; i < go.as_lint(); i++) {
1904 S->element_unrank_lint(i, Elt, 0 /* verbose_level */);
1905 ost << "Element " << i << " / " << go << " is:" << endl;
1906 ost << "$$" << endl;
1907 A->element_print_latex(Elt, ost);
1908 ost << "$$" << endl;
1909 }
1910 FREE_OBJECT(S);
1911 FREE_int(Elt);
1912}
1913
1915{
1916 long int i;
1918 sims *S;
1919 int *Elt;
1920
1921 Elt = NEW_int(A->elt_size_in_int);
1922 group_order(go);
1923 S = create_sims(0 /*verbose_level */);
1924 ost << "Group elements for a group of order " << go << " tl=";
1925 Int_vec_print(ost, tl, A->base_len());
1926 ost << "\\\\" << endl;
1927 for (i = 0; i < go.as_lint(); i++) {
1928 S->element_unrank_lint(i, Elt, 0 /* verbose_level */);
1929
1930 ost << "Element " << i << " / " << go << " is:" << endl;
1931 ost << "$$" << endl;
1932 A->element_print_latex(Elt, ost);
1933 if (A->matrix_group_dimension() == 4) {
1934 int A6[36];
1936
1938 F->isomorphism_to_special_orthogonal(Elt, A6, 0 /* verbose_level*/);
1939 ost << "=" << endl;
1940 F->print_matrix_latex(ost, A6, 6, 6);
1941 }
1942 ost << "$$" << endl;
1943 }
1944 FREE_OBJECT(S);
1945 FREE_int(Elt);
1946}
1947
1948
1950 std::ostream &ost, actions::action *A2)
1951{
1952 long int i;
1954 sims *S;
1955 int *Elt;
1956
1957 Elt = NEW_int(A->elt_size_in_int);
1958 group_order(go);
1959 S = create_sims(0 /*verbose_level */);
1960 ost << "Group elements for a group of order " << go << " tl=";
1961 Int_vec_print(ost, tl, A->base_len());
1962 ost << "\\\\" << endl;
1963 for (i = 0; i < go.as_lint(); i++) {
1964 S->element_unrank_lint(i, Elt, 0 /* verbose_level */);
1965 ost << "Element " << i << " / " << go << " is:" << endl;
1966 ost << "$$" << endl;
1967 if (A2->degree < 1000) {
1968 A2->element_print_as_permutation(Elt, ost);
1969 }
1970 else {
1971 cout << "strong_generators::print_with_given_action "
1972 "the degree is too large, we won't print "
1973 "the permutation representation" << endl;
1974 }
1975 ost << endl;
1976 ost << "$$" << endl;
1977 }
1978 FREE_OBJECT(S);
1979 FREE_int(Elt);
1980}
1981
1983{
1984 long int i, order, m;
1986 sims *S;
1987 int *Elt;
1988
1989 Elt = NEW_int(A->elt_size_in_int);
1990 group_order(go);
1991 S = create_sims(0 /*verbose_level */);
1992 ost << "Group elements for a group of order " << go << " tl=";
1993 Int_vec_print(ost, tl, A->base_len());
1994 ost << "\\\\" << endl;
1995 m = MINIMUM(go.as_int(), 100);
1996 if (m < go.as_int()) {
1997 ost << "We will only list the first " << m
1998 << " elements:\\\\" << endl;
1999 }
2000 for (i = 0; i < m; i++) {
2001 S->element_unrank_lint(i, Elt, 0 /* verbose_level */);
2002 order = A->element_order(Elt);
2003 ost << "Element " << i << " / " << go << " is:" << endl;
2004 ost << "$$" << endl;
2005 A->element_print_latex(Elt, ost);
2006 ost << "$$" << endl;
2007 ost << "The element has order " << order << ".\\\\" << endl;
2008 }
2009 FREE_OBJECT(S);
2010 FREE_int(Elt);
2011}
2012
2014 actions::action *A_given,
2015 std::ostream &ost,
2016 void (*point_label)(std::stringstream &sstr, long int pt, void *data),
2017 void *point_label_data)
2018{
2019 long int i, order, m;
2021 sims *S;
2022 int *Elt;
2023 int *power_elt;
2024 int *nb_fix_points;
2025 int *cycle_type;
2026
2027 Elt = NEW_int(A->elt_size_in_int);
2028 group_order(go);
2029 power_elt = NEW_int(go.as_int());
2030 nb_fix_points = NEW_int(go.as_int());
2031 cycle_type = NEW_int(A_given->degree);
2032 S = create_sims(0 /*verbose_level */);
2033 ost << "Group elements for a group of order " << go << " tl=";
2034 Int_vec_print(ost, tl, A->base_len());
2035 ost << "\\\\" << endl;
2036 m = MINIMUM(go.as_int(), 500);
2037 if (m < go.as_int()) {
2038 ost << "We will only list the first " << m
2039 << " elements:\\\\" << endl;
2040 }
2041 for (i = 0; i < m; i++) {
2042 S->element_unrank_lint(i, Elt, 0 /* verbose_level */);
2043 //cout << "element " << i << " / " << m << " before A->element_order" << endl;
2044 order = A->element_order(Elt);
2045 //cout << "element " << i << " / " << m << " before A->element_order_and_cycle_type" << endl;
2046 A_given->element_order_and_cycle_type(Elt, cycle_type);
2047 ost << "Element " << i << " / " << go << " is:" << endl;
2048 ost << "$$" << endl;
2049 A->element_print_latex(Elt, ost);
2050 ost << "$$" << endl;
2051 ost << "$$" << endl;
2053 point_label, point_label_data);
2054 ost << "$$" << endl;
2055 ost << "The element has order " << order << ".\\\\" << endl;
2056 S->compute_all_powers(i, order, power_elt, 0 /*verbose_level*/);
2057 ost << "The powers are: ";
2058 Int_vec_print(ost, power_elt, order);
2059 ost << ".\\\\" << endl;
2060 nb_fix_points[i] = cycle_type[0];
2061 ost << "The element has " << nb_fix_points[i] << " fix points.\\\\" << endl;
2062 }
2064
2065 C.init(nb_fix_points, m, FALSE, 0);
2066 ost << "The distribution of the number of fix points is $";
2068 ost << "$\\\\" << endl;
2069 FREE_OBJECT(S);
2070 FREE_int(Elt);
2071 FREE_int(power_elt);
2072 FREE_int(nb_fix_points);
2073 FREE_int(cycle_type);
2074}
2075
2077 int *&Table, long int &go, int verbose_level)
2078{
2079 int f_v = (verbose_level >= 1);
2080 sims *S;
2081
2082 if (f_v) {
2083 cout << "strong_generators::create_group_table" << endl;
2084 }
2085 S = create_sims(0 /*verbose_level */);
2086 S->create_group_table(Table, go, verbose_level - 1);
2087 FREE_OBJECT(S);
2088 if (f_v) {
2089 cout << "strong_generators::create_group_table done" << endl;
2090 }
2091}
2092
2094 strong_generators *gens_subgroup,
2095 long int *&Subgroup_elements_by_index, long int &sz_subgroup, int verbose_level)
2096{
2097 int f_v = (verbose_level >= 1);
2098 long int i, a;
2100 sims *S;
2101 sims *U;
2102 int *Elt;
2103
2104 if (f_v) {
2105 cout << "strong_generators::list_of_elements_of_subgroup" << endl;
2106 }
2107 Elt = NEW_int(A->elt_size_in_int);
2108 S = create_sims(0 /*verbose_level */);
2109 U = gens_subgroup->create_sims(0 /*verbose_level */);
2110 U->group_order(go);
2111 sz_subgroup = go.as_lint();
2112 Subgroup_elements_by_index = NEW_lint(go.as_int());
2113 for (i = 0; i < sz_subgroup; i++) {
2114 U->element_unrank_lint(i, Elt, 0 /* verbose_level */);
2115 a = S->element_rank_lint(Elt);
2116 Subgroup_elements_by_index[i] = a;
2117 }
2118 FREE_OBJECT(S);
2119 FREE_OBJECT(U);
2120 FREE_int(Elt);
2121 if (f_v) {
2122 cout << "strong_generators::list_of_elements_of_subgroup done" << endl;
2123 }
2124}
2125
2127 actions::action *A_given, schreier *&Sch, int verbose_level)
2128{
2129 int f_v = (verbose_level >= 1);
2130
2131 if (f_v) {
2132 cout << "strong_generators::compute_schreier_with_given_action" << endl;
2133 cout << "action=";
2134 A->print_info();
2135 }
2136 Sch = NEW_OBJECT(schreier);
2137
2138 Sch->init(A_given, verbose_level - 2);
2139 Sch->initialize_tables();
2140 Sch->init_generators(*gens, verbose_level - 2);
2141 Sch->compute_all_point_orbits(verbose_level - 2);
2142
2143
2144 if (f_v) {
2145 cout << "strong_generators::compute_schreier_with_given_action done, we found "
2146 << Sch->nb_orbits << " orbits" << endl;
2147 }
2148}
2149
2151 actions::action *A_given, schreier *&Sch, long int *set, int len,
2152 int verbose_level)
2153{
2154 int f_v = (verbose_level >= 1);
2155
2156 if (f_v) {
2157 cout << "strong_generators::compute_schreier_with_given_action_on_a_given_set" << endl;
2158 cout << "action=";
2159 A->print_info();
2160 }
2161 Sch = NEW_OBJECT(schreier);
2162
2163 Sch->init(A_given, verbose_level - 2);
2164 Sch->initialize_tables();
2165 Sch->init_generators(*gens, verbose_level - 2);
2167 0 /* verbose_level */);
2168 //Sch->compute_all_point_orbits(verbose_level);
2169
2170
2171 if (f_v) {
2172 cout << "strong_generators::compute_schreier_with_given_action_on_a_given_set "
2173 "done, we found "
2174 << Sch->nb_orbits << " orbits" << endl;
2175 }
2176}
2177
2179 int *&orbit_reps, int verbose_level)
2180{
2181 int f_v = (verbose_level >= 1);
2182 schreier *Sch;
2183 int i, f, a;
2184
2185 if (f_v) {
2186 cout << "strong_generators::orbits_on_points" << endl;
2187 cout << "action=";
2188 A->print_info();
2189 }
2190
2191 compute_schreier_with_given_action(A, Sch, verbose_level - 1);
2192
2193
2194 nb_orbits = Sch->nb_orbits;
2195 orbit_reps = NEW_int(nb_orbits);
2196 for (i = 0; i < nb_orbits; i++) {
2197 f = Sch->orbit_first[i];
2198 a = Sch->orbit[f];
2199 orbit_reps[i] = a;
2200 }
2201
2202 FREE_OBJECT(Sch);
2203
2204 if (f_v) {
2205 cout << "strong_generators::orbits_on_points done, "
2206 "we found " << nb_orbits << " orbits" << endl;
2207 }
2208}
2209
2211 actions::action *A_given, int &nb_orbits, int *&orbit_reps,
2212 int verbose_level)
2213{
2214 int f_v = (verbose_level >= 1);
2215 schreier *Sch;
2216 int i, f, a;
2217
2218 if (f_v) {
2219 cout << "strong_generators::orbits_on_points_with_given_action" << endl;
2220 cout << "action=";
2221 A->print_info();
2222 }
2223 compute_schreier_with_given_action(A_given, Sch, verbose_level - 1);
2224
2225 nb_orbits = Sch->nb_orbits;
2226 orbit_reps = NEW_int(nb_orbits);
2227 for (i = 0; i < nb_orbits; i++) {
2228 f = Sch->orbit_first[i];
2229 a = Sch->orbit[f];
2230 orbit_reps[i] = a;
2231 }
2232
2233 FREE_OBJECT(Sch);
2234
2235 if (f_v) {
2236 cout << "strong_generators::orbits_on_points_with_given_action "
2237 "done, we found "
2238 << nb_orbits << " orbits" << endl;
2239 }
2240}
2241
2243 actions::action *A_given, int verbose_level)
2244{
2245 int f_v = (verbose_level >= 1);
2246 schreier *Sch;
2247
2248 if (f_v) {
2249 cout << "strong_generators::orbits_on_points_schreier "
2250 "degree = " << A_given->degree << endl;
2251 cout << "A_given=";
2252 A_given->print_info();
2253 }
2254
2256 group_order(go);
2257
2258 if (f_v) {
2259 cout << "strong_generators::orbits_on_points_schreier "
2260 "go = " << go << endl;
2261 }
2262
2263
2264 if (f_v) {
2265 cout << "strong_generators::orbits_on_points_schreier "
2266 "generators:" << endl;
2267 //print_generators_tex();
2268 }
2269 Sch = NEW_OBJECT(schreier);
2270
2271 Sch->init(A_given, verbose_level - 2);
2272 Sch->initialize_tables();
2273 if (f_v) {
2274 cout << "strong_generators::orbits_on_points_schreier "
2275 "before Sch->init_generators" << endl;
2276 }
2277 Sch->init_generators(*gens, verbose_level - 2);
2278 if (f_v) {
2279 cout << "strong_generators::orbits_on_points_schreier "
2280 "before Sch->compute_all_point_orbits" << endl;
2281 }
2282 Sch->compute_all_point_orbits(0 /*verbose_level*/);
2283 if (f_v) {
2284 cout << "strong_generators::orbits_on_points_schreier "
2285 "after Sch->compute_all_point_orbits" << endl;
2286 }
2287
2288 if (f_v) {
2289 cout << "strong_generators::orbits_on_points_schreier "
2290 "done, we found " << Sch->nb_orbits << " orbits" << endl;
2291 }
2292 return Sch;
2293}
2294
2296 actions::action *A_given, int pt, int verbose_level)
2297{
2298 int f_v = (verbose_level >= 1);
2299 schreier *Sch;
2300
2301 if (f_v) {
2302 cout << "strong_generators::orbit_of_one_point_schreier "
2303 "degree = " << A_given->degree << " point = "
2304 << pt << endl;
2305 }
2306 Sch = NEW_OBJECT(schreier);
2307
2308 Sch->init(A_given, verbose_level - 2);
2309 Sch->initialize_tables();
2310 Sch->init_generators(*gens, verbose_level - 2);
2311 Sch->compute_point_orbit(pt, verbose_level);
2312
2313 if (f_v) {
2314 cout << "strong_generators::orbit_of_one_point_schreier "
2315 "done, we found one orbit of length "
2316 << Sch->orbit_len[0] << endl;
2317 }
2318 return Sch;
2319}
2320
2322 int *&Orbit_reps, int *&Orbit_lengths, int &nb_orbits,
2323 int **&Pts_per_generator, int *&Nb_per_generator,
2324 int verbose_level)
2325{
2326 int f_v = (verbose_level >= 1);
2327 int f_vv = FALSE; //(verbose_level >= 2);
2328 data_structures::bitvector *Has_been_reached;
2329 int Orbit_allocated;
2330 int Orbit_len;
2331 int *Orbit;
2332 int *Q;
2333 int Q_allocated;
2334 int Q_len;
2335 int pt, i = 0, h, nb_gens, a, b, idx;
2336 int Orbit_reps_allocated;
2337 int nb_reached;
2338 int *Generator_idx;
2340
2341 if (f_v) {
2342 cout << "strong_generators::orbits_light "
2343 "degree = " << A_given->degree << endl;
2344 }
2345
2346 Orbit_reps_allocated = 1024;
2347 Orbit_reps = NEW_int(Orbit_reps_allocated);
2348 Orbit_lengths = NEW_int(Orbit_reps_allocated);
2349 nb_orbits = 0;
2350
2351 if (f_v) {
2352 cout << "strong_generators::orbits_light "
2353 "allocating array Generator_idx" << endl;
2354 }
2355 Generator_idx = NEW_int(A_given->degree);
2356 if (f_v) {
2357 cout << "strong_generators::orbits_light "
2358 "allocating array Generator_idx done" << endl;
2359 }
2360 for (pt = 0; pt < A_given->degree; pt++) {
2361 Generator_idx[pt] = -1;
2362 }
2363 Has_been_reached = NEW_OBJECT(data_structures::bitvector);
2364 Has_been_reached->allocate(A_given->degree);
2365
2366 nb_reached = 0;
2367
2368 Orbit_allocated = 1024;
2369 Orbit = NEW_int(Orbit_allocated);
2370
2371 Q_allocated = 1024;
2372 Q = NEW_int(Q_allocated);
2373
2374 nb_gens = gens->len;
2375
2376 if (A_given->degree > ONE_MILLION) {
2377 f_v = TRUE;
2378 }
2379
2380 Nb_per_generator = NEW_int(nb_gens);
2381 Int_vec_zero(Nb_per_generator, nb_gens);
2382 Pts_per_generator = NEW_pint(nb_gens);
2383
2384 for (pt = 0; pt < A_given->degree; pt++) {
2385 if (Has_been_reached->s_i(pt)) {
2386 continue;
2387 }
2388 if (f_vv) {
2389 cout << "strong_generators::orbits_light "
2390 "computing orbit of point " << pt << endl;
2391 }
2392 Q[0] = pt;
2393 Q_len = 1;
2394
2395 Orbit[0] = pt;
2396 Orbit_len = 1;
2397
2398 while (Q_len) {
2399 if (f_vv) {
2400 cout << "strong_generators::orbits_light "
2401 "considering the next element in the queue" << endl;
2402 }
2403 a = Q[0];
2404 for (i = 1; i < Q_len; i++) {
2405 Q[i - 1] = Q[i];
2406 }
2407 Q_len--;
2408 if (f_vv) {
2409 cout << "strong_generators::orbits_light "
2410 "looking at element " << a << endl;
2411 }
2412 for (h = 0; h < nb_gens; h++) {
2413 if (f_vv) {
2414 cout << "strong_generators::orbits_light "
2415 "applying generator " << h << endl;
2416 }
2417 b = A_given->element_image_of(a, gens->ith(h), FALSE);
2418 if (f_vv) {
2419 cout << "strong_generators::orbits_light "
2420 "under generator " << h
2421 << " it maps to " << b << endl;
2422 }
2423 if (!Sorting.int_vec_search(Orbit, Orbit_len, b, idx)) {
2424 if (Orbit_len == Orbit_allocated) {
2425 int new_oa;
2426 int *O;
2427
2428 new_oa = 2 * Orbit_allocated;
2429 O = NEW_int(new_oa);
2430 for (i = 0; i < Orbit_len; i++) {
2431 O[i] = Orbit[i];
2432 }
2433 FREE_int(Orbit);
2434 Orbit = O;
2435 Orbit_allocated = new_oa;
2436 }
2437 for (i = Orbit_len; i > idx; i--) {
2438 Orbit[i] = Orbit[i - 1];
2439 }
2440 Orbit[idx] = b;
2441 Orbit_len++;
2442 Generator_idx[b] = h;
2443 Nb_per_generator[h]++;
2444
2445 if (f_vv) {
2446 cout << "current orbit: ";
2447 Int_vec_print(cout, Orbit, Orbit_len);
2448 cout << endl;
2449 }
2450
2451 Has_been_reached->m_i(b, 1);
2452 nb_reached++;
2453 if (f_v && ((nb_reached & ((1 << 18) - 1)) == 0)) {
2454 cout << "strong_generators::orbits_light "
2455 "nb_reached = " << nb_reached << " / "
2456 << A_given->degree << endl;
2457 }
2458
2459 if (Q_len == Q_allocated) {
2460 int new_qa;
2461 int *new_Q;
2462
2463 new_qa = 2 * Q_allocated;
2464 new_Q = NEW_int(new_qa);
2465 for (i = 0; i < Q_len; i++) {
2466 new_Q[i] = Q[i];
2467 }
2468 FREE_int(Q);
2469 Q = new_Q;
2470 Q_allocated = new_qa;
2471 }
2472
2473 Q[Q_len++] = b;
2474
2475 if (f_vv) {
2476 cout << "current Queue: ";
2477 Int_vec_print(cout, Q, Q_len);
2478 cout << endl;
2479 }
2480
2481 }
2482 } // next h
2483 } // while (Q_len)
2484
2485 if (f_vv) {
2486 cout << "Orbit of point " << pt << " has length "
2487 << Orbit_len << endl;
2488 }
2489 if (nb_orbits == Orbit_reps_allocated) {
2490 int an;
2491 int *R;
2492 int *L;
2493
2494 an = 2 * Orbit_reps_allocated;
2495 R = NEW_int(an);
2496 L = NEW_int(an);
2497 for (i = 0; i < nb_orbits; i++) {
2498 R[i] = Orbit_reps[i];
2499 L[i] = Orbit_lengths[i];
2500 }
2501 FREE_int(Orbit_reps);
2502 FREE_int(Orbit_lengths);
2503 Orbit_reps = R;
2504 Orbit_lengths = L;
2505 Orbit_reps_allocated = an;
2506 }
2507 Orbit_reps[nb_orbits] = pt;
2508 Orbit_lengths[nb_orbits] = Orbit_len;
2509 nb_orbits++;
2510 } // for pt
2511 if (f_v) {
2512 cout << "strong_generators::orbits_light degree = "
2513 << A_given->degree << " we found " << nb_orbits
2514 << " orbits" << endl;
2515 cout << i << " : " << Nb_per_generator[i] << endl;
2516 for (i = 0; i < nb_gens; i++) {
2517 cout << i << " : " << Nb_per_generator[i] << endl;
2518 }
2519 }
2520
2521
2522 if (f_v) {
2523 cout << "strong_generators::orbits_light computing the arrays "
2524 "Pts_per_generator" << endl;
2525 }
2526 for (i = 0; i < nb_gens; i++) {
2527 int *v;
2528 int j;
2529
2530 v = NEW_int(Nb_per_generator[i]);
2531 j = 0;
2532 for (pt = 0; pt < A_given->degree; pt++) {
2533 if (Generator_idx[pt] == i) {
2534 v[j] = pt;
2535 j++;
2536 }
2537 }
2538 if (j != Nb_per_generator[i]) {
2539 cout << "strong_generators::orbits_light j != Nb_per_generator[i]" << endl;
2540 exit(1);
2541 }
2542 Pts_per_generator[i] = v;
2543 }
2544
2545 FREE_int(Orbit);
2546 FREE_int(Q);
2547 //FREE_uchar(reached);
2548 FREE_OBJECT(Has_been_reached);
2549 FREE_int(Generator_idx);
2550 //FREE_int(Nb_per_generator);
2551 if (f_v) {
2552 cout << "strong_generators::orbits_light degree = "
2553 << A_given->degree << " we found "
2554 << nb_orbits << " orbits" << endl;
2555 }
2556}
2557
2558
2560 ofstream &fp, int verbose_level)
2561{
2562 int f_v = (verbose_level >= 1);
2563 int i;
2564
2565 if (f_v) {
2566 cout << "strong_generators::write_to_file_binary" << endl;
2567 }
2568
2569 if (!A->f_has_base()) {
2570 cout << "strong_generators::write_to_file_binary "
2571 "!A->f_has_base" << endl;
2572 exit(1);
2573 }
2574 if (f_v) {
2575 cout << "strong_generators::write_to_file_binary "
2576 "A->base_len=" << A->base_len() << endl;
2577 }
2578 int bl;
2579
2580 bl = A->base_len();
2581 fp.write((char *) &bl, sizeof(int));
2582
2583 if (tl == NULL) {
2584 cout << "strong_generators::write_to_file_binary tl == NULL" << endl;
2585 exit(1);
2586 }
2587 for (i = 0; i < A->base_len(); i++) {
2588 if (f_v) {
2589 cout << "strong_generators::write_to_file_binary "
2590 "before writing tl[" << i << "]" << endl;
2591 }
2592 fp.write((char *) &tl[i], sizeof(int));
2593 }
2594 if (f_v) {
2595 cout << "strong_generators::write_to_file_binary "
2596 "before gens->write_to_file_binary" << endl;
2597 }
2598 gens->write_to_file_binary(fp, 0 /*verbose_level - 1*/);
2599 if (f_v) {
2600 cout << "strong_generators::write_to_file_binary "
2601 "after gens->write_to_file_binary" << endl;
2602 }
2603 if (f_v) {
2604 cout << "strong_generators::write_to_file_binary done" << endl;
2605 }
2606}
2607
2609 actions::action *A, ifstream &fp, int verbose_level)
2610{
2611 int f_v = (verbose_level >= 1);
2612 int i, l;
2613
2614 if (f_v) {
2615 cout << "strong_generators::read_from_file_binary" << endl;
2616 }
2617 init(A, 0);
2618 if (f_v) {
2619 cout << "strong_generators::read_from_file_binary "
2620 "action A=" << A->label << endl;
2621 }
2622 fp.read((char *) &l, sizeof(int));
2623 if (l != A->base_len()) {
2624 cout << "strong_generators::read_from_file_binary "
2625 "l != A->base_len()" << endl;
2626 cout << "l=" << l << endl;
2627 cout << "A->base_len()=" << A->base_len() << endl;
2628 exit(1);
2629 }
2630 if (f_v) {
2631 cout << "strong_generators::read_from_file_binary "
2632 "A->base_len()=" << A->base_len() << endl;
2633 }
2634 tl = NEW_int(A->base_len());
2635 for (i = 0; i < A->base_len(); i++) {
2636 fp.read((char *) &tl[i], sizeof(int));
2637 }
2639 gens->init(A, verbose_level - 2);
2640 if (f_v) {
2641 cout << "strong_generators::read_from_file_binary "
2642 "before gens->read_from_file_binary" << endl;
2643 }
2644 gens->read_from_file_binary(fp, 0 /*verbose_level - 1*/);
2645 if (f_v) {
2646 cout << "strong_generators::read_from_file_binary done" << endl;
2647 }
2648}
2649
2650void strong_generators::write_file(std::string &fname, int verbose_level)
2651{
2652 int f_v = (verbose_level >= 1);
2654
2655 if (f_v) {
2656 cout << "strong_generators::write_file" << endl;
2657 }
2658 {
2659 ofstream fp(fname, ios::binary);
2660
2661 write_to_file_binary(fp, verbose_level - 1);
2662 }
2663 if (f_v) {
2664 cout << "Written file " << fname << " of size "
2665 << Fio.file_size(fname) << endl;
2666 }
2667 if (f_v) {
2668 cout << "strong_generators::write_file done" << endl;
2669 }
2670}
2671
2673 std::string &fname, int verbose_level)
2674{
2675 int f_v = (verbose_level >= 1);
2677
2678 if (f_v) {
2679 cout << "strong_generators::read_file reading "
2680 "file " << fname << " of size "
2681 << Fio.file_size(fname) << endl;
2682 }
2683 if (Fio.file_size(fname) <= 0) {
2684 cout << "strong_generators::read_file "
2685 "file " << fname << " does not exist" << endl;
2686 exit(1);
2687 }
2688 if (f_v) {
2689 cout << "strong_generators::read_file reading file " << fname << endl;
2690 }
2691
2692 {
2693 ifstream fp(fname, ios::binary);
2694
2695 read_from_file_binary(A, fp, 0 /*verbose_level*/);
2696 }
2697 if (f_v) {
2698 cout << "strong_generators::read_file "
2699 "Read file " << fname << " of size "
2700 << Fio.file_size(fname) << endl;
2701 }
2702 if (f_v) {
2703 cout << "strong_generators::read_file done" << endl;
2704 }
2705}
2706
2707
2708#if 0
2709void strong_generators::generators_for_shallow_schreier_tree(
2710 char *label, vector_ge *chosen_gens, int verbose_level)
2711{
2712 int f_v = (verbose_level >= 1);
2713 action *AR;
2714 sims *S;
2715 int go;
2716 double avg;
2717 double log_go;
2718 int cnt = 0;
2719 int i;
2720
2721 go = group_order_as_int();
2722 log_go = log(go);
2723 if (f_v) {
2724 cout << "strong_generators::generators_for_shallow_"
2725 "schreier_tree group of order " << go << endl;
2726 cout << "log_go = " << log_go << endl;
2727 }
2728 S = create_sims(verbose_level - 2);
2729 if (f_v) {
2730 cout << "strong_generators::generators_for_shallow_"
2731 "schreier_tree created sims" << endl;
2732 }
2733 AR = new_action_by_right_multiplication(S,
2734 TRUE /* f_transfer_ownership */, verbose_level - 2);
2735 if (f_v) {
2736 cout << "strong_generators::generators_for_shallow_"
2737 "schreier_tree created action by right "
2738 "multiplication" << endl;
2739 }
2740
2741 chosen_gens->init(A);
2742 chosen_gens->allocate(gens->len);
2743 for (i = 0; i < gens->len; i++) {
2744 A->element_move(gens->ith(i), chosen_gens->ith(i), 0);
2745 }
2746
2747 while (TRUE) {
2748
2749 schreier *Sch;
2750
2751 Sch = NEW_OBJECT(schreier);
2752 Sch->init(AR);
2753 Sch->initialize_tables();
2754 Sch->init_generators(*chosen_gens);
2755 if (f_v) {
2756 cout << "strong_generators::generators_for_shallow_"
2757 "schreier_tree before computing all orbits" << endl;
2758 }
2759 Sch->compute_all_point_orbits(verbose_level - 2);
2760 if (f_v) {
2761 cout << "strong_generators::generators_for_shallow_"
2762 "schreier_tree after computing all orbits" << endl;
2763 }
2764 if (Sch->nb_orbits > 1) {
2765 cout << "strong_generators::generators_for_shallow_"
2766 "schreier_tree Sch->nb_orbits > 1" << endl;
2767 exit(1);
2768 }
2769 char label1[1000];
2770 int xmax = 1000000;
2771 int ymax = 1000000;
2772 int f_circletext = TRUE;
2773 int rad = 3000;
2774
2775 sprintf(label1, "%s_%d", label, cnt);
2776 Sch->draw_tree(label1, 0 /* orbit_no */,
2777 xmax, ymax, f_circletext, rad,
2778 TRUE /* f_embedded */, FALSE /* f_sideways */,
2779 0.3 /* scale */, 1. /* line_width */,
2780 FALSE, NULL,
2781 0 /* verbose_level */);
2782
2783
2784 int *Depth;
2785 int avgi, f, /*l,*/ idx;
2786
2787 Depth = NEW_int(Sch->A->degree);
2788 for (i = 0; i < Sch->A->degree; i++) {
2789 Depth[i] = Sch->depth_in_tree(i);
2790 }
2791 tally Cl;
2792
2793 Cl.init(Depth, Sch->A->degree, FALSE, 0);
2794 if (f_v) {
2795 cout << "distribution of depth in tree is: ";
2796 Cl.print(TRUE);
2797 cout << endl;
2798 }
2799 avg = Cl.average();
2800 if (f_v) {
2801 cout << "average = " << avg << endl;
2802 cout << "log_go = " << log_go << endl;
2803 }
2804
2805 if (avg < log_go) {
2806 if (f_v) {
2807 cout << "strong_generators::generators_for_shallow_"
2808 "schreier_tree average < log_go, we are done" << endl;
2809 }
2810 break;
2811 }
2812
2813 avgi = (int) avg;
2814 if (f_v) {
2815 cout << "average as int = " << avgi << endl;
2816 }
2817 f = 0;
2818 for (i = 0; i < Cl.nb_types; i++) {
2819 f = Cl.type_first[i];
2820 //l = Cl.type_len[i];
2821 if (Cl.data_sorted[f] == avgi) {
2822 break;
2823 }
2824 }
2825 if (i == Cl.nb_types) {
2826 cout << "strong_generators::generators_for_shallow_"
2827 "schreier_tree cannot find element of depth "
2828 << avgi << endl;
2829 exit(1);
2830 }
2831 idx = Cl.sorting_perm_inv[f];
2832 if (f_v) {
2833 cout << "strong_generators::generators_for_shallow_"
2834 "schreier_tree idx = " << idx << endl;
2835 }
2836 Sch->coset_rep(idx);
2837 chosen_gens->append(Sch->cosetrep);
2838
2839
2840 FREE_int(Depth);
2841 FREE_OBJECT(Sch);
2842 cnt++;
2843 }
2844
2845
2846 if (f_v) {
2847 cout << "strong_generators::generators_for_shallow_"
2848 "schreier_tree done" << endl;
2849 }
2850}
2851#endif
2852
2854 char *&ascii_coding, int verbose_level)
2855{
2856 int f_v = (verbose_level >= 1);
2857 int sz, i, j;
2858 char *p;
2860
2861 if (f_v) {
2862 cout << "strong_generators::compute_ascii_coding" << endl;
2863 }
2864 sz = 2 * ((2 + A->base_len() + A->base_len()) * sizeof(int_4) +
2866 ascii_coding = NEW_char(sz);
2867 p = ascii_coding;
2868 Os.code_int4(p, (int_4) A->base_len());
2869
2870 Os.code_int4(p, (int_4) gens->len);
2871 for (i = 0; i < A->base_len(); i++) {
2872 Os.code_int4(p, (int_4) A->base_i(i));
2873 }
2874 for (i = 0; i < A->base_len(); i++) {
2875 Os.code_int4(p, (int_4) tl[i]);
2876 }
2877 for (i = 0; i < gens->len; i++) {
2878 A->element_pack(gens->ith(i), A->elt1, FALSE);
2879 for (j = 0; j < A->coded_elt_size_in_char; j++) {
2880 Os.code_uchar(p, A->elt1[j]);
2881 }
2882 }
2883 *p++ = 0;
2884 if (p - ascii_coding != sz) {
2885 cout << "strong_generators::compute_ascii_coding "
2886 "p - ascii_coding != sz" << endl;
2887 exit(1);
2888 }
2889
2890
2891 if (f_v) {
2892 cout << "strong_generators::compute_ascii_coding "
2893 "done" << endl;
2894 }
2895}
2896
2898 char *ascii_coding, int verbose_level)
2899{
2900 int f_v = (verbose_level >= 1);
2901 int str_len, len, nbsg, i, j;
2902 char *p, *p0;
2903 actions::action *A_save;
2904 int *base1;
2906
2907 if (f_v) {
2908 cout << "strong_generators::decode_ascii_coding" << endl;
2909 }
2910
2911 // clean up before we go:
2912 A_save = A;
2913 freeself();
2914 A = A_save;
2915
2916 p = ascii_coding;
2917 p0 = p;
2918 str_len = strlen(ascii_coding);
2919 len = Os.decode_int4(p);
2920 nbsg = Os.decode_int4(p);
2921 if (len != A->base_len()) {
2922 cout << "strong_generators::decode_ascii_coding "
2923 "len != A->base_len" << endl;
2924 cout << "len=" << len << " (from file)" << endl;
2925 cout << "A->base_len=" << A->base_len() << endl;
2926 cout << "action A is " << A->label << endl;
2927 exit(1);
2928 }
2930 gens->init(A, verbose_level - 2);
2931 gens->allocate(nbsg, verbose_level - 2);
2932 base1 = NEW_int(A->base_len());
2933 tl = NEW_int(A->base_len());
2934 for (i = 0; i < A->base_len(); i++) {
2935 base1[i] = Os.decode_int4(p);
2936 }
2937 for (i = 0; i < A->base_len(); i++) {
2938 if (base1[i] != A->base_i(i)) {
2939 cout << "strong_generators::decode_ascii_coding "
2940 "base element " << i << " does not match "
2941 "current base" << endl;
2942 exit(1);
2943 }
2944 }
2945 for (i = 0; i < A->base_len(); i++) {
2946 tl[i] = Os.decode_int4(p);
2947 }
2948 for (i = 0; i < nbsg; i++) {
2949 for (j = 0; j < A->coded_elt_size_in_char; j++) {
2950 Os.decode_uchar(p, A->elt1[j]);
2951 }
2952 A->element_unpack(A->elt1, gens->ith(i), FALSE);
2953 }
2954 FREE_int(base1);
2955 if (p - p0 != str_len) {
2956 cout << "strong_generators::decode_ascii_coding "
2957 "p - p0 != str_len" << endl;
2958 cout << "p - p0 = " << p - p0 << endl;
2959 cout << "str_len = " << str_len << endl;
2960 exit(1);
2961 }
2962 if (f_v) {
2963 cout << "strong_generators::decode_ascii_coding done" << endl;
2964 }
2965}
2966
2968 std::string &fname, actions::action *A2, int verbose_level)
2969{
2970 int f_v = (verbose_level >= 1);
2971 int i;
2973
2974 if (f_v) {
2975 cout << "strong_generators::export_permutation_group_to_magma" << endl;
2976 }
2977 {
2978 ofstream fp(fname);
2979
2980 fp << "G := sub< Sym(" << A2->degree << ") |" << endl;
2981 for (i = 0; i < gens->len; i++) {
2983 gens->ith(i), fp,
2984 1 /* offset */,
2985 TRUE /* f_do_it_anyway_even_for_big_degree */,
2986 FALSE /* f_print_cycles_of_length_one */,
2987 0 /* verbose_level */);
2988 if (i < gens->len - 1) {
2989 fp << ", " << endl;
2990 }
2991 }
2992 fp << ">;" << endl;
2993
2994 }
2995 if (f_v) {
2996 cout << "Written file " << fname << " of size "
2997 << Fio.file_size(fname) << endl;
2998 }
2999
3000 if (f_v) {
3001 cout << "strong_generators::export_permutation_group_to_magma done" << endl;
3002 }
3003}
3004
3006 std::string &fname, actions::action *A2, int verbose_level)
3007{
3008 int f_v = (verbose_level >= 1);
3009 int i;
3011
3012 if (f_v) {
3013 cout << "strong_generators::export_permutation_group_to_GAP" << endl;
3014 }
3015 {
3016 ofstream fp(fname);
3017
3018 fp << "G := Group([" << endl;
3019 for (i = 0; i < gens->len; i++) {
3021 gens->ith(i), fp,
3022 1 /* offset */,
3023 TRUE /* f_do_it_anyway_even_for_big_degree */,
3024 FALSE /* f_print_cycles_of_length_one */,
3025 0 /* verbose_level */);
3026 if (i < gens->len - 1) {
3027 fp << ", " << endl;
3028 }
3029 }
3030 fp << "]);" << endl;
3031
3032 }
3033 if (f_v) {
3034 cout << "Written file " << fname << " of size "
3035 << Fio.file_size(fname) << endl;
3036 }
3037
3038 if (f_v) {
3039 cout << "strong_generators::export_permutation_group_to_GAP done" << endl;
3040 }
3041}
3042
3043
3044
3045
3046
3047
3049 actions::action *A_given, long int *set, int len, int verbose_level)
3050{
3051 int f_v = (verbose_level >= 1);
3052 schreier *Sch;
3053 int i, j, f, l, a;
3054
3055 if (f_v) {
3056 cout << "strong_generators::compute_and_print_orbits_on_a_given_set" << endl;
3057 }
3059 A_given, Sch, set, len, verbose_level - 2);
3060
3061 cout << "orbits on the set: " << endl;
3062 for (i = 0; i < Sch->nb_orbits; i++) {
3063 f = Sch->orbit_first[i];
3064 for (j = 0; j < Sch->orbit_len[i]; j++) {
3065 a = Sch->orbit[f + j];
3066 cout << a << " ";
3067 }
3068 if (i < Sch->nb_orbits - 1) {
3069 cout << "| ";
3070 }
3071 }
3072 cout << endl;
3073 cout << "partition: " << len << " = ";
3074 for (i = 0; i < Sch->nb_orbits; i++) {
3075 l = Sch->orbit_len[i];
3076 cout << l << " ";
3077 if (i < Sch->nb_orbits - 1) {
3078 cout << "+ ";
3079 }
3080 }
3081 cout << endl;
3082 cout << "representatives for each of the "
3083 << Sch->nb_orbits << " orbits:" << endl;
3084 for (i = 0; i < Sch->nb_orbits; i++) {
3085 f = Sch->orbit_first[i];
3086 l = Sch->orbit_len[i];
3087 a = Sch->orbit[f + 0];
3088 cout << setw(5) << a << " : " << setw(5) << l << " : ";
3089 A_given->print_point(a, cout);
3090 cout << endl;
3091 }
3092 FREE_OBJECT(Sch);
3093
3094}
3095
3097 actions::action *A_given, int verbose_level)
3098{
3099 int f_v = (verbose_level >= 1);
3100 schreier *Sch;
3101 int i, j, f, l, a;
3102
3103 if (f_v) {
3104 cout << "strong_generators::compute_and_print_orbits" << endl;
3105 }
3106 compute_schreier_with_given_action(A_given, Sch, verbose_level - 2);
3107
3108 cout << "orbits on the set: " << endl;
3109 for (i = 0; i < Sch->nb_orbits; i++) {
3110 f = Sch->orbit_first[i];
3111 l = Sch->orbit_len[i];
3112 if (l >= 10) {
3113 cout << "too long to list ";
3114 }
3115 else {
3116 for (j = 0; j < Sch->orbit_len[i]; j++) {
3117 a = Sch->orbit[f + j];
3118 cout << a << " ";
3119 }
3120 }
3121 if (i < Sch->nb_orbits - 1) {
3122 cout << "| ";
3123 }
3124 }
3125 cout << endl;
3126 cout << "partition: " << A_given->degree << " = ";
3127 for (i = 0; i < Sch->nb_orbits; i++) {
3128 l = Sch->orbit_len[i];
3129 cout << l << " ";
3130 if (i < Sch->nb_orbits - 1) {
3131 cout << "+ ";
3132 }
3133 }
3134 cout << endl;
3135 cout << "representatives for each of the "
3136 << Sch->nb_orbits << " orbits:" << endl;
3137 for (i = 0; i < Sch->nb_orbits; i++) {
3138 f = Sch->orbit_first[i];
3139 l = Sch->orbit_len[i];
3140 a = Sch->orbit[f + 0];
3141 cout << setw(5) << a << " : " << setw(5) << l << " : ";
3142 A_given->print_point(a, cout);
3143 cout << endl;
3144 }
3145
3146#if 0
3147 set_of_sets *S;
3148
3149 Sch->orbits_as_set_of_sets(S, 0 /* verbose_level */);
3150
3151 const char *fname = "orbits.csv";
3152
3153 cout << "writing orbits to file " << fname << endl;
3154 S->save_csv(fname, 1 /* verbose_level */);
3155
3156 FREE_OBJECT(S);
3157#endif
3158 FREE_OBJECT(Sch);
3159
3160}
3161
3163{
3164 int f_v = (verbose_level >= 1);
3165 int i;
3166
3167 if (f_v) {
3168 cout << "strong_generators::test_if_normalizing" << endl;
3169 }
3170 for (i = 0; i < gens->len; i++) {
3171 if (f_v) {
3172 cout << "strong_generators::test_if_normalizing "
3173 "testing generator " << i << " / "
3174 << gens->len << endl;
3175 }
3176 if (!S->is_normalizing(gens->ith(i), verbose_level)) {
3177 if (f_v) {
3178 cout << "strong_generators::test_if_normalizing "
3179 "generator " << i << " / " << gens->len
3180 << " does not normalize the given group" << endl;
3181 }
3182 return FALSE;
3183 }
3184 }
3185 if (f_v) {
3186 cout << "strong_generators::test_if_normalizing done, "
3187 "the given generators normalize the given group" << endl;
3188 }
3189 return TRUE;
3190}
3191
3192
3194 actions::action *A_given, long int *set, int set_sz, int verbose_level)
3195{
3196 int f_v = (verbose_level >= 1);
3197 int i;
3198
3199 if (f_v) {
3200 cout << "strong_generators::test_if_set_is_invariant_under_given_action" << endl;
3201 }
3202 for (i = 0; i < gens->len; i++) {
3203
3204 if (!A_given->test_if_set_stabilizes(gens->ith(i),
3205 set_sz, set, 0 /* verbose_level */)) {
3206 cout << "strong_generators::test_if_set_is_invariant_under_given_action "
3207 "the generator does not fix the set" << endl;
3208 exit(1);
3209 }
3210 }
3211 if (f_v) {
3212 cout << "strong_generators::test_if_set_is_invariant_under_given_action done" << endl;
3213 }
3214}
3215
3217 int pt, int verbose_level)
3218{
3219 int f_v = (verbose_level >= 1);
3220
3221 if (f_v) {
3222 cout << "strong_generators::point_stabilizer" << endl;
3223 }
3224
3225 schreier *Sch;
3226 sims *Stab;
3227 strong_generators *Stab_gens;
3228 ring_theory::longinteger_object G_order, stab_go;
3229
3230 if (f_v) {
3231 cout << "computing orbit of point " << pt << ":" << endl;
3232 }
3233 group_order(G_order);
3234 Sch = orbit_of_one_point_schreier(A, pt, verbose_level);
3235 if (f_v) {
3236 cout << "orbit of point " << pt << " has length "
3237 << Sch->orbit_len[0] << endl;
3238 }
3239 Sch->point_stabilizer(A, G_order,
3240 Stab, 0 /* orbit_no */, verbose_level);
3241 Stab->group_order(stab_go);
3242 if (f_v) {
3243 cout << "stabilizer of point " << pt << " has order "
3244 << stab_go << endl;
3245 }
3246 Stab_gens = NEW_OBJECT(strong_generators);
3247 Stab_gens->init_from_sims(Stab, verbose_level);
3248 if (f_v) {
3249 cout << "generators for the stabilizer "
3250 "have been computed" << endl;
3251 }
3252
3253 if (f_v) {
3254 cout << "strong_generators::point_stabilizer done" << endl;
3255 }
3256 FREE_OBJECT(Sch);
3257 FREE_OBJECT(Stab);
3258 return Stab_gens;
3259}
3260
3262 int nb_fixpoints, actions::action *A_given, int verbose_level)
3263{
3264 int f_v = (verbose_level >= 1);
3265
3266 if (f_v) {
3267 cout << "strong_generators::find_cyclic_subgroup_with_exactly_n_fixpoints" << endl;
3268 }
3269
3270 sims *H;
3271 int *Elt;
3272 int order;
3273 strong_generators *Sub_gens;
3274
3275 if (f_v) {
3276 cout << "finding element with n fixpoints, where n = " << nb_fixpoints << ":" << endl;
3277 }
3278
3279 H = create_sims(verbose_level - 2);
3280
3281 Elt = NEW_int(A->elt_size_in_int);
3282
3284 Elt, nb_fixpoints, A_given, verbose_level);
3285
3286 Sub_gens = NEW_OBJECT(strong_generators);
3287 if (f_v) {
3288 cout << "strong_generators::find_cyclic_subgroup_with_exactly_n_fixpoints "
3289 "before init_single_with_target_go" << endl;
3290 cout << "Elt=" << endl;
3291 A->element_print(Elt, cout);
3292 }
3293 Sub_gens->init_single_with_target_go(A, Elt, order, verbose_level);
3294 if (f_v) {
3295 cout << "strong_generators::find_cyclic_subgroup_with_exactly_n_fixpoints "
3296 "after init_single_with_target_go" << endl;
3297 }
3298
3299 if (f_v) {
3300 cout << "strong_generators::find_cyclic_subgroup_with_exactly_n_fixpoints done" << endl;
3301 }
3302 FREE_int(Elt);
3303 FREE_OBJECT(H);
3304 return Sub_gens;
3305}
3306
3307
3309 actions::action *A_given,
3310 int pt_A, int pt_B, int *Elt, int verbose_level)
3311{
3312 int f_v = (verbose_level >= 1);
3313
3314 if (f_v) {
3315 cout << "strong_generators::make_element_which_moves_a_point_from_A_to_B" << endl;
3316 }
3317
3318 schreier *Orb;
3319 int orbit_idx;
3320 int len;
3321
3322
3323 Orb = orbit_of_one_point_schreier(A_given, pt_A,
3324 0 /*verbose_level */);
3325 len = Orb->orbit_len[0];
3326 if (Orb->orbit_inv[pt_B] >= len) {
3327 cout << "strong_generators::make_element_which_moves_"
3328 "a_point_from_A_to_B the two points are not "
3329 "in the same orbit" << endl;
3330 exit(1);
3331 }
3332 Orb->transporter_from_orbit_rep_to_point(pt_B, orbit_idx, Elt,
3333 0 /* verbose_level */);
3334
3335 if (A_given->element_image_of(pt_A, Elt, 0 /* verbose_level*/)
3336 != pt_B) {
3337 cout << "strong_generators::make_element_which_moves_a_point_from_A_to_B "
3338 "the image of A is not B" << endl;
3339 exit(1);
3340 }
3341
3342 FREE_OBJECT(Orb);
3343 if (f_v) {
3344 cout << "strong_generators::make_element_which_moves_a_point_from_A_to_B done" << endl;
3345 }
3346}
3347
3349 std::string &label_txt,
3350 ostream &ost,
3351 actions::action *A2,
3352 int verbose_level)
3353{
3354 int f_v = (verbose_level >= 1);
3356
3357
3358 if (f_v) {
3359 cout << "strong_generators::export_group_to_magma_and_copy_to_latex" << endl;
3360 }
3361 string export_fname;
3362
3363 export_fname.assign(label_txt);
3364 export_fname.append("_group.magma");
3365
3367 export_fname, A2, verbose_level - 2);
3368 if (f_v) {
3369 cout << "written file " << export_fname << " of size "
3370 << Fio.file_size(export_fname) << endl;
3371 }
3372
3373 ost << "\\subsection*{Magma Export}" << endl;
3374 ost << "To export the group to Magma, "
3375 "use the following file\\\\" << endl;
3376 ost << "\\begin{verbatim}" << endl;
3377
3378 {
3379 ifstream fp1(export_fname);
3380 char line[100000];
3381
3382 while (TRUE) {
3383 if (fp1.eof()) {
3384 break;
3385 }
3386
3387 //cout << "count_number_of_orbits_in_file reading
3388 //line, nb_sol = " << nb_sol << endl;
3389 fp1.getline(line, 100000, '\n');
3390 ost << line << endl;
3391 }
3392
3393 }
3394 ost << "\\end{verbatim}" << endl;
3395
3396 if (f_v) {
3397 cout << "strong_generators::export_group_to_magma_and_copy_to_latex done" << endl;
3398 }
3399}
3400
3402 std::string &label_txt,
3403 ostream &ost,
3404 actions::action *A2,
3405 int verbose_level)
3406{
3407 int f_v = (verbose_level >= 1);
3409
3410
3411 if (f_v) {
3412 cout << "strong_generators::export_group_to_GAP_and_copy_to_latex" << endl;
3413 }
3414 string export_fname;
3415
3416 export_fname.assign(label_txt);
3417 export_fname.append("_group.gap");
3418
3420 export_fname, A2, verbose_level - 2);
3421 if (f_v) {
3422 cout << "written file " << export_fname << " of size "
3423 << Fio.file_size(export_fname) << endl;
3424 }
3425
3426 ost << "\\subsection*{GAP Export}" << endl;
3427 ost << "To export the group to GAP, "
3428 "use the following file\\\\" << endl;
3429 ost << "\\begin{verbatim}" << endl;
3430
3431 {
3432 ifstream fp1(export_fname);
3433 char line[100000];
3434
3435 while (TRUE) {
3436 if (fp1.eof()) {
3437 break;
3438 }
3439
3440 //cout << "count_number_of_orbits_in_file reading
3441 //line, nb_sol = " << nb_sol << endl;
3442 fp1.getline(line, 100000, '\n');
3443 ost << line << endl;
3444 }
3445
3446 }
3447 ost << "\\end{verbatim}" << endl;
3448
3449 if (f_v) {
3450 cout << "strong_generators::export_group_to_GAP_and_copy_to_latex done" << endl;
3451 }
3452}
3453
3455 std::string &label_txt,
3456 ostream &ost,
3457 actions::action *A2,
3458 int verbose_level)
3459{
3460 int f_v = (verbose_level >= 1);
3461
3462
3463 if (f_v) {
3464 cout << "strong_generators::export_group_and_copy_to_latex" << endl;
3465 }
3466 export_group_to_magma_and_copy_to_latex(label_txt, ost, A2, verbose_level);
3467 export_group_to_GAP_and_copy_to_latex(label_txt, ost, A2, verbose_level);
3468 if (f_v) {
3469 cout << "strong_generators::export_group_and_copy_to_latex done" << endl;
3470 }
3471
3472}
3473
3474
3476 ostream &ost,
3478 int verbose_level)
3479{
3480 int f_v = (verbose_level >= 1);
3481 int i;
3482
3483 if (f_v) {
3484 cout << "strong_generators::report_fixed_objects_in_P3" << endl;
3485 }
3486
3487 ost << "\\begin{enumerate}[(1)]" << endl;
3488 for (i = 0; i < gens->len; i++) {
3489
3490 ost << "\\item" << endl;
3492 P3,
3493 gens->ith(i),
3494 verbose_level);
3495 }
3496 ost << "\\end{enumerate}" << endl;
3497 if (f_v) {
3498 cout << "strong_generators::report_fixed_objects_in_P3" << endl;
3499 }
3500}
3501
3503{
3504 int f_v = (verbose_level >= 1);
3505
3506 if (f_v) {
3507 cout << "strong_generators::reverse_isomorphism_exterior_square" << endl;
3508 }
3509
3510 if (f_v) {
3511 cout << "strong_generators::reverse_isomorphism_exterior_square "
3512 "before gens->reverse_isomorphism_exterior_square" << endl;
3513 }
3514
3516
3517 if (f_v) {
3518 cout << "strong_generators::reverse_isomorphism_exterior_square "
3519 "after gens->reverse_isomorphism_exterior_square" << endl;
3520 }
3521
3522 if (f_v) {
3523 cout << "strong_generators::reverse_isomorphism_exterior_square" << endl;
3524 }
3525}
3526
3527void strong_generators::get_gens_data(int *&data, int &sz, int verbose_level)
3528{
3529 int f_v = (verbose_level >= 1);
3530
3531 if (f_v) {
3532 cout << "strong_generators::get_gens_data" << endl;
3533 }
3534 int i;
3535
3536 sz = gens->len * A->make_element_size;
3537 data = NEW_int(sz);
3538 for (i = 0; i < gens->len; i++) {
3540 }
3541 if (f_v) {
3542 cout << "strong_generators::get_gens_data done" << endl;
3543 }
3544}
3545
3546void strong_generators::get_gens_data_as_string_with_quotes(std::string &str, int verbose_level)
3547{
3548 int f_v = (verbose_level >= 1);
3549
3550 if (f_v) {
3551 cout << "strong_generators::get_gens_data_as_string_with_quotes" << endl;
3552 }
3553 int *data;
3554 int sz;
3555
3556 get_gens_data(data, sz, verbose_level);
3557
3558
3560
3561 if (f_v) {
3562 cout << "strong_generators::get_gens_data_as_string_with_quotes done" << endl;
3563 }
3564}
3565
3567 actions::action *A2,
3568 std::string &fname, std::string &label, std::string &label_tex,
3569 int verbose_level)
3570{
3571 int f_v = (verbose_level >= 1);
3572 int i, j;
3573 long int a;
3576
3577 if (f_v) {
3578 cout << "strong_generators::export_to_orbiter_as_bsgs" << endl;
3579 }
3580
3581 group_order(go);
3582 if (f_v) {
3583 cout << "strong_generators::export_to_orbiter_as_bsgs go = " << go << endl;
3584 cout << "strong_generators::export_to_orbiter_as_bsgs number of generators = " << gens->len << endl;
3585 cout << "strong_generators::export_to_orbiter_as_bsgs degree = " << A2->degree << endl;
3586 }
3587 {
3588 ofstream fp(fname);
3589
3590 string fname_generators;
3591
3592 fname_generators.assign(label);
3593 fname_generators.append("_gens.csv");
3594
3595
3596#if 0
3597 for (i = 0; i < gens->len; i++) {
3598 fp << "GENERATOR_" << label << "_" << i << " = \\" << endl;
3599 fp << "\t\"";
3600 for (j = 0; j < A2->degree; j++) {
3601 if (FALSE) {
3602 cout << "strong_generators::export_to_orbiter_as_bsgs computing image of " << j << " under generator " << i << endl;
3603 }
3604 a = A2->element_image_of(j, gens->ith(i), 0 /* verbose_level*/);
3605 fp << a;
3606 if (j < A2->degree - 1) {
3607 fp << ",";
3608 }
3609 }
3610 fp << "\"";
3611 fp << endl;
3612 }
3613#else
3614 {
3615 long int *Data;
3616
3617 Data = NEW_lint(gens->len * A2->degree);
3618 for (i = 0; i < gens->len; i++) {
3619 for (j = 0; j < A2->degree; j++) {
3620 a = A2->element_image_of(j, gens->ith(i), 0 /* verbose_level*/);
3621 Data[i * A2->degree + j] = a;
3622 }
3623 }
3624
3625
3626 Fio.lint_matrix_write_csv(fname_generators, Data, gens->len, A2->degree);
3627
3628
3629 FREE_lint(Data);
3630 }
3631#endif
3632
3633 fp << endl;
3634 fp << label << ":" << endl;
3635 fp << "\t$(ORBITER_PATH)orbiter.out -v 2 \\" << endl;
3636 fp << "\t\t-define gens -vector -file " << fname_generators << " -end \\" << endl;
3637 fp << "\t\t-define G -permutation_group \\" << endl;
3638 fp << "\t\t-bsgs " << label << " \"" << label_tex << "\" "
3639 << A2->degree << " " << go << " ";
3640 fp << "\"";
3641 A->print_bare_base(fp);
3642 fp << "\"";
3643 fp << " ";
3644 fp << gens->len;
3645 fp << " gens -end \\" << endl;
3646#if 0
3647 for (i = 0; i < gens->len; i++) {
3648 fp << "\t\t\t" << "$(GENERATOR_" << label << "_" << i << ") \\" << endl;
3649 }
3650 fp << "\t\t-end" << endl;
3651#endif
3652
3653 //$(ORBITER_PATH)orbiter.out -v 10 \
3654 // -define G -permutation_group \
3655 // -bsgs C13 C_{13} 13 13 0 1 \
3656 // $(GEN_C13) \
3657 // -end \
3658
3659 // with backslashes at the end of the line
3660
3661 }
3662 cout << "Written file " << fname << " of size "
3663 << Fio.file_size(fname) << endl;
3664
3665 if (f_v) {
3666 cout << "strong_generators::export_to_orbiter_as_bsgs" << endl;
3667 }
3668}
3669
3670
3671
3672
3673
3674
3675
3676}}}
3677
3678
compact storage of 0/1-data as bitvectors
void create_string_with_quotes(std::string &str, int *v, int len)
Definition: int_vec.cpp:1088
a collection of functions related to sorted vectors
int int_vec_search(int *v, int len, int a, int &idx)
Definition: sorting.cpp:1094
functions related to strings and character arrays
void create_comma_separated_list(std::string &output, long int *input, int input_sz)
a statistical analysis of data consisting of single integers
void init(int *data, int data_length, int f_second, int verbose_level)
Definition: tally.cpp:72
void print_file_tex_we_are_in_math_mode(std::ostream &ost, int f_backwards)
Definition: tally.cpp:358
void print_matrix_latex(std::ostream &ost, int *A, int m, int n)
void isomorphism_to_special_orthogonal(int *A4, int *A6, int verbose_level)
projective space PG(n,q) of dimension n over Fq
Definition: geometry.h:1916
void lint_matrix_write_csv(std::string &fname, long int *M, int m, int n)
Definition: file_io.cpp:1323
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
void create_from_base_10_string(const char *str, int verbose_level)
a permutation group in a fixed action.
Definition: actions.h:99
void print_for_make_element(std::ostream &ost, void *elt)
Definition: action_cb.cpp:182
void element_print_latex(void *elt, std::ostream &ost)
Definition: action_cb.cpp:364
void element_print_as_permutation_with_offset(void *elt, std::ostream &ost, int offset, int f_do_it_anyway_even_for_big_degree, int f_print_cycles_of_length_one, int verbose_level)
Definition: action_cb.cpp:463
void element_conjugate_babv(int *Elt_A, int *Elt_B, int *Elt_C, int verbose_level)
void element_conjugate_bvab(int *Elt_A, int *Elt_B, int *Elt_C, int verbose_level)
void element_unpack(void *elt, void *Elt, int verbose_level)
Definition: action_cb.cpp:287
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_pack(void *Elt, void *elt, int verbose_level)
Definition: action_cb.cpp:294
void element_retrieve(int hdl, void *elt, int verbose_level)
Definition: action_cb.cpp:301
groups::sims * create_sims_from_generators_with_target_group_order_factorized(data_structures_groups::vector_ge *gens, int *tl, int len, int verbose_level)
void element_print_for_make_element(void *elt, std::ostream &ost)
Definition: action_cb.cpp:409
int count_fixed_points(void *elt, int verbose_level)
Definition: action.cpp:601
field_theory::finite_field * matrix_group_finite_field()
Definition: action.cpp:2883
int element_order_and_cycle_type(void *elt, int *cycle_type)
Definition: action.cpp:860
void make_element(int *Elt, int *data, int verbose_level)
Definition: action.cpp:1875
int test_if_set_stabilizes(int *Elt, int size, long int *set, int verbose_level)
Definition: action.cpp:622
void print_for_make_element_no_commas(std::ostream &ost, void *elt)
Definition: action_cb.cpp:188
void element_move(void *a, void *b, int verbose_level)
Definition: action_cb.cpp:335
void print_point(int a, std::ostream &ost)
Definition: action_cb.cpp:149
void report_fixed_objects_in_P3(std::ostream &ost, geometry::projective_space *P3, int *Elt, int verbose_level)
groups::matrix_group * get_matrix_group()
Definition: action.cpp:2986
void element_print_latex_with_print_point_function(void *elt, std::ostream &ost, void(*point_label)(std::stringstream &sstr, long int pt, void *data), void *point_label_data)
Definition: action_cb.cpp:388
void generators_to_strong_generators(int f_target_go, ring_theory::longinteger_object &target_go, data_structures_groups::vector_ge *gens, groups::strong_generators *&Strong_gens, int verbose_level)
groups::sims * create_sims_from_generators_with_target_group_order_lint(data_structures_groups::vector_ge *gens, long int target_go, int verbose_level)
void element_print_as_permutation(void *elt, std::ostream &ost)
Definition: action_cb.cpp:421
void element_transpose(void *a, void *at, int verbose_level)
Definition: action_cb.cpp:329
long int element_image_of(long int a, void *elt, int verbose_level)
Definition: action_cb.cpp:198
void init_ascii_coding_to_sims(const char *ascii_coding, int verbose_level)
void extract_subset_of_elements_by_rank_text_vector(const char *rank_vector_text, groups::sims *S, int verbose_level)
Definition: vector_ge.cpp:836
void init_conjugate_svas_of(vector_ge *v, int *Elt, int verbose_level)
Definition: vector_ge.cpp:205
void extract_subset_of_elements_by_rank(int *rank_vector, int len, groups::sims *S, int verbose_level)
Definition: vector_ge.cpp:863
void init_conjugate_sasv_of(vector_ge *v, int *Elt, int verbose_level)
Definition: vector_ge.cpp:237
void write_to_file_binary(std::ofstream &fp, int verbose_level)
Definition: vector_ge.cpp:688
void init_from_data(actions::action *A, int *data, int nb_elements, int elt_size, int verbose_level)
Definition: vector_ge.cpp:175
void init(actions::action *A, int verbose_level)
Definition: vector_ge.cpp:55
void init_from_permutation_representation(actions::action *A, groups::sims *S, int *data, int nb_elements, int verbose_level)
Definition: vector_ge.cpp:141
void read_from_file_binary(std::ifstream &fp, int verbose_level)
Definition: vector_ge.cpp:705
a matrix group over a finite field in projective, vector space or affine action
Definition: groups.h:318
Schreier trees for orbits of groups on points.
Definition: groups.h:839
void compute_all_point_orbits(int verbose_level)
Definition: schreier.cpp:988
void orbits_as_set_of_sets(data_structures::set_of_sets *&S, int verbose_level)
Definition: schreier.cpp:2653
void compute_all_orbits_on_invariant_subset_lint(int len, long int *subset, int verbose_level)
Definition: schreier.cpp:1221
void transporter_from_orbit_rep_to_point(int pt, int &orbit_idx, int *Elt, int verbose_level)
Definition: schreier.cpp:735
void init_generators(data_structures_groups::vector_ge &generators, int verbose_level)
Definition: schreier.cpp:373
void transporter_from_point_to_orbit_rep(int pt, int &orbit_idx, int *Elt, int verbose_level)
Definition: schreier.cpp:760
void compute_point_orbit(int pt, int verbose_level)
Definition: schreier.cpp:1256
void point_stabilizer(actions::action *default_action, ring_theory::longinteger_object &go, groups::sims *&Stab, int orbit_no, int verbose_level)
Definition: schreier.cpp:2388
void init(actions::action *A, int verbose_level)
Definition: schreier.cpp:308
a permutation group represented via a stabilizer chain
Definition: groups.h:1273
void compute_all_powers(int elt_idx, int n, int *power_elt, int verbose_level)
void transitive_extension_using_coset_representatives_extract_generators(int *coset_reps, int nb_cosets, data_structures_groups::vector_ge &SG, int *tl, int verbose_level)
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
int is_normalizing(int *Elt, int verbose_level)
void create_group_table(int *&Table, long int &n, int verbose_level)
void transitive_extension_using_generators(int *Elt_gens, int nb_gens, int subgroup_index, data_structures_groups::vector_ge &SG, int *tl, int verbose_level)
void element_unrank_lint(long int rk, int *Elt, int verbose_level)
Definition: sims.cpp:1326
int find_element_with_exactly_n_fixpoints_in_given_action(int *Elt, int nb_fixpoints, actions::action *A_given, int verbose_level)
a strong generating set for a permutation group with respect to a fixed action
Definition: groups.h:1703
void init_copy(strong_generators *S, int verbose_level)
void compute_and_print_orbits_on_a_given_set(actions::action *A_given, long int *set, int len, int verbose_level)
void compute_schreier_with_given_action_on_a_given_set(actions::action *A_given, schreier *&Sch, long int *set, int len, int verbose_level)
void orbits_on_points_with_given_action(actions::action *A_given, int &nb_orbits, int *&orbit_reps, int verbose_level)
void create_group_table(int *&Table, long int &go, int verbose_level)
void init_from_data(actions::action *A, int *data, int nb_elements, int elt_size, int *transversal_length, data_structures_groups::vector_ge *&nice_gens, int verbose_level)
void init_by_hdl_and_with_tl(actions::action *A, std::vector< int > &gen_handle, std::vector< int > &tl, int verbose_level)
void orbits_on_points(int &nb_orbits, int *&orbit_reps, int verbose_level)
void export_group_and_copy_to_latex(std::string &label_txt, std::ostream &ost, actions::action *A2, int verbose_level)
void get_gens_data(int *&data, int &sz, int verbose_level)
void test_if_set_is_invariant_under_given_action(actions::action *A_given, long int *set, int set_sz, int verbose_level)
void print_generators_as_permutations_tex(std::ostream &ost, actions::action *A2)
void print_generators_MAGMA(actions::action *A, std::ostream &ost)
strong_generators * point_stabilizer(int pt, int verbose_level)
void add_single_generator(int *Elt, int group_index, int verbose_level)
void init_single_with_target_go(actions::action *A, int *Elt, int target_go, int verbose_level)
void init_point_stabilizer_of_arbitrary_point_through_schreier(schreier *Sch, int pt, int &orbit_idx, ring_theory::longinteger_object &full_group_order, int verbose_level)
void print_elements_latex_ost_with_print_point_function(actions::action *A, std::ostream &ost, void(*point_label)(std::stringstream &sstr, long int pt, void *data), void *point_label_data)
void export_group_to_magma_and_copy_to_latex(std::string &label_txt, std::ostream &ost, actions::action *A2, int verbose_level)
void init_point_stabilizer_orbit_rep_schreier(schreier *Sch, int orbit_idx, ring_theory::longinteger_object &full_group_order, int verbose_level)
void init_from_permutation_representation(actions::action *A, sims *parent_group_S, int *data, int nb_elements, long int group_order, data_structures_groups::vector_ge *&nice_gens, int verbose_level)
void init_by_hdl(actions::action *A, int *gen_hdl, int nb_gen, int verbose_level)
schreier * orbit_of_one_point_schreier(actions::action *A_given, int pt, int verbose_level)
void print_elements_with_given_action(std::ostream &ost, actions::action *A2)
void decode_ascii_coding(char *ascii_coding, int verbose_level)
void init_from_ascii_coding(actions::action *A, char *ascii_coding, int verbose_level)
void report_fixed_objects_in_P3(std::ostream &ost, geometry::projective_space *P3, int verbose_level)
void switch_to_subgroup(const char *rank_vector_text, const char *subgroup_order_text, sims *S, int *&subgroup_gens_idx, int &nb_subgroup_gens, int verbose_level)
void init_generators_for_the_conjugate_group_aGav(strong_generators *SG, int *Elt_a, int verbose_level)
void list_of_elements_of_subgroup(strong_generators *gens_subgroup, long int *&Subgroup_elements_by_index, long int &sz_subgroup, int verbose_level)
void print_generators_tex_with_print_point_function(actions::action *A, std::ostream &ost, void(*point_label)(std::stringstream &sstr, long int pt, void *data), void *point_label_data)
strong_generators * find_cyclic_subgroup_with_exactly_n_fixpoints(int nb_fixpoints, actions::action *A_given, int verbose_level)
void compute_and_print_orbits(actions::action *A_given, int verbose_level)
schreier * orbits_on_points_schreier(actions::action *A_given, int verbose_level)
void canonical_image_GAP(std::string &input_set_text, std::ostream &ost)
void read_from_file_binary(actions::action *A, std::ifstream &fp, int verbose_level)
void compute_ascii_coding(char *&ascii_coding, int verbose_level)
void read_file(actions::action *A, std::string &fname, int verbose_level)
void init_from_data_with_target_go(actions::action *A, int *data_gens, int data_gens_size, int nb_gens, ring_theory::longinteger_object &target_go, data_structures_groups::vector_ge *&nice_gens, int verbose_level)
void export_magma(actions::action *A, std::ostream &ost, int verbose_level)
void write_to_file_binary(std::ofstream &fp, int verbose_level)
void export_permutation_group_to_GAP(std::string &fname, actions::action *A2, int verbose_level)
void print_with_given_action(std::ostream &ost, actions::action *A2)
void print_generators_in_different_action_tex(std::ostream &ost, actions::action *A2)
void init_from_sims(groups::sims *S, int verbose_level)
void orbits_light(actions::action *A_given, int *&Orbit_reps, int *&Orbit_lengths, int &nb_orbits, int **&Pts_per_generator, int *&Nb_per_generator, int verbose_level)
void init_generators_for_the_conjugate_group_avGa(strong_generators *SG, int *Elt_a, int verbose_level)
void export_to_orbiter_as_bsgs(actions::action *A2, std::string &fname, std::string &label, std::string &label_tex, int verbose_level)
void export_group_to_GAP_and_copy_to_latex(std::string &label_txt, std::ostream &ost, actions::action *A2, int verbose_level)
void add_generators(data_structures_groups::vector_ge *coset_reps, int group_index, int verbose_level)
void compute_schreier_with_given_action(actions::action *A_given, schreier *&Sch, int verbose_level)
void write_file(std::string &fname, int verbose_level)
void init_from_data_with_go(actions::action *A, std::string &generators_data, std::string &go_text, int verbose_level)
void init_subgroup(actions::action *A, int *subgroup_gens_idx, int nb_subgroup_gens, const char *subgroup_order_text, sims *S, int verbose_level)
void init_transposed_group(strong_generators *SG, int verbose_level)
void export_permutation_group_to_magma(std::string &fname, actions::action *A2, int verbose_level)
void print_generators_gap_in_different_action(std::ostream &ost, actions::action *A2)
void init_subgroup_by_generators(actions::action *A, int nb_subgroup_gens, int *subgroup_gens, std::string &subgroup_order_text, data_structures_groups::vector_ge *&nice_gens, int verbose_level)
sims * create_sims_in_different_action(actions::action *A_given, int verbose_level)
void init_group_extension(strong_generators *subgroup, int *data, int index, int verbose_level)
void make_element_which_moves_a_point_from_A_to_B(actions::action *A_given, int pt_A, int pt_B, int *Elt, int verbose_level)
void init_from_data_with_target_go_ascii(actions::action *A, int *data, int nb_elements, int elt_size, const char *ascii_target_go, data_structures_groups::vector_ge *&nice_gens, int verbose_level)
data_structures_groups::vector_ge * gens
Definition: groups.h:1708
void get_gens_data_as_string_with_quotes(std::string &str, int verbose_level)
void group_order(ring_theory::longinteger_object &go)
a subgroup of a group using a list of elements
Definition: groups.h:2039
#define Int_vec_scan(A, B, C)
Definition: foundations.h:716
#define MINIMUM(x, y)
Definition: foundations.h:216
#define FREE_int(p)
Definition: foundations.h:640
#define Int_vec_zero(A, B)
Definition: foundations.h:713
#define ONE_MILLION
Definition: foundations.h:226
#define Lint_vec_scan(A, B, C)
Definition: foundations.h:717
#define NEW_pint(n)
Definition: foundations.h:627
#define NEW_char(n)
Definition: foundations.h:632
#define NEW_OBJECT(type)
Definition: foundations.h:638
#define FREE_OBJECT(p)
Definition: foundations.h:651
#define NEW_int(n)
Definition: foundations.h:625
int int_4
Definition: foundations.h:181
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define Int_vec_copy(A, B, C)
Definition: foundations.h:693
#define FREE_lint(p)
Definition: foundations.h:642
#define NEW_lint(n)
Definition: foundations.h:628
#define Int_vec_print(A, B, C)
Definition: foundations.h:685
orbiter_kernel_system::orbiter_session * Orbiter
global Orbiter session
the orbiter library for the classification of combinatorial objects