17namespace layer5_applications {
18namespace applications_in_algebraic_geometry {
19namespace cubic_surfaces_and_arcs {
23static void classify_trihedral_pairs_early_test_function_type1(
long int *S,
int len,
24 long int *candidates,
int nb_candidates,
25 long int *good_candidates,
int &nb_good_candidates,
26 void *data,
int verbose_level);
27static void classify_trihedral_pairs_early_test_function_type2(
long int *S,
int len,
28 long int *candidates,
int nb_candidates,
29 long int *good_candidates,
int &nb_good_candidates,
30 void *data,
int verbose_level);
94 int f_v = (verbose_level >= 1);
97 cout <<
"classify_trihedral_pairs::init" << endl;
107 cout <<
"classify_trihedral_pairs::init computing stabilizer "
108 "of three collinear points" << endl;
116 cout <<
"classify_trihedral_pairs::init computing stabilizer "
117 "of a triangle of points" << endl;
131 cout <<
"The group 1 has order " ;
133 cout <<
"\\\\" << endl;
134 cout <<
"generators:" << endl;
137 cout <<
"The group 2 has order " ;
139 cout <<
"\\\\" << endl;
140 cout <<
"generators:" << endl;
148 cout <<
"classify_trihedral_pairs::init done" << endl;
159 int f_v = (verbose_level >= 1);
162 cout <<
"classify_trihedral_pairs::classify_orbits_on_trihedra" << endl;
166 cout <<
"classify_trihedral_pairs::classify_orbits_on_trihedra "
167 "computing orbits on 3-subsets of points (type 1):" << endl;
175 classify_trihedral_pairs_early_test_function_type1,
189 cout <<
"classify_trihedral_pairs::classify_orbits_on_trihedra "
190 "computing orbits on 3-subsets of points (type 1) done. "
193 <<
" orbits on 3-subsets" << endl;
197 cout <<
"classify_trihedral_pairs::classify_orbits_on_trihedra "
198 "computing orbits on 3-subsets of points (type 2):" << endl;
206 classify_trihedral_pairs_early_test_function_type2,
219 cout <<
"classify_trihedral_pairs::classify_orbits_on_trihedra "
220 "computing orbits on 3-subsets of points (type 2) done. "
223 <<
" orbits on 3-subsets" << endl;
227 cout <<
"classify_trihedral_pairs::classify_orbits_on_trihedra done" << endl;
233 cout <<
"classify_trihedral_pairs::report "
234 "before list_orbits_on_trihedra_type1" << endl;
237 cout <<
"classify_trihedral_pairs::report "
238 "before list_orbits_on_trihedra_type2" << endl;
241 cout <<
"classify_trihedral_pairs::report "
242 "before print_trihedral_pairs no stabs" << endl;
244 ost <<
"\\subsection*{Classification of Double Triplets in $\\PG(3," <<
q <<
")$}" << endl;
249 cout <<
"classify_trihedral_pairs::report "
250 "before print_trihedral_pairs with stabs" << endl;
259 cout <<
"classify_trihedral_pairs::report "
260 "before list_orbits_on_trihedra_type1" << endl;
263 cout <<
"classify_trihedral_pairs::report "
264 "before list_orbits_on_trihedra_type2" << endl;
267 cout <<
"classify_trihedral_pairs::report "
268 "before print_trihedral_pairs no stabs" << endl;
273 cout <<
"classify_trihedral_pairs::report "
274 "before print_trihedral_pairs with stabs" << endl;
287 ost <<
"\\subsection*{Classification of Double Triplets of "
288 "type 1 in $\\PG(3," <<
q <<
")$}" << endl;
296 ost <<
"The order of the group of type 1 is ";
298 ost <<
"\\\\" << endl;
300 ost <<
"\\bigskip" << endl;
307 Ol.
create(0, __FILE__, __LINE__);
309 ost <<
"The group of type 1 has "
311 <<
" orbits on double triplets of type 1 in "
312 "$\\PG(3," <<
q <<
").$" << endl << endl;
315 for (i = 0; i < l; i++) {
328 ost <<
"$" << i <<
" / " << l <<
"$ $" << endl;
330 ost <<
"$ orbit length $";
332 ost <<
"$\\\\" << endl;
337 ost <<
"The overall number of double triplets of type 1 "
338 "in $\\PG(3," <<
q <<
")$ is: " << Ol <<
"\\\\" << endl;
349 ost <<
"\\subsection*{Classification of Double Triplets of "
350 "type 2 in $\\PG(3," <<
q <<
")$}" << endl;
358 ost <<
"The order of the group of type 2 is ";
360 ost <<
"\\\\" << endl;
362 ost <<
"\\bigskip" << endl;
369 Ol.
create(0, __FILE__, __LINE__);
371 ost <<
"The group of type 2 has "
373 <<
" orbits on double triplets of type 2 "
374 "in $\\PG(3," <<
q <<
").$" << endl << endl;
378 for (i = 0; i < l; i++) {
391 ost <<
"$" << i <<
" / " << l <<
"$ $" << endl;
393 ost <<
"$ orbit length $";
395 ost <<
"$\\\\" << endl;
400 ost <<
"The overall number of double triplets of type 2 "
401 "in $\\PG(3," <<
q <<
")$ is: " << Ol <<
"\\\\" << endl;
406 long int *S,
int len,
407 long int *candidates,
int nb_candidates,
408 long int *good_candidates,
int &nb_good_candidates,
411 int f_v = (verbose_level >= 1);
412 int f_vv = (verbose_level >= 2);
420 cout <<
"classify_trihedral_pairs::early_test_func_type1 "
424 cout <<
"candidate set of size " << nb_candidates <<
":" << endl;
429 cout <<
"classify_trihedral_pairs::early_test_func_type1 "
435 rk0 =
Surf->
P->line_of_intersection_of_two_planes_in_three_
436 space_using_dual_coordinates(0, 1, 0 );
438 cout <<
"surface_with_action::early_test_func_type1 "
439 "rk0 = " << rk0 << endl;
443 for (i = 0; i < len; i++) {
449 cout <<
"classify_trihedral_pairs::early_test_func_type1 Lines=" << endl;
453 nb_good_candidates = 0;
454 for (i = 0; i < nb_candidates; i++) {
457 if (a == 0 || a == 1 || a == 5) {
462 cout <<
"classify_trihedral_pairs::early_test_func_type1 "
463 "testing a=" << a << endl;
466 for (j = 0; j < len; j++) {
483 cout <<
"intersects 0 in the bad line" << endl;
488 Lines2[len * 3 + 0] = rk;
494 cout <<
"intersects 1 in the bad line" << endl;
499 Lines2[len * 3 + 1] = rk;
505 cout <<
"intersects 5 in the bad line" << endl;
510 Lines2[len * 3 + 2] = rk;
513 cout <<
"classify_trihedral_pairs::early_test_func_type1 "
521 for (j = 1; j < (len + 1) * 3; j++) {
522 if (Lines2[j] == Lines2[j - 1]) {
524 cout <<
"classify_trihedral_pairs::early_test_func_type1 "
525 "repeated line" << endl;
530 if (j < (len + 1) * 3) {
542 if (int_vec_search(Lines2, (len + 1) * 3, rk, idx)) {
548 if (int_vec_search(Lines2, (len + 1) * 3, rk, idx)) {
552 if (int_vec_search(Lines2, (len + 1) * 3, rk, idx)) {
556 if (int_vec_search(Lines2, (len + 1) * 3, rk, idx)) {
562 good_candidates[nb_good_candidates++] = candidates[i];
565 cout <<
"classify_trihedral_pairs::early_test_func_type1 "
569 cout <<
"good_candidates set of size "
570 << nb_good_candidates <<
":" << endl;
578 long int *candidates,
int nb_candidates,
579 long int *good_candidates,
int &nb_good_candidates,
582 int f_v = (verbose_level >= 1);
583 int f_vv = (verbose_level >= 2);
595 cout <<
"classify_trihedral_pairs::early_test_func_type2 "
599 cout <<
"candidate set of size " << nb_candidates <<
":" << endl;
604 cout <<
"classify_trihedral_pairs::early_test_func_type2 "
609 for (i = 0; i < len; i++) {
615 cout <<
"classify_trihedral_pairs::early_test_func_type2 "
625 nb_good_candidates = 0;
626 for (i = 0; i < nb_candidates; i++) {
629 if (a == 0 || a == 1 || a == 2) {
635 cout <<
"classify_trihedral_pairs::early_test_func_type2 "
636 "testing a=" << a << endl;
639 for (j = 0; j < len; j++) {
651 Lines2[len * 3 + 0] = rk;
653 Lines2[len * 3 + 1] = rk;
655 Lines2[len * 3 + 2] = rk;
658 cout <<
"classify_trihedral_pairs::early_test_func_type1 "
666 for (j = 1; j < (len + 1) * 3; j++) {
667 if (Lines2[j] == Lines2[j - 1]) {
669 cout <<
"classify_trihedral_pairs::early_test_func_type2 "
670 "repeated line" << endl;
675 if (j < (len + 1) * 3) {
681 int_vec_copy(M1, M2, 8);
683 rk =
F->rank_of_rectangular_matrix_memory_given(M2, 3, 4,
692 good_candidates[nb_good_candidates++] = candidates[i];
698 int p1,
int p2,
int p3,
699 int &type,
int *transporter,
int verbose_level)
701 int f_v = (verbose_level >= 1);
709 int c1, c2, c3, c4, a, b, c, d, e, f, lambda, mu, det, det_inv;
713 cout <<
"classify_trihedral_pairs::identify_three_planes" << endl;
721 Combi.
set_complement(base_cols, rk, base_cols + rk, size_complement, 4);
723 cout <<
"classify_trihedral_pairs::identify_three_planes "
730 c4 = base_cols[rk + 1];
763 M2[3 * 4 + base_cols[3]] = 1;
767 cout <<
"classify_trihedral_pairs::identify_three_planes "
768 "the rank is not 2 or 3" << endl;
772 cout <<
"classify_trihedral_pairs::identify_three_planes "
781 cout <<
"classify_trihedral_pairs::identify_three_planes "
792 int f_v = (verbose_level >= 1);
795 cout <<
"classify_trihedral_pairs::classify" << endl;
799 cout <<
"classify_trihedral_pairs::classify "
800 "before classify_orbits_on_trihedra" << endl;
804 cout <<
"classify_trihedral_pairs::classify "
805 "before after classify_orbits_on_trihedra" << endl;
814 cout <<
"nb_orbits_ordered_total = "
820 cout <<
"classify_trihedral_pairs::classify "
821 "before downstep" << endl;
825 cout <<
"classify_trihedral_pairs::classify "
826 "after downstep" << endl;
832 cout <<
"classify_trihedral_pairs::classify "
833 "before upstep" << endl;
835 upstep(verbose_level - 2);
837 cout <<
"classify_trihedral_pairs::classify "
838 "after upstep" << endl;
842 cout <<
"classify_trihedral_pairs::classify "
844 <<
" orbits of trihedral pairs" << endl;
849 cout <<
"classify_trihedral_pairs::classify done" << endl;
855 int f_v = (verbose_level >= 1);
859 cout <<
"classify_trihedral_pairs::downstep" << endl;
872 cout <<
"classify_trihedral_pairs::downstep "
873 "initializing flag orbits type 1" << endl;
904 cout <<
"flag orbit " << i <<
" / "
907 <<
" stab order " << go << endl;
911 cout <<
"classify_trihedral_pairs::downstep "
912 "initializing flag orbits type 2" << endl;
943 <<
" is type 2 orbit " << i <<
" / "
948 cout <<
"classify_trihedral_pairs::downstep "
949 "initializing flag orbits done" << endl;
954 cout <<
"classify_trihedral_pairs::downstep done" << endl;
960 int f_v = (verbose_level >= 1);
963 cout <<
"classify_trihedral_pairs::upstep" << endl;
967 int nb_processed, po, so, type, orb, f, f2;
968 long int Planes[] = {0,1,5, 0,1,2};
991 6, go, verbose_level);
998 if (f_processed[f]) {
1002 progress = ((double)nb_processed * 100. ) /
1006 cout <<
"Defining n e w orbit "
1008 <<
" from flag orbit " << f <<
" / "
1010 <<
" progress=" << progress <<
"%" << endl;
1021 cout <<
"classify_trihedral_pairs::upstep initializing planes: ";
1029 cout <<
"We found a transporter:" << endl;
1042 else if (type == 2) {
1049 cout <<
"type must be either 1 or 2." << endl;
1060 if (type - 1 == po && orb == so) {
1062 cout <<
"We found an automorphism "
1063 "of the trihedral pair:" << endl;
1069 2 , verbose_level - 2);
1073 cout <<
"We are identifying with po="
1074 << type - 1 <<
" so=" << orb << endl;
1083 cout <<
"We are identifying with po=" << type - 1
1084 <<
" so=" << orb <<
", which is "
1085 "flag orbit " << f2 << endl;
1093 f_processed[f2] =
TRUE;
1098 cout <<
"the trihedral pair has a stabilizer of order "
1109 S, Rep, NULL , verbose_level);
1112 f_processed[f] =
TRUE;
1117 cout <<
"nb_processed != nb_orbits_ordered_total" << endl;
1118 cout <<
"nb_processed = " << nb_processed << endl;
1119 cout <<
"nb_orbits_ordered_total = "
1128 <<
" orbits of trihedral pairs" << endl;
1137 cout <<
"classify_trihedral_pairs::upstep done" << endl;
1147 int f_with_stabilizers)
1151 title.assign(
"Classification of Double Triplets");
1153 title, f_with_stabilizers,
1159 long int *planes6,
int *transporter,
int &orbit_index,
1162 int f_v = (verbose_level >= 1);
1166 cout <<
"classify_trihedral_pairs::identify_trihedral_pair_and_get_stabilizer" << endl;
1170 cout <<
"planes6: ";
1177 cout <<
"classify_trihedral_pairs::identify_trihedral_pair_"
1178 "and_get_stabilizer before identify_trihedral_pair" << endl;
1181 transporter, orbit_index, verbose_level);
1183 cout <<
"classify_trihedral_pairs::identify_trihedral_pair_"
1184 "and_get_stabilizer after identify_trihedral_pair" << endl;
1187 cout <<
"orbit_index=" << orbit_index << endl;
1195 cout <<
"classify_trihedral_pairs::identify_trihedral_pair_"
1196 "and_get_stabilizer before gens->init_generators_for_"
1197 "the_conjugate_group_aGav" << endl;
1201 transporter, verbose_level);
1203 cout <<
"classify_trihedral_pairs::identify_trihedral_pair_"
1204 "and_get_stabilizer after gens->init_generators_for_"
1205 "the_conjugate_group_aGav" << endl;
1210 cout <<
"classify_trihedral_pairs::identify_trihedral_pair_and_get_stabilizer done" << endl;
1219 int *transporter,
int &orbit_index,
int verbose_level)
1221 int f_v = (verbose_level >= 1);
1222 int f_vv = (verbose_level >= 2);
1223 int type, orb, f, f2;
1228 long int planes1[3];
1229 long int planes2[3];
1232 cout <<
"classify_trihedral_pairs::identify_trihedral_pair" << endl;
1240 cout <<
"classify_trihedral_pairs::identify_trihedral_pair "
1241 "identifying the first trihedron" << endl;
1247 cout <<
"Elt1=" << endl;
1252 planes6 + 3, planes1, 3, Elt1,
1260 else if (type == 2) {
1267 cout <<
"classify_trihedral_pairs::identify_trihedral_pair "
1268 "type must be either 1 or 2." << endl;
1291 cout <<
"classify_trihedral_pairs::identify_trihedral_pair "
1292 "type=" << type <<
" orb=" << orb <<
" f=" << f
1293 <<
" f2=" << f2 <<
" orbit_index=" << orbit_index << endl;
1297 cout <<
"transporter=" << endl;
1306 cout <<
"classify_trihedral_pairs::identify_trihedral_pair "
1315static void classify_trihedral_pairs_early_test_function_type1(
long int *S,
int len,
1316 long int *candidates,
int nb_candidates,
1317 long int *good_candidates,
int &nb_good_candidates,
1318 void *data,
int verbose_level)
1321 int f_v = (verbose_level >= 1);
1324 cout <<
"classify_trihedral_pairs_early_test_function_type1 "
1330 candidates, nb_candidates,
1331 good_candidates, nb_good_candidates,
1334 cout <<
"classify_trihedral_pairs_early_test_function_type1 "
1339static void classify_trihedral_pairs_early_test_function_type2(
long int *S,
int len,
1340 long int *candidates,
int nb_candidates,
1341 long int *good_candidates,
int &nb_good_candidates,
1342 void *data,
int verbose_level)
1344 classify_trihedral_pairs *CT = (classify_trihedral_pairs *) data;
1345 int f_v = (verbose_level >= 1);
1348 cout <<
"classify_trihedral_pairs_early_test_function_type2 "
1353 CT->early_test_func_type2(S, len,
1354 candidates, nb_candidates,
1355 good_candidates, nb_good_candidates,
1358 cout <<
"classify_trihedral_pairs_early_test_function_type2 "
geometry::projective_space * P
a collection of combinatorial functions
void set_complement(int *subset, int subset_size, int *complement, int &size_complement, int universal_set_size)
a collection of functions related to sorted vectors
void lint_vec_heapsort(long int *v, int len)
linear_algebra::linear_algebra * Linear_algebra
long int line_of_intersection_of_two_planes_in_three_space_using_dual_coordinates(long int plane1, long int plane2, int verbose_level)
void unrank_point(int *v, long int rk)
int rank_of_rectangular_matrix_memory_given(int *A, int m, int n, int *B, int *base_cols, int verbose_level)
void scalar_multiply_vector_in_place(int c, int *A, int m)
void matrix_inverse(int *A, int *Ainv, int n, int verbose_level)
domain to compute with objects of type longinteger
void add_in_place(longinteger_object &a, longinteger_object &b)
a class to represent arbitrary precision integers
std::ostream & print_not_scientific(std::ostream &ost)
void create(long int i, const char *file, int line)
void element_print_quick(void *elt, std::ostream &ost)
void element_mult(void *a, void *b, void *ab, int verbose_level)
void element_invert(void *a, void *av, int verbose_level)
void make_element(int *Elt, int *data, int verbose_level)
void element_move(void *a, void *b, int verbose_level)
void group_order(ring_theory::longinteger_object &go)
void map_a_set_and_reorder(long int *set, long int *image_set, int n, int *Elt, int verbose_level)
a set and its known set stabilizer
groups::strong_generators * Strong_gens
void print_set_tex(std::ostream &ost)
a strong generating set for a permutation group with respect to a fixed action
void add_single_generator(int *Elt, int group_index, int verbose_level)
strong_generators * create_copy()
void generators_for_stabilizer_of_three_collinear_points_in_PGL4(actions::action *A_PGL_4_q, matrix_group *Mtx, int verbose_level)
void print_generators_tex()
void init_generators_for_the_conjugate_group_aGav(strong_generators *SG, int *Elt_a, int verbose_level)
void generators_for_stabilizer_of_triangle_in_PGL4(actions::action *A_PGL_4_q, matrix_group *Mtx, int verbose_level)
void group_order(ring_theory::longinteger_object &go)
a single step classification of combinatorial objects
void print_latex(std::ostream &ost, std::string &title, int f_print_stabilizer_gens, int f_has_print_function, void(*print_function)(std::ostream &ost, int i, classification_step *Step, void *print_function_data), void *print_function_data)
void print_summary(std::ostream &ost)
void init(actions::action *A, actions::action *A2, int max_orbits, int representation_sz, ring_theory::longinteger_object &go, int verbose_level)
void init(flag_orbits *Flag_orbits, int flag_orbit_index, int downstep_primary_orbit, int downstep_secondary_orbit, int downstep_orbit_len, int f_long_orbit, long int *pt_representation, groups::strong_generators *Strong_gens, int verbose_level)
int downstep_primary_orbit
groups::strong_generators * gens
int downstep_secondary_orbit
stores the set of flag orbits; related to the class classification_step
void init(actions::action *A, actions::action *A2, int nb_primary_orbits_lower, int pt_representation_sz, int nb_flag_orbits, int upper_bound_for_number_of_traces, void(*func_to_free_received_trace)(void *trace_result, void *data, int verbose_level), void(*func_latex_report_trace)(std::ostream &ost, void *trace_result, void *data, int verbose_level), void *free_received_trace_data, int verbose_level)
flag_orbit_node * Flag_orbit_node
int nb_primary_orbits_upper
groups::strong_generators * gens
void init(classification_step *C, int orbit_index, groups::strong_generators *gens, long int *Rep, void *extra_data, int verbose_level)
to control the behavior of the poset classification algorithm
the poset classification algorithm
int trace_set(long int *set, int size, int level, long int *canonical_set, int *Elt_transporter, int verbose_level)
data_structures_groups::set_and_stabilizer * get_set_and_stabilizer(int level, int orbit_at_level, int verbose_level)
void orbit_length(int orbit_at_level, int level, ring_theory::longinteger_object &len)
int nb_orbits_at_level(int level)
void compute_orbits_on_subsets(int target_depth, poset_classification_control *PC_control, poset_with_group_action *Poset, int verbose_level)
a poset with a group action on it
void init_subset_lattice(actions::action *A, actions::action *A2, groups::strong_generators *Strong_gens, 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)
classification of double triplets in PG(3,q)
~classify_trihedral_pairs()
algebraic_geometry::surface_domain * Surf
void downstep(int verbose_level)
void identify_three_planes(int p1, int p2, int p3, int &type, int *transporter, int verbose_level)
classify_trihedral_pairs()
groups::strong_generators * gens_type1
void upstep(int verbose_level)
field_theory::finite_field * F
poset_classification::poset_classification * orbits_on_trihedra_type1
poset_classification::poset_with_group_action * Poset1
void list_orbits_on_trihedra_type1(std::ostream &ost, int f_detailed)
void report(std::ostream &ost)
void early_test_func_type2(long int *S, int len, long int *candidates, int nb_candidates, long int *good_candidates, int &nb_good_candidates, int verbose_level)
void classify_orbits_on_trihedra(poset_classification::poset_classification_control *Control1, poset_classification::poset_classification_control *Control2, int verbose_level)
void print_trihedral_pairs_summary(std::ostream &ost)
void init(cubic_surfaces_in_general::surface_with_action *Surf_A, int verbose_level)
cubic_surfaces_in_general::surface_with_action * Surf_A
void list_orbits_on_trihedra_type2(std::ostream &ost, int f_detailed)
void early_test_func_type1(long int *S, int len, long int *candidates, int nb_candidates, long int *good_candidates, int &nb_good_candidates, int verbose_level)
int nb_orbits_trihedral_pairs
void report_summary(std::ostream &ost)
invariant_relations::classification_step * Trihedral_pairs
groups::strong_generators * gens_type2
poset_classification::poset_classification * orbits_on_trihedra_type2
groups::strong_generators * identify_trihedral_pair_and_get_stabilizer(long int *planes6, int *transporter, int &orbit_index, int verbose_level)
invariant_relations::flag_orbits * Flag_orbits
void print_trihedral_pairs(std::ostream &ost, int f_with_stabilizers)
void classify(poset_classification::poset_classification_control *Control1, poset_classification::poset_classification_control *Control2, int verbose_level)
void identify_trihedral_pair(long int *planes6, int *transporter, int &orbit_index, int verbose_level)
poset_classification::poset_with_group_action * Poset2
int nb_orbits_ordered_total
cubic surfaces in projective space with automorphism group
projective_geometry::projective_space_with_action * PA
algebraic_geometry::surface_domain * Surf
field_theory::finite_field * F
#define Lint_vec_copy(A, B, C)
#define Lint_matrix_print(A, B, C)
#define Int_vec_zero(A, B)
#define Lint_vec_print(A, B, C)
#define Int_matrix_print(A, B, C)
#define Int_vec_copy(A, B, C)
the orbiter library for the classification of combinatorial objects
groups::matrix_group * matrix_grp