19namespace layer5_applications {
20namespace applications_in_algebraic_geometry {
21namespace cubic_surfaces_in_general {
27 long int *Pts,
int nb_pts,
31static void matrix_entry_print(
long int *p,
32 int m,
int n,
int i,
int j,
int val,
33 std::string &output,
void *data);
39 int f_v = (verbose_level >= 1);
42 cout <<
"surface_study::init" << endl;
45 cout <<
"q=" <<
q << endl;
46 cout <<
"nb=" <<
nb << endl;
57 sprintf(str_q,
"%d",
q);
58 sprintf(str_nb,
"%d",
nb);
60 prefix.assign(
"surface_q");
71 cout <<
"surface_study::init initializing surface" << endl;
75 cout <<
"surface_study::init initializing surface done" << endl;
79 cout <<
"surface_study::init nb_lines_PG_3 = " <<
nb_lines_PG_3 << endl;
90 cout <<
"creating linear group" << endl;
106 cout <<
"creating linear group done" << endl;
108 cout <<
"creating action on lines" << endl;
110 cout <<
"creating action on lines done" << endl;
124 cout <<
"The lines are: ";
129 cout <<
"q=" <<
q <<
" nb=" <<
nb;
135 cout <<
"stab_gens for a group of order " <<
stab_order <<
":" << endl;
136 for (i = 0; i <
nb_gens; i++) {
157 cout <<
"q=11:" << endl;
161 int data1[] = {3,6,7,4,9,7,4,7,8,2,4,8,7,5,4,6};
162 int data2[] = {5,0,0,0,10,10,10,0,0,10,0,0,2,4,3,4};
163 int data3[] = { 3, 0, 0, 0, 0, 9, 0, 0, 0, 0, 3, 0, 0, 0, 0, 7};
164 int data4[] = { 7, 0, 0, 0, 0, 7, 0, 0, 0, 0, 7, 0, 3, 7, 2, 3};
167 cout <<
"applying first transformation:" << endl;
170 cout <<
"applying second transformation:" << endl;
173 cout <<
"applying third transformation:" << endl;
176 cout <<
"applying fourth transformation:" << endl;
185 if (
q == 13 &&
nb == 0) {
187 cout <<
"q=13, nb=0:" << endl;
190 int data1[] = { 6,4,2,10,1,7,9,6,8,6,9,10,8,1,8,6};
191 int data2[] = { 1,0,0,0,0,1,0,0,0,0,4,0,2,6,7,3};
192 int data3[] = { 12,0,0,0,0,12,0,0,0,0,12,0,5,0,10,8};
195 cout <<
"applying first transformation:" << endl;
198 cout <<
"applying second transformation:" << endl;
201 cout <<
"applying third transformation:" << endl;
206 if (
q == 13 &&
nb == 1) {
208 cout <<
"q=13, nb=1:" << endl;
211 int data1[] = {2, 9, 3, 7, 10, 8, 12, 4, 10, 1, 11, 10, 3, 10, 12, 5 };
212 int data2[] = {6, 0, 0, 0, 0, 6, 0, 0, 8, 8, 8, 0, 9, 6, 8, 8};
213 int data3[] = { 6, 0, 0, 0, 0, 3, 0, 0, 0, 0, 12, 0, 0, 0, 0, 11};
214 int data4[] = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 0, 11, 12, 9, 6};
217 cout <<
"applying first transformation:" << endl;
220 cout <<
"applying second transformation:" << endl;
223 cout <<
"applying third transformation:" << endl;
226 cout <<
"applying fourth transformation:" << endl;
234 if (
q == 17 &&
nb == 0) {
236 cout <<
"q=17, nb=0:" << endl;
239 int data1[] = {9, 3, 13, 5, 11, 1, 1, 0, 11, 1, 6, 15, 16, 14, 5, 4};
240 int data2[] = {16, 0, 0, 0, 0, 15, 0, 0, 14, 14, 14, 0, 8, 7, 9, 8};
241 int data3[] = { 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 8, 0, 0, 4, 0, 1};
242 int data4[] = { 0, 6, 0, 0, 6, 0, 0, 0, 0, 0, 11, 0, 1, 4, 0, 6};
245 cout <<
"applying first transformation:" << endl;
248 cout <<
"applying second transformation:" << endl;
251 cout <<
"applying third transformation:" << endl;
254 cout <<
"applying fourth transformation:" << endl;
260 if (
q == 17 &&
nb == 2) {
262 cout <<
"q=17, nb=2:" << endl;
265 int data1[] = {14, 11, 14, 15, 7, 12, 8, 14, 9, 1, 11, 16, 13, 13, 1, 6};
266 int data2[] = {16, 0, 0, 0, 0, 15, 0, 0, 14, 14, 14, 0, 8, 7, 9, 8 };
267 int data3[] = { 6, 0, 0, 0, 0, 15, 0, 0, 0, 0, 7, 0, 0, 0, 0, 8};
268 int data4[] = { 16, 0, 0, 0, 0, 1, 0, 0, 0, 0, 16, 0, 12, 6, 14, 15};
271 cout <<
"applying first transformation:" << endl;
274 cout <<
"applying second transformation:" << endl;
277 cout <<
"applying third transformation:" << endl;
280 cout <<
"applying fourth transformation:" << endl;
286 if (
q == 17 &&
nb == 6) {
288 cout <<
"q=17, nb=6:" << endl;
290 int data1[] = {16, 10, 13, 9, 4, 13, 2, 1, 2, 3, 12, 7, 4, 6, 3, 9};
291 int data2[] = {16, 0, 0, 0, 0, 15, 0, 0, 14, 14, 14, 0, 8, 7, 9, 8};
292 int data3[] = { 7, 0, 0, 0, 0, 6, 0, 0, 0, 0, 7, 0, 0, 0, 0, 9};
293 int data4[] = { 0, 0, 16, 0, 16, 0, 0, 0, 0, 1, 0, 0, 7, 8, 1, 14};
295 cout <<
"applying first transformation:" << endl;
298 cout <<
"applying second transformation:" << endl;
301 cout <<
"applying third transformation:" << endl;
305 cout <<
"applying fourth transformation:" << endl;
320 cout <<
"coefficient vector of the surface: ";
323 cout <<
"equation: ";
336 int f_v = (verbose_level >= 1);
340 cout <<
"surface_study::study_intersection_points" << endl;
354 for (i = 0; i < 27; i++) {
360 cout <<
"The adjacency matrix is:" << endl;
367 cout <<
"The intersection points are:" << endl;
371 string fname_intersection_pts;
372 string fname_intersection_pts_tex;
374 fname_intersection_pts.assign(
prefix);
375 fname_intersection_pts.append(
"_intersection_points0.csv");
377 fname_intersection_pts_tex.assign(
prefix);
378 fname_intersection_pts_tex.append(
"_intersection_points0.tex");
383 cout <<
"Written file " << fname_intersection_pts
384 <<
" of size " << Fio.
file_size(fname_intersection_pts) << endl;
387 ofstream fp(fname_intersection_pts_tex);
392 fp <<
"{\\tiny \\arraycolsep=1pt" << endl;
396 line_labels, line_labels,
399 matrix_entry_print, (
void *)
Surf,
404 cout <<
"Written file " << fname_intersection_pts_tex
405 <<
" of size " << Fio.
file_size(fname_intersection_pts_tex) << endl;
411 cout <<
"surface_study::study_intersection_points done" << endl;
428 for (i = 0; i < nb_pts; i++) {
430 b = Klein->Line_to_point_on_quadric[a];
441 int f_v = (verbose_level >= 1);
444 cout <<
"surface_study::study_line_orbits" << endl;
448 cout <<
"rearranging by orbits:" << endl;
453 cout <<
"after rearranging, the set is:" << endl;
457 cout <<
"orbit_length: ";
464 cout <<
"surface_study::study_line_orbits" << endl;
472 int f_v = (verbose_level >= 1);
476 cout <<
"surface_study::study_group" << endl;
478 cout <<
"The elements are :" << endl;
488 Group_elts, group_order, elt_sz,
492 cout <<
"Group_elts:" << endl;
494 for (i = 0; i < group_order; i++) {
497 cout <<
"group elements:" << endl;
498 for (i = 0; i < group_order; i++) {
500 Group_elts + i * elt_sz);
503 cout <<
"Group_elts normalized from the back:" << endl;
504 for (i = 0; i < group_order; i++) {
506 cout <<
"element " << i <<
" / " << group_order <<
":" << endl;
512 if (group_order < 1000) {
516 cout <<
"creating the group table:..." << endl;
525 sprintf(str,
"_table_%d_%d.csv",
q,
nb);
526 fname_out.append(str);
529 cout <<
"Written file " << fname_out
530 <<
" of size " << Fio.
file_size(fname_out) << endl;
535 cout <<
"We won't create the group table because "
536 "the group order is too big" << endl;
543 cout <<
"surface_study::study_group done" << endl;
555 strong_generators *Strong_gens;
557 cout <<
"creating linear group A3" << endl;
558 create_linear_group(PGL3, A3,
563 cout <<
"creating linear group A3 done" << endl;
566 gens->allocate(group_order);
567 for (h = 0; h < group_order; h++) {
568 for (i = 0; i < 3; i++) {
569 for (j = 0; j < 3; j++) {
570 a = Group_elts[h * elt_sz + i * 4 + j];
574 A3->make_element(gens->ith(h), Mtx3, 0 );
576 generators_to_strong_generators(A3,
580 cout <<
"Strong generators:" << endl;
581 Strong_gens->print_generators();
584 S3 = Strong_gens->create_sims(verbose_level);
585 S3->print_all_group_elements();
587 S3->table_of_group_elements_in_data_form(
588 Group_elts, group_order, elt_sz, verbose_level);
589 cout <<
"Group_elts:" << endl;
590 int_matrix_print(Group_elts, group_order, elt_sz);
591 for (i = 0; i < group_order; i++) {
592 PG_element_normalize(*F, Group_elts + i * elt_sz, 1, elt_sz);
594 cout <<
"Group_elts normalized from the back:" << endl;
595 int_matrix_print(Group_elts, group_order, elt_sz);
601 S3->create_group_table(Table, n, 0 );
602 cout <<
"The group table is:" << endl;
603 int_matrix_print(Table, n, n);
604 int_matrix_print_tex(cout, Table, n, n);
616 int f_v = (verbose_level >= 1);
619 cout <<
"surface_study::study_orbits_on_lines" << endl;
623 cout <<
"creating restricted action on the set of lines" << endl;
626 cout <<
"creating restricted action on the set of lines done" << endl;
629 cout <<
"computing orbits on lines:" << endl;
633 cout <<
"orbits on lines:" << endl;
636 int f, l, b, ii, i, a;
642 cout <<
"The unique shortest orbit has length " << l <<
":" << endl;
643 for (i = 0; i < l; i++) {
646 cout << i <<
" : " << a <<
" : " << b << endl;
655 cout <<
"Orbit " << ii <<
" has length " << l <<
":" << endl;
656 for (i = 0; i < l; i++) {
659 cout << i <<
" : " << a <<
" : " << b << endl;
666 cout <<
"The unique shortest orbit on lines is orbit "
669 cout <<
"surface_study::study_orbits_on_lines" << endl;
675 int f_v = (verbose_level >= 1);
681 cout <<
"surface_study::study_find_eckardt_points" << endl;
688 cout <<
"The adjacency matrix is:" << endl;
697 cout <<
"The tactical decomposition scheme is:" << endl;
704 cout <<
"The intersection points are:" << endl;
708 string fname_intersection_pts;
709 string fname_intersection_pts_tex;
712 fname_intersection_pts.append(
prefix);
713 fname_intersection_pts.append(
"_intersection_points.csv");
715 fname_intersection_pts_tex.append(
prefix);
716 fname_intersection_pts_tex.append(
"_intersection_points.tex");
720 cout <<
"Written file " << fname_intersection_pts
721 <<
" of size " << Fio.
file_size(fname_intersection_pts)
725 ofstream fp(fname_intersection_pts_tex);
730 fp <<
"{\\tiny \\arraycolsep=1pt" << endl;
737 matrix_entry_print, (
void *)
Surf,
742 cout <<
"Written file " << fname_intersection_pts_tex
743 <<
" of size " << Fio.
file_size(fname_intersection_pts_tex)
751 cout <<
"classification of points by multiplicity:" << endl;
765 cout <<
"We found " <<
nb_double_pts <<
" double points" << endl;
781 cout <<
"We found " <<
nb_Eckardt_pts <<
" Eckardt points" << endl;
786 cout <<
"surface_study::study_find_eckardt_points done" << endl;
795 int f_v = (verbose_level >= 1);
798 cout <<
"surface_study::study_surface_with_6_eckardt_points" << endl;
803 cout <<
"nb_Eckardt_pts = 6" << endl;
805 int Basis1[] = {1,0,0,0,0,1,0,0};
806 int Basis2[] = {1,0,0,0,0,0,1,0};
807 int Basis3[] = {0,1,0,0,0,0,1,0};
808 long int desired_lines[3];
814 cout <<
"desired_lines : ";
823 int special_lines[] = {0,1,2,4, 3,5,6,7, 10,11,8,9, 14,16,18,20, 12,13,22,23, 15,17,19,21, 24,25,26};
824 int nb_special_lines = 27;
827 nb_special_lines, 0 );
828 cout <<
"The elements are :" << endl;
837 long int three_points[3] = {0,1,2};
838 cout <<
"creating projective triangle" << endl;
840 triangle, nb_pts_triangle, three_points,
849 cout <<
"After taking away the triangle points, "
850 "we still have " <<
nb_double_pts <<
" double points" << endl;
860 char fname_stab[1000];
863 triangle, nb_pts_triangle, 0 );
866 Triangle->
init_data(triangle, nb_pts_triangle,
869 sprintf(fname_stab,
"PGL_4_%d_Grassmann_4_2_%d_stab_gens_3_2.txt",
q,
q);
872 A, triangle, nb_pts_triangle,
874 cout <<
"The trangle is invariant under the given group" << endl;
878 int Eckardt_pts2[] = {15,24,5,14,25,124};
883 cout <<
"before move_point_set" << endl;
884 move_point_set(A_triangle, Triangle,
888 cout <<
"after move_point_set" << endl;
890 cout <<
"The stabilizer of the Eckardt points is:" << endl;
892 cout <<
"a group of order " << Eckardt_stab->
target_go << endl;
899 set_and_stabilizer_apply(
SaS, Elt,
FALSE, verbose_level);
901 cout <<
"The transporter is:" << endl;
905 cout <<
"the moved set is:" << endl;
909 cout <<
"this is the third transformation, stop" << endl;
915 action *A_triangle_reduced;
916 int *triangle_reduced;
917 int nb_pts_triangle_reduced;
919 triangle_reduced =
NEW_int(nb_pts_triangle);
920 int_vec_copy(triangle, triangle_reduced, nb_pts_triangle);
921 nb_pts_triangle_reduced = nb_pts_triangle;
923 int_vec_take_away(triangle_reduced, nb_pts_triangle_reduced,
926 cout <<
"The triangle without Eckardt points: " << endl;
927 int_vec_print(cout, triangle_reduced, nb_pts_triangle_reduced);
929 cout <<
"nb_pts_triangle_reduced=" << nb_pts_triangle_reduced << endl;
931 cout <<
"setting up A_triangle_reduced" << endl;
933 triangle_reduced, nb_pts_triangle_reduced,
935 cout <<
"setting up A_triangle_reduced done" << endl;
940 nb_pts_triangle_reduced,
943 cout <<
"testing if the reduced set is invariant "
944 "under the stabilizer of the E-pts:" << endl;
946 A, triangle_reduced, nb_pts_triangle_reduced,
949 cout <<
"Yes!" << endl;
954 cout <<
"testing if the double pts are invariant "
955 "under the stabilizer of the E-pts:" << endl;
960 cout <<
"Yes!" << endl;
967 cout <<
"Creating restricted action on Double_pts:" << endl;
974 cout <<
"computing orbits on double points off the triangle:" << endl;
976 A_on_double_pts, verbose_level);
977 cout <<
"orbits on double points off the triangle:" << endl;
984 cout <<
"the shortest orbit on double points "
985 "is not unique" << endl;
991 cout <<
"The unique shortest orbit on double points off "
992 "the triangle has length " << l <<
":" << endl;
993 for (i = 0; i < l; i++) {
994 a = Orb2->
orbit[f + i];
1000 long int *short_orbit;
1001 int short_orbit_len;
1005 short_orbit =
NEW_lint(short_orbit_len);
1006 for (i = 0; i < short_orbit_len; i++) {
1007 a = Orb2->
orbit[f + i];
1018 cout <<
"before OS->init" << endl;
1019 OS->
init(
A,
A, short_orbit, short_orbit_len,
1021 cout <<
"after OS->init" << endl;
1023 long int *six_point_orbit;
1024 int six_point_orbit_length;
1029 six_point_orbit_length, sz, verbose_level);
1031 cout <<
"Creating action on six_point_orbit" << endl;
1033 six_point_orbit_length, sz, six_point_orbit,
1035 cout <<
"Creating action on six_point_orbit done" << endl;
1039 cout <<
"computing orbits on set of six points:" << endl;
1041 A_on_six_point_orbit,
1044 cout <<
"orbits on set of six points:" << endl;
1045 Orb_six_points->
print(cout);
1054 cout <<
"computing Coeff" << endl;
1057 for (j = 0; j < l; j++) {
1058 if ((j % 1000) == 0) {
1059 cout <<
"coset " << j <<
" / " << l <<
":" << endl;
1076 cout <<
"coefficient vector of the surface: ";
1077 int_vec_print(cout,
coeff, 20);
1079 cout <<
"equation: ";
1090 cout <<
"Coeff:" << endl;
1091 for (i = 0; i < l; i++) {
1095 co = Coeff + i * 20;
1096 if ((co[16] == co[17]) && (co[17] == co[18])) {
1097 cout << i <<
" / " << l <<
" : ";
1110 if (
q == 11 &&
nb == 0) {
1114 else if (
q == 13 &&
nb == 1) {
1117 else if (
q == 17 &&
nb == 0) {
1120 else if (
q == 17 &&
nb == 2) {
1123 else if (
q == 17 &&
nb == 6) {
1132 cout <<
"coset " << j <<
" / " << l <<
":" << endl;
1146 cout <<
"coefficient vector of the surface: ";
1149 cout <<
"equation: ";
1159 cout <<
"surface_study::study_surface_with_6_eckardt_points done" << endl;
1166 if (nb_Eckardt_pts == 4) {
1167 cout <<
"nb_Eckardt_pts = 4" << endl;
1170 int Basis1[] = {1,0,0,0,0,0,1,0};
1171 int Basis2[] = {0,1,0,0,0,0,1,0};
1172 int Basis3[] = {0,0,1,0,1,1,0,0};
1173 int desired_lines[3];
1175 desired_lines[0] = Surf->Gr->rank_int_here(Basis1, 0 );
1176 desired_lines[1] = Surf->Gr->rank_int_here(Basis2, 0 );
1177 desired_lines[2] = Surf->Gr->rank_int_here(Basis3, 0 );
1179 cout <<
"desired_lines : ";
1180 int_vec_print(cout, desired_lines, 3);
1184 int *pts_on_three_lines;
1185 int nb_pts_on_three_lines;
1186 int three_lines_idx[3] = {169, 30927, 352};
1189 cout <<
"creating the three lines" << endl;
1191 pts_on_three_lines =
NEW_int(3 * (q + 1));
1192 nb_pts_on_three_lines = 0;
1194 for (i = 0; i < 3; i++) {
1195 for (j = 0; j < q + 1; j++) {
1196 a = three_lines_idx[i];
1197 b = Surf->P->Lines[a * (q + 1) + j];
1198 if (int_vec_search(pts_on_three_lines,
1199 nb_pts_on_three_lines, b, idx)) {
1202 for (c = nb_pts_on_three_lines; c > idx; c--) {
1203 pts_on_three_lines[c] = pts_on_three_lines[c - 1];
1205 pts_on_three_lines[idx] = b;
1206 nb_pts_on_three_lines++;
1212 pts_on_three_lines, nb_pts_on_three_lines,
1213 Eckardt_pts, nb_Eckardt_pts);
1214 cout <<
"After taking away the Eckardt points, we still have "
1215 << nb_pts_on_three_lines
1216 <<
" points on the three lines" << endl;
1217 int_vec_print_as_table(cout,
1218 pts_on_three_lines, nb_pts_on_three_lines, 10);
1223 int_vec_take_away(Double_pts, nb_double_pts,
1224 pts_on_three_lines, nb_pts_on_three_lines);
1227 cout <<
"After taking away the triangle points, "
1228 "we still have " << nb_double_pts
1229 <<
" double points" << endl;
1230 int_vec_print_as_table(cout,
1231 Double_pts, nb_double_pts, 10);
1236 set_and_stabilizer *Three_lines;
1238 action *A_on_pts_on_three_lines;
1240 char fname_stab[1000];
1242 A_on_pts_on_three_lines = A->restricted_action(
1243 pts_on_three_lines, nb_pts_on_three_lines,
1245 Three_lines =
NEW_OBJECT(set_and_stabilizer);
1246 Three_lines->init(A, A, 0 );
1247 Three_lines->init_data(
1248 pts_on_three_lines, nb_pts_on_three_lines,
1251 sprintf(fname_stab,
"PGL_4_%d_stab_gens_4_1.txt", q);
1252 cout <<
"Reading group from file " << fname_stab << endl;
1253 Three_lines->init_stab_from_file(fname_stab, verbose_level);
1254 Three_lines->Strong_gens->test_if_set_is_invariant_under_given_action(
1256 pts_on_three_lines, nb_pts_on_three_lines,
1258 cout <<
"The points on the three lines "
1259 "are invariant under the given group" << endl;
1262 int interesting_points[6] = {17,28,29,172,30,184};
1263 int interesting_pt_idx[6];
1265 for (i = 0; i < 6; i++) {
1266 if (!int_vec_search(
1267 pts_on_three_lines, nb_pts_on_three_lines,
1268 interesting_points[i], idx)) {
1269 cout <<
"could not find interesting point" << endl;
1272 interesting_pt_idx[i] = idx;
1274 cout <<
"interesting_points: ";
1275 int_vec_print(cout, interesting_points, 6);
1277 cout <<
"interesting_pt_idx: ";
1278 int_vec_print(cout, interesting_pt_idx, 6);
1281 set_and_stabilizer *Interesting_pts_stab;
1283 char fname_stabilizer_stage_two[1000];
1284 char fname_stabilizer_stage_three[1000];
1286 sprintf(fname_stabilizer_stage_two,
"%s_stage2_stab.txt", prefix);
1287 sprintf(fname_stabilizer_stage_three,
"%s_stage3_stab.txt", prefix);
1288 Elt =
NEW_int(A->elt_size_in_int);
1292 move_point_set(A_on_pts_on_three_lines, Three_lines,
1293 interesting_points, 6, Elt, Interesting_pts_stab, verbose_level);
1295 cout <<
"Writing generators to file "
1296 << fname_stabilizer_stage_two << endl;
1297 Interesting_pts_stab->Strong_gens->print_generators_in_source_code_to_file(
1298 fname_stabilizer_stage_two);
1299 cout <<
"Written file " << fname_stabilizer_stage_two
1300 <<
" of size " << file_size(fname_stabilizer_stage_two) << endl;
1303 cout <<
"Reading generators from file "
1304 << fname_stabilizer_stage_two << endl;
1305 Interesting_pts_stab =
NEW_OBJECT(set_and_stabilizer);
1306 Interesting_pts_stab->init(A, A, 0 );
1307 Interesting_pts_stab->init_stab_from_file(
1308 fname_stabilizer_stage_two, verbose_level);
1309 cout <<
"Generators are:" << endl;
1310 Interesting_pts_stab->Strong_gens->print_generators_tex();
1317 int stage3_points[3] = {3,185,198};
1321 Orb3 = Interesting_pts_stab->Strong_gens->orbits_on_points_schreier(
1323 cout <<
"orbits in stage3:" << endl;
1324 Orb3->print_and_list_orbits(cout);
1332 orbit_idx = Orb3->orbit_number(stage3_points[0]);
1333 Orb3->get_orbit(orbit_idx, set, sz, 0 );
1335 int_vec_heapsort(set, sz);
1337 cout <<
"We will consider the set of size " << sz <<
":" << endl;
1338 int_vec_print_as_table(cout, set, sz, 25);
1341 action *A_on_stage3_set;
1343 cout <<
"Creating restricted action on Stage 3 set:" << endl;
1344 A_on_stage3_set = A->restricted_action(
1347 set_and_stabilizer *Stage3_set;
1350 Stage3_set->init(A, A, 0 );
1351 Stage3_set->init_data(set, sz, 0 );
1353 cout <<
"Reading group from file "
1354 << fname_stabilizer_stage_two << endl;
1355 Stage3_set->init_stab_from_file(
1356 fname_stabilizer_stage_two, verbose_level);
1357 Stage3_set->Strong_gens->test_if_set_is_invariant_under_given_action(
1360 cout <<
"The points on the three lines are invariant "
1361 "under the given group" << endl;
1365 set_and_stabilizer *Stage3_Interesting_pts_stab;
1368 cout <<
"before move_point_set" << endl;
1369 move_point_set(A_on_stage3_set, Stage3_set,
1370 stage3_points, 3, Elt, Stage3_Interesting_pts_stab,
1372 cout <<
"after move_point_set" << endl;
1374 cout <<
"Writing generators to file "
1375 << fname_stabilizer_stage_three << endl;
1376 Stage3_Interesting_pts_stab->Strong_gens->print_generators_in_source_code_to_file(
1377 fname_stabilizer_stage_three);
1378 cout <<
"Written file " << fname_stabilizer_stage_three
1379 <<
" of size " << file_size(fname_stabilizer_stage_three)
1382 cout <<
"Generators are:" << endl;
1383 Stage3_Interesting_pts_stab->Strong_gens->print_generators_tex();
1386 char fname_intersection_pts[1000];
1387 char fname_intersection_pts_tex[1000];
1388 sprintf(fname_intersection_pts,
1389 "%s_intersection_points3.csv", prefix);
1390 sprintf(fname_intersection_pts_tex,
1391 "%s_intersection_points3.tex", prefix);
1393 int_matrix_write_csv(fname_intersection_pts,
1394 Intersection_pt, SaS->sz, SaS->sz);
1395 cout <<
"Written file " << fname_intersection_pts
1396 <<
" of size " << file_size(fname_intersection_pts) << endl;
1398 ofstream fp(fname_intersection_pts_tex);
1399 latex_head_easy(fp);
1401 fp <<
"{\\tiny \\arraycolsep=1pt" << endl;
1403 int_matrix_print_with_labels_and_partition(fp,
1404 Intersection_pt, SaS->sz, SaS->sz,
1406 Orb->orbit_first, Orb->orbit_len, Orb->nb_orbits,
1407 Orb->orbit_first, Orb->orbit_len, Orb->nb_orbits,
1408 matrix_entry_print, (
void *) Surf,
1410 fp <<
"$$}" << endl;
1413 cout <<
"Written file " << fname_intersection_pts_tex
1415 << file_size(fname_intersection_pts_tex) << endl;
1421 else if (nb_Eckardt_pts == 6) {
1450void compute_decomposition(orthogonal *O,
1451 finite_field *F,
int *Pts,
int nb_pts,
1454 int f_v = (verbose_level >= 1);
1457 cout <<
"compute_decomposition" << endl;
1463 N = O->nb_points + O->nb_lines;
1466 S.allocate(N,
FALSE);
1468 S.subset_continguous(O->nb_points, O->nb_lines);
1469 S.split_cell(
FALSE);
1473 cout <<
"ht = " << S.ht << endl;
1474 cout <<
"before S.refine_arbitrary_set" << endl;
1475 S.refine_arbitrary_set(nb_pts, Pts, verbose_level - 1);
1476 cout <<
"after S.refine_arbitrary_set" << endl;
1479 cout <<
"compute_decomposition before S.compute_TDO" << endl;
1483 S.compute_TDO(*O, ht0, -1, -1, depth, verbose_level - 2);
1485 cout <<
"compute_decomposition after S.compute_TDO" << endl;
1488 S.get_and_print_row_decomposition_scheme(*O, -1, -1);
1491 S.get_and_print_col_decomposition_scheme(*O, -1, -1);
1496 cout <<
"compute_decomposition done" << endl;
1503 long int *Pts,
int nb_pts,
1508 int f_v = (verbose_level >= 1);
1511 cout <<
"move_point_set" << endl;
1529 cout <<
"move_point_set computing orbits "
1530 "on subsets of size " << nb_pts << endl;
1556 for (i = 0; i < nb_pts; i++) {
1558 data_in[i] = Universe->
find(Pts[i]);
1563 cout <<
"identifying " << nb_pts <<
" points:" << endl;
1565 idx = gen->
trace_set(data_in, nb_pts, nb_pts,
1570 cout <<
"idx = " << idx <<
" data_out = ";
1575 for (i = 0; i < nb_pts; i++) {
1576 data2[i] = Universe->
data[data_out[i]];
1586 cout <<
"transporter:" << endl;
1599 cout <<
"pulled out set and stabilizer at level "
1600 << nb_pts <<
" for orbit " << idx <<
":" << endl;
1601 cout <<
"a set with a group of order "
1614 cout <<
"move_point_set done" << endl;
1618static void matrix_entry_print(
long int *p,
1619 int m,
int n,
int i,
int j,
int val,
1620 std::string &output,
void *data)
1637 sprintf(str,
"%d", val);
std::string * Line_label_tex
schlaefli_labels * Labels
cubic surfaces in PG(3,q) with 27 lines
geometry::projective_space * P
void rearrange_lines_according_to_double_six(long int *Lines, int verbose_level)
Picks a double six and rearranges the lines accordingly.
void compute_intersection_points(int *Adj, long int *Lines, int nb_lines, long int *&Intersection_pt, int verbose_level)
void compute_adjacency_matrix_of_line_intersection_graph(int *&Adj, long int *S, int n, int verbose_level)
Given a set of lines in S[n], compute the associated line intersection graph.
void build_cubic_surface_from_lines(int len, long int *S, int *coeff, int verbose_level)
void init(field_theory::finite_field *F, int verbose_level)
void print_equation(std::ostream &ost, int *coeffs)
void take_away(long int *v, int &len, long int *take_away, int nb_take_away)
void print_as_table(std::ostream &ost, long int *v, int len, int width)
a collection of functions related to sorted vectors
void lint_vec_heapsort(long int *v, int len)
a statistical analysis of data consisting of single integers
void init_lint(long int *data, int data_length, int f_second, int verbose_level)
void get_data_by_multiplicity_as_lint(long int *&Pts, int &nb_pts, int multiplicity, int verbose_level)
void print_naked(int f_backwards)
void PG_element_normalize_from_front(int *v, int stride, int len)
void PG_element_normalize(int *v, int stride, int len)
ring_theory::longinteger_object * nCkq
long int rank_lint_here(int *Mtx, int verbose_level)
void unrank_lint_here(int *Mtx, long int rk, int verbose_level)
void points_on_projective_triangle(long int *&set, int &set_size, long int *three_points, int verbose_level)
various functions related to graph theory
void compute_decomposition_of_graph_wrt_partition(int *Adj, int N, int *first, int *len, int nb_parts, int *&R, int verbose_level)
provides access to pre-computed combinatorial data in encoded form
long int * cubic_surface_Lines(int q, int i)
void cubic_surface_stab_gens(int q, int i, int *&data, int &nb_gens, int &data_size, std::string &stab_order_str)
int * cubic_surface_representative(int q, int i)
basic number theoretic functions
a collection of functions related to file io
void int_matrix_write_csv(std::string &fname, int *M, int m, int n)
void lint_matrix_write_csv(std::string &fname, long int *M, int m, int n)
long int file_size(std::string &fname)
interface to create latex output files
void head_easy(std::ostream &ost)
void lint_matrix_print_with_labels_and_partition(std::ostream &ost, long int *p, int m, int n, int *row_labels, int *col_labels, int *row_part_first, int *row_part_len, int nb_row_parts, int *col_part_first, int *col_part_len, int nb_col_parts, void(*process_function_or_NULL)(long int *p, int m, int n, int i, int j, int val, std::string &output, void *data), void *data, int f_tex)
void foot(std::ostream &ost)
data_structures::lint_vec * Lint_vec
a class to represent arbitrary precision integers
a permutation group in a fixed action.
void print_for_make_element(std::ostream &ost, void *elt)
action * restricted_action(long int *points, int nb_points, int verbose_level)
void element_print_quick(void *elt, std::ostream &ost)
action * create_induced_action_on_sets(int nb_sets, int set_size, long int *sets, int verbose_level)
groups::strong_generators * Strong_gens
action * induced_action_on_grassmannian(int k, int verbose_level)
void element_move(void *a, void *b, int verbose_level)
void init_linear_group(field_theory::finite_field *F, int m, int f_projective, int f_general, int f_affine, int f_semilinear, int f_special, data_structures_groups::vector_ge *&nice_gens, int verbose_level)
a set and its known set stabilizer
void apply_to_self_element_raw(int *Elt_data, int verbose_level)
void init_stab_from_data(int *data_gens, int data_gens_size, int nb_gens, std::string &ascii_target_go, int verbose_level)
ring_theory::longinteger_object target_go
groups::strong_generators * Strong_gens
void apply_to_self_inverse_element_raw(int *Elt_data, int verbose_level)
void init(actions::action *A, actions::action *A2, int verbose_level)
void init_stab_from_file(const char *fname_gens, int verbose_level)
void init_data(long int *data, int sz, int verbose_level)
set_and_stabilizer * create_copy(int verbose_level)
void apply_to_self(int *Elt, int verbose_level)
void rearrange_by_orbits(int *&orbit_first, int *&orbit_length, int *&orbit, int &nb_orbits, int verbose_level)
to hold a vector of group elements
Schreier trees for orbits of groups on points.
void print_and_list_orbits(std::ostream &ost)
int find_shortest_orbit_if_unique(int &idx)
void print(std::ostream &ost)
void coset_rep(int j, int verbose_level)
void print_all_group_elements_as_permutations_in_special_action(actions::action *A_special)
void group_order(ring_theory::longinteger_object &go)
void create_group_table(int *&Table, long int &n, int verbose_level)
void write_as_magma_permutation_group(std::string &fname_base, data_structures_groups::vector_ge *gens, int verbose_level)
void table_of_group_elements_in_data_form(int *&Table, int &len, int &sz, int verbose_level)
void test_if_set_is_invariant_under_given_action(actions::action *A_given, long int *set, int set_sz, int verbose_level)
sims * create_sims(int verbose_level)
schreier * orbit_of_one_point_schreier(actions::action *A_given, int pt, int verbose_level)
void print_generators(std::ostream &ost)
schreier * orbits_on_points_schreier(actions::action *A_given, int verbose_level)
data_structures_groups::vector_ge * gens
orbit of sets using a Schreier tree, used in packing::make_spread_table
int position_of_original_set
void get_table_of_orbits(long int *&Table, int &orbit_length, int &set_size, int verbose_level)
void init(actions::action *A, actions::action *A2, long int *set, int sz, data_structures_groups::vector_ge *gens, 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 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 study_find_eckardt_points(int verbose_level)
void study_orbits_on_lines(int verbose_level)
algebraic_geometry::surface_domain * Surf
void init(field_theory::finite_field *F, int nb, int verbose_level)
void study_group(int verbose_level)
long int * Intersection_pt
int shortest_line_orbit_idx
field_theory::finite_field * F
void study_intersection_points(int verbose_level)
void study_surface_with_6_eckardt_points(int verbose_level)
void study_line_orbits(int verbose_level)
data_structures_groups::set_and_stabilizer * SaS
actions::action * A_on_lines
#define Lint_matrix_print(A, B, C)
#define Lint_vec_print(A, B, C)
#define Int_matrix_print(A, B, C)
#define Int_vec_copy(A, B, C)
#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