Orbiter 2022
Combinatorial Objects
action_init.cpp
Go to the documentation of this file.
1// action_init.cpp
2//
3// Anton Betten
4// 1/1/2009
5
7#include "group_actions.h"
8
9using namespace std;
10
11
12namespace orbiter {
13namespace layer3_group_actions {
14namespace actions {
15
16
19 int f_projective, int f_general, int f_affine,
20 int f_semilinear, int f_special,
22 int verbose_level)
23{
24 int f_v = (verbose_level >= 1);
25 //int f_vv = (verbose_level >= 2);
26 int f_basis = TRUE;
27 int f_init_sims = FALSE;
28
29 if (f_v) {
30 cout << "action::init_linear_group "
31 "m=" << m << " q=" << F->q << endl;
32 }
33
34 if (f_projective) {
35 if (f_v) {
36 cout << "action::init_linear_group before init_projective_group "
37 "m=" << m << " q=" << F->q
38 << " f_semilinear=" << f_semilinear << endl;
39 }
40 init_projective_group(m, F, f_semilinear,
41 f_basis, f_init_sims,
42 nice_gens,
43 verbose_level);
44 if (f_v) {
45 cout << "action::init_linear_group after init_projective_group "
46 "m=" << m << " q=" << F->q
47 << " f_semilinear=" << f_semilinear << endl;
48 }
49 }
50 else if (f_general) {
51 if (f_v) {
52 cout << "action::init_linear_group before init_general_linear_group "
53 "m=" << m << " q=" << F->q
54 << " f_semilinear=" << f_semilinear << endl;
55 }
56 init_general_linear_group(m, F, f_semilinear,
57 f_basis, f_init_sims,
58 nice_gens,
59 verbose_level);
60 if (f_v) {
61 cout << "action::init_linear_group after init_general_linear_group "
62 "m=" << m << " q=" << F->q
63 << " f_semilinear=" << f_semilinear << endl;
64 }
65 }
66 else if (f_affine) {
67 if (f_v) {
68 cout << "action::init_linear_group before init_affine_group "
69 "m=" << m << " q=" << F->q
70 << " f_semilinear=" << f_semilinear << endl;
71 }
72 init_affine_group(m, F, f_semilinear,
73 f_basis, f_init_sims,
74 nice_gens,
75 verbose_level);
76 if (f_v) {
77 cout << "action::init_linear_group after init_affine_group "
78 "m=" << m << " q=" << F->q
79 << " f_semilinear=" << f_semilinear << endl;
80 }
81 }
82 else {
83 cout << "action::init_linear_group "
84 "the type of group is not specified" << endl;
85 exit(1);
86 }
87
88
90 cout << "action::init_linear_group "
91 "fatal: !f_has_strong_generators" << endl;
92 }
93
94
95
96 if (f_special) {
97
98
99 if (f_v) {
100 cout << "action::init_linear_group "
101 "computing intersection with "
102 "special linear group" << endl;
103 }
104
105
106 action A_on_det;
108
109 A_on_det.induced_action_on_determinant(Sims, verbose_level);
110 if (f_v) {
111 cout << "action::init_linear_group "
112 "induced_action_on_determinant finished" << endl;
113 }
114 A_on_det.Kernel->group_order(go);
115 if (f_v) {
116 cout << "action::init_linear_group "
117 "intersection has order " << go << endl;
118 }
119
120
122
124 if (f_v) {
125 cout << "action::init_linear_group creating strong generators "
126 "for the kernel n the action "
127 "on the determinant" << endl;
128 }
129
130 SG->init_from_sims(A_on_det.Kernel, 0 /* verbose_level */);
131 //S = SG->create_sims(0 /* verbose_level */);
132 FREE_OBJECT(SG);
133 }
134
135#if 0
136 else {
137 if (f_v) {
138 cout << "action::init_linear_group "
139 "before Strong_gens->create_sims" << endl;
140 }
141
142 S = Strong_gens->create_sims(verbose_level - 2);
143 }
144
145 if (f_v) {
146 cout << "action::init_linear_group "
147 "sims object has been created" << endl;
148 }
149#endif
150
151
152
153
154
155
156 if (f_v) {
157 print_base();
158#if 0
159 if (f_projective) {
160 display_all_PG_elements(m - 1, *F);
161 }
162#endif
163 }
164
165
166
167 if (f_v) {
168 cout << "action::init_linear_group finished" << endl;
169 }
170}
171
172
173
175 int f_semilinear, int f_basis, int f_init_sims,
177 int verbose_level)
178{
179 int f_v = (verbose_level >= 1);
181
182 if (f_v) {
183 cout << "action::init_projective_group" << endl;
184 cout << "n=" << n << " q=" << F->q << endl;
185 cout << "f_semilinear=" << f_semilinear << endl;
186 cout << "f_basis=" << f_basis << endl;
187 }
188
190
191
192
194 G.matrix_grp = M;
196
198 dimension = n;
199
200 if (f_v) {
201 cout << "action::init_projective_group "
202 "before M->init_projective_group" << endl;
203 }
205 F, f_semilinear, this, verbose_level - 3);
206 if (f_v) {
207 cout << "action::init_projective_group "
208 "after M->init_projective_group" << endl;
209 }
210
211
213 if (f_v) {
214 cout << "action::init_projective_group low_level_point_size="
215 << low_level_point_size<< endl;
216 }
217 label.assign(M->label);
218 label_tex.assign(M->label_tex);
219 if (f_v) {
220 cout << "action::init_projective_group label=" << label << endl;
221 }
222
223 degree = M->degree;
225
228
232
233
234 if (f_basis) {
235 if (f_v) {
236 cout << "action::init_projective_group "
237 "before setup_linear_group_from_strong_generators"
238 << endl;
239 }
241 nice_gens, f_init_sims,
242 verbose_level - 3);
243 if (f_v) {
244 cout << "action::init_projective_group "
245 "after setup_linear_group_from_strong_generators"
246 << endl;
247 }
248 }
249 if (f_v) {
250 cout << "action::init_projective_group, finished setting up "
251 << label;
252 cout << ", a permutation group of degree " << degree << " ";
253 cout << "and of order ";
254 print_group_order(cout);
255 cout << endl;
256 //cout << "make_element_size=" << make_element_size << endl;
257 //cout << "base_len=" << base_len << endl;
258 //cout << "f_semilinear=" << f_semilinear << endl;
259 }
260}
261
263 int f_semilinear,
264 int f_basis, int f_init_sims,
266 int verbose_level)
267{
268 int f_v = (verbose_level >= 1);
270
271 if (f_v) {
272 cout << "action::init_affine_group" << endl;
273 cout << "n=" << n << " q=" << F->q << endl;
274 cout << "f_semilinear=" << f_semilinear << endl;
275 cout << "f_basis=" << f_basis << endl;
276 }
277
279
280
281
283 G.matrix_grp = M;
285
287 dimension = n;
288
289 M->init_affine_group(n, F, f_semilinear, this, verbose_level - 1);
290
291
293 if (f_v) {
294 cout << "action::init_affine_group low_level_point_size="
295 << low_level_point_size<< endl;
296 }
297 label.assign(M->label);
298 label_tex.assign(M->label_tex);
299 if (f_v) {
300 cout << "action::init_affine_group label=" << label << endl;
301 }
302
303 degree = M->degree;
305
308
312
313 if (f_basis) {
315 nice_gens, f_init_sims, verbose_level);
316 }
317 if (f_v) {
318 cout << "action::init_affine_group, finished setting up "
319 << label;
320 cout << ", a permutation group of degree " << degree << " ";
321 cout << "and of order ";
322 print_group_order(cout);
323 cout << endl;
324 //cout << "make_element_size=" << make_element_size << endl;
325 //cout << "base_len=" << base_len << endl;
326 //cout << "f_semilinear=" << f_semilinear << endl;
327 }
328}
329
331 int f_semilinear,
332 int f_basis, int f_init_sims,
334 int verbose_level)
335{
336 int f_v = (verbose_level >= 1);
338
339 if (f_v) {
340 cout << "action::init_general_linear_group" << endl;
341 cout << "n=" << n << " q=" << F->q << endl;
342 cout << "f_semilinear=" << f_semilinear << endl;
343 cout << "f_basis=" << f_basis << endl;
344 }
345
347
348
349
351 G.matrix_grp = M;
353
355 dimension = n;
356
358 f_semilinear, this, verbose_level - 1);
359
360
362 if (f_v) {
363 cout << "action::init_general_linear_group "
364 "low_level_point_size="
365 << low_level_point_size<< endl;
366 }
367 label.assign(M->label);
368 label_tex.assign(M->label_tex);
369 if (f_v) {
370 cout << "action::init_general_linear_group "
371 "label=" << label << endl;
372 }
373
374 degree = M->degree;
376
379
383
384
385 if (f_basis) {
387 nice_gens, f_init_sims, verbose_level);
388 }
389 if (f_v) {
390 cout << "action::init_general_linear_group, "
391 "finished setting up " << label;
392 cout << ", a permutation group of degree " << degree << " ";
393 cout << "and of order ";
394 print_group_order(cout);
395 cout << endl;
396 //cout << "make_element_size=" << make_element_size << endl;
397 //cout << "base_len=" << base_len << endl;
398 //cout << "f_semilinear=" << f_semilinear << endl;
399 }
400}
401
404 data_structures_groups::vector_ge *&nice_gens, int f_init_sims,
405 int verbose_level)
406{
407 int f_v = (verbose_level >= 1);
408
409
410 if (f_v) {
411 cout << "action::setup_linear_group_from_strong_generators "
412 "setting up a basis" << endl;
413 cout << "action::setup_linear_group_from_strong_generators "
414 "before init_matrix_group_strong_generators_builtin" << endl;
415 }
417 nice_gens,
418 verbose_level - 2);
419 // see below
420 if (f_v) {
421 cout << "action::setup_linear_group_from_strong_generators "
422 "after init_matrix_group_strong_generators_builtin" << endl;
423 }
424
425
426
427 if (f_init_sims) {
428
429 if (f_v) {
430 cout << "action::setup_linear_group_from_strong_generators "
431 "before init_sims_from_generators" << endl;
432 }
433 init_sims_from_generators(verbose_level);
434 if (f_v) {
435 cout << "action::setup_linear_group_from_strong_generators "
436 "after init_sims_from_generators" << endl;
437 }
438
439 }
440
441 if (f_v) {
442 cout << "action::setup_linear_group_from_strong_generators done" << endl;
443 }
444}
445
447{
448 int f_v = (verbose_level >= 1);
449 groups::sims *S;
450
451
452 if (f_v) {
453 cout << "action::init_sims_from_generators" << endl;
454 }
456
457 S->init(this, verbose_level - 2);
458 if (f_v) {
459 cout << "action::init_sims_from_generators "
460 "before S->init_generators" << endl;
461 }
462 S->init_generators(*Strong_gens->gens, 0/*verbose_level*/);
463 if (f_v) {
464 cout << "action::init_sims_from_generators "
465 "after S->init_generators" << endl;
466 }
467 if (f_v) {
468 cout << "action::init_sims_from_generators "
469 "before S->compute_base_orbits_known_length" << endl;
470 }
472 if (f_v) {
473 cout << "action::init_sims_from_generators "
474 "after S->compute_base_orbits_known_length" << endl;
475 }
476
477
478 if (f_v) {
479 cout << "action::init_sims_from_generators "
480 "before init_sims" << endl;
481 }
482 init_sims_only(S, verbose_level);
483 if (f_v) {
484 cout << "action::init_sims_from_generators "
485 "after init_sims" << endl;
486 }
487 if (f_v) {
488 cout << "action::init_sims_from_generators done" << endl;
489 }
490
491}
492
495 int f_semilinear, int f_basis, int verbose_level)
496{
497 int f_v = (verbose_level >= 1);
498
499 if (f_v) {
500 cout << "action::init_projective_special_group" << endl;
501 cout << "n=" << n << " q=" << F->q << endl;
502 cout << "f_semilinear=" << f_semilinear << endl;
503 cout << "f_basis=" << f_basis << endl;
504 }
505
506 if (f_v) {
507 cout << "action::init_projective_special_group "
508 "before init_projective_group" << endl;
509 }
510
512 int f_init_sims = TRUE;
513
515 f_semilinear, f_basis, f_init_sims,
516 nice_gens,
517 verbose_level);
518 if (f_v) {
519 cout << "action::init_projective_special_group "
520 "after init_projective_group" << endl;
521 }
522 FREE_OBJECT(nice_gens);
523
524 {
525 action A_on_det;
528 groups::sims *Sims2;
529
531
532 if (f_v) {
533 cout << "action::init_projective_special_group "
534 "computing intersection with special linear group" << endl;
535 }
537 Sims, verbose_level);
538 if (f_v) {
539 cout << "action::init_projective_special_group "
540 "induced_action_on_determinant finished" << endl;
541 A_on_det.Kernel->group_order(go);
542 cout << "action::init_projective_special_group "
543 "intersection has order " << go << endl;
544 }
545 gens->init_from_sims(A_on_det.Kernel, verbose_level - 1);
546
547
548 Sims2 = gens->create_sims(verbose_level - 1);
549
550 FREE_OBJECT(gens);
551 init_sims_only(Sims2, verbose_level);
552
553 compute_strong_generators_from_sims(0/*verbose_level - 2*/);
554 }
555
556 if (f_v) {
557 cout << "action::init_projective_special_group done" << endl;
558 }
559}
560
564 int verbose_level)
565{
566 int f_v = (verbose_level >= 1);
567 int n, q;
569 int *data;
570 int size, nb_gens;
571
572 if (f_v) {
573 cout << "action::init_matrix_group_strong_generators_builtin" << endl;
574 }
575 F = M->GFq;
576 n = M->n;
577 q = F->q;
578 if (f_v) {
579 cout << "action::init_matrix_group_strong_generators_builtin "
580 "computing strong generators builtin group" << endl;
581 cout << "n=" << n << endl;
582 cout << "q=" << q << endl;
583 cout << "p=" << F->p << endl;
584 cout << "e=" << F->e << endl;
585 cout << "f_semilinear=" << M->f_semilinear << endl;
586 }
587
588 if (f_v) {
589 cout << "action::init_matrix_group_strong_generators_builtin "
590 "getting strong generators" << endl;
591 }
592 if (M->f_projective) {
593
595
597 M->f_semilinear,
598 data, size, nb_gens,
599 0 /*verbose_level - 1*/);
600 }
601 else if (M->f_affine) {
602
604
606 M->f_semilinear,
607 data, size, nb_gens,
608 0 /*verbose_level - 1*/);
609 }
610 else if (M->f_general_linear) {
611
613
615 M->f_semilinear,
616 data, size, nb_gens,
617 0 /*verbose_level - 1*/);
618 }
619 else {
620 cout << "action::init_matrix_group_strong_generators_builtin "
621 "unknown group type" << endl;
622 exit(1);
623 }
624
625
626 if (f_v) {
627 cout << "action::init_matrix_group_strong_generators_builtin "
628 "before Strong_gens->init_from_data" << endl;
629 }
632 Strong_gens->init_from_data(this, data, nb_gens, size,
634 nice_gens,
635 verbose_level - 1);
636 if (f_v) {
637 cout << "action::init_matrix_group_strong_generators_builtin "
638 "after Strong_gens->init_from_data" << endl;
639 }
640 if (f_v) {
641 cout << "action::init_matrix_group_strong_generators_builtin "
642 "generators:" << endl;
644 }
645
646 FREE_int(data);
647
648 if (f_v) {
649 cout << "action::init_matrix_group_strong_generators_builtin "
650 "computing strong generators builtin group finished" << endl;
651 }
652}
653
654void action::init_permutation_group(int degree, int f_no_base, int verbose_level)
655{
656 int page_length_log = PAGE_LENGTH_LOG;
657 int f_v = (verbose_level >= 1);
658 int f_vv = (verbose_level >= 2);
660 char str[1000];
661
662 if (f_v) {
663 cout << "action::init_permutation_group, degree=" << degree << endl;
664 }
665 sprintf(str, "Perm%d", degree);
666
667
668 label.assign(str);
669 label_tex.assign(str);
670
673 G.perm_grp = P;
675
676 if (f_v) {
677 cout << "action::init_permutation_group before P->init" << endl;
678 }
679
680 P->init(degree, page_length_log, verbose_level);
681
682 if (f_v) {
683 cout << "action::init_permutation_group after P->init" << endl;
684 }
685
688
689
692 if (f_vv) {
693 cout << "elt_size_in_int = " << elt_size_in_int << endl;
694 cout << "coded_elt_size_in_char = " << coded_elt_size_in_char << endl;
695 }
699
700
701 // ToDo
702
703
704 if (f_no_base) {
705 if (f_vv) {
706 cout << "action::init_permutation_group "
707 "no base" << endl;
708 }
709 }
710 else {
711 if (f_vv) {
712 cout << "action::init_permutation_group "
713 "calling allocate_base_data" << endl;
714 }
716 Stabilizer_chain->allocate_base_data(this, degree, verbose_level);
717
718 // init trivial base:
719 int i;
720 for (i = 0; i < base_len(); i++) {
721 base_i(i) = i;
722 }
723 }
724
725 // ToDo
726
727
728
729
730 if (f_v) {
731 cout << "action::init_permutation_group finished" << endl;
732 cout << "a permutation group of degree " << action::degree << endl;
733 cout << "and of order ";
734 print_group_order(cout);
735 cout << endl;
736 print_info();
737 }
738 if (f_v) {
739 cout << "action::init_permutation_group done" << endl;
740 }
741
742}
743
745 int verbose_level)
746{
747 int f_v = (verbose_level >= 1);
748
749 if (f_v) {
750 cout << "action::init_permutation_group_from_nauty_output" << endl;
751 }
752
753 if (f_v) {
754 cout << "action::init_permutation_group_from_nauty_output "
755 "before init_permutation_group_from_generators" << endl;
756 }
758 TRUE, *NO->Ago,
759 NO->Aut_counter, NO->Aut,
760 NO->Base_length, NO->Base_lint,
761 FALSE /* f_no_base */,
762 verbose_level - 2);
763 if (f_v) {
764 cout << "action::init_permutation_group_from_nauty_output "
765 "after init_permutation_group_from_generators" << endl;
766 }
767
768 if (f_v) {
769 cout << "action::init_permutation_group_from_nauty_output done" << endl;
770 }
771}
772
773
775 int f_target_go, ring_theory::longinteger_object &target_go,
776 int nb_gens, int *gens,
777 int given_base_length, long int *given_base,
778 int f_no_base,
779 int verbose_level)
780{
781 int f_v = (verbose_level >= 1);
782 int f_vv = (verbose_level >= 2);
783 int i;
785 char str[1000];
786
787 if (f_v) {
788 cout << "action::init_permutation_group_from_generators "
789 "degree=" << degree << " nb_gens=" << nb_gens
790 << " given_base_length=" << given_base_length << endl;
791 if (f_target_go) {
792 cout << "action::init_permutation_group_from_generators "
793 "target group order is " << target_go << endl;
794 }
795 else {
796 cout << "action::init_permutation_group_from_generators "
797 "no target group order is given" << endl;
798 }
799 }
800 sprintf(str, "Perm%d", degree);
801
802
803 label.assign(str);
804 label_tex.assign(str);
805
806 if (f_vv) {
807 cout << "action::init_permutation_group_from_generators "
808 "the " << nb_gens << " generators are" << endl;
809 for (i = 0; i < nb_gens; i++) {
810 cout << i << " : ";
811 if (degree < 20) {
812 Combi.perm_print(cout, gens + i * degree, degree);
813 }
814 else {
815 cout << "too large to print";
816 }
817 cout << endl;
818 }
819 }
820
821 if (f_vv) {
822 cout << "action::init_permutation_group_from_generators "
823 "calling init_permutation_group" << endl;
824 }
825 init_permutation_group(degree, f_no_base, verbose_level - 10);
826 if (f_vv) {
827 cout << "action::init_permutation_group_from_generators "
828 "after init_permutation_group" << endl;
829 }
830
831 if (Stabilizer_chain) {
833 Stabilizer_chain = NULL;
834 }
835
836
837 if (f_no_base) {
838 if (f_vv) {
839 cout << "action::init_permutation_group_from_generators "
840 "no base" << endl;
841 }
842 }
843 else {
844 if (f_vv) {
845 cout << "action::init_permutation_group_from_generators "
846 "calling allocate_base_data" << endl;
847 cout << "given_base:";
848 Lint_vec_print(cout, given_base, given_base_length);
849 cout << " of length " << given_base_length << endl;
850 }
852 Stabilizer_chain->allocate_base_data(this, given_base_length, verbose_level - 10);
853
854 // init base:
855 for (i = 0; i < base_len(); i++) {
856 base_i(i) = given_base[i];
857 }
858
859
860
861 if (f_vv) {
862 cout << "action::init_permutation_group_from_generators, "
863 "now trying to set up the group from the given generators"
864 << endl;
865 }
866
869
871 generators->init(this, verbose_level - 2);
872 generators->allocate(nb_gens, verbose_level - 2);
873 for (i = 0; i < nb_gens; i++) {
874 make_element(generators->ith(i), gens + i * degree,
875 0 /*verbose_level*/);
876 }
877
878
879 if (f_vv) {
880 cout << "action::init_permutation_group_from_generators "
881 "before generators_to_strong_generators" << endl;
882 }
884 f_target_go, target_go,
885 generators, Strong_gens,
886 0 /*verbose_level - 5*/);
887 if (f_vv) {
888 cout << "action::init_permutation_group_from_generators "
889 "after generators_to_strong_generators" << endl;
890 }
891
893
894 if (f_vv) {
895 cout << "action::init_permutation_group_from_generators "
896 "before Strong_gens->create_sims" << endl;
897 }
898 G = Strong_gens->create_sims(verbose_level - 10);
899 if (f_vv) {
900 cout << "action::init_permutation_group_from_generators "
901 "after Strong_gens->create_sims" << endl;
902 }
903
904
905 if (f_vv) {
906 cout << "action::init_permutation_group_from_generators "
907 "before init_sims_only" << endl;
908 }
909 init_sims_only(G, verbose_level - 10);
910 FREE_OBJECT(generators);
912
913
914 if (f_vv) {
915 cout << "action::init_permutation_group_from_generators "
916 "after init_sims_only" << endl;
917 }
918
919
920
921 if (f_vv) {
922 cout << "action::init_permutation_group_from_generators "
923 "before compute_strong_generators_from_sims" << endl;
924 }
925 compute_strong_generators_from_sims(verbose_level - 10);
926 if (f_vv) {
927 cout << "action::init_permutation_group_from_generators "
928 "after_strong_generators_from_sims" << endl;
929 }
930 }
931
932
933
934 if (f_v) {
935 print_info();
936 }
937 if (f_v) {
938 cout << "action::init_permutation_group_from_generators done" << endl;
939 }
940}
941
942void action::init_affine_group(int n, int q,
943 int f_translations,
944 int f_semilinear, int frobenius_power,
945 int f_multiplication,
946 int multiplication_order,
947 int verbose_level)
948{
949 int f_v = (verbose_level >= 1);
950 int nb_gens, degree;
951 int *gens;
952 int given_base_length;
953 long int *given_base;
956 char str1[1000];
957 char str2[1000];
958
959 if (f_v) {
960 cout << "action::init_affine_group" << endl;
961 }
962 sprintf(str1, "AGL_%d_%d", n, q);
963 sprintf(str2, "AGL(%d,%d)", n, q);
964
965 label.assign(str1);
966 label_tex.assign(str2);
967
968 F.finite_field_init(q, FALSE /* f_without_tables */, verbose_level - 1);
969
970
972
973
974 GGD.affine_generators(n, &F, f_translations,
975 f_semilinear, frobenius_power,
976 f_multiplication, multiplication_order,
977 nb_gens, degree, gens,
978 given_base_length, given_base, verbose_level - 2);
979
981 FALSE, go,
982 nb_gens, gens,
983 given_base_length, given_base,
984 FALSE /* f_no_base */,
985 verbose_level);
986
987 FREE_int(gens);
988 FREE_lint(given_base);
989 if (f_v) {
990 cout << "action::init_affine_group done" << endl;
991 }
992}
993
994
995void action::init_symmetric_group(int degree, int f_no_base, int verbose_level)
996{
997 int f_v = (verbose_level >= 1);
998 int nb_gens, *gens;
999 int given_base_length;
1000 long int *given_base;
1001 int i, j;
1004 char str1[1000];
1005 char str2[1000];
1006
1007 if (f_v) {
1008 cout << "action::init_symmetric_group f_no_base=" << f_no_base << endl;
1009 }
1010 sprintf(str1, "Sym_%d", degree);
1011 sprintf(str2, "Sym(%d)", degree);
1012
1013 label.assign(str1);
1014 label_tex.assign(str2);
1015
1016 D.factorial(go, degree);
1017
1019 nb_gens = degree - 1;
1020 given_base_length = degree - 1;
1021 gens = NEW_int(nb_gens * degree);
1022 given_base = NEW_lint(given_base_length);
1023
1024 // Coxeter generators for the symmetric group:
1025 for (i = 0; i < nb_gens; i++) {
1026 for (j = 0; j < degree; j++) {
1027 gens[i * degree + j] = j;
1028 }
1029 gens[i * degree + i] = i + 1;
1030 gens[i * degree + i + 1] = i;
1031 }
1032
1033 for (i = 0; i < given_base_length; i++) {
1034 given_base[i] = i;
1035 }
1036 if (f_v) {
1037 cout << "action::init_symmetric_group before init_permutation_group_from_generators" << endl;
1038 }
1040 TRUE, go,
1041 nb_gens, gens,
1042 given_base_length, given_base,
1043 f_no_base,
1044 verbose_level);
1045 if (f_v) {
1046 cout << "action::init_symmetric_group after init_permutation_group_from_generators" << endl;
1047 }
1048 FREE_int(gens);
1049 FREE_lint(given_base);
1050 if (f_v) {
1051 cout << "action::init_symmetric_group done" << endl;
1052 }
1053}
1054
1055
1056void action::create_sims(int verbose_level)
1057{
1058 int f_v = (verbose_level >= 1);
1059 groups::sims *S;
1060
1061 if (f_v) {
1062 cout << "action::create_sims" << endl;
1063 }
1065 cout << "action::create_sims we need strong generators" << endl;
1066 exit(1);
1067 }
1068
1069 S = Strong_gens->create_sims(verbose_level - 1);
1070
1071 init_sims_only(S, verbose_level);
1072 compute_strong_generators_from_sims(0/*verbose_level - 2*/);
1073 if (f_v) {
1074 cout << "action::create_sims done" << endl;
1075 }
1076}
1077
1078
1079
1081 int f_has_target_group_order, ring_theory::longinteger_object &target_go,
1082 void (* callback_choose_random_generator)(int iteration,
1083 int *Elt, void *data, int verbose_level),
1084 int verbose_level)
1085{
1086 //verbose_level = 10;
1087
1088 int f_v = (verbose_level >= 1);
1089 //int f_vv = (verbose_level >= 2);
1090
1091 if (f_v) {
1092 cout << "action::create_orthogonal_group" << endl;
1093 }
1094
1096 int degree_save;
1097
1098 Mtx = subaction->get_matrix_group();
1099
1100 degree_save = degree;
1101 if (f_v) {
1102 cout << "action::create_orthogonal_group "
1103 "before Mtx->init_base_projective" << endl;
1104 }
1105 Mtx->init_base_projective(this, verbose_level);
1106 // initializes base, base_len, degree,
1107 // transversal_length, orbit, orbit_inv
1108 if (f_v) {
1109 cout << "action::create_orthogonal_group "
1110 "after Mtx->init_base_projective" << endl;
1111 }
1112 degree = degree_save;
1113
1114
1115 if (f_v) {
1116 cout << "action::create_orthogonal_group "
1117 "before allocating a schreier_sims object" << endl;
1118 }
1119
1120 {
1122
1123 if (f_v) {
1124 cout << "action::create_orthogonal_group "
1125 "before ss.init" << endl;
1126 }
1127 ss.init(this, verbose_level - 1);
1128 if (f_v) {
1129 cout << "action::create_orthogonal_group "
1130 "after ss.init" << endl;
1131 }
1132
1133 ss.interested_in_kernel(subaction, verbose_level - 1);
1134
1135 if (f_has_target_group_order) {
1136 ss.init_target_group_order(target_go, verbose_level - 1);
1137 }
1138
1139 if (f_v) {
1140 cout << "action::create_orthogonal_group "
1141 "before ss.init_random_process" << endl;
1142 }
1144 callback_choose_random_generator,
1145 &ss,
1146 verbose_level - 1);
1147 if (f_v) {
1148 cout << "action::create_orthogonal_group "
1149 "after ss.init_random_process" << endl;
1150 }
1151
1152 if (f_v) {
1153 cout << "action::create_orthogonal_group "
1154 "before ss.create_group" << endl;
1155 }
1156 ss.create_group(verbose_level - 1);
1157 if (f_v) {
1158 cout << "action::create_orthogonal_group "
1159 "after ss.create_group" << endl;
1160 }
1161
1162 init_sims_only(ss.G, verbose_level);
1163 compute_strong_generators_from_sims(0/*verbose_level - 2*/);
1164
1166 Kernel = ss.K;
1167
1168 ss.K = NULL;
1169 ss.G = NULL;
1170
1171 //init_transversal_reps_from_stabilizer_chain(G, verbose_level - 2);
1172 if (f_v) {
1173 cout << "action::create_orthogonal_group after init_sims, "
1174 "calling compute_strong_generators_from_sims" << endl;
1175 }
1176 compute_strong_generators_from_sims(verbose_level - 2);
1177 if (f_v) {
1178 cout << "action::create_orthogonal_group done, "
1179 "freeing schreier_sims object" << endl;
1180 }
1181 }
1182 if (f_v) {
1183 cout << "action::create_orthogonal_group "
1184 "done" << endl;
1185 }
1186}
1187
1188
1190 int nb_factors, int n,
1193 int verbose_level)
1194{
1195 int f_v = (verbose_level >= 1);
1196 action *A_wreath;
1197 action *Awr;
1199 long int *points;
1200 int nb_points;
1201 int i;
1202
1203 if (f_v) {
1204 cout << "action::init_wreath_product_group_and_restrict" << endl;
1205 cout << "nb_factors=" << nb_factors
1206 << " n=" << n << " q=" << F->q << endl;
1207 }
1208 A_wreath = NEW_OBJECT(action);
1209 if (f_v) {
1210 cout << "action::init_wreath_product_group_and_restrict "
1211 "before A_wreath->init_wreath_product_group" << endl;
1212 }
1213 A_wreath->init_wreath_product_group(nb_factors, n, F, nice_gens,
1214 verbose_level);
1215 if (f_v) {
1216 cout << "action::init_wreath_product_group_and_restrict "
1217 "after A_wreath->init_wreath_product_group" << endl;
1218 }
1219
1220 W = A_wreath->G.wreath_product_group;
1221 nb_points = W->degree_of_tensor_action;
1222 points = NEW_lint(nb_points);
1223 for (i = 0; i < nb_points; i++) {
1224 points[i] = W->perm_offset_i[nb_factors] + i;
1225 }
1226
1227 if (f_v) {
1228 cout << "action::init_wreath_product_group_and_restrict "
1229 "before A_wreath->restricted_action" << endl;
1230 }
1231 Awr = A_wreath->restricted_action(points, nb_points,
1232 verbose_level);
1233 Awr->f_is_linear = TRUE;
1234 if (f_v) {
1235 cout << "action::init_wreath_product_group_and_restrict "
1236 "after A_wreath->restricted_action" << endl;
1237 }
1238
1239 memcpy(this, Awr, sizeof(action)); // ToDo
1240 Awr->null();
1241 FREE_OBJECT(Awr);
1242}
1243
1244
1245void action::init_wreath_product_group(int nb_factors, int n,
1248 int verbose_level)
1249{
1250 int f_v = (verbose_level >= 1);
1251 action *A_mtx;
1254
1255 if (f_v) {
1256 cout << "action::init_wreath_product_group" << endl;
1257 cout << "nb_factors=" << nb_factors
1258 << " n=" << n << " q=" << F->q << endl;
1259 }
1260
1261 A_mtx = NEW_OBJECT(action);
1264
1265
1266
1269 f_allocated = TRUE;
1270
1271 if (f_v) {
1272 cout << "action::init_wreath_product_group "
1273 "before M->init_general_linear_group" << endl;
1274 }
1276 F, FALSE /* f_semilinear */, A_mtx,
1277 verbose_level - 1);
1278 if (f_v) {
1279 cout << "action::init_wreath_product_group "
1280 "after M->init_general_linear_group" << endl;
1281 }
1282
1283 if (f_v) {
1284 cout << "action::init_wreath_product_group "
1285 "before W->init_tensor_wreath_product" << endl;
1286 }
1287 W->init_tensor_wreath_product(M, A_mtx, nb_factors,
1288 verbose_level);
1289 if (f_v) {
1290 cout << "action::init_wreath_product_group "
1291 "after W->init_tensor_wreath_product" << endl;
1292 }
1293
1294 f_is_linear = TRUE;
1296
1297
1299 if (f_v) {
1300 cout << "action::init_wreath_product_group "
1301 "low_level_point_size="
1302 << low_level_point_size<< endl;
1303 }
1304
1305 label.assign(W->label);
1306 label_tex.assign(W->label_tex);
1307
1308
1309 if (f_v) {
1310 cout << "action::init_wreath_product_group "
1311 "label=" << label << endl;
1312 }
1313
1316
1319
1323
1324
1325
1326
1327 if (f_v) {
1328 cout << "action::init_wreath_product_group "
1329 "degree=" << degree << endl;
1330 }
1331
1333 if (f_v) {
1334 cout << "action::init_wreath_product_group "
1335 "before Stabilizer_chain->allocate_base_data" << endl;
1336 }
1337 Stabilizer_chain->allocate_base_data(this, W->base_length, verbose_level);
1338
1339 if (f_v) {
1340 cout << "action::init_wreath_product_group "
1341 "base_len=" << base_len() << endl;
1342 }
1343
1347
1348 int *gens_data;
1349 int gens_size;
1350 int gens_nb;
1351
1352 if (f_v) {
1353 cout << "action::init_wreath_product_group "
1354 "before W->make_strong_generators_data" << endl;
1355 }
1356 W->make_strong_generators_data(gens_data,
1357 gens_size, gens_nb, verbose_level - 10);
1358 if (f_v) {
1359 cout << "action::init_wreath_product_group "
1360 "after W->make_strong_generators_data" << endl;
1361 }
1363 if (f_v) {
1364 cout << "action::init_wreath_product_group "
1365 "before Strong_gens->init_from_data" << endl;
1366 }
1367
1368
1369 Strong_gens->init_from_data(this, gens_data, gens_nb, gens_size,
1371 nice_gens,
1372 verbose_level - 10);
1373 if (f_v) {
1374 cout << "action::init_wreath_product_group "
1375 "after Strong_gens->init_from_data" << endl;
1376 }
1378 FREE_int(gens_data);
1379
1380
1382 groups::sims *S;
1383
1385
1386 S->init(this, verbose_level - 2);
1387 if (f_v) {
1388 cout << "action::init_wreath_product_group "
1389 "before S->init_generators" << endl;
1390 }
1391 S->init_generators(*Strong_gens->gens, verbose_level);
1392 if (f_v) {
1393 cout << "action::init_wreath_product_group "
1394 "after S->init_generators" << endl;
1395 }
1396 if (f_v) {
1397 cout << "action::init_wreath_product_group "
1398 "before S->compute_base_orbits_known_length" << endl;
1399 }
1401 if (f_v) {
1402 cout << "action::init_wreath_product_group "
1403 "after S->compute_base_orbits_known_length" << endl;
1404 }
1405
1406
1407 if (f_v) {
1408 cout << "action::init_wreath_product_group "
1409 "before init_sims_only" << endl;
1410 }
1411
1412 init_sims_only(S, verbose_level);
1413
1414 if (f_v) {
1415 cout << "action::init_wreath_product_group "
1416 "after init_sims_only" << endl;
1417 }
1418
1419 compute_strong_generators_from_sims(0/*verbose_level - 2*/);
1420 }
1421 else {
1422 cout << "action::init_wreath_product_group "
1423 "because the degree is very large, "
1424 "we are not creating a sims object" << endl;
1425 }
1426
1427 if (f_v) {
1428 cout << "action::init_wreath_product_group, finished setting up "
1429 << label;
1430 cout << ", a permutation group of degree " << degree << " ";
1431 cout << "and of order ";
1432 print_group_order(cout);
1433 cout << endl;
1434 //cout << "make_element_size=" << make_element_size << endl;
1435 //cout << "base_len=" << base_len << endl;
1436 //cout << "f_semilinear=" << f_semilinear << endl;
1437 }
1438}
1439
1441 int f_stay_in_the_old_action,
1443 int *Perms, int degree,
1444 int verbose_level)
1445{
1446 int f_v = (verbose_level >= 1);
1448 char str1[2000];
1449 char str2[2000];
1450
1451 if (f_v) {
1452 cout << "action::init_permutation_representation" << endl;
1453 cout << "original action=" << A_original->label << " restricted to degree " << degree << endl;
1454 cout << "f_stay_in_the_old_action=" << f_stay_in_the_old_action << endl;
1455 }
1456
1458
1459 if (f_v) {
1460 cout << "action::init_permutation_representation before P->init" << endl;
1461 }
1462 P->init(A_original,
1463 f_stay_in_the_old_action,
1464 gens,
1465 Perms, degree,
1466 verbose_level - 2);
1467 if (f_v) {
1468 cout << "action::init_permutation_representation after P->init" << endl;
1469 }
1470
1473 f_allocated = TRUE;
1474
1475 if (f_stay_in_the_old_action) {
1476 f_is_linear = A_original->f_is_linear;
1477 dimension = A_original->f_is_linear;
1479 action::degree = A_original->degree;
1480
1482 if (A_original->type_G != wreath_product_t) {
1483 cout << "action::init_permutation_representation A_original->type_G != wreath_product_t" << endl;
1484 exit(1);
1485 }
1486 W = A_original->G.wreath_product_group;
1487
1488 if (f_v) {
1489 cout << "action::init_permutation_representation "
1490 "degree=" << degree << endl;
1491 }
1492
1494 if (f_v) {
1495 cout << "action::init_permutation_representation "
1496 "before Stabilizer_chain->allocate_base_data" << endl;
1497 }
1498 Stabilizer_chain->allocate_base_data(this, W->base_length, verbose_level);
1499 //allocate_base_data(base_len);
1500 //Stabilizer_chain->base_len = W->base_length;
1501 if (f_v) {
1502 cout << "action::init_permutation_representation "
1503 "base_len=" << base_len() << endl;
1504 }
1505
1509
1510 sprintf(str1, "_induced%d_prev", degree);
1511 sprintf(str2, " induced%d prev", degree);
1512
1513 label.assign(P->label);
1514 label.assign(P->label_tex);
1515
1516 label.append(str1);
1517 label_tex.append(str2);
1518 }
1519 else {
1521 dimension = 0;
1524
1525 sprintf(str1, "_induced%d", degree);
1526 sprintf(str2, " induced%d", degree);
1527
1528 label.assign(P->label);
1529 label_tex.assign(P->label_tex);
1530
1531
1532 label.append(str1);
1533 label_tex.append(str2);
1534
1535 }
1536
1538
1539
1540
1541 if (f_v) {
1542 cout << "action::init_permutation_representation "
1543 "label=" << label << endl;
1544 }
1545
1548
1552
1553 //group_prefix.assign(label);
1554
1555
1556
1557 if (f_v) {
1558 cout << "action::init_permutation_representation "
1559 "degree=" << degree << endl;
1560 }
1561
1562 if (f_v) {
1563 cout << "action::init_permutation_representation, finished setting up "
1564 << label;
1565 cout << ", a permutation group of degree " << degree << " ";
1566 cout << "and of order ";
1567 print_group_order(cout);
1568 cout << endl;
1569 //cout << "make_element_size=" << make_element_size << endl;
1570 //cout << "base_len=" << base_len << endl;
1571 //cout << "f_semilinear=" << f_semilinear << endl;
1572 }
1573}
1574
1577 int f_on_points, int f_on_lines, int f_on_points_and_lines,
1578 int f_semilinear,
1579 int f_basis, int verbose_level)
1580{
1581 int f_v = (verbose_level >= 1);
1582 int f_vv = (verbose_level >= 2);
1584
1585 if (f_v) {
1586 cout << "action::init_orthogonal_group "
1587 "verbose_level=" << verbose_level << endl;
1588 }
1590 if (f_vv) {
1591 cout << "action::init_orthogonal_group before O->init" << endl;
1592 }
1593 O->init(epsilon, n, F, verbose_level);
1594 if (f_vv) {
1595 cout << "action::init_orthogonal_group after O->init" << endl;
1596 }
1597
1599 f_on_points, f_on_lines, f_on_points_and_lines,
1600 f_semilinear,
1601 f_basis, verbose_level);
1602
1603
1604 if (f_v) {
1605 cout << "action::init_orthogonal_group done" << endl;
1606 }
1607}
1608
1610 int f_on_points, int f_on_lines, int f_on_points_and_lines,
1611 int f_semilinear,
1612 int f_basis, int verbose_level)
1613{
1614 int f_v = (verbose_level >= 1);
1615 int f_vv = (verbose_level >= 2);
1616 action *A;
1618 int q = O->F->q;
1620
1621 if (f_v) {
1622 cout << "action::init_orthogonal_group_with_O "
1623 "verbose_level=" << verbose_level << endl;
1624 }
1625 A = NEW_OBJECT(action);
1626 if (f_vv) {
1627 cout << "action::init_orthogonal_group_with_O "
1628 "before A->init_projective_group" << endl;
1629 }
1631 A->init_projective_group(O->n, O->F, f_semilinear,
1632 TRUE /* f_basis */, TRUE /* f_init_sims */,
1633 nice_gens,
1634 verbose_level - 2);
1635 if (f_vv) {
1636 cout << "action::init_orthogonal_group_with_O "
1637 "after A->init_projective_group" << endl;
1638 }
1639 FREE_OBJECT(nice_gens);
1640
1642 if (f_vv) {
1643 cout << "action::init_orthogonal_group_with_O before AO->init" << endl;
1644 }
1645 AO->init(A, O, f_on_points, f_on_lines,
1646 f_on_points_and_lines, verbose_level - 2);
1647 if (f_vv) {
1648 cout << "action::init_orthogonal_group_with_O after AO->init" << endl;
1649 }
1650
1652 G.AO = AO;
1653
1655 subaction = A;
1656 degree = AO->degree;
1661
1665 char str1[1000];
1666 char str2[1000];
1667
1668 if (f_semilinear) {
1669 if (O->epsilon == 1) {
1670 sprintf(str1, "PGGOp_%d_%d", O->n, q);
1671 sprintf(str2, "{\\rm P}\\Gamma{\\rm O}^+(%d,%d)", O->n, q);
1672 }
1673 else if (O->epsilon == -1) {
1674 sprintf(str1, "PGGOm_%d_%d", O->n, q);
1675 sprintf(str2, "{\\rm P}\\Gamma{\\rm O}^-(%d,%d)", O->n, q);
1676 }
1677 else {
1678 sprintf(str1, "PGGO_%d_%d", O->n, q);
1679 sprintf(str2, "{\\rm P}\\Gamma{\\rm O}(%d,%d)", O->n, q);
1680 }
1681 }
1682 else {
1683 if (O->epsilon == 1) {
1684 sprintf(str1, "PGOp_%d_%d", O->n, q);
1685 sprintf(str2, "{\\rm PGO}^+(%d,%d)", O->n, q);
1686 }
1687 else if (O->epsilon == -1) {
1688 sprintf(str1, "PGOm_%d_%d", O->n, q);
1689 sprintf(str2, "{\\rm PGO}^-(%d,%d)", O->n, q);
1690 }
1691 else {
1692 sprintf(str1, "PGO_%d_%d", O->n, q);
1693 sprintf(str2, "{\\rm PGO}(%d,%d)", O->n, q);
1694 }
1695 }
1696
1697 //algebra_global AG;
1698
1699
1700
1701 label.assign(str1);
1702 label_tex.assign(str2);
1703
1704 if (f_basis) {
1706
1707 if (f_vv) {
1708 cout << "action::init_orthogonal_group_with_O "
1709 "we will create the orthogonal group now" << endl;
1710 }
1711
1712 action_global AG;
1713
1715 if (f_vv) {
1716 cout << "action::init_orthogonal_group_with_O "
1717 "with reflections, before order_PO_epsilon" << endl;
1718 }
1719 GG.order_PO_epsilon(f_semilinear, O->epsilon, O->n - 1, O->F->q,
1720 target_go, verbose_level);
1721 }
1722 else {
1723 if (f_vv) {
1724 cout << "action::init_orthogonal_group_with_O "
1725 "without reflections, before order_POmega_epsilon"
1726 << endl;
1727 }
1728 GG.order_POmega_epsilon(O->epsilon, O->n - 1,
1729 O->F->q, target_go, verbose_level);
1730 }
1731
1732 if (f_vv) {
1733 cout << "action::init_orthogonal_group_with_O "
1734 "the target group order is " << target_go << endl;
1735 }
1736
1737 if (f_vv) {
1738 cout << "action::init_orthogonal_group_with_O "
1739 "before create_orthogonal_group" << endl;
1740 }
1741 create_orthogonal_group(A /*subaction*/,
1742 TRUE /* f_has_target_go */, target_go,
1744 verbose_level - 2);
1745 if (f_vv) {
1746 cout << "action::init_orthogonal_group_with_O "
1747 "after create_orthogonal_group" << endl;
1748 }
1749 }
1750
1751 if (f_v) {
1752 cout << "action::init_orthogonal_group_with_O done" << endl;
1753 }
1754}
1755
1757 int f_init_hash_table, int verbose_level)
1758{
1759 int f_v = (verbose_level >= 1);
1760 int f_vv = (verbose_level >= 2);
1761 int p, hh, epsilon, n;
1762 int f_semilinear = FALSE;
1764
1765 if (f_v) {
1766 cout << "action::init_BLT q=" << F->q
1767 << " f_init_hash_table=" << f_init_hash_table << endl;
1768 cout << "f_basis=" << f_basis << endl;
1769 cout << "verbose_level=" << verbose_level << endl;
1770 }
1771 NT.is_prime_power(F->q, p, hh);
1772 if (hh > 1)
1773 f_semilinear = TRUE;
1774 else
1775 f_semilinear = FALSE;
1776 epsilon = 0;
1777 n = 5;
1778
1779
1780 if (f_v) {
1781 cout << "action::init_BLT before init_orthogonal_group" << endl;
1782 }
1783 init_orthogonal_group(epsilon, n, F,
1784 TRUE /* f_on_points */,
1785 FALSE /* f_on_lines */,
1786 FALSE /* f_on_points_and_lines */,
1787 f_semilinear,
1788 f_basis,
1789 verbose_level - 2);
1790 if (f_v) {
1791 cout << "action::init_BLT after init_orthogonal_group" << endl;
1792 }
1793
1794
1795
1796 if (f_v) {
1797 cout << "action::init_BLT computing lex least base" << endl;
1798 }
1799 lex_least_base_in_place(verbose_level - 2);
1800 if (f_v) {
1801 cout << "action::init_BLT computing lex least base done" << endl;
1802 cout << "base: ";
1803 Lint_vec_print(cout, get_base(), base_len());
1804 cout << endl;
1805 }
1806
1807 if (f_v) {
1808 print_base();
1809 }
1810
1811
1813 if (f_v) {
1814 cout << "action::init_BLT strong "
1815 "generators have been computed" << endl;
1816 }
1817 if (f_vv) {
1819 }
1820 }
1821 else {
1822 cout << "action::init_BLT we don't have strong generators" << endl;
1823 exit(1);
1824 }
1825
1826#if 0
1827 if (f_init_hash_table) {
1828 matrix_group *M;
1829 orthogonal *O;
1830
1831 M = subaction->G.matrix_grp;
1832 O = M->O;
1833
1834 if (f_v) {
1835 cout << "calling init_hash_table_parabolic" << endl;
1836 }
1837 init_hash_table_parabolic(*O->F, 4, 0 /* verbose_level */);
1838 }
1839#endif
1840
1841 if (f_v) {
1842 print_info();
1843 }
1844 if (f_v) {
1845 cout << "action::init_BLT done" << endl;
1846 }
1847}
1848
1851 groups::sims *K,
1852 int given_base_length, int *given_base,
1853 int verbose_level)
1854{
1855 int f_v = (verbose_level >= 1);
1856 int f_vv = (verbose_level >= 2);
1857 int f_vvv = (verbose_level >= 3);
1858 groups::sims *G;
1860 int i;
1861
1862
1863 if (f_v) {
1864 cout << "action::init_group_from_strong_generators" << endl;
1865 }
1866 label.assign("from sgs");
1867 label_tex.assign("from sgs");
1868
1869 if (f_vv) {
1870 cout << "generators are" << endl;
1871 gens->print(cout);
1872 cout << endl;
1873 }
1874
1875
1876 if (f_vv) {
1877 cout << "action::init_group_from_strong_generators "
1878 "calling allocate_base_data, initial base:";
1879 Int_vec_print(cout, given_base, given_base_length);
1880 cout << " of length " << given_base_length << endl;
1881 }
1883 Stabilizer_chain->allocate_base_data(this, given_base_length, verbose_level);
1884 //allocate_base_data(given_base_length);
1885 //Stabilizer_chain->base_len = given_base_length;
1886
1887 for (i = 0; i < base_len(); i++) {
1888 base_i(i) = given_base[i];
1889 }
1890
1891
1892
1893 if (f_vv) {
1894 cout << "action::init_group_from_strong_generators, "
1895 "now trying to set up the group "
1896 "from the given generators" << endl;
1897 }
1898
1900
1901 G->init(this, verbose_level - 2);
1902 G->init_trivial_group(verbose_level - 1);
1903 G->group_order(G_order);
1904
1905 G->build_up_group_from_generators(K, gens,
1906 FALSE, NULL, /* target_go */
1907 FALSE /* f_override_choose_next_base_point */,
1908 NULL,
1909 verbose_level);
1910
1911 G->group_order(G_order);
1912
1913
1914 if (f_vvv) {
1915 //G.print(TRUE);
1916 //G.print_generator_depth_and_perm();
1917 }
1918
1919 if (f_v) {
1920 cout << "init_group_from_strong_generators: "
1921 "found a group of order " << G_order << endl;
1922 if (f_vv) {
1923 cout << "transversal lengths:" << endl;
1924 //int_vec_print(cout, G->orbit_len, base_len());
1925 for (int t = 0; t < G->A->base_len(); t++) {
1926 cout << G->get_orbit_length(t) << ", ";
1927 }
1928 cout << endl;
1929 }
1930 }
1931
1932 if (f_vv) {
1933 cout << "action::init_group_from_strong_generators before init_sims_only" << endl;
1934 }
1935 init_sims_only(G, 0/*verbose_level - 1*/);
1936 if (f_vv) {
1937 cout << "action::init_group_from_strong_generators after init_sims_only" << endl;
1938 }
1939 compute_strong_generators_from_sims(0/*verbose_level - 2*/);
1940
1941 if (f_v) {
1942 print_info();
1943 }
1944 if (f_v) {
1945 cout << "action::init_group_from_strong_generators done" << endl;
1946 }
1947}
1948
1949
1952 int *tl, int len, int verbose_level)
1953{
1954 int f_v = (verbose_level >= 1);
1957 groups::sims *S;
1958
1959 if (f_v) {
1960 cout << "action::create_sims_from_generators_with_target_group_order_factorized" << endl;
1961 }
1962 D.multiply_up(go, tl, len, 0 /* verbose_level */);
1963 if (f_v) {
1964 cout << "action::create_sims_from_generators_with_target_group_order_factorized go=" << go << endl;
1965 }
1966 if (f_v) {
1967 cout << "action::create_sims_from_generators_with_target_group_order_factorized "
1968 "before create_sims_from_generators_randomized" << endl;
1969 }
1971 gens, TRUE /* f_target_go */, go, verbose_level - 3);
1972 if (f_v) {
1973 cout << "action::create_sims_from_generators_with_target_group_order_factorized done" << endl;
1974 }
1975 return S;
1976}
1977
1980 long int target_go, int verbose_level)
1981{
1983
1984 tgo.create(target_go, __FILE__, __LINE__);
1986 gens, tgo, verbose_level - 3);
1987}
1988
1992 int verbose_level)
1993{
1995 gens, TRUE /* f_target_go */, target_go, verbose_level - 3);
1996}
1997
1999 data_structures_groups::vector_ge *gens, int verbose_level)
2000{
2002
2004 gens, FALSE /* f_target_go */, dummy, verbose_level - 3);
2005}
2006
2008 int *Elt, int verbose_level)
2009{
2010 int f_v = (verbose_level >= 1);
2011 groups::sims *S;
2014
2015 if (f_v) {
2016 cout << "action::create_sims_from_single_generator_"
2017 "without_target_group_order" << endl;
2018 }
2020 gens->init_single(this, Elt, verbose_level - 2);
2021
2023 gens, FALSE /* f_target_go */, dummy, verbose_level - 3);
2024
2025 FREE_OBJECT(gens);
2026 if (f_v) {
2027 cout << "action::create_sims_from_single_generator_"
2028 "without_target_group_order done" << endl;
2029 }
2030 return S;
2031}
2032
2035 int f_target_go, ring_theory::longinteger_object &target_go,
2036 int verbose_level)
2037{
2038 int f_v = (verbose_level >= 1);
2039 //init(A);
2040 //init_trivial_group(0);
2041 //freeself();
2042 groups::sims *S;
2043
2044 if (f_v) {
2045 cout << "action::create_sims_from_generators_randomized" << endl;
2046 cout << "verbose_level=" << verbose_level << endl;
2047 if (f_target_go) {
2048 cout << "creating a group of order " << target_go << endl;
2049 if (target_go.is_zero()) {
2050 cout << "action::create_sims_from_generators_randomized target_go is zero" << endl;
2051 exit(1);
2052 }
2053 }
2054 else {
2055 cout << "action::create_sims_from_generators_randomized no target group order given" << endl;
2056 }
2057 }
2058
2060
2062
2063 if (f_v) {
2064 cout << "action::create_sims_from_generators_randomized "
2065 "before ss->init" << endl;
2066 }
2067 ss->init(this, verbose_level - 1);
2068 if (f_v) {
2069 cout << "action::create_sims_from_generators_randomized "
2070 "after ss->init" << endl;
2071 }
2072
2073 //ss->interested_in_kernel(A_subaction, verbose_level - 1);
2074
2075 if (f_target_go) {
2076 ss->init_target_group_order(target_go, verbose_level - 1);
2077 }
2078
2079 if (f_v) {
2080 cout << "action::create_sims_from_generators_randomized "
2081 "before ss->init_generators" << endl;
2082 }
2083 ss->init_generators(gens, verbose_level - 3);
2084 if (f_v) {
2085 cout << "action::create_sims_from_generators_randomized "
2086 "after ss->init_generators" << endl;
2087 }
2088
2089 if (f_v) {
2090 cout << "action::create_sims_from_generators_randomized "
2091 "before ss->create_group" << endl;
2092 }
2093 ss->create_group(verbose_level - 10);
2094 if (f_v) {
2095 cout << "action::create_sims_from_generators_randomized "
2096 "after ss->create_group" << endl;
2097 }
2098
2099 S = ss->G;
2100 ss->G = NULL;
2101 //*this = *ss->G;
2102
2103 //ss->G->null();
2104
2105 //cout << "create_sims_from_generators_randomized
2106 // before FREE_OBJECT ss" << endl;
2107 FREE_OBJECT(ss);
2108 //cout << "create_sims_from_generators_randomized
2109 // after FREE_OBJECT ss" << endl;
2110
2111 if (f_v) {
2112 cout << "action::create_sims_from_generators_randomized done" << endl;
2113 }
2114 return S;
2115}
2116
2118 int *Mtx, int verbose_level)
2119{
2120 int f_v = (verbose_level >= 1);
2121 int f_vv = (verbose_level >= 2);
2124 int d, q, i;
2126
2127 if (f_v) {
2128 cout << "action::create_sims_for_centralizer_of_matrix" << endl;
2129 }
2130
2131 if (type_G != matrix_group_t) {
2132 cout << "action::create_sims_for_centralizer_of_matrix "
2133 "action not of type matrix_group" << endl;
2134 exit(1);
2135 }
2136
2137 M = G.matrix_grp;
2138 F = M->GFq;
2139 q = F->q;
2140 d = M->n;
2141
2142
2143 if (M->C == NULL) {
2144 if (f_v) {
2145 cout << "action::create_sims_for_centralizer_of_matrix "
2146 "before M->init_gl_classes" << endl;
2147 }
2148 M->init_gl_classes(verbose_level - 2);
2149 }
2150
2151 C = M->C;
2152
2153 if (f_v) {
2154 cout << "action::create_sims_for_centralizer_of_matrix "
2155 "d = " << d << " q = " << q << endl;
2156 cout << "Mtx=" << endl;
2157 Int_matrix_print(Mtx, d, d);
2158 }
2159
2160 //gl_classes C;
2161 //gl_class_rep *Reps;
2162 //int nb_classes;
2163
2164 //C.init(d, F, 0 /*verbose_level - 2*/);
2165
2166
2167#if 0
2168 C.make_classes(Reps, nb_classes, 0 /*verbose_level - 2*/);
2169
2170 if (f_v) {
2171 cout << "create_sims_for_centralizer_of_matrix "
2172 "There are " << nb_classes << " conjugacy classes" << endl;
2173 }
2174 if (f_vv) {
2175 cout << "create_sims_for_centralizer_of_matrix "
2176 "The conjugacy classes are:" << endl;
2177 for (i = 0; i < nb_classes; i++) {
2178 cout << "Class " << i << ":" << endl;
2179 int_matrix_print(Reps[i].type_coding.M,
2180 Reps[i].type_coding.m, Reps[i].type_coding.n);
2181 cout << "Centralizer order = "
2182 << Reps[i].centralizer_order << endl;
2183 }
2184 }
2185#endif
2186
2187
2188 //int class_rep;
2189
2190 int *Elt;
2191
2192 Elt = NEW_int(elt_size_in_int);
2193
2195
2197
2198 int *Basis;
2199 int **Gens;
2200 int nb_gens;
2201 int nb_alloc = 20;
2202
2203 Gens = NEW_pint(nb_alloc);
2204 nb_gens = 0;
2205
2206 Basis = NEW_int(d * d);
2207 if (f_v) {
2208 cout << "action::create_sims_for_centralizer_of_matrix "
2209 "before generators_for_centralizer" << endl;
2210 }
2211 C->generators_for_centralizer(Mtx, R1, Basis, Gens,
2212 nb_gens, nb_alloc, verbose_level - 2);
2213
2214 if (f_v) {
2215 cout << "action::create_sims_for_centralizer_of_matrix "
2216 "Basis=" << endl;
2217 Int_matrix_print(Basis, d, d);
2218 cout << "create_sims_for_centralizer_of_matrix "
2219 "We found " << nb_gens << " centralizing matrices" << endl;
2220 }
2221
2222 if (f_vv) {
2223 cout << "action::create_sims_for_centralizer_of_matrix "
2224 "Gens=" << endl;
2225 for (i = 0; i < nb_gens; i++) {
2226 cout << "Gen " << i << " / " << nb_gens << " is:" << endl;
2227 Int_matrix_print(Gens[i], d, d);
2228 }
2229 }
2230
2231 for (i = 0; i < nb_gens; i++) {
2232 if (!F->Linear_algebra->test_if_commute(Mtx, Gens[i], d,
2233 0/*verbose_level*/)) {
2234 cout << "The matrices do not commute" << endl;
2235 cout << "Mtx=" << endl;
2236 Int_matrix_print(Mtx, d, d);
2237 cout << "Gens[i]=" << endl;
2238 Int_matrix_print(Gens[i], d, d);
2239 exit(1);
2240 }
2241 }
2242
2243 //C.identify_matrix(Elt, R1, verbose_level);
2244
2245 if (f_v) {
2246 cout << "The type of the matrix under "
2247 "consideration is:" << endl;
2249 R1->type_coding->m, R1->type_coding->n);
2250 }
2251
2252
2253#if 0
2254 class_rep = C.find_class_rep(Reps, nb_classes,
2255 R1, 0 /* verbose_level */);
2256
2257 if (f_v) {
2258 cout << "The index of the class of the "
2259 "matrix is = " << class_rep << endl;
2260 }
2261#endif
2262
2263
2266 int *tl;
2267 ring_theory::longinteger_object centralizer_order, cent_go;
2268 int *Elt1;
2269
2272 tl = NEW_int(base_len());
2273 gens->init(this, verbose_level - 2);
2274 gens->allocate(nb_gens, verbose_level - 2);
2276
2277 for (i = 0; i < nb_gens; i++) {
2278 make_element(Elt1, Gens[i], 0);
2279 element_move(Elt1, gens->ith(i), 0);
2280 }
2281 groups::sims *Cent;
2282
2283
2284 if (f_v) {
2285 cout << "before centralizer_order_Kung" << endl;
2286 }
2287 R1->centralizer_order_Kung(C, centralizer_order, verbose_level);
2288 if (f_v) {
2289 cout << "after centralizer_order_Kung, "
2290 "centralizer_order=" << centralizer_order << endl;
2291 }
2292
2294 gens,
2295 centralizer_order /*Reps[class_rep].centralizer_order*/,
2296 0 /* verbose_level */);
2297 //Cent = create_sims_from_generators_without_target_group_order(
2298 // A, gens, 0 /* verbose_level */);
2299 Cent->group_order(cent_go);
2300
2301 if (f_v) {
2302 cout << "action::create_sims_for_centralizer_of_matrix "
2303 "The order of the centralizer is " << cent_go << endl;
2304 }
2305
2306
2307
2308
2309 for (i = 0; i < nb_gens; i++) {
2310 FREE_int(Gens[i]);
2311 }
2312 FREE_pint(Gens);
2313
2314 FREE_OBJECT(R1);
2315 FREE_OBJECT(gens);
2316 FREE_OBJECT(SG);
2317 FREE_int(tl);
2318 FREE_int(Elt1);
2319 FREE_int(Elt);
2320 FREE_int(Basis);
2321
2322 if (f_v) {
2323 cout << "action::create_sims_for_centralizer_of_matrix done" << endl;
2324 }
2325 return Cent;
2326}
2327
2328
2330 std::string &fname_base,
2331 int *Table, int group_order, int *gens, int nb_gens,
2332 groups::strong_generators *&Aut_gens,
2333 int verbose_level)
2334{
2335 int f_v = (verbose_level >= 1);
2336 int *N_gens;
2337 int N_nb_gens;
2338 int N_go;
2340 //int i;
2342
2343 if (f_v) {
2344 cout << "action::init_automorphism_group_from_group_table" << endl;
2345 }
2346
2347 Magma.normalizer_in_Sym_n(fname_base,
2348 group_order, Table, gens, nb_gens,
2349 N_gens, N_nb_gens, N_go, verbose_level);
2350
2351 if (f_v) {
2352 cout << "action::init_automorphism_group_from_group_table "
2353 "The holomorph has order " << N_go
2354 << " and is generated by " << N_nb_gens << " elements" << endl;
2355 }
2356 go.create(N_go, __FILE__, __LINE__);
2357
2358#if 0
2359 for (i = 0; i < N_nb_gens; i++) {
2360 cout << "holomorph generator " << i << " / "
2361 << N_nb_gens << ":" << endl;
2362
2363 ord = perm_order(N_gens + i * H->group_order, H->group_order);
2364 cout << "an element of order " << ord << endl;
2365 for (j = 0; j < nb_gens; j++) {
2366 a = gens[j];
2367 b = N_gens[i * H->group_order + a];
2368 cout << a << " -> " << b << " : ";
2369 H->unrank_element(H->Elt1, a);
2370 H->unrank_element(H->Elt2, b);
2371 int_vec_print(cout, H->Elt1, H->len);
2372 cout << " -> ";
2373 int_vec_print(cout, H->Elt2, H->len);
2374 cout << endl;
2375 }
2376 }
2377 given_base_length = H->len;
2378 given_base = NEW_int(given_base_length);
2379 for (i = 0; i < given_base_length; i++) {
2380 given_base[i] = i_power_j(q, i);
2381 }
2382 cout << "given base: ";
2383 int_vec_print(cout, given_base, given_base_length);
2384 cout << endl;
2385#endif
2386
2387
2388
2389 if (f_v) {
2390 cout << "action::init_automorphism_group_from_group_table "
2391 "creating holomorph" << endl;
2392 }
2393
2394 long int *gens1;
2395 int i;
2396 gens1 = NEW_lint(nb_gens);
2397 for (i = 0; i < nb_gens; i++) {
2398 gens1[i] = gens[i];
2399 }
2400
2402 group_order /* degree */,
2403 TRUE, go,
2404 N_nb_gens, N_gens,
2405 nb_gens /* given_base_length */, gens1 /* given_base */,
2406 FALSE /* f_no_base */,
2407 verbose_level);
2408 {
2411 if (f_v) {
2412 cout << "action::init_automorphism_group_from_group_table "
2413 "The order of the holomorph is " << go << endl;
2414 }
2415 }
2416
2418 if (f_v) {
2419 cout << "action::init_automorphism_group_from_group_table "
2420 "creating automorphism group" << endl;
2421 }
2422 Aut_gens = Strong_gens->point_stabilizer(0 /* pt */, verbose_level);
2423 Aut_gens->group_order(Aut_order);
2424 if (f_v) {
2425 cout << "action::init_automorphism_group_from_group_table "
2426 "The automorphism group has order " << Aut_order << endl;
2427 }
2428
2429}
2430
2431
2432
2433
2434
2435
2436}}}
2437
2438
2439
#define STABILIZER_CHAIN_DATA_MAX_DEGREE
Definition: actions.h:1208
conjugacy class in GL(n,q) described using rational normal form
Definition: algebra.h:260
data_structures::int_matrix * type_coding
Definition: algebra.h:262
void centralizer_order_Kung(gl_classes *C, ring_theory::longinteger_object &co, int verbose_level)
to list all conjugacy classes in GL(n,q)
Definition: algebra.h:455
void generators_for_centralizer(int *Mtx, gl_class_rep *R, int *Basis, int **&Gens, int &nb_gens, int &nb_alloc, int verbose_level)
void make_classes(gl_class_rep *&R, int &nb_classes, int f_no_eigenvalue_one, int verbose_level)
Definition: gl_classes.cpp:471
int find_class_rep(gl_class_rep *Reps, int nb_reps, gl_class_rep *R, int verbose_level)
generators for various classes of groups
Definition: algebra.h:286
void strong_generators_for_affine_linear_group(int n, field_theory::finite_field *F, int f_semilinear, int *&data, int &size, int &nb_gens, int verbose_level)
void order_PO_epsilon(int f_semilinear, int epsilon, int k, int q, ring_theory::longinteger_object &go, int verbose_level)
void affine_generators(int n, field_theory::finite_field *F, int f_translations, int f_semilinear, int frobenius_power, int f_multiplication, int multiplication_order, int &nb_gens, int &degree, int *&gens, int &base_len, long int *&the_base, int verbose_level)
void order_POmega_epsilon(int epsilon, int m, int q, ring_theory::longinteger_object &o, int verbose_level)
void strong_generators_for_projective_linear_group(int n, field_theory::finite_field *F, int f_semilinear, int *&data, int &size, int &nb_gens, int verbose_level)
void strong_generators_for_general_linear_group(int n, field_theory::finite_field *F, int f_semilinear, int *&data, int &size, int &nb_gens, int verbose_level)
void finite_field_init(int q, int f_without_tables, int verbose_level)
int test_if_commute(int *A, int *B, int k, int verbose_level)
void normalizer_in_Sym_n(std::string &fname_base, int group_order, int *Table, int *gens, int nb_gens, int *&N_gens, int &N_nb_gens, int &N_go, int verbose_level)
void init(int epsilon, int n, field_theory::finite_field *F, int verbose_level)
Definition: orthogonal.cpp:312
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(long int i, const char *file, int line)
global functions related to group actions
Definition: actions.h:1015
interface to the implementation functions for group actions
Definition: actions.h:1081
a permutation group in a fixed action.
Definition: actions.h:99
action * restricted_action(long int *points, int nb_points, int verbose_level)
void init_general_linear_group(int n, field_theory::finite_field *F, int f_semilinear, int f_basis, int f_init_sims, data_structures_groups::vector_ge *&nice_gens, int verbose_level)
void create_orthogonal_group(action *subaction, int f_has_target_group_order, ring_theory::longinteger_object &target_go, void(*callback_choose_random_generator)(int iteration, int *Elt, void *data, int verbose_level), int verbose_level)
void init_matrix_group_strong_generators_builtin(groups::matrix_group *M, data_structures_groups::vector_ge *&nice_gens, int verbose_level)
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 init_symmetric_group(int degree, int f_no_base, int verbose_level)
void init_wreath_product_group_and_restrict(int nb_factors, int n, field_theory::finite_field *F, data_structures_groups::vector_ge *&nice_gens, int verbose_level)
void induced_action_on_determinant(groups::sims *old_G, int verbose_level)
void init_group_from_strong_generators(data_structures_groups::vector_ge *gens, groups::sims *K, int given_base_length, int *given_base, int verbose_level)
void init_orthogonal_group_with_O(orthogonal_geometry::orthogonal *O, int f_on_points, int f_on_lines, int f_on_points_and_lines, int f_semilinear, int f_basis, int verbose_level)
groups::strong_generators * Strong_gens
Definition: actions.h:130
void init_sims_only(groups::sims *G, int verbose_level)
Definition: action.cpp:709
void compute_strong_generators_from_sims(int verbose_level)
Definition: action.cpp:750
void init_affine_group(int n, field_theory::finite_field *F, int f_semilinear, int f_basis, int f_init_sims, data_structures_groups::vector_ge *&nice_gens, int verbose_level)
void init_projective_group(int n, field_theory::finite_field *F, int f_semilinear, int f_basis, int f_init_sims, data_structures_groups::vector_ge *&nice_gens, int verbose_level)
stabilizer_chain_base_data * Stabilizer_chain
Definition: actions.h:178
void init_BLT(field_theory::finite_field *F, int f_basis, int f_init_hash_table, int verbose_level)
void init_orthogonal_group(int epsilon, int n, field_theory::finite_field *F, int f_on_points, int f_on_lines, int f_on_points_and_lines, int f_semilinear, int f_basis, int verbose_level)
groups::sims * create_sims_from_generators_randomized(data_structures_groups::vector_ge *gens, int f_target_go, ring_theory::longinteger_object &target_go, int verbose_level)
void init_permutation_group_from_nauty_output(data_structures::nauty_output *NO, int verbose_level)
void init_projective_special_group(int n, field_theory::finite_field *F, int f_semilinear, int f_basis, int verbose_level)
void setup_linear_group_from_strong_generators(groups::matrix_group *M, data_structures_groups::vector_ge *&nice_gens, int f_init_sims, int verbose_level)
void make_element(int *Elt, int *data, int verbose_level)
Definition: action.cpp:1875
void init_automorphism_group_from_group_table(std::string &fname_base, int *Table, int group_order, int *gens, int nb_gens, groups::strong_generators *&Aut_gens, int verbose_level)
groups::sims * create_sims_from_generators_without_target_group_order(data_structures_groups::vector_ge *gens, int verbose_level)
void element_move(void *a, void *b, int verbose_level)
Definition: action_cb.cpp:335
groups::sims * create_sims_from_single_generator_without_target_group_order(int *Elt, int verbose_level)
void init_permutation_group(int degree, int f_no_base, int verbose_level)
void group_order(ring_theory::longinteger_object &go)
Definition: action.cpp:2223
groups::matrix_group * get_matrix_group()
Definition: action.cpp:2986
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)
void init_permutation_representation(action *A_original, int f_stay_in_the_old_action, data_structures_groups::vector_ge *gens, int *Perms, int degree, 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 init_linear_group(field_theory::finite_field *F, int m, int f_projective, int f_general, int f_affine, int f_semilinear, int f_special, data_structures_groups::vector_ge *&nice_gens, int verbose_level)
Definition: action_init.cpp:17
void init_permutation_group_from_generators(int degree, int f_target_go, ring_theory::longinteger_object &target_go, int nb_gens, int *gens, int given_base_length, long int *given_base, int f_no_base, int verbose_level)
groups::sims * create_sims_for_centralizer_of_matrix(int *Mtx, int verbose_level)
groups::sims * create_sims_from_generators_with_target_group_order(data_structures_groups::vector_ge *gens, ring_theory::longinteger_object &target_go, int verbose_level)
void init_wreath_product_group(int nb_factors, int n, field_theory::finite_field *F, data_structures_groups::vector_ge *&nice_gens, int verbose_level)
the transversals in the stabilizer subgroup chain (Sims chain)
Definition: actions.h:1214
void init_single(actions::action *A, int *Elt, int verbose_level)
Definition: vector_ge.cpp:110
void init(actions::action *A, int verbose_level)
Definition: vector_ge.cpp:55
a matrix group over a finite field in projective, vector space or affine action
Definition: groups.h:318
void init_affine_group(int n, field_theory::finite_field *F, int f_semilinear, actions::action *A, int verbose_level)
void init_base_projective(actions::action *A, int verbose_level)
void init_projective_group(int n, field_theory::finite_field *F, int f_semilinear, actions::action *A, int verbose_level)
void init_general_linear_group(int n, field_theory::finite_field *F, int f_semilinear, actions::action *A, int verbose_level)
a domain for permutation groups whose elements are given in the permutation representation
Definition: groups.h:715
void init(actions::action *A_original, int f_stay_in_the_old_action, data_structures_groups::vector_ge *gens, int *Perms, int degree, int verbose_level)
Schreier Sims algorithm to create the stabilizer chain of a permutation group.
Definition: groups.h:1188
void init(actions::action *A, int verbose_level)
void init_generators(data_structures_groups::vector_ge *gens, int verbose_level)
void interested_in_kernel(actions::action *KA, int verbose_level)
void init_random_process(void(*callback_choose_random_generator)(int iteration, int *Elt, void *data, int verbose_level), void *callback_choose_random_generator_data, int verbose_level)
void init_target_group_order(ring_theory::longinteger_object &tgo, int verbose_level)
a permutation group represented via a stabilizer chain
Definition: groups.h:1273
void init(actions::action *A, int verbose_level)
Definition: sims.cpp:289
void group_order(ring_theory::longinteger_object &go)
Definition: sims.cpp:951
void compute_base_orbits_known_length(int *tl, int verbose_level)
Definition: sims_main.cpp:57
void init_generators(data_structures_groups::vector_ge &generators, int verbose_level)
Definition: sims.cpp:660
a strong generating set for a permutation group with respect to a fixed action
Definition: groups.h:1703
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)
strong_generators * point_stabilizer(int pt, int verbose_level)
void init_from_sims(groups::sims *S, int verbose_level)
data_structures_groups::vector_ge * gens
Definition: groups.h:1708
void group_order(ring_theory::longinteger_object &go)
the wreath product group GL(d,q) wreath Sym(n)
Definition: groups.h:2093
void init_tensor_wreath_product(matrix_group *M, actions::action *A_mtx, int nb_factors, int verbose_level)
void make_strong_generators_data(int *&data, int &size, int &nb_gens, int verbose_level)
void init(actions::action *original_action, orthogonal_geometry::orthogonal *O, int f_on_points, int f_on_lines, int f_on_points_and_lines, int verbose_level)
#define PAGE_LENGTH_LOG
Definition: foundations.h:210
#define Lint_vec_copy(A, B, C)
Definition: foundations.h:694
#define FREE_int(p)
Definition: foundations.h:640
#define NEW_pint(n)
Definition: foundations.h:627
#define NEW_OBJECT(type)
Definition: foundations.h:638
#define Lint_vec_print(A, B, C)
Definition: foundations.h:686
#define FREE_OBJECT(p)
Definition: foundations.h:651
#define NEW_int(n)
Definition: foundations.h:625
#define Int_matrix_print(A, B, C)
Definition: foundations.h:707
#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 FREE_pint(p)
Definition: foundations.h:641
#define Int_vec_print(A, B, C)
Definition: foundations.h:685
void callback_choose_random_generator_orthogonal(int iteration, int *Elt, void *data, int verbose_level)
the orbiter library for the classification of combinatorial objects
groups::permutation_representation * Permutation_representation
induced_actions::action_on_orthogonal * AO
groups::permutation_representation_domain * perm_grp