16namespace layer5_applications {
17namespace apps_geometry {
20static long int polar_callback_rank_point_func(
int *v,
void *data);
21static void polar_callback_unrank_point_func(
int *v,
long int rk,
void *data);
22static void polar_callback_early_test_func(
long int *S,
int len,
23 long int *candidates,
int nb_candidates,
24 long int *good_candidates,
int &nb_good_candidates,
25 void *data,
int verbose_level);
96 int *group_generator_data,
int group_generator_size,
97 int f_group_order_target,
const char *group_order_target,
100 int f_v = (verbose_level >= 1);
104 cout <<
"polar::init_group, calling "
105 "A->init_group_from_generators_by_base_images" << endl;
109 group_generator_data, group_generator_size,
110 f_group_order_target, group_order_target,
118 int *group_generator_data,
int group_generator_size,
119 int f_group_order_target,
const char *group_order_target,
122 int f_v = (verbose_level >= 1);
126 cout <<
"polar::init_group, calling "
127 "A->init_group_from_generators" << endl;
130 group_generator_data, group_generator_size,
131 f_group_order_target, group_order_target,
142 int depth,
int verbose_level)
144 int f_v = (verbose_level >= 1);
156 cout <<
"polar::init n=" <<
n <<
" k=" <<
k <<
" q=" <<
q << endl;
182 int f_v = (verbose_level >= 1);
189 cout <<
"polar::init2" << endl;
193 cout <<
"initializing with strong generators" << endl;
201 cout <<
"initializing full group" << endl;
209 int f_print_as_permutation =
TRUE;
212 int f_do_it_anyway_even_for_big_degree =
TRUE;
213 int f_print_cycles_of_length_one =
FALSE;
215 cout <<
"printing generators for the group:" << endl;
216 gens->
gens->
print(cout, f_print_as_permutation,
218 f_do_it_anyway_even_for_big_degree,
219 f_print_cycles_of_length_one);
226 polar_callback_rank_point_func,
227 polar_callback_unrank_point_func,
238 sprintf(label,
"polar_%d_%d_%d_%d",
epsilon,
n,
k,
q);
249 polar_callback_early_test_func,
255 depth , verbose_level);
260 Gen->print_function = print_set;
261 Gen->print_function_data =
this;
271 int f_v = (verbose_level >= 1);
274 cout <<
"polar::compute_orbits calling generator_main" << endl;
287 cout <<
"done with generator_main" << endl;
298 cout <<
"we found " <<
nb_orbits <<
" orbits containing "
305 int f_v = (verbose_level >= 1);
306 int f_vv = (verbose_level >= 2);
307 int f_vvv = (verbose_level >= 3);
308 int i, c, cc, node2, index_int;
319 cout <<
"polar::compute_cosets" << endl;
335 index_int = index.
as_int();
337 cout <<
"polar::compute_cosets index=" << index_int << endl;
343 cout <<
"the set representing orbit " << orbit_idx
344 <<
" at level " <<
depth <<
" is ";
348 for (i = 0; i <
k; i++) {
353 cout <<
"corresponding to the subspace with basis:" << endl;
360 for (i = 0; i <
k *
n; i++) {
364 cout <<
"Rank=" << Rank << endl;
367 for (c = 0; c < index_int; c++) {
371 cout <<
"Coset " << c << endl;
376 cout <<
"Left coset " << c <<
" is represented by" << endl;
385 cout <<
"Right coset " << c <<
" is represented by" << endl;
390 for (i = 0; i <
k; i++) {
395 cout <<
"basis of subspace that is the image "
396 "under this element:" << endl;
399 for (i = 0; i <
k *
n; i++) {
404 cout <<
"Coset " << c <<
" Rank=" << Rank << endl;
409 cout <<
"error in polar::compute_cosets" << endl;
410 cout <<
"cc != c" << endl;
411 cout <<
"c=" << c << endl;
412 cout <<
"cc=" << cc << endl;
429 int f_v = (verbose_level >= 1);
430 int f_vv = (verbose_level >= 2);
431 int i, c, node2, index_int;
446 cout <<
"polar::dual_polar_graph" << endl;
464 index_int = index.
as_int();
466 cout <<
"polar::dual_polar_graph index=" << index_int << endl;
467 cout <<
"polar::dual_polar_graph witt=" << witt << endl;
470 nb_maximals = index_int;
472 Adj =
NEW_int(index_int * index_int);
475 for (i = 0; i < index_int; i++) {
478 for (i = 0; i < index_int * index_int; i++) {
485 cout <<
"the set representing orbit " << orbit_idx
486 <<
" at level " <<
depth <<
" is ";
490 for (i = 0; i <
k; i++) {
496 cout <<
"corresponding to the subspace with basis:" << endl;
502 Grass.
init(
n,
k,
F, verbose_level - 2);
503 for (i = 0; i <
k *
n; i++) {
507 cout <<
"Rank=" << Rank << endl;
510 for (c = 0; c < index_int; c++) {
515 cout <<
"Coset " << c << endl;
520 cout <<
"Left coset " << c <<
" is represented by" << endl;
529 cout <<
"Right coset " << c
530 <<
" is represented by" << endl;
535 for (i = 0; i <
k; i++) {
537 M2 + i *
n, Elt2, 0);
543 cout <<
"subspace " << c <<
":" << endl;
550 for (i = 0; i <
k *
n; i++) {
555 cout <<
"Coset " << c <<
" Rank=" << Rank << endl;
560 for (i = 0; i <
k *
n; i++) {
566 int c1, c2, rk, nb_e, e;
573 for (c1 = 0; c1 < index_int; c1++) {
574 for (c2 = 0; c2 < index_int; c2++) {
575 for (i = 0; i <
k *
n; i++) {
578 for (i = 0; i <
k *
n; i++) {
579 MM[
k *
n + i] = M[c2][i];
586 Adj[c1 * index_int + c2] = 1;
592 cout <<
"adjacency matrix:" << endl;
594 index_int, index_int, index_int, 1);
598 cout <<
"neighborhood lists:" << endl;
599 for (c1 = 0; c1 < index_int; c1++) {
600 cout <<
"N(" << c1 <<
")={";
601 for (c2 = 0; c2 < index_int; c2++) {
602 if (Adj[c1 * index_int + c2]) {
611 for (c1 = 0; c1 < index_int; c1++) {
612 for (c2 = c1 + 1; c2 < index_int; c2++) {
613 if (Adj[c1 * index_int + c2]) {
619 cout <<
"with " << nb_e <<
" edges" << endl;
623 Inc =
NEW_int(index_int * nb_e);
624 for (i = 0; i < index_int * nb_e; i++) {
629 for (c1 = 0; c1 < index_int; c1++) {
630 for (c2 = c1 + 1; c2 < index_int; c2++) {
631 if (Adj[c1 * index_int + c2]) {
632 Inc[c1 * nb_e + e] = 1;
633 Inc[c2 * nb_e + e] = 1;
639 cout <<
"Incidence matrix:" << index_int
640 <<
" x " << nb_e << endl;
642 index_int, nb_e, nb_e, 1);
648 sprintf(fname,
"dual_polar_graph_O_%d_%d_%d.inc",
epsilon,
n,
q);
651 f << index_int <<
" " << nb_e <<
" " << 2 * nb_e << endl;
652 for (i = 0; i < index_int * nb_e; i++) {
664 cout <<
"written file " << fname <<
" of size "
680 for (i = 0; i < index_int; i++) {
689 long int goi, i, order;
695 depth, orbit_idx, 0 );
705 cout <<
"polar::show_stabilizer created group of order " << go << endl;
707 for (i = 0; i < goi; i++) {
710 cout <<
"element " << i <<
" of order " << order <<
":" << endl;
722void polar::get_maximals(
int depth,
int orbit_idx,
int verbose_level)
725 poset_orbit_node *O2;
734 node2 =
Gen->first_poset_orbit_node_at_level[
depth] + orbit_idx;
735 O2 = &
Gen->root[node2];
736 Gen->get_stabilizer(gens, tl,
depth, orbit_idx, verbose_level);
739 S = create_sims_from_generators_with_target_group_order_factorized(
741 longinteger_object go;
744 cout <<
"polar::show_stabilizer created group of order " << go << endl;
746 for (i = 0; i < goi; i++) {
747 S->element_unrank_int(i, Elt);
749 cout <<
"element " << i <<
" of order " << order <<
":" << endl;
763void polar::compute_Kramer_Mesner_matrix(
int t,
int k,
int verbose_level)
765 int f_v = (verbose_level >= 1);
768 cout <<
"compute_Kramer_Mesner_matrix t=" << t
769 <<
" k=" <<
k <<
":" << endl;
777 for (i = 0; i <
k; i++) {
779 calc_Kramer_Mesner_matrix_neighboring(
Gen, i,
780 V[i].as_matrix(), verbose_level - 2);
782 cout <<
"matrix level " << i <<
":" << endl;
789 Mtk_from_MM(V, Mtk, t,
k,
TRUE,
q, verbose_level - 2);
790 cout <<
"M_{" << t <<
"," <<
k <<
"} sup:" << endl;
794 Mtk_sup_to_inf(
Gen, t,
k, Mtk, Mtk_inf, verbose_level - 2);
795 cout <<
"M_{" << t <<
"," <<
k <<
"} inf:" << endl;
803int polar::test(
int *S,
int len,
int verbose_level)
806 int f_v = (verbose_level >= 1);
807 int f_vv = (verbose_level >= 2);
812 cout <<
"polar::test" << endl;
814 for (i = 0; i < len; i++) {
819 cout <<
"coordinate matrix:" << endl;
824 cout <<
"after perp:" << endl;
825 print_integer_matrix_width(cout,
tmp_M,
n,
n,
n,
828 rk =
F->Gauss_simple(
tmp_M,
831 cout <<
"the matrix has rank " << rk << endl;
837 cout <<
"polar::test rk < n - len, fatal. "
838 "This should not happen" << endl;
839 cout <<
"rk=" << rk << endl;
840 cout <<
"n=" <<
n << endl;
841 cout <<
"len=" << len << endl;
845 cout <<
"polar::test done, f_OK=" << f_OK << endl;
852 long int *candidates,
int nb_candidates,
853 long int *good_candidates,
int &nb_good_candidates,
856 int f_v = (verbose_level >= 1);
857 int f_vv = (verbose_level >= 2);
862 cout <<
"polar::test_if_in_perp done for ";
867 for (i = 0; i < nb_candidates; i++) {
868 good_candidates[i] = candidates[i];
870 nb_good_candidates = nb_candidates;
874 nb_good_candidates = 0;
877 for (i = 0; i < nb_candidates; i++) {
881 cout <<
"candidate " << i <<
" = " << c <<
":" << endl;
887 cout <<
"form value " << f << endl;
890 good_candidates[nb_good_candidates++] = c;
896 cout <<
"polar::test_if_in_perp done for ";
898 cout <<
"; # of candidates reduced from " << nb_candidates
899 <<
" to " << nb_good_candidates << endl;
902 cout <<
"good candidates: ";
909 int *candidates,
int nb_candidates,
910 int *good_candidates,
int &nb_good_candidates,
913 int f_v = (verbose_level >= 1);
914 int f_vv = (verbose_level >= 2);
915 int i, j, h, c, d, y, f_OK, idx, nb, nb0;
921 int *candidates_expanded;
922 int nb_candidates_expanded;
924 int nb_tmp_candidates;
929 cout <<
"polar::test_if_closed_under_cosets for ";
932 cout <<
"verbose_level=" << verbose_level << endl;
933 cout <<
"candidates: ";
938 for (i = 0; i < nb_candidates; i++) {
939 good_candidates[i] = candidates[i];
941 nb_good_candidates = nb_candidates;
957 candidates_expanded =
NEW_int(2 * nb_candidates * (1 + nb0));
958 tmp_candidates =
NEW_int(2 * nb_candidates * (1 + nb0));
959 for (i = 0; i < len; i++) {
963 cout <<
"the basis is ";
966 cout <<
"corresponding to the vectors:" << endl;
968 cout <<
"nb=" << nb << endl;
971 for (i = 0; i < nb0; i++) {
976 cout <<
"the list of points N0:" << endl;
980 for (i = 0; i < nb; i++) {
985 cout <<
"the list of points N:" << endl;
991 cout <<
"expand:" << endl;
993 nb_candidates_expanded = 0;
994 for (i = 0; i < nb_candidates; i++) {
996 candidates_expanded[nb_candidates_expanded++] = c;
1006 for (j = 0; j < nb0; j++) {
1007 for (y = 1; y <
F->
q; y++) {
1008 for (h = 0; h <
n; h++) {
1009 w[h] =
F->
add(v[h],
F->
mult(y, N0[j *
n + h]));
1012 cout <<
"j=" << j <<
" y=" << y <<
" : w=";
1018 cout <<
"d=" << d << endl;
1020 candidates_expanded[nb_candidates_expanded++] = d;
1025 cout <<
"expanded candidate set:" << endl;
1027 candidates_expanded, nb_candidates_expanded);
1032 cout <<
"expanded candidate set after sort:" << endl;
1033 Int_vec_print(cout, candidates_expanded, nb_candidates_expanded);
1038 nb_candidates_expanded = 0;
1039 for (i = 0; i < nb_candidates; i++) {
1041 candidates_expanded[nb_candidates_expanded++] = c;
1046 nb_tmp_candidates = 0;
1047 for (i = 0; i < nb_candidates_expanded; i++) {
1048 c = candidates_expanded[i];
1050 tmp_candidates[nb_tmp_candidates++] = c;
1060 for (j = 0; j < nb; j++) {
1061 for (y = 1; y <
F->
q; y++) {
1062 for (h = 0; h <
n; h++) {
1063 w[h] =
F->
add(v[h],
F->
mult(y, N[j *
n + h]));
1066 cout <<
"j=" << j <<
" y=" << y <<
" : w=";
1072 nb_candidates_expanded, d, idx)) {
1074 cout <<
"polar::test_if_closed_under_cosets "
1075 "point " << c <<
" is ruled out, "
1076 "coset point " << d <<
" is not found "
1077 "j=" << j <<
" y=" << y << endl;
1088 tmp_candidates[nb_tmp_candidates++] = c;
1092 cout <<
"tmp_candidates:" << endl;
1097 nb_good_candidates = 0;
1098 for (i = 0; i < nb_candidates; i++) {
1100 if (Sorting.
int_vec_search(tmp_candidates, nb_tmp_candidates, c, idx)) {
1101 good_candidates[nb_good_candidates++] = c;
1107 cout <<
"polar::test_if_closed_under_cosets for ";
1109 cout <<
"; # of candidates reduced from "
1110 << nb_candidates <<
" to " << nb_good_candidates << endl;
1113 cout <<
"good candidates: ";
1147 long int rank,
long int *set,
int verbose_level)
1150 orbit_idx, rank, set, verbose_level);
1154 long int &rank,
long int *set,
int verbose_level)
1157 orbit_idx, rank, set, verbose_level);
1171 int orbit_idx,
int f_limit,
int limit)
1175 long int len, j, h, jj;
1185 cout <<
"the stabilizer of orbit rep " << orbit_idx
1186 <<
" has order " << go_G << endl;
1190 cout <<
"the orbit length of orbit " << orbit_idx
1191 <<
" is " << len << endl;
1192 for (j = 0; j < len; j++) {
1195 if (f_limit && j >= limit) {
1196 cout <<
"..." << endl;
1200 cout << setw(4) << j <<
" : ";
1204 for (h = 0; h <
depth; h++) {
1207 cout <<
"corresponding to the subspace with basis:" << endl;
1212 cout <<
"basis in echelon form:" << endl;
1220 for (h = 0; h <
k *
n; h++) {
1224 cout <<
"Rank=" << Rank << endl;
1227 cout << setw(2) << ii <<
" : " << setw(4) << jj << endl;
1228 if (ii != orbit_idx) {
1229 cout <<
"polar::list_whole_orbit: "
1230 "fatal: ii != orbit_idx" << endl;
1234 cout <<
"polar::list_whole_orbit: "
1235 "fatal: jj != j" << endl;
1249long int static polar_callback_rank_point_func(
int *v,
void *data)
1259void static polar_callback_unrank_point_func(
int *v,
long int rk,
void *data)
1261 polar *P = (polar *) data;
1270int polar_callback_test_func(
int len,
int *S,
1271 void *data,
int verbose_level)
1273 polar *P = (polar *) data;
1275 int f_v = (verbose_level >= 1);
1278 cout <<
"checking set ";
1279 print_set(cout, len, S);
1281 f_OK = P->test(S, len, verbose_level - 2);
1284 cout <<
"OK" << endl;
1294void static polar_callback_early_test_func(
long int *S,
int len,
1295 long int *candidates,
int nb_candidates,
1296 long int *good_candidates,
int &nb_good_candidates,
1297 void *data,
int verbose_level)
1299 polar *P = (polar *) data;
1300 int f_v = (verbose_level >= 1);
1303 cout <<
"polar_callback_early_test_func for set ";
1307 P->test_if_in_perp(S, len,
1308 candidates, nb_candidates,
1309 good_candidates, nb_good_candidates,
1312 cout <<
"polar_callback_early_test_func done" << endl;
finite dimensional vector space over a finite field
void init(field_theory::finite_field *F, int dimension, int verbose_level)
void init_rank_functions(long int(*rank_point_func)(int *v, void *data), void(*unrank_point_func)(int *v, long int rk, void *data), void *data, int verbose_level)
void set_print(std::ostream &ost, int *v, int len)
void set_print(long int *v, int len)
a collection of functions related to sorted vectors
int int_vec_search(int *v, int len, int a, int &idx)
void int_vec_heapsort(int *v, int len)
void PG_element_unrank_modified(int *v, int stride, int len, int a)
linear_algebra::linear_algebra * Linear_algebra
various functions related to geometries
int Witt_index(int epsilon, int k)
long int nb_PG_elements(int n, int q)
to rank and unrank subspaces of a fixed dimension in F_q^n
void rank_longinteger(ring_theory::longinteger_object &r, int verbose_level)
void init(int n, int k, field_theory::finite_field *F, int verbose_level)
void mult_vector_from_the_left(int *v, int *A, int *vA, int m, int n)
int Gauss_easy(int *A, int m, int n)
int rank_of_rectangular_matrix(int *A, int m, int n, int verbose_level)
int Gauss_simple(int *A, int m, int n, int *base_cols, int verbose_level)
a collection of functions related to file io
long int file_size(std::string &fname)
data_structures::lint_vec * Lint_vec
data_structures::int_vec * Int_vec
an orthogonal geometry O^epsilon(n,q)
long int rank_point(int *v, int stride, int verbose_level)
void unrank_point(int *v, int stride, long int rk, int verbose_level)
int evaluate_bilinear_form(int *u, int *v, int stride)
domain to compute with objects of type longinteger
void integral_division(longinteger_object &a, longinteger_object &b, longinteger_object &q, longinteger_object &r, int verbose_level)
a class to represent arbitrary precision integers
void assign_to(longinteger_object &b)
DISCRETA vector class for vectors of DISCRETA objects.
discreta_matrix & change_to_matrix()
discreta_matrix & as_matrix()
std::ostream & print(std::ostream &)
a permutation group in a fixed action.
void init_group_from_generators_by_base_images(groups::sims *S, int *group_generator_data, int group_generator_size, int f_group_order_target, const char *group_order_target, data_structures_groups::vector_ge *gens, groups::strong_generators *&Strong_gens_out, int verbose_level)
void element_print_quick(void *elt, std::ostream &ost)
groups::sims * create_sims_from_generators_with_target_group_order_factorized(data_structures_groups::vector_ge *gens, int *tl, int len, int verbose_level)
groups::strong_generators * Strong_gens
void element_invert(void *a, void *av, int verbose_level)
void element_image_of_low_level(int *input, int *output, void *elt, int verbose_level)
void init_group_from_generators(int *group_generator_data, int group_generator_size, int f_group_order_target, const char *group_order_target, data_structures_groups::vector_ge *gens, groups::strong_generators *&Strong_gens, int verbose_level)
void element_print_as_permutation(void *elt, std::ostream &ost)
int element_order(void *elt)
a container data structure for groups
to hold a vector of group elements
void print(std::ostream &ost)
a permutation group represented via a stabilizer chain
void group_order(ring_theory::longinteger_object &go)
void element_unrank_lint(long int rk, int *Elt, int verbose_level)
a strong generating set for a permutation group with respect to a fixed action
data_structures_groups::vector_ge * gens
to control the behavior of the poset classification algorithm
the poset classification algorithm
void initialize_and_allocate_root_node(poset_classification_control *PC_control, poset_with_group_action *Poset, int depth, int verbose_level)
actions::action * get_A2()
actions::action * get_A()
int main(int t0, int schreier_depth, int f_use_invariant_subset_if_available, int f_debug, int verbose_level)
void stabilizer_order(int node, ring_theory::longinteger_object &go)
void orbit_length(int orbit_at_level, int level, ring_theory::longinteger_object &len)
int first_node_at_level(int i)
void orbit_element_unrank(int depth, int orbit_idx, long int rank, long int *set, int verbose_level)
int nb_orbits_at_level(int level)
poset_orbit_node * get_node(int node_idx)
void coset_unrank(int depth, int orbit_idx, long int rank, int *Elt, int verbose_level)
int orbit_length_as_int(int orbit_at_level, int level)
long int coset_rank(int depth, int orbit_idx, int *Elt, int verbose_level)
void get_stabilizer_generators(groups::strong_generators *&gens, int level, int orbit_at_level, int verbose_level)
void orbit_element_rank(int depth, int &orbit_idx, long int &rank, long int *set, int verbose_level)
to represent one poset orbit; related to the class poset_classification
void get_stabilizer(poset_classification *PC, data_structures_groups::group_container &G, ring_theory::longinteger_object &go_G, int verbose_level)
void store_set_to(poset_classification *gen, int i, long int *to)
a poset with a group action on it
void init_subspace_lattice(actions::action *A, actions::action *A2, groups::strong_generators *Strong_gens, algebra::vector_space *VS, int verbose_level)
void add_testing_without_group(void(*func)(long int *S, int len, long int *candidates, int nb_candidates, long int *good_candidates, int &nb_good_candidates, void *data, int verbose_level), void *data, int verbose_level)
the polar space arising from an orthogonal geometry
field_theory::finite_field * F
poset_classification::poset_classification_control * Control
groups::strong_generators * Strong_gens
void init_group(int *group_generator_data, int group_generator_size, int f_group_order_target, const char *group_order_target, int verbose_level)
void init(actions::action *A, orthogonal_geometry::orthogonal *O, int epsilon, int n, int k, field_theory::finite_field *F, int depth, int verbose_level)
void unrank_point(int *v, int rk)
poset_classification::poset_with_group_action * Poset
int f_has_strong_generators_allocated
orthogonal_geometry::orthogonal * O
void compute_cosets(int depth, int orbit_idx, int verbose_level)
void dual_polar_graph(int depth, int orbit_idx, ring_theory::longinteger_object *&Rank_table, int &nb_maximals, int verbose_level)
void init2(int depth, int verbose_level)
int get_orbit_length_as_int(int orbit_idx)
int f_use_invariant_subset_if_available
algebra::vector_space * VS
void init_group_by_base_images(int *group_generator_data, int group_generator_size, int f_group_order_target, const char *group_order_target, int verbose_level)
void list_whole_orbit(int depth, int orbit_idx, int f_limit, int limit)
void orbit_element_rank(int &orbit_idx, long int &rank, long int *set, int verbose_level)
int f_has_strong_generators
void get_orbit_length(int orbit_idx, ring_theory::longinteger_object &length)
void show_stabilizer(int depth, int orbit_idx, int verbose_level)
groups::matrix_group * Mtx
poset_classification::poset_classification * Gen
void get_stabilizer(int orbit_idx, data_structures_groups::group_container &G, ring_theory::longinteger_object &go_G)
void compute_orbits(int t0, int verbose_level)
void test_if_closed_under_cosets(int *S, int len, int *candidates, int nb_candidates, int *good_candidates, int &nb_good_candidates, int verbose_level)
void orbit_element_unrank(int orbit_idx, long int rank, long int *set, int verbose_level)
void test_if_in_perp(long int *S, int len, long int *candidates, int nb_candidates, long int *good_candidates, int &nb_good_candidates, int verbose_level)
#define Lint_vec_print(A, B, C)
#define Int_vec_print_integer_matrix_width(A, B, C, D, E, F)
#define NEW_OBJECTS(type, n)
#define Int_vec_print(A, B, C)
orbiter_kernel_system::orbiter_session * Orbiter
global Orbiter session
the orbiter library for the classification of combinatorial objects