13namespace layer3_group_actions {
21 ost <<
"unknown_symmetry_group_t";
24 ost <<
"matrix_group_t";
27 ost <<
"perm_group_t";
30 ost <<
"wreath_product_t";
33 ost <<
"direct_product_t";
36 ost <<
"permutation_representation_t";
39 ost <<
"action_on_sets_t";
42 ost <<
"action_on_set_partitions_t";
45 ost <<
"action_on_subgroups_t";
48 ost <<
"action_on_pairs_t";
51 ost <<
"action_on_ordered_pairs_t";
54 ost <<
"base_change_t";
57 ost <<
"product_action_t";
60 ost <<
"action_by_right_multiplication_t";
63 ost <<
"action_by_restriction_t";
66 ost <<
"action_by_conjugation_t";
69 ost <<
"action_by_representation_t";
72 ost <<
"action_by_subfield_structure_t";
75 ost <<
"action_on_determinant_t";
78 ost <<
"action_on_galois_group_t";
81 ost <<
"action_on_sign_t";
84 ost <<
"action_on_grassmannian_t";
87 ost <<
"action_on_spread_set_t";
90 ost <<
"action_on_cosets_t";
93 ost <<
"action_on_factor_space_t";
96 ost <<
"action_on_wedge_product_t";
99 ost <<
"action_on_bricks_t";
102 ost <<
"action_on_andre_t";
105 ost <<
"action_on_orthogonal_t";
108 ost <<
"action_on_orbits_t";
111 ost <<
"action_on_flags_t";
114 ost <<
"action_on_homogeneous_polynomials_t";
117 ost <<
"action_on_k_subsets_t";
120 ost <<
"action_on_interior_direct_product_t";
123 ost <<
"unknown symmetry_group_type" << endl;
135 int f_v = (verbose_level >= 1);
136 int f_vv = (verbose_level >= 2);
147 int minus_one, alpha;
153 cout <<
"action_global::make_generators_stabilizer_of_two_components" << endl;
167 minus_one = Fq->
negate(1);
174 for (i = 0; i < k; i++) {
177 for (i = 0; i < k; i++) {
178 Center[i * k + i] = alpha;
180 for (i = 0; i < k; i++) {
181 minusId[i * k + i] = minus_one;
191 int new_len, sz, idx, h;
193 new_len = 2 * len + 2;
202 for (h = 0; h < 2 * len; h++) {
204 P = gens_PGL_k->
gens->
ith(h / 2);
224 int_matrix_make_block_matrix_2x2(Q, k, Zero, Id, Id, Zero);
228 int_vec_copy(Q, Data + idx * sz, sz);
249 if (idx != new_len) {
250 cout <<
"action_global::make_generators_stabilizer_of_two_components "
251 "idx != new_len" << endl;
257 gens->
init(A_PGL_n_q, verbose_level - 2);
258 gens->
allocate(new_len, verbose_level - 2);
259 for (h = 0; h < new_len; h++) {
262 cout <<
"action_global::make_generators_stabilizer_of_two_components "
263 "after make_element generator " << h <<
" : " << endl;
266 A_PGL_n_q->
move(Elt1, gens->
ith(h));
279 cout <<
"action_global::make_generators_stabilizer_of_two_components done" << endl;
289 int f_v = (verbose_level >= 1);
290 int f_vv = (verbose_level >= 2);
304 cout <<
"action_global::make_generators_stabilizer_of_three_components" << endl;
317 minus_one = Fq->
negate(1);
323 for (i = 0; i < k; i++) {
326 for (i = 0; i < k; i++) {
327 minusId[i * k + i] = minus_one;
337 int new_len, sz, idx, h;
348 for (h = 0; h < len; h++) {
379 if (idx != new_len) {
380 cout <<
"action_global::make_generators_stabilizer_of_three_components "
381 "idx != new_len" << endl;
387 gens->
init(A_PGL_n_q, verbose_level - 2);
388 gens->
allocate(new_len, verbose_level - 2);
389 for (h = 0; h < new_len; h++) {
392 cout <<
"action_global::make_generators_stabilizer_of_three_components "
393 "after make_element generator " << h <<
" : " << endl;
396 A_PGL_n_q->
move(Elt1, gens->
ith(h));
408 cout <<
"action_global::make_generators_stabilizer_of_three_components done" << endl;
413 int &nb_gens,
int &elt_size,
int n,
418 int f_v = (verbose_level >= 1);
419 int f_vv = (verbose_level >= 2);
426 cout <<
"action_global::compute_generators_GL_n_q" << endl;
441 Gens =
NEW_int(nb_gens * elt_size);
442 for (h = 0; h < nb_gens; h++) {
445 for (i = 0; i < n * n; i++) {
446 Gens[h * elt_size + i] = Elt[i];
450 for (i = 0; i < n * n; i++) {
451 Gens[h * elt_size + i] = 0;
454 for (i = 0; i < n; i++) {
455 Gens[h * elt_size + i * n + i] = alpha;
460 for (h = 0; h < nb_gens; h++) {
461 cout <<
"Generator " << h <<
":" << endl;
468 cout <<
"action_global::compute_generators_GL_n_q done" << endl;
486 int f_semisimilarity)
502void test_matrix_group(
int k,
int q,
int f_semilinear,
int verbose_level)
507 vector_ge *nice_gens;
525 int f_v = (verbose_level >= 1);
526 int f_vv = (verbose_level >= 2);
534 cout <<
"action_global::lift_generators" << endl;
537 nb_gens = gens_in->
len;
547 cout <<
"action_global::lift_generators lifting generators" << endl;
549 gens_out->
init(Aq, verbose_level - 2);
550 gens_out->
allocate(nb_gens, verbose_level - 2);
551 for (t = 0; t < nb_gens; t++) {
553 cout <<
"lift_generators " << t <<
" / " << nb_gens << endl;
555 EltQ = gens_in->
ith(t);
558 cout <<
"action_global::lift_generators lifted matrix:" << endl;
563 cout <<
"action_global::lift_generators after make_element:" << endl;
568 cout <<
"action_global::lift_generators " << t <<
" / "
569 << nb_gens <<
" done" << endl;
575 cout <<
"action_global::lift_generators done" << endl;
585 int f_v = (verbose_level >= 1);
586 int f_vv = (verbose_level >= 2);
594 cout <<
"action_global::retract_generators" << endl;
597 nb_gens = gens_in->
len;
607 cout <<
"action_global::retract_generators retracting generators" << endl;
609 gens_out->
init(AQ, verbose_level - 2);
610 gens_out->
allocate(nb_gens, verbose_level - 2);
611 for (t = 0; t < nb_gens; t++) {
613 cout <<
"action_global::retract_generators " << t
614 <<
" / " << nb_gens << endl;
616 Eltq = gens_in->
ith(t);
619 cout <<
"action_global::retract_generators retracted matrix:" << endl;
624 cout <<
"action_global::retract_generators after make_element:" << endl;
629 cout <<
"action_global::retract_generators " << t
630 <<
" / " << nb_gens <<
" done" << endl;
636 cout <<
"action_global::retract_generators done" << endl;
647 int f_v = (verbose_level >= 1);
648 int f_vv = (verbose_level >= 2);
656 cout <<
"action_global::lift_generators_to_subfield_structure" << endl;
664 cout <<
"action_global::lift_generators_to_subfield_structure "
665 "s must divide n" << endl;
669 cout <<
"action_global::lift_generators_to_subfield_structure "
670 "creating subfield structure" << endl;
673 cout <<
"n=" << n << endl;
674 cout <<
"s=" << s << endl;
675 cout <<
"m=" << m << endl;
676 cout <<
"q=" << q << endl;
677 cout <<
"Q=" << Q << endl;
689 cout <<
"action_global::lift_generators_to_subfield_structure "
690 "order of GL(m,Q) = " << order_GLmQ << endl;
693 q - 1, target_go, r);
695 cout <<
"action_global::lift_generators_to_subfield_structure "
696 "target_go = " << target_go << endl;
709 cout <<
"action_global::lift_generators_to_subfield_structure "
710 "before lift_generators" << endl;
715 cout <<
"action_global::lift_generators_to_subfield_structure "
716 "after lift_generators" << endl;
721 cout <<
"action_global::lift_generators_to_subfield_structure "
722 "creating lifted group:" << endl;
731 Sims = A1->create_sims_from_generators_without_target_group_order(
732 gens1,
MINIMUM(2, verbose_level - 3));
736 cout <<
"action_global::lift_generators_to_subfield_structure "
737 "creating lifted group done" << endl;
745 cout <<
"go=" << go << endl;
753 cout <<
"action_global::lift_generators_to_subfield_structure "
754 "strong generators are:" << endl;
762 cout <<
"action_global::lift_generators_to_subfield_structure done" << endl;
768 int degree,
int *perm,
int verbose_level)
771 degree, perm, 0,
FALSE,
TRUE, verbose_level);
775 int degree,
int *perm,
int offset,
776 int f_do_it_anyway_even_for_big_degree,
777 int f_print_cycles_of_length_one,
int verbose_level)
783 int f_v = (verbose_level >= 1);
784 int f_vv = (verbose_level >= 2);
789 cout <<
"action_global::perm_print_cycles_sorted_by_length, "
790 "degree=" << degree << endl;
797 int f_no_base =
FALSE;
800 Gens.
init(A, verbose_level - 2);
801 Gens.
allocate(nb_gens, verbose_level - 2);
802 for (i = 0; i < nb_gens; i++) {
803 Gens.
copy_in(i, perm + i * degree);
811 S.
init(A, verbose_level - 2);
815 cout <<
"after S.compute_all_point_orbits, "
821 int j, f, l, length, F, L, h, a, b, m, orbit_idx;
822 int *orbit_len_sorted;
824 int *sorting_perm_inv;
831 sorting_perm, sorting_perm_inv,
832 nb_types, type_first, type_len);
835 ost <<
"permutation of degree " << degree <<
" with "
837 for (i = 0; i < nb_types; i++) {
840 length = orbit_len_sorted[f];
842 ost << l <<
" \\times ";
845 if (i < nb_types - 1)
849 ost <<
"cycles in increasing length:" << endl;
852 for (i = 0; i < nb_types; i++) {
855 length = orbit_len_sorted[f];
856 ost << l <<
" cycles of length " << length << endl;
859 if (f_big && !f_do_it_anyway_even_for_big_degree) {
863 for (i = 0; i < nb_types; i++) {
866 length = orbit_len_sorted[f];
867 if (length == 1 && !f_print_cycles_of_length_one) {
870 for (j = 0; j < l; j++) {
871 orbit_idx = sorting_perm_inv[f + j];
876 for (h = 1; h < L; h++) {
877 if (S.
orbit[F + h] < m)
888 ost <<
", " << (b + offset);
905 ost <<
" cycle type: ";
906 C.print_file(ost,
TRUE );
923 int f_v = (verbose_level >= 1);
932 cout <<
"action_global::init_direct_product_group_and_restrict" << endl;
933 cout <<
"M1=" << M1->
label << endl;
934 cout <<
"M2=" << M2->
label << endl;
939 cout <<
"action_global::init_direct_product_group_and_restrict "
940 "after A_direct_product->init_direct_product_group" << endl;
946 for (i = 0; i < nb_points; i++) {
951 cout <<
"action_global::init_direct_product_group_and_restrict "
952 "before A_direct_product->restricted_action" << endl;
960 cout <<
"action_global::init_direct_product_group_and_restrict "
961 "after A_direct_product->restricted_action" << endl;
970 int f_v = (verbose_level >= 1);
975 cout <<
"action_global::init_direct_product_group" << endl;
976 cout <<
"M1=" << M1->
label << endl;
977 cout <<
"M2=" << M2->
label << endl;
990 cout <<
"action_global::init_direct_product_group "
991 "before P->init" << endl;
993 P->
init(M1, M2, verbose_level);
995 cout <<
"action_global::init_direct_product_group "
996 "after P->init" << endl;
1005 cout <<
"action_global::init_direct_product_group low_level_point_size="
1014 cout <<
"action_global::init_direct_product_group "
1015 "label=" << A->
label << endl;
1033 cout <<
"action_global::init_direct_product_group "
1034 "degree=" << A->
degree << endl;
1041 cout <<
"action_global::init_direct_product_group "
1042 "base_len=" << A->
base_len() << endl;
1055 cout <<
"action_global::init_direct_product_group "
1056 "before W->make_strong_generators_data" << endl;
1059 gens_size, gens_nb, verbose_level - 1);
1061 cout <<
"action_global::init_direct_product_group "
1062 "after W->make_strong_generators_data" << endl;
1066 cout <<
"action_global::init_direct_product_group "
1067 "before A->Strong_gens->init_from_data" << endl;
1073 gens_data, gens_nb, gens_size,
1078 cout <<
"action_global::init_direct_product_group "
1079 "after A->Strong_gens->init_from_data" << endl;
1089 S->
init(A, verbose_level - 2);
1091 cout <<
"action_global::init_direct_product_group "
1092 "before S->init_generators" << endl;
1096 cout <<
"action_global::init_direct_product_group "
1097 "after S->init_generators" << endl;
1100 cout <<
"action_global::init_direct_product_group "
1101 "before S->compute_base_orbits_known_length" << endl;
1105 cout <<
"action_global::init_direct_product_group "
1106 "after S->compute_base_orbits_known_length" << endl;
1111 cout <<
"action_global::init_direct_product_group "
1112 "before init_sims_only" << endl;
1118 cout <<
"action_global::init_direct_product_group "
1119 "after init_sims_only" << endl;
1125 cout <<
"action_global::init_direct_product_group, finished setting up "
1127 cout <<
", a permutation group of degree " << A->
degree <<
" ";
1128 cout <<
"and of order ";
1146 int f_v = (verbose_level >= 1);
1149 cout <<
"action_global::compute_decomposition_based_on_orbits" << endl;
1160 cout <<
"action_global::compute_decomposition_based_on_orbits "
1161 "before S1->allocate" << endl;
1167 cout <<
"action_global::compute_decomposition_based_on_orbits "
1168 "before Sch1->get_orbit_partition" << endl;
1172 cout <<
"action_global::compute_decomposition_based_on_orbits "
1173 "before Sch2->get_orbit_partition" << endl;
1177 cout <<
"action_global::compute_decomposition_based_on_orbits "
1178 "after Sch2->get_orbit_partition" << endl;
1185 cout <<
"action_global::compute_decomposition_based_on_orbits "
1186 "before P->compute_decomposition" << endl;
1194 cout <<
"action_global::compute_decomposition_based_on_orbits done" << endl;
1205 int f_v = (verbose_level >= 1);
1208 cout <<
"action_global::compute_decomposition_based_on_orbit_length" << endl;
1225 cout <<
"action_global::compute_decomposition_based_on_orbit_length "
1226 "before P->compute_decomposition" << endl;
1235 cout <<
"action_global::compute_decomposition_based_on_orbit_length done" << endl;
1244 int *Elt,
void *data,
int verbose_level)
1247 int f_v = (verbose_level >= 1);
1250 cout <<
"action_global::callback_choose_random_generator_orthogonal "
1251 "iteration=" << iteration << endl;
1259 int f_siegel =
TRUE;
1260 int f_reflection =
TRUE;
1261 int f_similarity =
TRUE;
1262 int f_semisimilarity =
TRUE;
1273 cout <<
"action_global::callback_choose_random_generator_orthogonal "
1274 "iteration=" << iteration
1275 <<
" before M->orthogonal_group_random_generator"
1283 Elt, verbose_level - 2);
1286 cout <<
"action_global::callback_choose_random_generator_orthogonal "
1287 "iteration=" << iteration
1288 <<
" after M->orthogonal_group_random_generator"
1293 cout <<
"action_global::callback_choose_random_generator_orthogonal "
1294 "iteration=" << iteration <<
" done" << endl;
void matrix_make_block_matrix_2x2(int *Mtx, int k, int *A, int *B, int *C, int *D)
data structure for set partitions following Jeffrey Leon
void allocate(int n, int verbose_level)
a collection of functions related to sorted vectors
void int_vec_classify(int length, int *the_vec, int *&the_vec_sorted, int *&sorting_perm, int *&sorting_perm_inv, int &nb_types, int *&type_first, int *&type_len)
a statistical analysis of data consisting of single integers
void init(int *data, int data_length, int f_second, int verbose_level)
a finite field as a vector space over a subfield
void retract_matrix(int *Mq, int n, int *MQ, int m, int verbose_level)
void lift_matrix(int *MQ, int m, int *Mq, int verbose_level)
interface for various incidence geometries
projective space PG(n,q) of dimension n over Fq
void compute_decomposition_based_on_tally(data_structures::tally *T1, data_structures::tally *T2, incidence_structure *&Inc, data_structures::partitionstack *&Stack, int verbose_level)
void compute_decomposition(data_structures::partitionstack *S1, data_structures::partitionstack *S2, incidence_structure *&Inc, data_structures::partitionstack *&Stack, int verbose_level)
basic number theoretic functions
int i_power_j(int i, int j)
data_structures::int_vec * Int_vec
an orthogonal geometry O^epsilon(n,q)
domain to compute with objects of type longinteger
void integral_division_by_int(longinteger_object &a, int b, longinteger_object &q, int &r)
a class to represent arbitrary precision integers
void make_generators_stabilizer_of_three_components(action *A_PGL_n_q, action *A_PGL_k_q, int k, data_structures_groups::vector_ge *gens, int verbose_level)
void retract_generators(data_structures_groups::vector_ge *gens_in, data_structures_groups::vector_ge *&gens_out, action *AQ, field_theory::subfield_structure *S, int n, int verbose_level)
void set_orthogonal_group_type(int f_siegel, int f_reflection, int f_similarity, int f_semisimilarity)
action * init_direct_product_group(groups::matrix_group *M1, groups::matrix_group *M2, int verbose_level)
void action_print_symmetry_group_type(std::ostream &ost, symmetry_group_type a)
void compute_decomposition_based_on_orbits(geometry::projective_space *P, groups::schreier *Sch1, groups::schreier *Sch2, geometry::incidence_structure *&Inc, data_structures::partitionstack *&Stack, int verbose_level)
void perm_print_cycles_sorted_by_length_offset(std::ostream &ost, int degree, int *perm, int offset, int f_do_it_anyway_even_for_big_degree, int f_print_cycles_of_length_one, int verbose_level)
void lift_generators(data_structures_groups::vector_ge *gens_in, data_structures_groups::vector_ge *&gens_out, action *Aq, field_theory::subfield_structure *S, int n, int verbose_level)
action * init_direct_product_group_and_restrict(groups::matrix_group *M1, groups::matrix_group *M2, int verbose_level)
int get_orthogonal_group_type_f_reflection()
void make_generators_stabilizer_of_two_components(action *A_PGL_n_q, action *A_PGL_k_q, int k, data_structures_groups::vector_ge *gens, int verbose_level)
void perm_print_cycles_sorted_by_length(std::ostream &ost, int degree, int *perm, int verbose_level)
void lift_generators_to_subfield_structure(int n, int s, field_theory::subfield_structure *S, action *Aq, action *AQ, groups::strong_generators *&Strong_gens, int verbose_level)
void compute_decomposition_based_on_orbit_length(geometry::projective_space *P, groups::schreier *Sch1, groups::schreier *Sch2, geometry::incidence_structure *&Inc, data_structures::partitionstack *&Stack, int verbose_level)
void compute_generators_GL_n_q(int *&Gens, int &nb_gens, int &elt_size, int n, field_theory::finite_field *F, data_structures_groups::vector_ge *&nice_gens, int verbose_level)
interface to the implementation functions for group actions
void init_function_pointers_direct_product_group()
a permutation group in a fixed action.
int *& get_transversal_length()
action * restricted_action(long int *points, int nb_points, int verbose_level)
void element_print_quick(void *elt, std::ostream &ost)
int coded_elt_size_in_char
void print_quick(std::ostream &ost, void *elt)
symmetry_group_type type_G
groups::strong_generators * Strong_gens
void init_sims_only(groups::sims *G, int verbose_level)
void compute_strong_generators_from_sims(int verbose_level)
int f_has_strong_generators
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
void make_element(int *Elt, int *data, int verbose_level)
void element_move(void *a, void *b, int verbose_level)
void init_permutation_group(int degree, int f_no_base, int verbose_level)
void group_order(ring_theory::longinteger_object &go)
void allocate_element_data()
action_pointer_table * ptr
void move(void *a, void *b)
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 print_group_order(std::ostream &ost)
the transversals in the stabilizer subgroup chain (Sims chain)
void allocate_base_data(action *A, int base_len, int verbose_level)
to hold a vector of group elements
void allocate(int length, int verbose_level)
void copy_in(int i, int *elt)
void print(std::ostream &ost)
void init(actions::action *A, int verbose_level)
the direct product of two matrix groups in product action
void init(matrix_group *M1, matrix_group *M2, int verbose_level)
void make_strong_generators_data(int *&data, int &size, int &nb_gens, int verbose_level)
int * the_transversal_length
int degree_of_product_action
a matrix group over a finite field in projective, vector space or affine action
void orthogonal_group_random_generator(actions::action *A, orthogonal_geometry::orthogonal *O, int f_siegel, int f_reflection, int f_similarity, int f_semisimilarity, int *Elt, int verbose_level)
field_theory::finite_field * GFq
Schreier Sims algorithm to create the stabilizer chain of a permutation group.
Schreier trees for orbits of groups on points.
void compute_all_point_orbits(int verbose_level)
void get_orbit_length(int *&orbit_length, int verbose_level)
void init_generators(data_structures_groups::vector_ge &generators, int verbose_level)
void init(actions::action *A, int verbose_level)
void get_orbit_partition(data_structures::partitionstack &S, int verbose_level)
a permutation group represented via a stabilizer chain
void init(actions::action *A, int verbose_level)
void group_order(ring_theory::longinteger_object &go)
void compute_base_orbits_known_length(int *tl, int verbose_level)
void init_generators(data_structures_groups::vector_ge &generators, int verbose_level)
a strong generating set for a permutation group with respect to a fixed action
void init_from_data(actions::action *A, int *data, int nb_elements, int elt_size, int *transversal_length, data_structures_groups::vector_ge *&nice_gens, int verbose_level)
void print_generators(std::ostream &ost)
void init_from_sims(groups::sims *S, int verbose_level)
data_structures_groups::vector_ge * gens
induced action on the orthogonal geometry
orthogonal_geometry::orthogonal * O
#define Lint_vec_copy(A, B, C)
#define Int_vec_zero(A, B)
#define Int_matrix_print(A, B, C)
#define Int_vec_copy(A, B, C)
orbiter_kernel_system::orbiter_session * Orbiter
global Orbiter session
int f_generator_orthogonal_similarity
int f_generator_orthogonal_semisimilarity
int f_generator_orthogonal_reflection
void callback_choose_random_generator_orthogonal(int iteration, int *Elt, void *data, int verbose_level)
int f_generator_orthogonal_siegel
symmetry_group_type
enumeration to distinguish between the various types of group actions
@ action_by_restriction_t
@ action_on_factor_space_t
@ unknown_symmetry_group_t
@ action_on_galois_group_t
@ action_by_representation_t
@ action_on_grassmannian_t
@ action_on_homogeneous_polynomials_t
@ action_on_wedge_product_t
@ action_on_interior_direct_product_t
@ action_by_conjugation_t
@ action_by_right_multiplication_t
@ action_on_set_partitions_t
@ action_on_ordered_pairs_t
@ action_by_subfield_structure_t
@ permutation_representation_t
@ action_on_determinant_t
the orbiter library for the classification of combinatorial objects
groups::direct_product * direct_product_group
groups::matrix_group * matrix_grp
induced_actions::action_on_orthogonal * AO