Orbiter 2022
Combinatorial Objects
action_induce.cpp
Go to the documentation of this file.
1// action_induce.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
18 int nb_rows,
19 int verbose_level)
20{
21 int f_v = (verbose_level >= 1);
23 action *A;
24
25 if (f_v) {
26 cout << "action::induced_action_on_interior_direct_product" << endl;
27 }
28 A = NEW_OBJECT(action);
29
30
31
32 char str1[1000];
33 char str2[1000];
34 snprintf(str1, 1000, "_on_interior_direct_product_%ld_%d", A->degree, nb_rows);
35 snprintf(str2, 1000, " {\\rm OnIntDirectProduct}_{%ld,%d}", A->degree, nb_rows);
36
37 A->label.assign(label);
38 A->label.append(str1);
39
40 A->label_tex.assign(label_tex);
41 A->label_tex.append(str2);
42
43
44
45 if (f_v) {
46 cout << "the old_action " << label
47 << " has base_length = " << base_len()
48 << " and degree " << degree << endl;
49 }
51 A->subaction = this;
53
54 IDP->init(this, nb_rows, verbose_level);
55
58 A->f_allocated = TRUE;
61
63
64 A->degree = IDP->degree;
65 //A->base_len = 0;
66 if (f_v) {
67 cout << "action::induced_action_on_interior_direct_product "
68 "before init_function_pointers_induced_action" << endl;
69 }
72
73
74
77
78 if (f_v) {
79 cout << "action::induced_action_on_interior_direct_product "
80 "before allocate_element_data" << endl;
81 }
83
84
85 if (f_v) {
86 cout << "action::induced_action_on_interior_direct_product "
87 "finished, created action " << A->label << endl;
88 cout << "degree=" << A->degree << endl;
89 cout << "make_element_size=" << A->make_element_size << endl;
90 cout << "low_level_point_size=" << A->low_level_point_size << endl;
91 print_info();
92 }
93 return A;
94}
95
96
98 int partition_class_size,
99 int verbose_level)
100{
101 int f_v = (verbose_level >= 1);
103 action *A;
104
105 if (f_v) {
106 cout << "action::induced_action_on_set_partitions" << endl;
107 }
108 A = NEW_OBJECT(action);
109
110
111
112 char str1[1000];
113 char str2[1000];
114 snprintf(str1, 1000, "_on_set_partitions_%ld_%d", A->degree, partition_class_size);
115 snprintf(str2, 1000, " {\\rm OnSetPart}_{%ld,%d}", A->degree, partition_class_size);
116
117 A->label.assign(label);
118 A->label.append(str1);
119
120 A->label_tex.assign(label_tex);
121 A->label_tex.append(str2);
122
123
124
125
126
127 if (f_v) {
128 cout << "the old_action " << label
129 << " has base_length = " << base_len()
130 << " and degree " << degree << endl;
131 }
133 A->subaction = this;
135
136 OSP->init(partition_class_size,
137 this, verbose_level);
139 A->G.OnSetPartitions = OSP;
140 A->f_allocated = TRUE;
143
145
146 A->degree = OSP->nb_set_partitions;
147 //A->base_len = 0;
148 if (f_v) {
149 cout << "action::induced_action_on_set_partitions "
150 "before init_function_pointers_induced_action" << endl;
151 }
154
155
156
159
160 if (f_v) {
161 cout << "action::induced_action_on_set_partitions "
162 "before allocate_element_data" << endl;
163 }
165
166
167 if (f_v) {
168 cout << "action::induced_action_on_set_partitions "
169 "finished, created action " << A->label << endl;
170 cout << "degree=" << A->degree << endl;
171 cout << "make_element_size=" << A->make_element_size << endl;
172 cout << "low_level_point_size=" << A->low_level_point_size << endl;
173 print_info();
174 }
175 return A;
176}
177
178
180 field_theory::finite_field *F, int n, int verbose_level)
181{
182 int f_v = (verbose_level >= 1);
183 int f_vv = (verbose_level >= 2);
185 geometry::grassmann *Grass_lines;
186
187 if (f_v) {
188 cout << "action::init_action_on_lines" << endl;
189 }
190
192
193 Grass_lines = NEW_OBJECT(geometry::grassmann);
194
195
196 if (f_v) {
197 cout << "action::init_action_on_lines "
198 "before Grass_lines->init" << endl;
199 }
200 Grass_lines->init(n, 2, F, verbose_level - 2);
201
202 if (f_v) {
203 cout << "action::init_action_on_lines "
204 "before A_lines->init" << endl;
205 }
206 A_lines->init(*A, Grass_lines, verbose_level - 5);
207
208
209 if (f_v) {
210 cout << "action::init_action_on_lines "
211 "action on grassmannian established" << endl;
212 }
213
214 if (f_v) {
215 cout << "action::init_action_on_lines "
216 "initializing A2" << endl;
217 }
218 groups::sims S;
220
221 S.init(A, verbose_level - 2);
222 S.init_generators(*A->Strong_gens->gens, 0/*verbose_level*/);
224 A->get_transversal_length(), 0/*verbose_level - 1*/);
225 S.group_order(go1);
226 if (f_v) {
227 cout << "action::init_action_on_lines "
228 "group order " << go1 << endl;
229 }
230
231 if (f_v) {
232 cout << "action::init_action_on_lines "
233 "initializing action on grassmannian" << endl;
234 }
236 TRUE /* f_induce_action */, &S, verbose_level);
237 if (f_v) {
238 cout << "action::init_action_on_lines "
239 "after induced_action_on_grassmannian" << endl;
240 }
241 if (f_vv) {
242 print_info();
243 }
244
245 if (f_v) {
246 cout << "action::init_action_on_lines done" << endl;
247 }
248}
249
250
252 action *A_old,
253 int f_induce_action, groups::sims *old_G,
254 int verbose_level)
255{
256 int f_v = (verbose_level >= 1);
257 action *A;
259
260 if (f_v) {
261 cout << "action::induced_action_by_representation_on_conic "
262 "f_induce_action=" << f_induce_action << endl;
263 }
264
265 A = A_old;
266
267
268 char str1[1000];
269 char str2[1000];
270 snprintf(str1, 1000, "_OnConic");
271 snprintf(str2, 1000, " {\\rm OnConic}");
272
273 label.assign(A->label);
274 label_tex.assign(A->label_tex);
275 label.append(str1);
276 label_tex.append(str2);
277
278
279
280 if (f_v) {
281 cout << "the old_action " << A->label
282 << " has base_length = " << A->base_len()
283 << " and degree " << A->degree << endl;
284 }
286 subaction = A;
287 if (A->type_G != matrix_group_t) {
288 cout << "action::induced_action_by_representation_on_conic "
289 "action not of matrix group type" << endl;
290 exit(1);
291 }
292 //M = A->G.matrix_grp;
293
295 Rep->init_action_on_conic(*A_old, verbose_level);
296
298 G.Rep = Rep;
302
304
305 degree = Rep->degree;
306 //base_len = 0;
309
310
311
314
316
317 if (f_induce_action) {
318 induced_action_override_sims(*A, old_G, 0/*verbose_level - 2*/);
319 }
320
321 if (f_v) {
322 cout << "action::induced_action_by_representation_on_conic "
323 "finished, created action " << label << endl;
324 cout << "degree=" << A->degree << endl;
325 cout << "make_element_size=" << A->make_element_size << endl;
326 cout << "low_level_point_size=" << A->low_level_point_size << endl;
327 print_info();
328 }
329}
330
331
334 int f_induce_action, groups::sims *old_G,
335 int verbose_level)
336{
337 int f_v = (verbose_level >= 1);
338 action *A;
339
340 if (f_v) {
341 cout << "action::induced_action_on_cosets "
342 "f_induce_action=" << f_induce_action << endl;
343 }
344 A = A_on_cosets->A_linear;
345
346
347 char str1[1000];
348 char str2[1000];
349 snprintf(str1, 1000, "_Cosets_%d", A_on_cosets->dimension_of_subspace);
350 snprintf(str2, 1000, " {\\rm OnCosets}_{%d}", A_on_cosets->dimension_of_subspace);
351
352 label.assign(A->label);
353 label_tex.assign(A->label_tex);
354 label.append(str1);
355 label_tex.append(str2);
356
357
358 if (f_v) {
359 cout << "the old_action is " << A->label << endl;
360 // << " has base_length = " << A->base_len()
361 // << " and degree " << A->degree << endl;
362 }
364 subaction = A;
365 if (!A->f_is_linear) {
366 cout << "action::induced_action_on_cosets "
367 "action not of linear type" << endl;
368 exit(1);
369 }
370#if 0
371 if (A->type_G == matrix_group_t) {
372 M = A->G.matrix_grp;
373 }
374 else {
375 action *sub = A->subaction;
376 M = sub->G.matrix_grp;
377 }
378#endif
380 G.OnCosets = A_on_cosets;
384
386
387 degree = A_on_cosets->nb_points;
388 //base_len = 0;
391
392
393
396
398
399 if (f_induce_action) {
400 induced_action_override_sims(*A, old_G, verbose_level - 2);
401 }
402
403 if (f_v) {
404 cout << "action::induced_action_on_cosets "
405 "finished, created action " << label << " of degree=" << degree << endl;
406 print_info();
407 }
408}
409
410
411
414 int f_induce_action, groups::sims *old_G,
415 int verbose_level)
416{
417 int f_v = (verbose_level >= 1);
418 action *A;
419
420 if (f_v) {
421 cout << "action::induced_action_on_factor_space "
422 "f_induce_action=" << f_induce_action << endl;
423 }
424 A = A_old;
425
426 char str1[1000];
427 char str2[1000];
428 snprintf(str1, 1000, "_Factor_%d_%d", AF->VS->dimension, AF->factor_space_len);
429 snprintf(str2, 1000, " {\\rm OnFactor}_{%d,%d}", AF->VS->dimension, AF->factor_space_len);
430
431 label.assign(A->label);
432 label_tex.assign(A->label_tex);
433 label.append(str1);
434 label_tex.append(str2);
435
436
437 if (f_v) {
438 cout << "the old_action " << A->label
439 << " has base_length = " << A->base_len()
440 << " and degree " << A->degree << endl;
441 }
443 subaction = A;
444 if (!A->f_is_linear) {
445 cout << "action::induced_action_on_factor_space "
446 "action not of linear type" << endl;
447 cout << "the old action is:" << endl;
448 A->print_info();
449 exit(1);
450 }
451
453 G.AF = AF;
457
459
460 degree = AF->degree;
461 //base_len = 0;
464
465
466
469
471
472 if (f_induce_action) {
473 induced_action_override_sims(*A, old_G, verbose_level - 2);
474 }
475
476 if (f_v) {
477 cout << "action::induced_action_on_factor_space "
478 "finished, created action " << label << endl;
479 cout << "degree=" << A->degree << endl;
480 print_info();
481 }
482}
483
485{
486 int f_v = (verbose_level >= 1);
488 action *A;
490
491 if (f_v) {
492 cout << "action::induced_action_on_grassmannian" << endl;
493 }
494 A = NEW_OBJECT(action);
495
496
497 char str1[1000];
498 char str2[1000];
499 snprintf(str1, 1000, "_Gr_%d", k);
500 snprintf(str2, 1000, " {\\rm OnGr}_{%d}", k);
501
502 A->label.assign(label);
503 A->label_tex.assign(label_tex);
504 A->label.append(str1);
505 A->label_tex.append(str2);
506
507
508 if (f_v) {
509 cout << "the old_action " << label
510 << " has base_length = " << base_len()
511 << " and degree " << degree << endl;
512 }
514 A->subaction = this;
515 if (type_G != matrix_group_t) {
516 cout << "action::induced_action_on_grassmannian "
517 "old action not of matrix group type" << endl;
518 exit(1);
519 }
520 M = G.matrix_grp;
522
524
526 Gr->init(M->n, k, M->GFq, verbose_level);
527 AG->init(*this, Gr, verbose_level);
529 A->G.AG = AG;
530 A->f_allocated = TRUE;
533
535
536 A->degree = AG->degree.as_int();
537 //A->base_len = 0;
538 if (f_v) {
539 cout << "action::induced_action_on_grassmannian "
540 "before init_function_pointers_induced_action" << endl;
541 }
544
545
546
549
550 if (f_v) {
551 cout << "action::induced_action_on_grassmannian "
552 "before allocate_element_data" << endl;
553 }
555
556
557 if (f_v) {
558 cout << "action::induced_action_on_grassmannian "
559 "finished, created action " << A->label << endl;
560 cout << "degree=" << A->degree << endl;
561 cout << "make_element_size=" << A->make_element_size << endl;
562 cout << "low_level_point_size=" << A->low_level_point_size << endl;
563 print_info();
564 }
565 return A;
566}
567
568
571 int f_induce_action, groups::sims *old_G,
572 int verbose_level)
573{
574 int f_v = (verbose_level >= 1);
575 action *A;
576
577 if (f_v) {
578 cout << "action::induced_action_on_grassmannian "
579 "f_induce_action=" << f_induce_action << endl;
580 }
581 A = A_old;
582
583 char str1[1000];
584 char str2[1000];
585 snprintf(str1, 1000, "_Gr_%d_%d", AG->n, AG->k);
586 snprintf(str2, 1000, " {\\rm OnGr}_{%d,%d}", AG->n, AG->k);
587
588 label.assign(A->label);
589 label_tex.assign(A->label_tex);
590 label.append(str1);
591 label_tex.append(str2);
592
593
594 if (f_v) {
595 cout << "action::induced_action_on_grassmannian "
596 "the old_action " << A->label
597 << " has base_length = " << A->base_len()
598 << " and degree " << A->degree << endl;
599 }
601 if (f_v) {
602 cout << "action::induced_action_on_grassmannian "
603 "before subaction = A" << endl;
604 }
605 subaction = A;
606 if (!A->f_is_linear) {
607 cout << "action::induced_action_on_grassmannian "
608 "action not of linear type" << endl;
609 exit(1);
610 }
611
612 if (f_v) {
613 cout << "action::induced_action_on_grassmannian "
614 "action is of linear type" << endl;
615 }
617 G.AG = AG;
621
623
624 degree = AG->degree.as_int();
625
626 if (f_v) {
627 cout << "action::induced_action_on_grassmannian "
628 "before init_function_pointers_induced_action" << endl;
629 }
632 if (f_v) {
633 cout << "action::induced_action_on_grassmannian "
634 "after init_function_pointers_induced_action" << endl;
635 }
636
637
638
641
642 if (f_v) {
643 cout << "action::induced_action_on_grassmannian "
644 "before allocate_element_data" << endl;
645 }
647 if (f_v) {
648 cout << "action::induced_action_on_grassmannian "
649 "after allocate_element_data" << endl;
650 }
651
652 if (f_induce_action) {
653 if (f_v) {
654 cout << "action::induced_action_on_grassmannian "
655 "before induced_action_override_sims" << endl;
656 }
657 induced_action_override_sims(*A, old_G, verbose_level);
658 if (f_v) {
659 cout << "action::induced_action_on_grassmannian "
660 "after induced_action_override_sims" << endl;
661 }
662 }
663
664 if (f_v) {
665 cout << "action::induced_action_on_grassmannian finished, "
666 "created action " << label << endl;
667 cout << "action::induced_action_on_grassmannian "
668 "degree=" << degree << endl;
669 cout << "action::induced_action_on_grassmannian "
670 "make_element_size=" << make_element_size << endl;
671 cout << "action::induced_action_on_grassmannian "
672 "low_level_point_size=" << low_level_point_size << endl;
673 print_info();
674 cout << "action::induced_action_on_grassmannian finished, "
675 "after print_info()" << endl;
676 }
677 if (f_v) {
678 cout << "action::induced_action_on_grassmannian done" << endl;
679 }
680}
681
684 int f_induce_action, groups::sims *old_G,
685 int verbose_level)
686{
687 int f_v = (verbose_level >= 1);
688 action *A;
689
690 if (f_v) {
691 cout << "action::induced_action_on_spread_set "
692 "f_induce_action=" << f_induce_action << endl;
693 }
694 A = A_old;
695
696 char str1[1000];
697 char str2[1000];
698 snprintf(str1, 1000, "_SpreadSet_%d_%d", AS->k, AS->q);
699 snprintf(str2, 1000, " {\\rm OnSpreadSet %d,%d}", AS->k, AS->q);
700
701 label.assign(A->label);
702 label_tex.assign(A->label_tex);
703 label.append(str1);
704 label_tex.append(str2);
705
706
707
708 if (f_v) {
709 cout << "the old_action " << A->label
710 << " has base_length = " << A->base_len()
711 << " and degree " << A->degree << endl;
712 }
714 subaction = A;
715 if (!A->f_is_linear) {
716 cout << "action::induced_action_on_spread_set "
717 "action not of linear type" << endl;
718 exit(1);
719 }
720
722
723
725 G.AS = AS;
729
731
732 degree = AS->degree;
733 //base_len = 0;
736
737
738
741
743
744 if (f_induce_action) {
746 old_G, 0/*verbose_level - 2*/);
747 }
748
749 if (f_v) {
750 cout << "action::induced_action_on_spread_set finished, "
751 "created action " << label << endl;
752 cout << "degree=" << degree << endl;
753 cout << "make_element_size=" << make_element_size << endl;
754 cout << "low_level_point_size=" << low_level_point_size << endl;
755 print_info();
756 }
757}
758
761 int f_induce_action, groups::sims *old_G,
762 int verbose_level)
763{
764 int f_v = (verbose_level >= 1);
765 action *A;
766
767 if (f_v) {
768 cout << "action::induced_action_on_orthogonal "
769 "f_induce_action=" << f_induce_action << endl;
770 }
771 A = A_old;
772
773 char str1[1000];
774 char str2[1000];
775
776 if (AO->f_on_points) {
777 snprintf(str1, 1000, "_Opts_%d_%d_%d", AO->O->epsilon, AO->O->n, AO->O->q);
778 snprintf(str2, 1000, " {\\rm OnOpts %d,%d,%d}", AO->O->epsilon, AO->O->n, AO->O->q);
779 }
780 else if (AO->f_on_lines) {
781 snprintf(str1, 1000, "_Olines_%d_%d_%d", AO->O->epsilon, AO->O->n, AO->O->q);
782 snprintf(str2, 1000, " {\\rm OnOlines %d,%d,%d}", AO->O->epsilon, AO->O->n, AO->O->q);
783 }
784 else if (AO->f_on_points_and_lines) {
785 snprintf(str1, 1000, "_Optslines_%d_%d_%d", AO->O->epsilon, AO->O->n, AO->O->q);
786 snprintf(str2, 1000, " {\\rm OnOptslines %d,%d,%d}", AO->O->epsilon, AO->O->n, AO->O->q);
787 }
788
789
790
791 label.assign(A->label);
792 label_tex.assign(A->label_tex);
793 label.append(str1);
794 label_tex.append(str2);
795
796
797
798 if (f_v) {
799 cout << "the old_action " << A->label
800 << " has base_length = " << A->base_len()
801 << " and degree " << A->degree << endl;
802 }
804 subaction = A;
805 if (!A->f_is_linear) {
806 cout << "action::induced_action_on_orthogonal "
807 "action not of linear type" << endl;
808 exit(1);
809 }
811 G.AO = AO;
815
817
818 degree = AO->degree;
819 //base_len = 0;
822
823
824
827
829
830 if (f_induce_action) {
831 induced_action_override_sims(*A, old_G, 0/*verbose_level - 2*/);
832 }
833
834 if (f_v) {
835 cout << "action::induced_action_on_orthogonal "
836 "finished, created action " << label << endl;
837 cout << "degree=" << degree << endl;
838 cout << "make_element_size=" << make_element_size << endl;
839 cout << "low_level_point_size=" << low_level_point_size << endl;
840 print_info();
841 }
842}
843
844
846{
847 int f_v = (verbose_level >= 1);
848 action *A;
850
851 if (f_v) {
852 cout << "action::induced_action_on_wedge_product" << endl;
853 }
854 A = NEW_OBJECT(action);
855
856
857 char str1[1000];
858 char str2[1000];
859 snprintf(str1, 1000, "_Wedge");
860 snprintf(str2, 1000, " {\\rm OnWedge}");
861
862 A->label.assign(label);
863 A->label_tex.assign(label_tex);
864 A->label.append(str1);
865 A->label_tex.append(str2);
866
867
868 if (f_v) {
869 cout << "the old_action " << label
870 << " has base_length = " << base_len()
871 << " and degree " << degree << endl;
872 }
874 A->subaction = this;
875 if (type_G != matrix_group_t) {
876 cout << "action::induced_action_on_wedge_product "
877 "old action not of matrix group type" << endl;
878 exit(1);
879 }
880 M = G.matrix_grp;
881
883
885
886
887
888
889 if (f_v) {
890 cout << "action::induced_action_on_wedge_product before AW->init" << endl;
891 }
892 AW->init(*this, verbose_level);
893 if (f_v) {
894 cout << "action::induced_action_on_wedge_product after AW->init" << endl;
895 }
896
898 A->G.AW = AW;
899 A->f_allocated = TRUE;
902
904
905 A->degree = AW->degree;
906 //A->base_len = 0;
907 if (f_v) {
908 cout << "action::induced_action_on_wedge_product "
909 "before init_function_pointers_induced_action" << endl;
910 }
913
914
915
918
919 A->f_is_linear = TRUE;
920 A->dimension = AW->wedge_dimension;
921
922 if (f_v) {
923 cout << "action::induced_action_on_wedge_product "
924 "before allocate_element_data" << endl;
925 }
927
928
929 if (f_v) {
930 cout << "action::induced_action_on_wedge_product "
931 "finished, created action " << A->label << endl;
932 cout << "degree=" << A->degree << endl;
933 cout << "make_element_size=" << A->make_element_size << endl;
934 cout << "low_level_point_size=" << A->low_level_point_size << endl;
935 print_info();
936 }
937 return A;
938}
939
940#if 0
942 action_on_wedge_product *AW,
943 int f_induce_action, sims *old_G,
944 int verbose_level)
945{
946 int f_v = (verbose_level >= 1);
947 action *A;
948
949 if (f_v) {
950 cout << "action::induced_action_on_wedge_product "
951 "f_induce_action=" << f_induce_action << endl;
952 }
953 A = A_old;
954
955
956 char str1[1000];
957 char str2[1000];
958 snprintf(str1, 1000, "_Wedge");
959 snprintf(str2, 1000, " {\\rm OnWedge}");
960
961 label.assign(A->label);
962 label_tex.assign(A->label_tex);
963 label.append(str1);
964 label_tex.append(str2);
965
966
967
968 if (f_v) {
969 cout << "the old_action " << A->label
970 << " has base_length = " << A->base_len()
971 << " and degree " << A->degree << endl;
972 }
974 subaction = A;
975 if (A->type_G != matrix_group_t) {
976 cout << "action::induced_action_on_wedge_product "
977 "action not of matrix group type" << endl;
978 exit(1);
979 }
980 //M = A->G.matrix_grp;
982 G.AW = AW;
985 low_level_point_size = AW->low_level_point_size;
986
988
989 degree = AW->degree;
990 //base_len = 0;
991 ptr = NEW_OBJECT(action_pointer_table);
994 dimension = AW->wedge_dimension;
995
996
997
1000
1002
1003 if (f_induce_action) {
1004 induced_action_override_sims(*A, old_G, 0/*verbose_level - 2*/);
1005 }
1006
1007 if (f_v) {
1008 cout << "action::induced_action_on_wedge_product "
1009 "finished, created action " << label << endl;
1010 cout << "degree=" << A->degree << endl;
1011 cout << "make_element_size=" << A->make_element_size << endl;
1012 cout << "low_level_point_size=" << A->low_level_point_size << endl;
1013 print_info();
1014 }
1015}
1016#endif
1017
1020 int f_induce_action, groups::sims *old_G,
1021 int verbose_level)
1022{
1023 int f_v = (verbose_level >= 1);
1024 action *A;
1025
1026 if (f_v) {
1027 cout << "action::induced_action_by_subfield_structure "
1028 "f_induce_action=" << f_induce_action << endl;
1029 }
1030 A = A_old;
1031
1032
1033 char str1[1000];
1034 char str2[1000];
1035 snprintf(str1, 1000, "_subfield_%d", SubfieldStructure->q);
1036 snprintf(str2, 1000, " {\\rm OnSubfield F%d}", SubfieldStructure->q);
1037
1038 label.assign(A->label);
1039 label_tex.assign(A->label_tex);
1040 label.append(str1);
1041 label_tex.append(str2);
1042
1043
1044 if (f_v) {
1045 cout << "the old_action " << A->label
1046 << " has base_length = " << A->base_len()
1047 << " and degree " << A->degree << endl;
1048 }
1050 subaction = A;
1051 if (A->type_G != matrix_group_t) {
1052 cout << "action::induced_action_by_subfield_structure "
1053 "action not of matrix group type" << endl;
1054 exit(1);
1055 }
1056 //M = A->G.matrix_grp;
1058 G.SubfieldStructure = SubfieldStructure;
1059 f_allocated = TRUE;
1061 low_level_point_size = SubfieldStructure->low_level_point_size;
1062
1064
1065 degree = SubfieldStructure->degree;
1066 //base_len = 0;
1069 f_is_linear = TRUE;
1070 dimension = SubfieldStructure->m;
1071
1072
1073
1076
1078
1079 if (f_induce_action) {
1081 old_G, 0/*verbose_level - 2*/);
1082 }
1083
1084 if (f_v) {
1085 cout << "action::induced_action_by_subfield_structure "
1086 "finished, created action " << label << endl;
1087 cout << "degree=" << A->degree << endl;
1088 cout << "make_element_size=" << A->make_element_size << endl;
1089 cout << "low_level_point_size=" << A->low_level_point_size << endl;
1090 print_info();
1091 }
1092}
1093
1094
1096 groups::sims *old_G, int verbose_level)
1097{
1098 int f_v = (verbose_level >= 1);
1100 action *A;
1102
1103 if (f_v) {
1104 cout << "action::induced_action_on_Galois_group" << endl;
1105 }
1106 A = old_G->A;
1107
1108
1109 char str1[1000];
1110 char str2[1000];
1111 snprintf(str1, 1000, "_gal");
1112 snprintf(str2, 1000, " {\\rm OnGal}");
1113
1114 label.assign(A->label);
1115 label_tex.assign(A->label_tex);
1116 label.append(str1);
1117 label_tex.append(str2);
1118
1119 if (f_v) {
1120 cout << "the old_action " << A->label
1121 << " has base_length = " << A->base_len()
1122 << " and degree " << A->degree << endl;
1123 }
1125 subaction = A;
1126 if (A->type_G != matrix_group_t) {
1127 cout << "action::induced_action_on_Galois_group "
1128 "action not of matrix group type" << endl;
1129 exit(1);
1130 }
1131 M = A->G.matrix_grp;
1133 AG->init(A, M->n, verbose_level);
1135 G.on_Galois_group = AG;
1136 f_allocated = TRUE;
1138
1140
1141 degree = AG->degree;
1142 //base_len = 0;
1145
1147 Stabilizer_chain->allocate_base_data(this, 0, verbose_level);
1148 //allocate_base_data(0);
1149
1150
1153
1155
1156 if (f_v) {
1157 cout << "action::induced_action_on_Galois_group before induced_action_override_sims" << endl;
1158 }
1159 induced_action_override_sims(*A, old_G, verbose_level - 2);
1160 if (f_v) {
1161 cout << "action::induced_action_on_Galois_group "
1162 "finished, created action " << label << endl;
1163 print_info();
1164 }
1165}
1166
1168 groups::sims *old_G, int verbose_level)
1169{
1170 int f_v = (verbose_level >= 1);
1172 action *A;
1174
1175 if (f_v) {
1176 cout << "action::induced_action_on_determinant" << endl;
1177 }
1178 A = old_G->A;
1179
1180
1181 char str1[1000];
1182 char str2[1000];
1183 snprintf(str1, 1000, "_det");
1184 snprintf(str2, 1000, " {\\rm OnDet}");
1185
1186 label.assign(A->label);
1187 label_tex.assign(A->label_tex);
1188 label.append(str1);
1189 label_tex.append(str2);
1190
1191
1192 if (f_v) {
1193 cout << "the old_action " << A->label
1194 << " has base_length = " << A->base_len()
1195 << " and degree " << A->degree << endl;
1196 }
1198 subaction = A;
1199 if (A->type_G != matrix_group_t) {
1200 cout << "action::induced_action_on_determinant "
1201 "action not of matrix group type" << endl;
1202 exit(1);
1203 }
1204 M = A->G.matrix_grp;
1206 AD->init(*A, M->f_projective, M->n, verbose_level);
1208 G.AD = AD;
1209 f_allocated = TRUE;
1211
1213
1214 degree = AD->degree;
1215 //base_len = 0;
1218
1220 Stabilizer_chain->allocate_base_data(this, 0, verbose_level);
1221 //allocate_base_data(0);
1222
1223
1226
1228
1229 induced_action_override_sims(*A, old_G, verbose_level - 2);
1230 if (f_v) {
1231 cout << "action::induced_action_on_determinant "
1232 "finished, created action " << label << endl;
1233 print_info();
1234 }
1235}
1236
1238 groups::sims *old_G, int verbose_level)
1239{
1240 int f_v = (verbose_level >= 1);
1242 action *A;
1243
1244 if (f_v) {
1245 cout << "action::induced_action_on_sign" << endl;
1246 }
1247 A = old_G->A;
1248
1249
1250 char str1[1000];
1251 char str2[1000];
1252 snprintf(str1, 1000, "_OnSign");
1253 snprintf(str2, 1000, " {\\rm OnSign}");
1254
1255 label.assign(A->label);
1256 label_tex.assign(A->label_tex);
1257 label.append(str1);
1258 label_tex.append(str2);
1259
1260
1261 if (f_v) {
1262 cout << "the old_action " << A->label
1263 << " has base_length = " << A->base_len()
1264 << " and degree " << A->degree << endl;
1265 }
1267 subaction = A;
1269 OnSign->init(A, verbose_level);
1271 G.OnSign = OnSign;
1272 f_allocated = TRUE;
1274
1276
1277 degree = OnSign->degree;
1278 //base_len = 0;
1281
1283 Stabilizer_chain->allocate_base_data(this, 0, verbose_level);
1284 //allocate_base_data(0);
1285
1286
1289
1291
1292 induced_action_override_sims(*A, old_G, verbose_level - 2);
1293 if (f_v) {
1294 cout << "action::induced_action_on_sign finished, "
1295 "created action " << label << endl;
1296 print_info();
1297 }
1298}
1299
1301 groups::sims *Base_group, int f_ownership,
1302 int verbose_level)
1303{
1304 int f_v = (verbose_level >= 1);
1305 action *A;
1306
1307 if (f_v) {
1308 cout << "action::create_induced_action_by_conjugation" << endl;
1309 }
1310 A = NEW_OBJECT(action);
1311 if (f_v) {
1312 cout << "action::create_induced_action_by_conjugation "
1313 "before A->induced_action_on_sets" << endl;
1314 }
1316 Base_group, f_ownership, FALSE /* f_basis */,
1317 verbose_level);
1318 if (f_v) {
1319 cout << "action::create_induced_action_by_conjugation "
1320 "after A->induced_action_by_conjugation" << endl;
1321 }
1322 if (f_v) {
1323 cout << "action::create_induced_action_by_conjugation done" << endl;
1324 }
1325 return A;
1326}
1327
1329 groups::sims *Base_group, int f_ownership,
1330 int f_basis, int verbose_level)
1331{
1332 int f_v = (verbose_level >= 1);
1335 long int goi;
1336 action *A;
1337
1338 A = Base_group->A;
1339 if (f_v) {
1340 cout << "action::induced_action_by_conjugation" << endl;
1341 cout << "the old_action " << A->label
1342 << " has base_length = " << A->base_len()
1343 << " and degree " << A->degree << endl;
1344 }
1345 Base_group->group_order(go);
1346 goi = go.as_lint();
1347 if (f_v) {
1348 cout << "we are acting on a group of order " << goi << endl;
1349 }
1350
1351
1352
1353 char str1[1000];
1354 char str2[1000];
1355 snprintf(str1, 1000, "_C%ld", goi);
1356 snprintf(str2, 1000, " {\\rm ByConj%ld}", goi);
1357
1358 label.assign(A->label);
1359 label_tex.assign(A->label_tex);
1360 label.append(str1);
1361 label_tex.append(str2);
1362
1363
1364
1366 subaction = A;
1368 ABC->init(Base_group, f_ownership, verbose_level);
1370 G.ABC = ABC;
1371 f_allocated = TRUE;
1373
1375
1376 degree = goi;
1377 //base_len = 0;
1380
1382 Stabilizer_chain->allocate_base_data(this, 0, verbose_level);
1383 //allocate_base_data(0);
1384
1385
1388
1390
1391 if (f_basis) {
1392 if (f_v) {
1393 cout << "action::induced_action_by_conjugation "
1394 "calling induced_action_override_sims" << endl;
1395 }
1396 induced_action_override_sims(*A, old_G, verbose_level - 2);
1397 }
1398 if (f_v) {
1399 cout << "action::induced_action_by_conjugation "
1400 "finished, created action " << label << endl;
1401 print_info();
1402 }
1403}
1404
1406 int f_basis, groups::sims *old_G,
1407 groups::sims *Base_group, int f_ownership, int verbose_level)
1408{
1409 int f_v = (verbose_level >= 1);
1412 int goi;
1413 action *A;
1414
1415 A = Base_group->A;
1416 if (f_v) {
1417 cout << "action::induced_action_by_right_multiplication" << endl;
1418 cout << "the old_action " << A->label
1419 << " has base_length = " << A->base_len()
1420 << " and degree " << A->degree << endl;
1421 }
1422 Base_group->group_order(go);
1423 goi = go.as_int();
1424
1425
1426 char str1[1000];
1427 char str2[1000];
1428 snprintf(str1, 1000, "_R%d", goi);
1429 snprintf(str2, 1000, " {\\rm RightMult%d}", goi);
1430
1431 label.assign(A->label);
1432 label_tex.assign(A->label_tex);
1433 label.append(str1);
1434 label_tex.append(str2);
1435
1436
1437 if (f_v) {
1438 cout << "we are acting on a group of order " << goi << endl;
1439 }
1441 subaction = A;
1443 ABRM->init(Base_group, f_ownership, verbose_level);
1445 G.ABRM = ABRM;
1446 f_allocated = TRUE;
1448
1450
1451 degree = goi;
1452 //base_len = 0;
1455
1457 Stabilizer_chain->allocate_base_data(this, 0, verbose_level);
1458 //allocate_base_data(0);
1459
1460
1463
1465
1466 if (f_basis) {
1467 induced_action_override_sims(*A, old_G, verbose_level - 2);
1468 }
1469 if (f_v) {
1470 cout << "action::induced_action_by_right_multiplication "
1471 "finished, created action " << label << endl;
1472 print_info();
1473 }
1474}
1475
1477 int nb_sets, int set_size, long int *sets,
1478 int verbose_level)
1479{
1480 int f_v = (verbose_level >= 1);
1481 action *A;
1482
1483 if (f_v) {
1484 cout << "action::create_induced_action_on_sets" << endl;
1485 }
1486 A = NEW_OBJECT(action);
1487 if (f_v) {
1488 cout << "action::create_induced_action_on_sets "
1489 "before A->induced_action_on_sets" << endl;
1490 }
1491 A->induced_action_on_sets(*this, NULL,
1492 nb_sets, set_size, sets,
1493 FALSE /*f_induce_action*/, verbose_level);
1494 if (f_v) {
1495 cout << "action::create_induced_action_on_sets "
1496 "after A->induced_action_on_sets" << endl;
1497 }
1498 if (f_v) {
1499 cout << "action::create_induced_action_on_sets done" << endl;
1500 }
1501 return A;
1502}
1503
1504
1506 action &old_action, groups::sims *old_G,
1507 int nb_sets, int set_size, long int *sets,
1508 int f_induce_action, int verbose_level)
1509{
1510 int f_v = (verbose_level >= 1);
1512
1513 if (f_v) {
1514 cout << "action::induced_action_on_sets" << endl;
1515 cout << "action::induced_action_on_sets "
1516 "f_induce_action=" << f_induce_action << endl;
1517
1518 cout << "action::induced_action_on_sets "
1519 "the old_action " << old_action.label
1520 //<< " has base_length = " << old_action.base_len()
1521 << " has degree " << old_action.degree << endl;
1522
1523 cout << "action::induced_action_on_sets "
1524 "verbose_level = " << verbose_level << endl;
1525 }
1526
1527 char str1[1000];
1528 char str2[1000];
1529 snprintf(str1, 1000, "_S%d", set_size);
1530 snprintf(str2, 1000, " {\\rm S%d}", set_size);
1531
1532 label.assign(old_action.label);
1533 label_tex.assign(old_action.label_tex);
1534 label.append(str1);
1535 label_tex.append(str2);
1536
1537
1539 subaction = &old_action;
1540 if (f_v) {
1541 cout << "action::induced_action_on_sets "
1542 "allocating action_on_sets" << endl;
1543 }
1545 if (f_v) {
1546 cout << "action::induced_action_on_sets before AOS->init" << endl;
1547 }
1548 AOS->init(nb_sets, set_size, sets, verbose_level - 1);
1549 if (f_v) {
1550 cout << "action::induced_action_on_sets after AOS->init" << endl;
1551 }
1553 G.on_sets = AOS;
1554 f_allocated = TRUE;
1557
1559
1560 degree = nb_sets;
1561 //base_len = 0;
1564 if (f_v) {
1565 cout << "action::induced_action_on_sets "
1566 "calling allocate_base_data" << endl;
1567 }
1569 Stabilizer_chain->allocate_base_data(this, 0, verbose_level);
1570 //allocate_base_data(0);
1571
1572
1573 elt_size_in_int = old_action.elt_size_in_int;
1575
1577
1578 if (f_induce_action) {
1579 if (f_v) {
1580 cout << "action::induced_action_on_sets "
1581 "calling induced_action_override_sims" << endl;
1582 }
1584 old_G, verbose_level /*- 2*/);
1585 if (f_v) {
1586 cout << "action::induced_action_on_sets "
1587 "induced_action_override_sims done" << endl;
1588 }
1589 }
1590 if (f_v) {
1591 cout << "action::induced_action_on_sets finished, "
1592 "created action " << label << endl;
1593 //Sims->print_transversal_lengths();
1594 //cout << endl;
1595 print_info();
1596 }
1597}
1598
1600 int nb_subgroups, int group_order, groups::subgroup **Subgroups,
1601 int verbose_level)
1602{
1603 int f_v = (verbose_level >= 1);
1604 action *A;
1605
1606 if (f_v) {
1607 cout << "action::create_induced_action_on_subgroups" << endl;
1608 }
1609 A = NEW_OBJECT(action);
1610 A->induced_action_on_subgroups(this, S,
1611 nb_subgroups, group_order, Subgroups,
1612 0 /* verbose_level*/);
1613 if (f_v) {
1614 cout << "action::create_induced_action_on_subgroups done" << endl;
1615 }
1616 return A;
1617}
1618
1619
1621 action *old_action, groups::sims *S,
1622 int nb_subgroups, int group_order, groups::subgroup **Subgroups,
1623 int verbose_level)
1624{
1625 int f_v = (verbose_level >= 1);
1627
1628 if (f_v) {
1629 cout << "action::induced_action_on_subgroups" << endl;
1630 cout << "action::induced_action_on_sets "
1631 "the old_action " << old_action->label
1632 << " has base_length = " << old_action->base_len()
1633 << " and degree " << old_action->degree << endl;
1634 cout << "action::induced_action_on_subgroups "
1635 "verbose_level = " << verbose_level << endl;
1636 }
1637
1638 char str1[1000];
1639 char str2[1000];
1640 snprintf(str1, 1000, "_on_subgroups%d_%d", nb_subgroups, group_order);
1641 snprintf(str2, 1000, " {\\rm OnSubgroups%d,%d}", nb_subgroups, group_order);
1642
1643 label.assign(old_action->label);
1644 label_tex.assign(old_action->label_tex);
1645 label.append(str1);
1646 label_tex.append(str2);
1647
1649 subaction = old_action;
1650 if (f_v) {
1651 cout << "action::induced_action_on_subgroups "
1652 "allocating action_on_subgroups" << endl;
1653 }
1655 AOS->init(old_action, S, nb_subgroups,
1656 group_order, Subgroups, verbose_level - 1);
1657 if (f_v) {
1658 cout << "action::induced_action_on_subgroups "
1659 "after action_on_subgroups init" << endl;
1660 }
1662 G.on_subgroups = AOS;
1663 f_allocated = TRUE;
1666
1668
1669 degree = nb_subgroups;
1670 //base_len = 0;
1673 if (f_v) {
1674 cout << "action::induced_action_on_subgroups "
1675 "calling allocate_base_data" << endl;
1676 }
1678 Stabilizer_chain->allocate_base_data(this, 0, verbose_level);
1679 //allocate_base_data(0);
1680
1681
1682 elt_size_in_int = old_action->elt_size_in_int;
1684
1686
1687 if (f_v) {
1688 cout << "action::induced_action_on_subgroups "
1689 "finished, created action " << label << endl;
1690 //Sims->print_transversal_lengths();
1691 //cout << endl;
1692 print_info();
1693 }
1694}
1695
1697 action &old_action,
1698 int f_induce_action, groups::sims *old_G,
1700 int pt, int verbose_level)
1701{
1702 int f_v = (verbose_level >= 1);
1704
1705 if (f_v) {
1706 cout << "action::induced_action_by_restriction_on_orbit_with_schreier_vector" << endl;
1707 cout << "old_action ";
1708 old_action.print_info();
1709 cout << "pt = " << pt << endl;
1710 cout << "f_induce_action = " << f_induce_action << endl;
1711 cout << "verbose_level = " << verbose_level << endl;
1712 }
1713
1714
1715 char str1[1000];
1716 char str2[1000];
1717 snprintf(str1, 1000, "_res_sv%d", pt);
1718 snprintf(str2, 1000, " {\\rm res sv%d}", pt);
1719
1720 label.assign(old_action.label);
1721 label_tex.assign(old_action.label_tex);
1722 label.append(str1);
1723 label_tex.append(str2);
1724
1726 subaction = &old_action;
1728
1729 if (f_v) {
1730 cout << "action::induced_action_by_restriction_on_orbit_with_schreier_vector "
1731 "before ABR->init_single_orbit_from_schreier_vector" << endl;
1732 }
1733 ABR->init_single_orbit_from_schreier_vector(Schreier_vector, pt, verbose_level - 1);
1734 if (f_v) {
1735 cout << "action::induced_action_by_restriction_on_orbit_with_schreier_vector "
1736 "after ABR->init_single_orbit_from_schreier_vector" << endl;
1737 }
1738
1740 G.ABR = ABR;
1741 f_allocated = TRUE;
1744
1746
1747 degree = ABR->nb_points;
1748 //base_len = 0;
1751 if (FALSE) {
1752 cout << "action::induced_action_by_restriction_on_orbit_with_schreier_vector "
1753 "calling allocate_base_data" << endl;
1754 }
1756 Stabilizer_chain->allocate_base_data(this, 0, verbose_level);
1757 //allocate_base_data(0);
1758
1759
1760 elt_size_in_int = old_action.elt_size_in_int;
1762
1764
1765 if (f_induce_action) {
1766 if (f_v) {
1767 cout << "action::induced_action_by_restriction_on_orbit_with_schreier_vector "
1768 "calling induced_action_override_sims" << endl;
1769 }
1770 induced_action_override_sims(old_action, old_G, verbose_level - 2);
1771 }
1772 if (f_v) {
1773 cout << "action::induced_action_by_restriction_on_orbit_with_schreier_vector "
1774 "finished, created action " << label << endl;
1775 //Sims->print_transversal_lengths();
1776 //cout << endl;
1777 print_info();
1778 }
1779}
1780
1781void action::original_point_labels(long int *points, int nb_points,
1782 long int *&original_points, int verbose_level)
1783{
1784 int f_v = (verbose_level >= 1);
1785
1786 if (f_v) {
1787 cout << "action::original_point_labels" << endl;
1788 }
1791
1792 original_points = NEW_lint(nb_points);
1793
1794 ABR = G.ABR;
1795
1796
1797 int i;
1798 long int a, b;
1799
1800 for (i = 0; i < nb_points; i++) {
1801 a = points[i];
1802 b = ABR->original_point(a);
1803 original_points[i] = b;
1804 }
1805 }
1806 else {
1807 cout << "action::original_point_labels type must be action_by_restriction_t" << endl;
1808 exit(1);
1809 }
1810
1811}
1812
1814 long int *points, int nb_points, int verbose_level)
1815{
1816 int f_v = (verbose_level >= 1);
1817 action *A;
1819
1820 if (f_v) {
1821 cout << "action::restricted_action" << endl;
1822 cout << "old_action ";
1823 print_info();
1824 cout << "nb_points = " << nb_points << endl;
1825 cout << "verbose_level = " << verbose_level << endl;
1826 }
1827 A = NEW_OBJECT(action);
1828
1829 char str1[1000];
1830 char str2[1000];
1831 snprintf(str1, 1000, "_res%d", nb_points);
1832 snprintf(str2, 1000, " {\\rm res%d}", nb_points);
1833
1834 A->label.assign(label);
1835 A->label_tex.assign(label_tex);
1836 A->label.append(str1);
1837 A->label_tex.append(str2);
1838
1839
1840 A->f_has_subaction = TRUE;
1841 A->subaction = this;
1843 ABR->init(nb_points, points, verbose_level);
1845 A->G.ABR = ABR;
1846 A->f_allocated = TRUE;
1849
1851
1852 A->degree = nb_points;
1853 //A->base_len = 0;
1856 if (FALSE) {
1857 cout << "action::restricted_action "
1858 "calling allocate_base_data" << endl;
1859 }
1861 A->Stabilizer_chain->allocate_base_data(this, 0, verbose_level);
1862 //A->allocate_base_data(0);
1863
1864
1867
1869
1870 if (f_v) {
1871 cout << "action::restricted_action finished, "
1872 "created action " << A->label << endl;
1873 A->print_info();
1874 }
1875 return A;
1876}
1877
1879 groups::sims *S, int size, long int *set, int f_induce,
1880 int verbose_level)
1881{
1882 int f_v = (verbose_level >= 1);
1883 action *A2;
1884
1885 if (f_v) {
1886 cout << "action::create_induced_action_by_restriction" << endl;
1887 }
1888 A2 = NEW_OBJECT(action);
1890 f_induce, S, size, set, verbose_level - 1);
1891 if (f_v) {
1892 cout << "action::create_induced_action_by_restriction done" << endl;
1893 }
1894 return A2;
1895}
1896
1898 action &old_action,
1899 int f_induce_action, groups::sims *old_G,
1900 int nb_points, long int *points, int verbose_level)
1901// uses action_by_restriction data type
1902{
1903 int f_v = (verbose_level >= 1);
1905
1906 if (f_v) {
1907 cout << "action::induced_action_by_restriction_internal_function" << endl;
1908 cout << "old_action ";
1909 old_action.print_info();
1910 cout << "nb_points = " << nb_points << endl;
1911 cout << "f_induce_action = " << f_induce_action << endl;
1912 cout << "verbose_level = " << verbose_level << endl;
1913 }
1914
1915
1916 char str1[1000];
1917 char str2[1000];
1918 snprintf(str1, 1000, "_res%d", nb_points);
1919 snprintf(str2, 1000, " {\\rm res%d}", nb_points);
1920
1921 label.assign(old_action.label);
1922 label_tex.assign(old_action.label_tex);
1923 label.append(str1);
1924 label_tex.append(str2);
1925
1926
1928 subaction = &old_action;
1930 ABR->init(nb_points, points, verbose_level);
1932 G.ABR = ABR;
1933 f_allocated = TRUE;
1936
1938
1939 degree = nb_points;
1940 //base_len = 0;
1943 if (FALSE) {
1944 cout << "action::induced_action_by_restriction_internal_function "
1945 "calling allocate_base_data" << endl;
1946 }
1948 Stabilizer_chain->allocate_base_data(this, 0, verbose_level);
1949 //allocate_base_data(0);
1950
1951
1952 elt_size_in_int = old_action.elt_size_in_int;
1954
1956
1957 if (f_induce_action) {
1958 if (f_v) {
1959 cout << "action::induced_action_by_restriction_internal_function "
1960 "calling induced_action_override_sims" << endl;
1961 }
1963 old_G, verbose_level - 2);
1964 }
1965 if (f_v) {
1966 cout << "action::induced_action_by_restriction_internal_function "
1967 "finished, created action " << label << endl;
1968 //Sims->print_transversal_lengths();
1969 //cout << endl;
1970 print_info();
1971 }
1972}
1973
1975 action &old_action, groups::sims *old_G,
1976 int verbose_level)
1977{
1978 int f_v = (verbose_level >= 1);
1980
1981 if (f_v) {
1982 cout << "action::induced_action_on_pairs" << endl;
1983 cout << "the old_action " << old_action.label
1984 << " has base_length = " << old_action.base_len()
1985 << " and degree " << old_action.degree << endl;
1986 }
1987
1988 char str1[1000];
1989 char str2[1000];
1990 snprintf(str1, 1000, "_on_pairs");
1991 snprintf(str2, 1000, " {\\rm OnPairs}");
1992
1993 label.assign(old_action.label);
1994 label_tex.assign(old_action.label_tex);
1995 label.append(str1);
1996 label_tex.append(str2);
1997
1998
2000 subaction = &old_action;
2003
2005
2006 degree = Combi.int_n_choose_k(old_action.degree, 2);
2007 //base_len = 0;
2011 Stabilizer_chain->allocate_base_data(this, 0, verbose_level);
2012 //allocate_base_data(0);
2013
2014
2015 elt_size_in_int = old_action.elt_size_in_int;
2017
2019
2021 old_G, verbose_level - 2);
2022 if (f_v) {
2023 cout << "action::induced_action_on_pairs "
2024 "finished, created action " << label << endl;
2025 print_info();
2026 }
2027}
2028
2030{
2031 int f_v = (verbose_level >= 1);
2032 action *A;
2033
2034 if (f_v) {
2035 cout << "action::create_induced_action_on_ordered_pairs" << endl;
2036 }
2037 A = NEW_OBJECT(action);
2039 NULL, 0 /* verbose_level*/);
2040 if (f_v) {
2041 cout << "action::create_induced_action_on_ordered_pairs done" << endl;
2042 }
2043 return A;
2044}
2045
2046
2048 action &old_action, groups::sims *old_G,
2049 int verbose_level)
2050{
2051 int f_v = (verbose_level >= 1);
2052
2053 if (f_v) {
2054 cout << "action::induced_action_on_ordered_pairs" << endl;
2055 cout << "the old_action " << old_action.label
2056 << " has base_length = " << old_action.base_len()
2057 << " and degree " << old_action.degree << endl;
2058 }
2059
2060 char str1[1000];
2061 char str2[1000];
2062 snprintf(str1, 1000, "_on_ordered_pairs");
2063 snprintf(str2, 1000, " {\\rm OnOrderedPairs}");
2064
2065 label.assign(old_action.label);
2066 label_tex.assign(old_action.label_tex);
2067 label.append(str1);
2068 label_tex.append(str2);
2069
2070
2072 subaction = &old_action;
2075
2077
2078 degree = old_action.degree * (old_action.degree - 1);
2079 //base_len = 0;
2083 Stabilizer_chain->allocate_base_data(this, 0, verbose_level);
2084 //allocate_base_data(0);
2085
2086
2087 elt_size_in_int = old_action.elt_size_in_int;
2089
2091
2092 if (old_G) {
2094 old_G, verbose_level - 2);
2095 }
2096 if (f_v) {
2097 cout << "action::induced_action_on_ordered_pairs "
2098 "finished, created action " << label << endl;
2099 print_info();
2100 }
2101}
2102
2104 action &old_action, int k,
2105 int verbose_level)
2106{
2107 int f_v = (verbose_level >= 1);
2109
2110 if (f_v) {
2111 cout << "action::induced_action_on_k_subsets" << endl;
2112 cout << "the old_action " << old_action.label
2113 //<< " has base_length = " << old_action.base_len()
2114 << " has degree " << old_action.degree << endl;
2115 }
2116 char str1[1000];
2117 char str2[1000];
2118 snprintf(str1, 1000, "_on_%d_subsets",k);
2119 snprintf(str2, 1000, "^{[%d]}", k);
2120
2121 label.assign(old_action.label);
2122 label_tex.assign(old_action.label_tex);
2123 label.append(str1);
2124 label_tex.append(str2);
2125
2127 On_k_subsets->init(&old_action, k, verbose_level);
2128
2129
2131 subaction = &old_action;
2133 G.on_k_subsets = On_k_subsets;
2134 f_allocated = TRUE;
2135
2136
2138
2139 degree = On_k_subsets->degree;
2140 //base_len = 0;
2144 Stabilizer_chain->allocate_base_data(this, 0, verbose_level);
2145 //allocate_base_data(0);
2146
2147
2148 elt_size_in_int = old_action.elt_size_in_int;
2150
2152
2153 if (f_v) {
2154 cout << "action::induced_action_on_k_subsets "
2155 "finished, created action " << label << endl;
2156 print_info();
2157 }
2158}
2159
2161 groups::schreier *Sch, int f_play_it_safe,
2162 int verbose_level)
2163{
2164 int f_v = (verbose_level >= 1);
2166
2167 if (f_v) {
2168 cout << "action::induced_action_on_orbits" << endl;
2169 cout << "the old_action " << old_action->label
2170 << " has base_length = " << old_action->base_len()
2171 << " and degree " << old_action->degree << endl;
2172 }
2173
2174
2175 char str1[1000];
2176 char str2[1000];
2177 snprintf(str1, 1000, "_on_orbits_%d", Sch->nb_orbits);
2178 snprintf(str2, 1000, " {\\rm OnOrbits}_{%d}", Sch->nb_orbits);
2179
2180 label.assign(old_action->label);
2181 label_tex.assign(old_action->label_tex);
2182 label.append(str1);
2183 label_tex.append(str2);
2184
2185
2187 On_orbits->init(old_action, Sch, f_play_it_safe, verbose_level);
2188
2189
2191 subaction = old_action;
2193 G.OnOrbits = On_orbits;
2194 f_allocated = TRUE;
2195
2196
2198
2199 degree = On_orbits->degree;
2200 //base_len = 0;
2204 Stabilizer_chain->allocate_base_data(this, 0, verbose_level);
2205 //allocate_base_data(0);
2206
2207
2208 elt_size_in_int = old_action->elt_size_in_int;
2210
2212
2213 if (f_v) {
2214 cout << "action::induced_action_on_orbits "
2215 "finished, created action " << label << endl;
2216 print_info();
2217 }
2218}
2219
2221 int *type, int type_len,
2222 int verbose_level)
2223{
2224 int f_v = (verbose_level >= 1);
2226
2227 if (f_v) {
2228 cout << "action::induced_action_on_flags" << endl;
2229 cout << "the old_action " << old_action->label
2230 << " has base_length = " << old_action->base_len()
2231 << " and degree " << old_action->degree << endl;
2232 }
2233
2234
2235 char str1[1000];
2236 char str2[1000];
2237 snprintf(str1, 1000, "_on_flags");
2238 snprintf(str2, 1000, " {\\rm OnFlags}");
2239
2240 label.assign(old_action->label);
2241 label_tex.assign(old_action->label_tex);
2242 label.append(str1);
2243 label_tex.append(str2);
2244
2245
2247 On_flags->init(old_action, type,
2248 type_len, verbose_level);
2249
2250
2252 subaction = old_action;
2254 G.OnFlags = On_flags;
2255 f_allocated = TRUE;
2256
2257
2259
2260 degree = On_flags->degree;
2261 //base_len = 0;
2265 Stabilizer_chain->allocate_base_data(this, 0, verbose_level);
2266 //allocate_base_data(0);
2267
2268
2269 elt_size_in_int = old_action->elt_size_in_int;
2271
2273
2274 if (f_v) {
2275 cout << "action::induced_action_on_flags "
2276 "finished, created action " << label << endl;
2277 print_info();
2278 }
2279}
2280
2282 combinatorics::brick_domain *B, int f_linear_action,
2283 int verbose_level)
2284{
2285 int f_v = (verbose_level >= 1);
2287
2288 if (f_v) {
2289 cout << "action::induced_action_on_bricks" << endl;
2290 cout << "the old_action " << old_action.label
2291 << " has base_length = " << old_action.base_len()
2292 << " and degree " << old_action.degree << endl;
2293 }
2294
2295 char str1[1000];
2296 char str2[1000];
2297 snprintf(str1, 1000, "_on_bricks");
2298 snprintf(str2, 1000, " {\\rm OnBricks}");
2299
2300 label.assign(old_action.label);
2301 label_tex.assign(old_action.label_tex);
2302 label.append(str1);
2303 label_tex.append(str2);
2304
2305
2307 On_bricks->init(&old_action, B, f_linear_action, verbose_level);
2308
2309
2311 subaction = &old_action;
2313 G.OnBricks = On_bricks;
2314 f_allocated = TRUE;
2315
2316
2318
2319 degree = B->nb_bricks;
2320 //base_len = 0;
2324 Stabilizer_chain->allocate_base_data(this, 0, verbose_level);
2325 //allocate_base_data(0);
2326
2327
2328 elt_size_in_int = old_action.elt_size_in_int;
2330
2332
2333 //induced_action_override_sims(old_action, old_G, verbose_level - 2);
2334 if (f_v) {
2335 cout << "action::induced_action_on_bricks finished, "
2336 "created action " << label << endl;
2337 print_info();
2338 }
2339}
2340
2343 int verbose_level)
2344{
2345 int f_v = (verbose_level >= 1);
2347
2348 if (f_v) {
2349 cout << "action::induced_action_on_andre" << endl;
2350 cout << "action An = " << An->label
2351 << " has degree " << An->degree << endl;
2352 cout << "action An1 = " << An1->label
2353 << " has degree " << An1->degree << endl;
2354 }
2355
2356 char str1[1000];
2357 char str2[1000];
2358 snprintf(str1, 1000, "_on_andre");
2359 snprintf(str2, 1000, " {\\rm OnAndre}");
2360
2361 label.assign(An1->label);
2362 label_tex.assign(An1->label_tex);
2363 label.append(str1);
2364 label_tex.append(str2);
2365
2367 On_andre->init(An, An1, Andre, verbose_level);
2368
2369
2371 subaction = An1;
2373 G.OnAndre = On_andre;
2374 f_allocated = TRUE;
2375
2376
2378
2379 degree = On_andre->degree;
2380 //base_len = 0;
2384 Stabilizer_chain->allocate_base_data(this, 0, verbose_level);
2385 //allocate_base_data(0);
2386
2387
2390
2392
2393 if (f_v) {
2394 cout << "action::induced_action_on_andre "
2395 "finished, created action " << label << endl;
2396 print_info();
2397 }
2398}
2399
2401 int f_use_projections, int verbose_level)
2402{
2403 int f_v = (verbose_level >= 1);
2404 int f_vv = (verbose_level >= 2);
2406 int i;
2407
2408 if (f_v) {
2409 cout << "action::setup_product_action" << endl;
2410 }
2411
2412 char str1[1000];
2413 char str2[1000];
2414 snprintf(str1, 1000, "_product_action");
2415 snprintf(str2, 1000, " {\\rm ProductAction}");
2416
2417 label.assign(A1->label);
2418 label_tex.assign(A1->label_tex);
2419 label.assign("_");
2420 label_tex.assign(",");
2421 label.assign(A2->label);
2422 label_tex.assign(A2->label_tex);
2423 label.append(str1);
2424 label_tex.append(str2);
2425
2426
2428 PA->init(A1, A2, f_use_projections, verbose_level);
2430 subaction = NULL;
2433 f_allocated = TRUE;
2434
2436
2437 degree = PA->degree;
2438
2439 //base_len = 0;
2440
2443
2444 //Stabilizer_chain = NEW_OBJECT(stabilizer_chain_base_data);
2445 //Stabilizer_chain->allocate_base_data(this, 0);
2446 //allocate_base_data(0);
2447
2448
2451
2453
2455
2457 Stabilizer_chain->allocate_base_data(this, 0, verbose_level);
2458 set_base_len(A1->base_len() + A2->base_len());
2459 if (f_use_projections) {
2460 for (i = 0; i < A1->base_len(); i++) {
2461 base_i(i) = A1->base_i(i);
2462 }
2463 for (i = 0; i < A2->base_len(); i++) {
2464 base_i(A1->base_len() + i) = A1->degree + A2->base_i(i);
2465 }
2466 }
2467 else {
2468 for (i = 0; i < A1->base_len(); i++) {
2469 base_i(i) = A1->base_i(i) * A2->degree;
2470 }
2471 for (i = 0; i < A2->base_len(); i++) {
2472 base_i(A1->base_len() + i) = A2->base_i(i);
2473 }
2474 }
2475
2476 if (f_vv) {
2477 cout << "make_element_size=" << make_element_size << endl;
2478 cout << "base_len=" << base_len() << endl;
2479 }
2480 if (f_v) {
2481 cout << "action::setup_product_action finished" << endl;
2482 print_info();
2483 }
2484}
2485
2486
2488 action *A_old,
2490 int f_induce_action, groups::sims *old_G,
2491 int verbose_level)
2492{
2493 int f_v = (verbose_level >= 1);
2494 action *A;
2496
2497 if (f_v) {
2498 cout << "action::induced_action_on_homogeneous_polynomials "
2499 "f_induce_action=" << f_induce_action << endl;
2500 }
2501 A = A_old;
2503
2504 char str1[1000];
2505 char str2[1000];
2506 snprintf(str1, 1000, "_on_homog_poly_%d_%d", HPD->nb_variables, HPD->degree);
2507 snprintf(str2, 1000, " {\\rm OnHomPoly}_{%d,%d}", HPD->nb_variables, HPD->degree);
2508
2509 label.assign(A->label);
2510 label_tex.assign(A->label_tex);
2511 label.append(str1);
2512 label_tex.append(str2);
2513
2514
2515 if (f_v) {
2516 cout << "the old_action " << A->label
2517 << " has base_length = " << A->base_len()
2518 << " and degree " << A->degree << endl;
2519 }
2521 subaction = A;
2522 if (A->type_G != matrix_group_t) {
2523 cout << "action::induced_action_on_homogeneous_polynomials "
2524 "action not of matrix group type" << endl;
2525 exit(1);
2526 }
2527
2528 if (f_v) {
2529 cout << "action::induced_action_on_homogeneous_polynomials "
2530 "before OnHP->init" << endl;
2531 }
2532 OnHP->init(A, HPD, verbose_level);
2533 if (f_v) {
2534 cout << "action::induced_action_on_homogeneous_polynomials "
2535 "after OnHP->init" << endl;
2536 }
2537
2539 G.OnHP = OnHP;
2540 f_allocated = TRUE;
2543
2545
2546 degree = OnHP->degree;
2547 //base_len = 0;
2550 f_is_linear = TRUE;
2551 dimension = OnHP->dimension;
2552
2553
2554
2557
2559
2560 if (f_induce_action) {
2561 induced_action_override_sims(*A, old_G, 0/*verbose_level - 2*/);
2562 }
2563
2564 if (f_v) {
2565 cout << "action::induced_action_on_homogeneous_polynomials "
2566 "finished, created action " << label << endl;
2567 cout << "degree=" << A->degree << endl;
2568 cout << "make_element_size=" << A->make_element_size << endl;
2569 cout << "low_level_point_size=" << A->low_level_point_size << endl;
2570 print_info();
2571 }
2572}
2573
2575 action *A_old,
2577 int *Equations, int nb_equations,
2578 int f_induce_action, groups::sims *old_G,
2579 int verbose_level)
2580{
2581 int f_v = (verbose_level >= 1);
2582 action *A;
2584
2585 if (f_v) {
2586 cout << "action::induced_action_on_homogeneous_"
2587 "polynomials_given_by_equations "
2588 "f_induce_action=" << f_induce_action << endl;
2589 }
2590 A = A_old;
2592
2593 char str1[1000];
2594 char str2[1000];
2595 snprintf(str1, 1000, "_on_homog_poly_%d_%d_eqn%d", HPD->nb_variables, HPD->degree, nb_equations);
2596 snprintf(str2, 1000, " {\\rm OnHomPolyEqn}_{%d,%d%d}", HPD->nb_variables, HPD->degree, nb_equations);
2597
2598 label.assign(A->label);
2599 label_tex.assign(A->label_tex);
2600 label.append(str1);
2601 label_tex.append(str2);
2602
2603
2604 if (f_v) {
2605 cout << "the old_action " << A->label
2606 << " has base_length = " << A->base_len()
2607 << " and degree " << A->degree << endl;
2608 }
2610 subaction = A;
2611 if (A->type_G != matrix_group_t) {
2612 cout << "action::induced_action_on_homogeneous_"
2613 "polynomials_given_by_equations "
2614 "action not of matrix group type" << endl;
2615 exit(1);
2616 }
2617
2618 if (f_v) {
2619 cout << "action::induced_action_on_homogeneous_"
2620 "polynomials_given_by_equations "
2621 "before OnHP->init" << endl;
2622 }
2623 OnHP->init(A, HPD, verbose_level);
2624 if (f_v) {
2625 cout << "action::induced_action_on_homogeneous_"
2626 "polynomials_given_by_equations "
2627 "after OnHP->init" << endl;
2628 }
2629
2630 if (f_v) {
2631 cout << "action::induced_action_on_homogeneous_"
2632 "polynomials_given_by_equations "
2633 "before OnHP->init_invariant_set_of_equations" << endl;
2634 }
2636 Equations, nb_equations, verbose_level);
2637 if (f_v) {
2638 cout << "action::induced_action_on_homogeneous_"
2639 "polynomials_given_by_equations "
2640 "after OnHP->init_invariant_set_of_equations" << endl;
2641 }
2642
2644 G.OnHP = OnHP;
2645 f_allocated = TRUE;
2648
2650
2651 degree = OnHP->degree;
2652 //base_len = 0;
2655 f_is_linear = TRUE;
2656 dimension = OnHP->dimension;
2657
2658
2659
2662
2664
2665 if (f_induce_action) {
2667 old_G, 0/*verbose_level - 2*/);
2668 }
2669
2670 if (f_v) {
2671 cout << "action::induced_action_on_homogeneous_"
2672 "polynomials_given_by_equations "
2673 "finished, created action " << label << endl;
2674 cout << "degree=" << A->degree << endl;
2675 cout << "make_element_size=" << A->make_element_size << endl;
2676 cout << "low_level_point_size=" << A->low_level_point_size << endl;
2677 print_info();
2678 }
2679}
2680
2681
2682
2683
2685 int verbose_level)
2686{
2687 groups::sims *old_G;
2688
2689 if (!old_action.f_has_sims) {
2690 cout << "action::induced_action_recycle_sims: "
2691 "old action must have sims" << endl;
2692 exit(1);
2693 }
2694 old_G = old_action.Sims;
2695 induce(&old_action, old_G,
2696 0 /* base_of_choice_len */, NULL /* base_of_choice */,
2697 verbose_level);
2698}
2699
2701 action &old_action, groups::sims *old_G,
2702 int verbose_level)
2703{
2704 int f_v = (verbose_level >= 1);
2705
2706 if (f_v) {
2707 cout << "action::induced_action_override_sims before induce" << endl;
2708 }
2709 induce(&old_action, old_G,
2710 0 /* base_of_choice_len */, NULL /* base_of_choice */,
2711 verbose_level);
2712 if (f_v) {
2713 cout << "action::induced_action_override_sims done" << endl;
2714 }
2715}
2716
2717void action::induce(action *old_action, groups::sims *old_G,
2718 int base_of_choice_len, long int *base_of_choice,
2719 int verbose_level)
2720// after this procedure, action will have
2721// a sims for the group and the kernel
2722// it will also have strong generators
2723{
2724 int f_v = (verbose_level >= 1);
2725 int f_vv = (verbose_level >= 2);
2727 groups::sims *G, *K;
2728 // will become part of the action object
2729 // 'this' by the end of this procedure
2730 ring_theory::longinteger_object go, go1, go2, go3;
2731 ring_theory::longinteger_object G_order, K_order;
2733 int b, i, old_base_len;
2734 action *fallback_action;
2735
2736 if (f_v) {
2737 cout << "action::induce verbose_level=" << verbose_level << endl;
2738 }
2739 if (f_v) {
2740 cout << "inducing from action:" << endl;
2741 old_action->print_info();
2742 cout << "the old group is in action:" << endl;
2743 old_G->A->print_info();
2744 }
2745
2746 if (old_action->subaction) {
2747 if (f_vv) {
2748 cout << "action::induce has subaction" << endl;
2749 }
2750 subaction = old_action->subaction;
2751 if (f_vv) {
2752 cout << "subaction is ";
2754 }
2755 }
2756 else {
2757 if (f_vv) {
2758 cout << "action::induce does not have subaction" << endl;
2759 }
2760 subaction = old_action;
2761 }
2762 old_G->group_order(go);
2763 old_action->group_order(go1);
2764 subaction->group_order(go2);
2765 if (f_v) {
2766 cout << "action::induce" << endl;
2767 cout << "from old action " << old_action->label << endl;
2768 cout << "subaction " << subaction->label << endl;
2769 cout << "target order = " << go << endl;
2770 cout << "old_action order = " << go1 << endl;
2771 cout << "subaction order = " << go2 << endl;
2772 cout << "degree = " << old_action->degree << endl;
2773 cout << "subaction->degree = " << subaction->degree << endl;
2774 cout << "base_length = " << old_action->base_len() << endl;
2775 cout << "subaction->base_len = " << subaction->base_len() << endl;
2776 if (base_of_choice_len) {
2777 cout << "base of choice:" << endl;
2778 Lint_vec_print(cout, base_of_choice, base_of_choice_len);
2779 cout << endl;
2780 }
2781 else {
2782 cout << "no base of choice" << endl;
2783 }
2784 }
2785
2788 if (f_v) {
2789 cout << "action::induce: before G->init_without_base(this);" << endl;
2790 }
2791 G->init_without_base(this, verbose_level - 2);
2792 if (f_v) {
2793 cout << "action::induce: after G->init_without_base(this);" << endl;
2794 }
2795
2796
2797 if (base_of_choice_len) {
2798 if (f_vv) {
2799 cout << "action::induce: initializing base of choice" << endl;
2800 }
2801 for (i = 0; i < base_of_choice_len; i++) {
2802 b = base_of_choice[i];
2803 if (f_vv) {
2804 cout << i << "-th base point is " << b << endl;
2805 }
2806 old_base_len = base_len();
2808 G->reallocate_base(old_base_len, verbose_level - 2);
2809 }
2810 if (f_vv) {
2811 cout << "action::induce initializing base of choice finished"
2812 << endl;
2813 }
2814 }
2815
2816 fallback_action = subaction; // changed A. Betten Dec 27, 2011 !!!
2817 //fallback_action = old_action; // changed back A. Betten, May 27, 2012 !!!
2818 // The BLT search needs old_action
2819 // the translation plane search needs subaction
2820 if (fallback_action->base_len() == 0) {
2821 if (f_vv) {
2822 cout << "WARNING: action::induce fallback_action->base_len == 0"
2823 << endl;
2824 cout << "fallback_action=" << fallback_action->label << endl;
2825 cout << "subaction=" << subaction->label << endl;
2826 cout << "old_action=" << old_action->label << endl;
2827 cout << "old_G->A=" << old_G->A->label << endl;
2828 }
2829 fallback_action = old_G->A;
2830 if (f_vv) {
2831 cout << "changing fallback action to " << fallback_action->label
2832 << endl;
2833 }
2834 }
2835 if (f_v) {
2836 cout << "action::induce: before K->init" << endl;
2837 }
2838 K->init(fallback_action, verbose_level - 2);
2839 if (f_v) {
2840 cout << "action::induce: after K->init" << endl;
2841 }
2842
2843 if (f_v) {
2844 cout << "action::induce before G->init_trivial_group" << endl;
2845 }
2846
2847 G->init_trivial_group(verbose_level - 2);
2848
2849 if (f_v) {
2850 cout << "action::induce before K->init_trivial_group" << endl;
2851 }
2852 K->init_trivial_group(verbose_level - 2);
2853 if (f_v) {
2854 cout << "action::induce "
2855 "after init_trivial_group" << endl;
2856 cout << "action::induce "
2857 "before G->build_up_group_random_process" << endl;
2858 }
2859
2860 G->build_up_group_random_process(K, old_G, go,
2861 FALSE /*f_override_chose_next_base_point*/,
2862 NULL /*choose_next_base_point_method*/,
2863 verbose_level - 3);
2864 if (f_v) {
2865 cout << "action::induce "
2866 "after G->build_up_group_random_process" << endl;
2867 }
2868
2869 G->group_order(G_order);
2870 K->group_order(K_order);
2871 if (f_v) {
2872 cout << "action::induce: ";
2873 cout << "found a group in action " << G->A->label
2874 << " of order " << G_order << " ";
2875 cout << "transversal lengths:" << endl;
2876 for (int t = 0; t < G->A->base_len(); t++) {
2877 cout << G->get_orbit_length(t) << ", ";
2878 }
2879 //int_vec_print(cout, G->get_orbit_length(i), G->A->base_len());
2880 cout << endl;
2881
2882 cout << "kernel in action " << K->A->label
2883 << " of order " << K_order << " ";
2884 cout << "transversal lengths:" << endl;
2885 for (int t = 0; t < G->A->base_len(); t++) {
2886 cout << K->get_orbit_length(t) << ", ";
2887 }
2888 //int_vec_print(cout, K->get_orbit_length(), K->A->base_len());
2889 cout << endl;
2890 }
2891 D.mult(G_order, K_order, go3);
2892 if (D.compare(go3, go) != 0) {
2893 cout << "action::induce group orders do not match: "
2894 << go3 << " != " << go << endl;
2895 exit(1);
2896 }
2897 if (f_vv) {
2898 cout << "action::induce product of group orders equals "
2899 "old group order" << endl;
2900 }
2901 if (f_vv) {
2902 cout << "action::induce before init_sims_only" << endl;
2903 }
2904 init_sims_only(G, verbose_level - 2);
2906 Kernel = K;
2907
2908 //init_transversal_reps_from_stabilizer_chain(G, verbose_level - 2);
2909 if (f_vv) {
2910 cout << "action::induce after init_sims, "
2911 "calling compute_strong_generators_from_sims" << endl;
2912 }
2913 compute_strong_generators_from_sims(verbose_level - 2);
2914 if (f_v) {
2915 cout << "action::induce done" << endl;
2916 }
2917}
2918
2919int action::least_moved_point_at_level(int level, int verbose_level)
2920{
2921 return Sims->least_moved_point_at_level(level, verbose_level);
2922}
2923
2924void action::lex_least_base_in_place(int verbose_level)
2925{
2926 int f_v = (verbose_level >= 1);
2927 long int *set;
2928 long int *old_base;
2929 int i, lmp, old_base_len;
2930
2931 if (f_v) {
2932 cout << "action::lex_least_base_in_place action "
2933 << label << " base=";
2934 //int_vec_print(cout, Stabilizer_chain->base, base_len());
2935 cout << endl;
2936 print_info();
2937 //cout << "the generators are:" << endl;
2938 //Sims->print_generators();
2939 }
2940
2941 set = NEW_lint(degree);
2942 old_base = NEW_lint(base_len());
2943 old_base_len = base_len();
2944 for (i = 0; i < base_len(); i++) {
2945 old_base[i] = base_i(i);
2946 }
2947
2948
2949
2950 for (i = 0; i < base_len(); i++) {
2951 set[i] = base_i(i);
2952 if (f_v) {
2953 cout << "action::lex_least_base_in_place "
2954 "i=" << i << " computing the least moved point" << endl;
2955 }
2956 lmp = least_moved_point_at_level(i, verbose_level - 2);
2957 if (f_v) {
2958 cout << "action::lex_least_base_in_place "
2959 "i=" << i << " the least moved point is " << lmp << endl;
2960 }
2961 if (lmp >= 0 && lmp < base_i(i)) {
2962 if (f_v) {
2963 cout << "action::lex_least_base_in_place "
2964 "i=" << i << " least moved point = " << lmp
2965 << " less than base point " << base_i(i) << endl;
2966 cout << "doing a base change:" << endl;
2967 }
2968 set[i] = lmp;
2969 base_change_in_place(i + 1, set, verbose_level);
2970 if (f_v) {
2971 cout << "action::lex_least_base_in_place "
2972 "after base_change_in_place: action:" << endl;
2973 print_info();
2974 }
2975 }
2976 }
2977 if (f_v) {
2978 cout << "action::lex_least_base_in_place "
2979 "done, action " << label << " base=";
2980 //int_vec_print(cout, Stabilizer_chain->base, base_len());
2981 cout << endl;
2982 print_info();
2983 //cout << "the generators are:" << endl;
2984 //Sims->print_generators();
2985 int f_changed = FALSE;
2986
2987 if (old_base_len != base_len()) {
2988 f_changed = TRUE;
2989 }
2990 if (!f_changed) {
2991 for (i = 0; i < base_len(); i++) {
2992 if (old_base[i] != base_i(i)) {
2993 f_changed = TRUE;
2994 break;
2995 }
2996 }
2997 }
2998 if (f_changed) {
2999 cout << "The base has changed !!!" << endl;
3000 cout << "old base: ";
3001 Lint_vec_print(cout, old_base, old_base_len);
3002 cout << endl;
3003 cout << "new base: ";
3004 //int_vec_print(cout, Stabilizer_chain->base, base_len());
3005 cout << endl;
3006 }
3007 }
3008 FREE_lint(old_base);
3009 FREE_lint(set);
3010}
3011
3012void action::lex_least_base(action *old_action, int verbose_level)
3013{
3014 int f_v = (verbose_level >= 1);
3015 long int *set;
3016 action *A, *old_A;
3017 int i, lmp;
3018
3019 if (f_v) {
3020 cout << "action::lex_least_base action "
3021 << old_action->label << " base=";
3022 //int_vec_print(cout, old_action->Stabilizer_chain->base, old_action->base_len());
3023 cout << endl;
3024 }
3025#if 0
3026 if (!f_has_sims) {
3027 cout << "action::lex_least_base fatal: does not have sims" << endl;
3028 exit(1);
3029 }
3030#endif
3031
3032
3033 if (f_v) {
3034 //cout << "the generators are:" << endl;
3035 //old_action->Sims->print_generators();
3036 }
3037 A = NEW_OBJECT(action);
3038
3039 set = NEW_lint(old_action->degree);
3040
3041 old_A = old_action;
3042
3043 if (!old_action->f_has_sims) {
3044 cout << "action::lex_least_base does not have Sims" << endl;
3045 exit(1);
3046 }
3047
3048 for (i = 0; i < old_A->base_len(); i++) {
3049 set[i] = old_A->base_i(i);
3050 if (f_v) {
3051 cout << "action::lex_least_base "
3052 "calling least_moved_point_at_level " << i << endl;
3053 }
3054 lmp = old_A->least_moved_point_at_level(i, verbose_level - 2);
3055 if (lmp < old_A->base_i(i)) {
3056 if (f_v) {
3057 cout << "action::lex_least_base least moved point = " << lmp
3058 << " less than base point " << old_A->base_i(i) << endl;
3059 cout << "doing a base change:" << endl;
3060 }
3061 set[i] = lmp;
3062 A = NEW_OBJECT(action);
3063 A->base_change(old_A, i + 1, set, verbose_level - 2);
3064 old_A = A;
3065 }
3066 }
3067 base_change(old_A, old_A->base_len(),
3068 old_A->get_base(), verbose_level - 1);
3069 FREE_lint(set);
3070 if (f_v) {
3071 cout << "action::lex_least_base action " << label << " base=";
3072 //int_vec_print(cout, Stabilizer_chain->base, base_len());
3073 cout << endl;
3074 }
3075}
3076
3078{
3079 int f_v = (verbose_level >= 1);
3080 action *AA;
3081 int i;
3082
3083 if (f_v) {
3084 cout << "action::test_if_lex_least_base:" << endl;
3085 print_info();
3086 }
3087
3088 AA = NEW_OBJECT(action);
3089
3090 AA->lex_least_base(this, verbose_level);
3091 for (i = 0; i < base_len(); i++) {
3092 if (AA->base_len() >= i) {
3093 if (base_i(i) > AA->base_i(i)) {
3094 cout << "action::test_if_lex_least_base "
3095 "returns FALSE" << endl;
3096 cout << "base[i]=" << base_i(i) << endl;
3097 cout << "AA->base[i]=" << AA->base_i(i) << endl;
3098 FREE_OBJECT(AA);
3099 return FALSE;
3100 }
3101 }
3102 }
3103 FREE_OBJECT(AA);
3104 return TRUE;
3105}
3106
3107void action::base_change_in_place(int size, long int *set, int verbose_level)
3108{
3109 int f_v = (verbose_level >= 1);
3110 int f_v5 = (verbose_level >= 5);
3111 action *A;
3112 int i;
3113
3114 if (f_v) {
3115 cout << "action::base_change_in_place" << endl;
3116 }
3117 A = NEW_OBJECT(action);
3118 A->base_change(this, size, set, verbose_level);
3119 if (f_v) {
3120 cout << "action::base_change_in_place after base_change" << endl;
3121 }
3123 if (f_v5) {
3124 cout << "action::base_change_in_place after free_base_data" << endl;
3125 }
3127 Stabilizer_chain->allocate_base_data(this, A->base_len(), verbose_level);
3128 //allocate_base_data(A->base_len);
3129 if (f_v5) {
3130 cout << "action::base_change_in_place after allocate_base_data"
3131 << endl;
3132 }
3133 set_base_len(A->base_len());
3134 for (i = 0; i < A->base_len(); i++) {
3135 base_i(i) = A->base_i(i);
3136 }
3137 if (f_v5) {
3138 cout << "action::base_change_in_place after copying base" << endl;
3139 }
3140
3141
3142 A->Sims->A = this;
3143 A->Sims->gens.A = this;
3144 A->Sims->gens_inv.A = this;
3145 // not to forget: the sims also has an action pointer in it
3146 // and this one has to be changed to the old action
3147 if (f_v5) {
3148 cout << "action::base_change_in_place "
3149 "after changing action pointer in A->Sims" << endl;
3150 }
3151
3152 if (f_has_sims) {
3153 if (f_v5) {
3154 cout << "action::base_change_in_place "
3155 "before FREE_OBJECT Sims" << endl;
3156 cout << "Sims=" << Sims << endl;
3157 }
3159 if (f_v5) {
3160 cout << "action::base_change_in_place "
3161 "after FREE_OBJECT Sims" << endl;
3162 }
3163 Sims = NULL;
3164 f_has_sims = FALSE;
3165 }
3166
3167 if (f_v5) {
3168 cout << "action::base_change_in_place after deleting sims" << endl;
3169 }
3170
3171 if (f_v5) {
3172 cout << "action::base_change_in_place before init_sims_only" << endl;
3173 }
3174 init_sims_only(A->Sims, verbose_level);
3175 if (f_v5) {
3176 cout << "action::base_change_in_place after init_sims_only" << endl;
3177 }
3178
3182 Strong_gens = NULL;
3183 }
3184
3185 A->f_has_sims = FALSE;
3186 A->Sims = NULL;
3187
3188 if (f_v5) {
3189 cout << "action::base_change_in_place before FREE_OBJECT(A)" << endl;
3190 }
3191 FREE_OBJECT(A);
3192 if (f_v5) {
3193 cout << "action::base_change_in_place after FREE_OBJECT(A)" << endl;
3194 }
3195
3196 compute_strong_generators_from_sims(verbose_level - 3);
3197
3198 if (f_v) {
3199 cout << "action::base_change_in_place finished, created action"
3200 << endl;
3201 print_info();
3202 //cout << "generators are:" << endl;
3203 //Sims->print_generators();
3204 //cout << "Sims:" << endl;
3205 //Sims->print(3);
3206 }
3207}
3208
3209void action::base_change(action *old_action,
3210 int size, long int *set, int verbose_level)
3211{
3212 int f_v = (verbose_level >= 1);
3213 //int f_vv = (verbose_level >= 2);
3214
3215 if (f_v) {
3216 cout << "action::base_change to the following set:" << endl;
3217 Lint_vec_print(cout, set, size);
3218 cout << endl;
3219 }
3220 if (!old_action->f_has_sims) {
3221 cout << "action::base_change old_action does not have sims" << endl;
3222 exit(1);
3223 }
3225 subaction = old_action;
3228
3230
3231 degree = old_action->degree;
3232 //base_len = 0;
3235
3237 Stabilizer_chain->allocate_base_data(this, 0, verbose_level);
3238 //allocate_base_data(0);
3239
3240
3241 elt_size_in_int = old_action->elt_size_in_int;
3245
3246
3248
3249 if (f_v) {
3250 cout << "action::base_change calling induce" << endl;
3251 }
3252 induce(old_action,
3253 old_action->Sims,
3254 size, set,
3255 verbose_level - 1);
3256
3257 char str1[1000];
3258 char str2[1000];
3259 snprintf(str1, 1000, "_base_change");
3260 snprintf(str2, 1000, " {\\rm BaseChange}");
3261
3262 label.assign(old_action->label);
3263 label_tex.assign(old_action->label_tex);
3264 label.append(str1);
3265 label_tex.append(str2);
3266
3267
3268
3269 if (f_v) {
3271 group_order(go);
3272 Kernel->group_order(K_go);
3273 cout << "action::base_change finished" << endl;
3274 cout << "induced action has order " << go << endl;
3275 cout << "kernel has order " << K_go << endl;
3276 //cout << "generators are:" << endl;
3277 //Sims->print_generators();
3278 }
3279 if (FALSE) {
3283 }
3284}
3285
3286
3288 action *&A_by_restriction,
3289 groups::schreier *&Orbits, groups::sims *S,
3290 int size, long int *set,
3291 int verbose_level)
3292{
3293 int f_v = (verbose_level >= 1);
3294 int f_induce = FALSE;
3295
3296 if (f_v) {
3297 cout << "action::create_orbits_on_subset_using_restricted_action" << endl;
3298 }
3299 A_by_restriction = create_induced_action_by_restriction(
3300 S,
3301 size, set,
3302 f_induce,
3303 verbose_level - 1);
3304 Orbits = NEW_OBJECT(groups::schreier);
3305
3306 A_by_restriction->compute_all_point_orbits(*Orbits,
3307 S->gens, verbose_level - 2);
3308 if (f_v) {
3309 cout << "action::create_orbits_on_subset_using_restricted_action "
3310 "done" << endl;
3311 }
3312}
3313
3315 action *&A_on_sets,
3316 groups::schreier *&Orbits, groups::sims *S,
3317 int nb_sets, int set_size, long int *sets,
3318 int verbose_level)
3319{
3320 int f_v = (verbose_level >= 1);
3321 //int f_induce = FALSE;
3322
3323 if (f_v) {
3324 cout << "action::create_orbits_on_sets_using_action_on_sets" << endl;
3325 }
3326
3328 nb_sets, set_size, sets,
3329 verbose_level);
3330
3331 Orbits = NEW_OBJECT(groups::schreier);
3332
3333 A_on_sets->compute_all_point_orbits(*Orbits, S->gens, verbose_level - 2);
3334 if (f_v) {
3335 cout << "action::create_orbits_on_sets_using_action_on_sets "
3336 "done" << endl;
3337 }
3338}
3339
3340
3341
3342
3344 int *Elt, int verbose_level)
3345{
3346 int f_v = (verbose_level >= 1);
3347 int b;
3348
3349 if (f_v) {
3350 cout << "action::choose_next_base_point_default_method" << endl;
3351 cout << "calling A->find_non_fixed_point" << endl;
3352 }
3353 b = find_non_fixed_point(Elt, verbose_level - 1);
3354 if (b == -1) {
3355 if (f_v) {
3356 cout << "action::choose_next_base_point_default_method "
3357 "cannot find another base point" << endl;
3358 }
3359 return -1;
3360 }
3361 if (f_v) {
3362 cout << "action::choose_next_base_point_default_method current base: ";
3363 //int_vec_print(cout, Stabilizer_chain->base, base_len());
3364 cout << " choosing next base point to be " << b << endl;
3365 }
3366 return b;
3367}
3368
3370 int f_target_go, ring_theory::longinteger_object &target_go,
3372 groups::strong_generators *&Strong_gens,
3373 int verbose_level)
3374{
3375 int f_v = (verbose_level >= 1);
3376
3377 if (f_v) {
3378 cout << "action::generators_to_strong_generators" << endl;
3379 if (f_target_go) {
3380 cout << "action::generators_to_strong_generators "
3381 "trying to create a group of order " << target_go << endl;
3382 }
3383 }
3384
3385 groups::sims *S;
3386
3387 if (f_v) {
3388 cout << "action::generators_to_strong_generators "
3389 "before create_sims_from_generators_randomized" << endl;
3390 }
3391
3393 gens, f_target_go,
3394 target_go, verbose_level - 2);
3395
3396 if (f_v) {
3397 cout << "action::generators_to_strong_generators "
3398 "after create_sims_from_generators_randomized" << endl;
3399 }
3400
3402 if (f_v) {
3403 cout << "action::generators_to_strong_generators "
3404 "before Strong_gens->init_from_sims" << endl;
3405 }
3406 Strong_gens->init_from_sims(S, verbose_level - 5);
3407
3408 FREE_OBJECT(S);
3409
3410 if (f_v) {
3411 cout << "action::generators_to_strong_generators done" << endl;
3412 }
3413}
3414
3417 int *The_equations, int nb_equations, groups::strong_generators *gens,
3418 action *&A_on_equations, groups::schreier *&Orb, int verbose_level)
3419{
3420 int f_v = (verbose_level >= 1);
3421
3422 if (f_v) {
3423 cout << "action::orbits_on_equations" << endl;
3424 }
3425
3426 A_on_equations = NEW_OBJECT(action);
3427
3428 if (f_v) {
3429 cout << "action::orbits_on_equations "
3430 "creating the induced action on the equations:" << endl;
3431 }
3433 this,
3434 HPD,
3435 The_equations, nb_equations,
3436 FALSE /* f_induce_action */, NULL /* sims *old_G */,
3437 verbose_level);
3438 if (f_v) {
3439 cout << "action::orbits_on_equations "
3440 "The induced action on the equations has been created, "
3441 "degree = " << A_on_equations->degree << endl;
3442 }
3443
3444 if (f_v) {
3445 cout << "action::orbits_on_equations "
3446 "computing orbits on the equations:" << endl;
3447 }
3448 Orb = gens->orbits_on_points_schreier(A_on_equations,
3449 verbose_level);
3450
3451 if (f_v) {
3452 cout << "action::orbits_on_equations "
3453 "We found " << Orb->nb_orbits
3454 << " orbits on the equations:" << endl;
3455 Orb->print_and_list_orbits_tex(cout);
3456 }
3457
3458 if (f_v) {
3459 cout << "action::orbits_on_equations done" << endl;
3460 }
3461}
3462
3463
3464
3465}}}
3466
Andre / Bruck / Bose construction of a translation plane from a spread.
Definition: geometry.h:28
to rank and unrank subspaces of a fixed dimension in F_q^n
Definition: geometry.h:892
void init(int n, int k, field_theory::finite_field *F, int verbose_level)
Definition: grassmann.cpp:70
homogeneous polynomials of a given degree in a given number of variables over a finite field GF(q)
Definition: ring_theory.h:88
domain to compute with objects of type longinteger
Definition: ring_theory.h:240
int compare(longinteger_object &a, longinteger_object &b)
void mult(longinteger_object &a, longinteger_object &b, longinteger_object &c)
a class to represent arbitrary precision integers
Definition: ring_theory.h:366
interface to the implementation functions for group actions
Definition: actions.h:1081
a permutation group in a fixed action.
Definition: actions.h:99
action * induced_action_on_interior_direct_product(int nb_rows, int verbose_level)
void create_orbits_on_subset_using_restricted_action(action *&A_by_restriction, groups::schreier *&Orbits, groups::sims *S, int size, long int *set, int verbose_level)
void lex_least_base(action *old_action, int verbose_level)
action * induced_action_on_set_partitions(int partition_class_size, int verbose_level)
action * restricted_action(long int *points, int nb_points, int verbose_level)
void compute_all_point_orbits(groups::schreier &S, data_structures_groups::vector_ge &gens, int verbose_level)
Definition: action.cpp:995
void induced_action_on_orthogonal(action *A_old, induced_actions::action_on_orthogonal *AO, int f_induce_action, groups::sims *old_G, int verbose_level)
void create_orbits_on_sets_using_action_on_sets(action *&A_on_sets, groups::schreier *&Orbits, groups::sims *S, int nb_sets, int set_size, long int *sets, int verbose_level)
void induced_action_on_ordered_pairs(action &old_action, groups::sims *old_G, int verbose_level)
void induced_action_on_sign(groups::sims *old_G, int verbose_level)
action * induced_action_on_wedge_product(int verbose_level)
action * create_induced_action_on_subgroups(groups::sims *S, int nb_subgroups, int group_order, groups::subgroup **Subgroups, int verbose_level)
void induced_action_on_pairs(action &old_action, groups::sims *old_G, int verbose_level)
void induced_action_on_determinant(groups::sims *old_G, int verbose_level)
void induced_action_by_subfield_structure(action *A_old, induced_actions::action_by_subfield_structure *SubfieldStructure, int f_induce_action, groups::sims *old_G, int verbose_level)
action * create_induced_action_on_sets(int nb_sets, int set_size, long int *sets, 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 orbits_on_equations(ring_theory::homogeneous_polynomial_domain *HPD, int *The_equations, int nb_equations, groups::strong_generators *gens, action *&A_on_equations, groups::schreier *&Orb, int verbose_level)
void induced_action_on_subgroups(action *old_action, groups::sims *S, int nb_subgroups, int group_order, groups::subgroup **Subgroups, int verbose_level)
void compute_strong_generators_from_sims(int verbose_level)
Definition: action.cpp:750
void induced_action_on_Galois_group(groups::sims *old_G, int verbose_level)
stabilizer_chain_base_data * Stabilizer_chain
Definition: actions.h:178
void induced_action_by_representation_on_conic(action *A_old, int f_induce_action, groups::sims *old_G, 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 induced_action_on_orbits(action *old_action, groups::schreier *Sch, int f_play_it_safe, int verbose_level)
void init_action_on_lines(action *A, field_theory::finite_field *F, int n, int verbose_level)
void induced_action_on_flags(action *old_action, int *type, int type_len, int verbose_level)
void induce(action *old_action, groups::sims *old_G, int base_of_choice_len, long int *base_of_choice, int verbose_level)
void induced_action_by_restriction_on_orbit_with_schreier_vector(action &old_action, int f_induce_action, groups::sims *old_G, data_structures_groups::schreier_vector *Schreier_vector, int pt, int verbose_level)
void induced_action_on_k_subsets(action &old_action, int k, int verbose_level)
action * induced_action_on_grassmannian(int k, int verbose_level)
void induced_action_by_restriction_internal_function(action &old_action, int f_induce_action, groups::sims *old_G, int nb_points, long int *points, int verbose_level)
int find_non_fixed_point(void *elt, int verbose_level)
Definition: action.cpp:555
void induced_action_recycle_sims(action &old_action, int verbose_level)
action * create_induced_action_on_ordered_pairs(int verbose_level)
void original_point_labels(long int *points, int nb_points, long int *&original_points, int verbose_level)
void base_change_in_place(int size, long int *set, int verbose_level)
int least_moved_point_at_level(int level, int verbose_level)
void base_change(action *old_action, int size, long int *set, int verbose_level)
int choose_next_base_point_default_method(int *Elt, int verbose_level)
void setup_product_action(action *A1, action *A2, int f_use_projections, int verbose_level)
void induced_action_on_sets(action &old_action, groups::sims *old_G, int nb_sets, int set_size, long int *sets, int f_induce_action, int verbose_level)
action * create_induced_action_by_conjugation(groups::sims *Base_group, int f_ownership, int verbose_level)
void induced_action_on_homogeneous_polynomials(action *A_old, ring_theory::homogeneous_polynomial_domain *HPD, int f_induce_action, groups::sims *old_G, int verbose_level)
void group_order(ring_theory::longinteger_object &go)
Definition: action.cpp:2223
action * create_induced_action_by_restriction(groups::sims *S, int size, long int *set, int f_induce, int verbose_level)
void induced_action_by_conjugation(groups::sims *old_G, groups::sims *Base_group, int f_ownership, int f_basis, int verbose_level)
void induced_action_on_bricks(action &old_action, combinatorics::brick_domain *B, int f_linear_action, int verbose_level)
void induced_action_on_spread_set(action *A_old, induced_actions::action_on_spread_set *AS, int f_induce_action, groups::sims *old_G, int verbose_level)
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 induced_action_override_sims(action &old_action, groups::sims *old_G, int verbose_level)
void induced_action_on_homogeneous_polynomials_given_by_equations(action *A_old, ring_theory::homogeneous_polynomial_domain *HPD, int *Equations, int nb_equations, int f_induce_action, groups::sims *old_G, int verbose_level)
void induced_action_on_cosets(induced_actions::action_on_cosets *A_on_cosets, int f_induce_action, groups::sims *old_G, int verbose_level)
void induced_action_by_right_multiplication(int f_basis, groups::sims *old_G, groups::sims *Base_group, int f_ownership, int verbose_level)
void induced_action_on_factor_space(action *A_old, induced_actions::action_on_factor_space *AF, int f_induce_action, groups::sims *old_G, int verbose_level)
void induced_action_on_andre(action *An, action *An1, geometry::andre_construction *Andre, int verbose_level)
the transversals in the stabilizer subgroup chain (Sims chain)
Definition: actions.h:1214
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
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 init_trivial_group(int verbose_level)
Definition: sims.cpp:584
void compute_base_orbits_known_length(int *tl, int verbose_level)
Definition: sims_main.cpp:57
int least_moved_point_at_level(int lvl, int verbose_level)
Definition: sims.cpp:2084
data_structures_groups::vector_ge gens
Definition: groups.h:1280
data_structures_groups::vector_ge gens_inv
Definition: groups.h:1281
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
schreier * orbits_on_points_schreier(actions::action *A_given, int verbose_level)
void init_from_sims(groups::sims *S, int verbose_level)
data_structures_groups::vector_ge * gens
Definition: groups.h:1708
a subgroup of a group using a list of elements
Definition: groups.h:2039
induced action by conjugation on the elements of a given group
void init(groups::sims *Base_group, int f_ownership, int verbose_level)
induced action of PSL(2,q) on a conic (the only type implemented so far)
void init(int nb_points, long int *points, int verbose_level)
void init_single_orbit_from_schreier_vector(data_structures_groups::schreier_vector *Schreier_vector, int pt, int verbose_level)
induced action on a the set of elements of a group by right multiplication
void init(groups::sims *Base_group, int f_ownership, int verbose_level)
induced action on the vector space arising from a field over a subfield
induced action on the elements of a projective plane constructed via Andre / Bruck / Bose
void init(actions::action *An, actions::action *An1, geometry::andre_construction *Andre, int verbose_level)
void init(actions::action *A, combinatorics::brick_domain *B, int f_linear_action, int verbose_level)
induced action on the cosets of a subspace by right multiplication
induced action on the determinant of a group of matrices (used to compute the subgroup PSL)
void init(actions::action &A, int f_projective, int m, int verbose_level)
induced action on the factor space of a vector space modulo a subspace
void init(actions::action *A, int *type, int type_len, int verbose_level)
induced action on the galois group (used to compute the projectivity subgroup of a collineation group...
induced action on the grassmannian (subspaces of a fixed dimension of a vectors space)
void init(actions::action &A, geometry::grassmann *G, int verbose_level)
induced action on the set of homogeneous polynomials over a finite field
void init(actions::action *A, ring_theory::homogeneous_polynomial_domain *HPD, int verbose_level)
void init(actions::action *A, int k, int verbose_level)
induced action on the set of orbits (usually by the normalizer)
void init(actions::action *A, groups::schreier *Sch, int f_play_it_safe, int verbose_level)
void init(int partition_size, actions::action *A, int verbose_level)
void init(int nb_sets, int set_size, long int *input_sets, int verbose_level)
induced action on the sign function of a permutation group (to compute the even subgroup)
void init(actions::action *A, int verbose_level)
induced action on a spread set via the associated spread
void init(actions::action *A, groups::sims *S, int nb_subgroups, int subgroup_order, groups::subgroup **Subgroups, int verbose_level)
induced wedge product action on the exterior square of a vector space
void init(actions::action *A1, actions::action *A2, int f_use_projections, int verbose_level)
#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 TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define FREE_lint(p)
Definition: foundations.h:642
#define NEW_lint(n)
Definition: foundations.h:628
the orbiter library for the classification of combinatorial objects
induced_actions::action_on_galois_group * on_Galois_group
induced_actions::action_by_restriction * ABR
induced_actions::action_on_orbits * OnOrbits
induced_actions::action_on_sign * OnSign
induced_actions::action_on_homogeneous_polynomials * OnHP
induced_actions::action_on_spread_set * AS
induced_actions::action_on_wedge_product * AW
induced_actions::action_by_conjugation * ABC
induced_actions::action_by_representation * Rep
induced_actions::action_on_interior_direct_product * OnInteriorDirectProduct
induced_actions::action_on_bricks * OnBricks
induced_actions::action_by_subfield_structure * SubfieldStructure
induced_actions::action_on_grassmannian * AG
induced_actions::action_on_flags * OnFlags
induced_actions::product_action * product_action_data
induced_actions::action_on_sets * on_sets
induced_actions::action_on_set_partitions * OnSetPartitions
induced_actions::action_on_determinant * AD
induced_actions::action_by_right_multiplication * ABRM
induced_actions::action_on_orthogonal * AO
induced_actions::action_on_subgroups * on_subgroups
induced_actions::action_on_factor_space * AF
induced_actions::action_on_cosets * OnCosets
induced_actions::action_on_andre * OnAndre
induced_actions::action_on_k_subsets * on_k_subsets