18namespace layer1_foundations {
19namespace algebraic_geometry {
54 int verbose_level = 0;
55 int f_v = (verbose_level >= 1);
58 cout <<
"surface_object::freeself" << endl;
71 cout <<
"surface_object::freeself done" << endl;
82 int f_v = (verbose_level >= 1);
85 cout <<
"surface_object::init_equation_points_and_lines_only" << endl;
107 cout <<
"surface_object::init_equation_points_and_lines_only before enumerate_points_and_lines" << endl;
111 cout <<
"surface_object::init_equation_points_and_lines_only after enumerate_points_and_lines" << endl;
115 if (nb_points !=
Surf->nb_pts_on_surface) {
116 cout <<
"surface_object::init_equation nb_points != "
117 "Surf->nb_pts_on_surface" << endl;
118 cout <<
"Surf->nb_pts_on_surface=" <<
Surf->nb_pts_on_surface << endl;
125 cout <<
"surface_object::init_equation_points_and_lines_only done" << endl;
133 int f_v = (verbose_level >= 1);
136 cout <<
"surface_object::init_equation" << endl;
140 cout <<
"surface_object::init_equation before init_equation_points_and_lines_only" << endl;
144 cout <<
"surface_object::init_equation after init_equation_points_and_lines_only" << endl;
150 cout <<
"surface_object::init_equation before "
151 "find_double_six_and_rearrange_lines" << endl;
156 cout <<
"surface_object::init_equation after "
157 "find_double_six_and_rearrange_lines" << endl;
158 cout <<
"surface_object::init_equation Lines:";
164 cout <<
"The surface does not have 27 lines. nb_lines=" <<
nb_lines
165 <<
" A double six has not been computed" << endl;
170 cout <<
"surface_object::init_equation before "
171 "compute_properties" << endl;
175 cout <<
"surface_object::init_equation after "
176 "compute_properties" << endl;
182 cout <<
"surface_object::init_equation after "
183 "enumerate_points" << endl;
191 int f_v = (verbose_level >= 1);
194 cout <<
"surface_object::enumerate_points" << endl;
197 vector<long int> Points;
200 cout <<
"surface_object::enumerate_points before "
201 "Surf->enumerate_points" << endl;
207 cout <<
"surface_object::enumerate_points after "
208 "Surf->enumerate_points" << endl;
211 cout <<
"surface_object::enumerate_points The surface "
212 "has " << Points.size() <<
" points" << endl;
218 for (i = 0; i <
nb_pts; i++) {
224 cout <<
"surface_object::enumerate_points done" << endl;
232 int f_v = (verbose_level >= 1);
235 cout <<
"surface_object::enumerate_points_and_lines" << endl;
238 vector<long int> Points;
239 vector<long int> The_Lines;
242 cout <<
"surface_object::enumerate_points_and_lines before "
243 "Surf->enumerate_points" << endl;
249 cout <<
"surface_object::enumerate_points_and_lines after "
250 "Surf->enumerate_points" << endl;
253 cout <<
"surface_object::enumerate_points_and_lines The surface "
254 "has " << Points.size() <<
" points" << endl;
260 for (i = 0; i <
nb_pts; i++) {
266 cout <<
"surface_object::enumerate_points_and_lines before "
267 "Surf->P->find_lines_which_are_contained" << endl;
271 cout <<
"surface_object::enumerate_points_and_lines after "
272 "Surf->P->find_lines_which_are_contained" << endl;
276 cout <<
"surface_object::enumerate_points_and_lines The surface "
277 "has " << The_Lines.size() <<
" lines" << endl;
281 cout <<
"surface_object::enumerate_points_and_lines the surface "
282 "does not have 27 lines" << endl;
293 cout <<
"surface_object::enumerate_points_and_lines before find_real_lines" << endl;
299 cout <<
"surface_object::enumerate_points_and_lines after find_real_lines" << endl;
307 Lines[i] = The_Lines[i];
311 cout <<
"surface_object::enumerate_points_and_lines nb_pts=" <<
nb_pts <<
" nb_lines=" <<
nb_lines << endl;
321 cout <<
"surface_object::enumerate_points_and_lines done" << endl;
327 int f_v = (verbose_level >= 1);
334 cout <<
"surface_object::find_real_lines" << endl;
336 for (i = 0, j = 0; i < The_Lines.size(); i++) {
340 cout <<
"surface_object::find_real_lines testing line" << endl;
351 cout <<
"surface_object::find_real_lines coeff_out=";
357 cout <<
"surface_object::find_real_lines not a real line" << endl;
367 cout <<
"surface_object::find_real_lines done" << endl;
372 long int *Lines27,
int *eqn,
373 int f_find_double_six_and_rearrange_lines,
376 int f_v = (verbose_level >= 1);
379 cout <<
"surface_object::init_with_27_lines" << endl;
392 cout <<
"surface_object::init_with_27_lines Lines:";
397 if (f_find_double_six_and_rearrange_lines) {
399 cout <<
"surface_object::init_with_27_lines before "
400 "find_double_six_and_rearrange_lines" << endl;
405 cout <<
"surface_object::init_with_27_lines after "
406 "find_double_six_and_rearrange_lines" << endl;
411 cout <<
"surface_object::init_with_27_lines Lines:";
421 cout <<
"surface_object::init_with_27_lines before enumerate_points" << endl;
425 cout <<
"surface_object::init_with_27_lines after enumerate_points" << endl;
429 cout <<
"surface_object::init_with_27_lines before compute_properties" << endl;
433 cout <<
"surface_object::init_with_27_lines after compute_properties" << endl;
437 cout <<
"surface_object::init_with_27_lines done" << endl;
443 int f_v = (verbose_level >= 1);
446 cout <<
"surface_object::compute_properties" << endl;
451 SOP->
init(
this, verbose_level);
454 cout <<
"surface_object::compute_properties done" << endl;
460 int f_v = (verbose_level >= 1);
463 cout <<
"surface_object::recompute_properties" << endl;
473 SOP->
init(
this, verbose_level);
476 cout <<
"surface_object::recompute_properties done" << endl;
486 int f_v = (verbose_level >= 1);
489 long int double_six[12];
494 int l, line_idx, subset_idx;
501 cout <<
"surface_object::find_double_six_and_rearrange_lines" << endl;
506 Adj, Lines0, 27, 0 );
514 line_intersections, Starter_Table, nb_starter, verbose_level);
517 if (nb_starter != 432) {
518 cout <<
"surface_object::find_double_six_and_rearrange_lines nb_starter != 432" << endl;
522 line_idx = Starter_Table[l * 2 + 0];
523 subset_idx = Starter_Table[l * 2 + 1];
526 subset_idx, line_intersections,
533 cout <<
"surface_object::find_double_six_and_rearrange_lines "
534 "before Surf->create_double_six_from_five_lines_with_a_common_transversal" << endl;
537 S3, double_six, verbose_level)) {
538 cout <<
"surface_object::find_double_six_and_rearrange_lines "
539 "The starter configuration is bad, there "
540 "is no double six" << endl;
544 cout <<
"surface_object::find_double_six_and_rearrange_lines after "
545 "Surf->create_double_six_from_five_lines_with_a_common_transversal" << endl;
552 cout <<
"surface_object::find_double_six_and_rearrange_lines "
553 "before Surf->create_remaining_fifteen_lines" << endl;
558 cout <<
"surface_object::find_double_six_and_rearrange_lines "
559 "after Surf->create_remaining_fifteen_lines" << endl;
567 for (i = 0; i < 27; i++) {
568 if (Lines0[i] != Lines1[i]) {
569 cout <<
"surface_object::find_double_six_and_rearrange_lines "
570 "Lines0[i] != Lines1[i]" << endl;
580 cout <<
"surface_object::find_double_six_and_rearrange_lines done" << endl;
589void surface_object::compute_tritangent_planes(
int verbose_level)
591 int f_v = (verbose_level >= 1);
595 cout <<
"surface_object::compute_tritangent_planes" << endl;
600 cout <<
"surface_object::compute_tritangent_planes "
601 "before compute_tritangent_planes_slow" << endl;
603 Surf->compute_tritangent_planes_slow(
Lines,
604 Tritangent_planes, nb_tritangent_planes,
605 Unitangent_planes, nb_unitangent_planes,
606 Lines_in_tritangent_plane,
607 Line_in_unitangent_plane,
612 cout <<
"surface_object::compute_tritangent_planes "
613 "Lines_in_tritangent_plane: " << endl;
614 L.print_lint_matrix_with_standard_labels(cout,
615 Lines_in_tritangent_plane, nb_tritangent_planes, 3,
624 int_vec_zero(Cnt, 27);
625 Tritangent_planes_on_lines =
NEW_int(27 * 5);
626 for (i = 0; i < nb_tritangent_planes; i++) {
627 for (j = 0; j < 3; j++) {
628 a = Lines_in_tritangent_plane[i * 3 + j];
629 Tritangent_planes_on_lines[a * 5 + Cnt[a]++] = i;
632 for (i = 0; i < 27; i++) {
634 cout <<
"surface_object::compute_tritangent_planes "
635 "Cnt[i] != 5" << endl;
642 Unitangent_planes_on_lines =
NEW_int(27 * (
q + 1 - 5));
644 int_vec_zero(Cnt, 27);
645 for (i = 0; i < nb_unitangent_planes; i++) {
646 a = Line_in_unitangent_plane[i];
647 Unitangent_planes_on_lines[a * (
q + 1 - 5) + Cnt[a]++] = i;
649 for (i = 0; i < 27; i++) {
650 if (Cnt[i] != (
q + 1 - 5)) {
651 cout <<
"surface_object::compute_tritangent_planes "
652 "Cnt[i] != (q + 1 - 5)" << endl;
659 iso_type_of_tritangent_plane =
NEW_int(nb_tritangent_planes);
660 for (i = 0; i < nb_tritangent_planes; i++) {
661 long int three_lines[3];
662 for (j = 0; j < 3; j++) {
663 three_lines[j] =
Lines[Lines_in_tritangent_plane[i * 3 + j]];
665 iso_type_of_tritangent_plane[i] =
666 Surf->identify_three_lines(
670 Type_iso_tritangent_planes =
NEW_OBJECT(tally);
671 Type_iso_tritangent_planes->init(iso_type_of_tritangent_plane,
672 nb_tritangent_planes,
FALSE, 0);
674 cout <<
"Type iso of tritangent planes: ";
675 Type_iso_tritangent_planes->print_naked(
TRUE);
679 Tritangent_plane_to_Eckardt =
NEW_int(nb_tritangent_planes);
680 Eckardt_to_Tritangent_plane =
NEW_int(nb_tritangent_planes);
681 Tritangent_plane_dual =
NEW_int(nb_tritangent_planes);
682 for (i = 0; i < nb_tritangent_planes; i++) {
684 for (j = 0; j < 3; j++) {
685 three_lines[j] = Lines_in_tritangent_plane[i * 3 + j];
687 a =
Surf->Eckardt_point_from_tritangent_plane(three_lines);
688 Tritangent_plane_to_Eckardt[i] = a;
689 Eckardt_to_Tritangent_plane[a] = i;
691 for (i = 0; i < nb_tritangent_planes; i++) {
692 Tritangent_plane_dual[i] =
694 Tritangent_planes[i], 0 );
698 Trihedral_pairs_as_tritangent_planes =
NEW_lint(
Surf->nb_trihedral_pairs * 6);
699 for (i = 0; i <
Surf->nb_trihedral_pairs; i++) {
700 for (j = 0; j < 6; j++) {
701 a =
Surf->Trihedral_to_Eckardt[i * 6 + j];
702 Trihedral_pairs_as_tritangent_planes[i * 6 + j] = Eckardt_to_Tritangent_plane[a];
708 cout <<
"surface_object::compute_tritangent_planes done" << endl;
715void surface_object::print_generalized_quadrangle(ostream &ost)
718 ost <<
"\\subsection*{The Generalized Quadrangle}" << endl;
720 ost <<
"The lines in the tritangent planes are:\\\\" << endl;
724 ost <<
"\\noindent" << endl;
725 for (i = 0; i < nb_tritangent_planes; i++) {
726 j = Eckardt_to_Tritangent_plane[i];
727 a = Tritangent_planes[j];
728 ost <<
"$\\pi_{" << i <<
"}";
729 ost <<
"=\\pi_{" <<
Surf->Eckard_point_label_tex[i] <<
"}";
730 ost <<
" = \\{ \\ell_i \\mid i =";
731 for (h = 0; h < 3; h++) {
732 ost << Lines_in_tritangent_plane[j * 3 + h];
739 for (h = 0; h < 3; h++) {
740 ost <<
Surf->Line_label_tex[Lines_in_tritangent_plane[j * 3 + h]];
745 ost <<
"\\}$" << endl;
746 ost <<
"\\\\" << endl;
751 ost <<
"The lines in the tritangent planes in "
752 "Schlaefli's notation are:\\\\" << endl;
753 ost <<
"\\begin{multicols}{2}" << endl;
754 ost <<
"\\noindent" << endl;
755 for (i = 0; i < nb_tritangent_planes; i++) {
756 j = Eckardt_to_Tritangent_plane[i];
757 a = Tritangent_planes[j];
758 ost <<
"$\\pi_{" << i <<
"} = \\{ ";
759 for (h = 0; h < 3; h++) {
760 ost <<
Surf->Line_label_tex[
761 Lines_in_tritangent_plane[j * 3 + h]];
766 ost <<
"\\}$\\\\" << endl;
768 ost <<
"\\end{multicols}" << endl;
774 print_integer_matrix_with_standard_labels(ost,
775 Lines_in_tritangent_plane, 15, 3,
777 ost <<
"\\;\\;" << endl;
778 print_integer_matrix_with_standard_labels_and_offset(ost,
779 Lines_in_tritangent_plane + 15 * 3, 15, 3, 15, 0,
781 ost <<
"\\;\\;" << endl;
782 print_integer_matrix_with_standard_labels_and_offset(ost,
783 Lines_in_tritangent_plane + 30 * 3, 15, 3, 30, 0,
788 ost <<
"The tritangent planes through the 27 lines are:\\\\" << endl;
791 ost <<
"\\noindent" << endl;
792 for (i = 0; i < 27; i++) {
794 ost <<
Surf->Line_label_tex[i];
795 ost <<
"=\\ell_{" << i <<
"} \\in \\{ \\pi_i \\mid i = ";
796 for (h = 0; h < 5; h++) {
797 a = Tritangent_planes_on_lines[i * 5 + h];
798 j = Tritangent_plane_to_Eckardt[a];
806 for (h = 0; h < 5; h++) {
807 a = Tritangent_planes_on_lines[i * 5 + h];
808 j = Tritangent_plane_to_Eckardt[a];
809 ost <<
"\\pi_{" <<
Surf->Eckard_point_label_tex[j] <<
"}";
815 ost <<
"$\\\\" << endl;
822 print_integer_matrix_with_standard_labels(ost,
823 Tritangent_planes_on_lines, 9, 5,
TRUE );
824 ost <<
"\\;\\;" << endl;
825 print_integer_matrix_with_standard_labels_and_offset(ost,
826 Tritangent_planes_on_lines + 9 * 5, 9, 5, 9, 0,
828 ost <<
"\\;\\;" << endl;
829 print_integer_matrix_with_standard_labels_and_offset(ost,
830 Tritangent_planes_on_lines + 18 * 5, 9, 5, 18, 0,
836 ost <<
"The unitangent planes through the 27 lines are:" << endl;
838 print_integer_matrix_with_standard_labels(ost,
839 Unitangent_planes_on_lines, 27,
q + 1 - 5,
851void surface_object::identify_double_six_from_trihedral_pair(
852 int *Lines,
int t_idx,
int *nine_lines,
int *double_sixes,
855 int f_v = (verbose_level >= 1);
856 int nine_line_idx[9];
861 cout <<
"surface_object::identify_double_six_from_trihedral_pair" << endl;
864 cout <<
"surface_object::identify_double_six_from_trihedral_pair t_idx = " << t_idx << endl;
867 for (i = 0; i < 9; i++) {
868 if (!Sorting.int_vec_search_linear(
Lines, 27, nine_lines[i], idx)) {
869 cout <<
"surface_object::identify_double_six_from_"
870 "trihedral_pair cannot find line" << endl;
873 nine_line_idx[i] = idx;
876 identify_double_six_from_trihedral_pair_type_one(
Lines,
877 t_idx, nine_line_idx, double_sixes, verbose_level);
879 else if (t_idx < 110) {
880 identify_double_six_from_trihedral_pair_type_two(
Lines,
881 t_idx, nine_line_idx, double_sixes, verbose_level);
883 else if (t_idx < 120) {
884 identify_double_six_from_trihedral_pair_type_three(
Lines,
885 t_idx, nine_line_idx, double_sixes, verbose_level);
888 cout <<
"surface_object::identify_double_six_from_"
889 "trihedral_pair t_idx is out of range" << endl;
893 cout <<
"surface_object::identify_double_six_from_trihedral_pair done" << endl;
898void surface_object::identify_double_six_from_trihedral_pair_type_one(
899 int *Lines,
int t_idx,
int *nine_line_idx,
int *double_sixes,
902 int f_v = (verbose_level >= 1);
905 int i, j, k, l, m, n;
908 combinatorics_domain Combi;
911 cout <<
"surface_object::identify_double_six_from_trihedral_pair_type_one" << endl;
914 cout <<
"t_idx=" << t_idx << endl;
915 cout <<
"Lines:" << endl;
916 for (h = 0; h < 27; h++) {
917 cout << h <<
" : " <<
Lines[h] << endl;
919 cout <<
"nine_line_idx:" << endl;
920 for (h = 0; h < 9; h++) {
921 cout << h <<
" : " << nine_line_idx[h] << endl;
924 Combi.unrank_k_subset(t_idx, subset, 6, 3);
925 Combi.set_complement(subset, 3, subset + 3, size_complement, 6);
934 cout <<
"i=" << i <<
" j=" << j <<
" k=" << k
935 <<
" l=" << l <<
" m=" << m <<
" n=" << n << endl;
937 T[0] =
Surf->line_cij(j, k);
938 T[1] =
Surf->line_bi(k);
939 T[2] =
Surf->line_ai(j);
940 T[3] =
Surf->line_ai(k);
941 T[4] =
Surf->line_cij(i, k);
942 T[5] =
Surf->line_bi(i);
943 T[6] =
Surf->line_bi(j);
944 T[7] =
Surf->line_ai(i);
945 T[8] =
Surf->line_cij(i, j);
949 int_vec_mone(new_lines, 27);
952 for (h = 0; h < 9; h++) {
953 new_lines[T[h]] = nine_line_idx[h];
959 find_common_transversals_to_three_disjoint_lines(
960 new_lines[
Surf->line_ai(i)],
961 new_lines[
Surf->line_ai(j)],
962 new_lines[
Surf->line_ai(k)],
968 int_vec_print(cout, X1, X1_len);
978 for (c1 = 0; c1 < X1_len; c1++) {
981 cout <<
"c1=" << c1 <<
" / " << X1_len << endl;
985 new_lines[
Surf->line_bi(l)] = X1[c1];
987 cout <<
"b_l=" << X1[c1] << endl;
1005 cout <<
"c1 is illegal" << endl;
1010 int_vec_print(cout, X4, 2);
1016 find_common_transversals_to_four_disjoint_lines(
1017 new_lines[
Surf->line_bi(i)],
1018 new_lines[
Surf->line_bi(j)],
1019 new_lines[
Surf->line_bi(k)],
1020 new_lines[
Surf->line_bi(l)],
1025 int_vec_print(cout, X2, 2);
1029 for (c2 = 0; c2 < X2_len; c2++) {
1032 cout <<
"c2=" << c2 <<
" / " << X2_len << endl;
1036 new_lines[
Surf->line_ai(m)] = X2[c2];
1038 cout <<
"a_m=" << X2[c2] << endl;
1046 new_lines[
Surf->line_ai(n)] = X2[c2b];
1048 cout <<
"a_n=" << X2[c2b] << endl;
1051 int p_ml, p_il, p_jl, p_kl;
1052 int c_ml, c_il, c_jl, c_kl;
1055 p_ml = find_tritangent_plane_through_two_lines(
1056 new_lines[
Surf->line_ai(m)],
1057 new_lines[
Surf->line_bi(l)]);
1058 c_ml = find_unique_line_in_plane(p_ml,
1059 new_lines[
Surf->line_ai(m)],
1060 new_lines[
Surf->line_bi(l)]);
1061 new_lines[
Surf->line_cij(m, l)] = c_ml;
1063 cout <<
"c_ml=" << c_ml << endl;
1067 p_il = find_tritangent_plane_through_two_lines(
1068 new_lines[
Surf->line_ai(i)],
1069 new_lines[
Surf->line_bi(l)]);
1070 c_il = find_unique_line_in_plane(p_il,
1071 new_lines[
Surf->line_ai(i)],
1072 new_lines[
Surf->line_bi(l)]);
1073 new_lines[
Surf->line_cij(i, l)] = c_il;
1076 p_jl = find_tritangent_plane_through_two_lines(
1077 new_lines[
Surf->line_ai(j)],
1078 new_lines[
Surf->line_bi(l)]);
1079 c_jl = find_unique_line_in_plane(p_jl,
1080 new_lines[
Surf->line_ai(j)],
1081 new_lines[
Surf->line_bi(l)]);
1082 new_lines[
Surf->line_cij(j, l)] = c_jl;
1085 p_kl = find_tritangent_plane_through_two_lines(
1086 new_lines[
Surf->line_ai(k)],
1087 new_lines[
Surf->line_bi(l)]);
1088 c_kl = find_unique_line_in_plane(p_kl,
1089 new_lines[
Surf->line_ai(k)],
1090 new_lines[
Surf->line_bi(l)]);
1091 new_lines[
Surf->line_cij(k, l)] = c_kl;
1095 int_vec_copy(Tritangent_planes_on_lines + c_ml * 5,
1097 for (h = 0; h < 5; h++) {
1098 if (planes[h] == p_ml) {
1101 if (planes[h] == p_il) {
1104 if (planes[h] == p_jl) {
1107 if (planes[h] == p_kl) {
1113 cout <<
"could not find the plane" << endl;
1117 int plane_idx, b_m, b_n, a_l;
1120 plane_idx = planes[h];
1122 cout <<
"plane_idx=" << plane_idx << endl;
1124 find_two_lines_in_plane(plane_idx, c_ml, X3[0], X3[1]);
1127 int_vec_print(cout, X3, 2);
1132 if (X4[0] == X3[0]) {
1137 else if (X4[0] == X3[1]) {
1142 else if (X4[1] == X3[0]) {
1147 else if (X4[1] == X3[1]) {
1153 cout <<
"surface_object::identify_double_six_from_"
1154 "trihedral_pair_type_one something is wrong "
1155 "with this choice of c2" << endl;
1159 new_lines[
Surf->line_ai(l)] = a_l;
1160 new_lines[
Surf->line_bi(m)] = b_m;
1161 new_lines[
Surf->line_bi(n)] = b_n;
1163 cout <<
"a_l=" << a_l <<
" b_m=" << b_m
1164 <<
" b_n=" << b_n << endl;
1167 for (h = 0; h < 6; h++) {
1168 double_sixes[nb_double_sixes * 12 + h] =
1169 new_lines[
Surf->line_ai(h)];
1171 for (h = 0; h < 6; h++) {
1172 double_sixes[nb_double_sixes * 12 + 6 + h] =
1173 new_lines[
Surf->line_bi(h)];
1176 cout <<
"We found the following double six, "
1177 "nb_double_sixes=" << nb_double_sixes << endl;
1178 for (h = 0; h < 6; h++) {
1179 cout << setw(2) << new_lines[
Surf->line_ai(h)];
1185 for (h = 0; h < 6; h++) {
1186 cout << setw(2) << new_lines[
Surf->line_bi(h)];
1199 cout <<
"surface_object::identify_double_six_from_trihedral_pair_type_one done" << endl;
1203void surface_object::identify_double_six_from_trihedral_pair_type_two(
1204 int *Lines,
int t_idx,
int *nine_line_idx,
1205 int *double_sixes,
int verbose_level)
1207 int f_v = (verbose_level >= 1);
1208 int idx, rk_h, rk_s;
1210 int second_subset[6];
1212 int size_complement;
1215 combinatorics_domain Combi;
1219 cout <<
"surface_object::identify_double_six_from_trihedral_pair_type_two" << endl;
1226 Combi.unrank_k_subset(rk_h, subset, 6, 4);
1227 Combi.unrank_k_subset(rk_s, second_subset, 4, 2);
1228 Combi.set_complement(second_subset, 2, complement, size_complement, 4);
1229 l = subset[second_subset[0]];
1230 m = subset[second_subset[1]];
1231 n = subset[complement[0]];
1232 p = subset[complement[1]];
1244 Sorting.int_vec_heapsort(subset2, 4);
1245 Combi.set_complement(subset2, 4, complement2, size_complement, 6);
1249 cout <<
"l=" << l <<
" m=" << m <<
" n=" << n
1250 <<
" p=" << p <<
" r=" << r <<
" s=" << s << endl;
1253 T[0] =
Surf->line_ai(l);
1254 T[1] =
Surf->line_bi(p);
1255 T[2] =
Surf->line_cij(l, p);
1256 T[3] =
Surf->line_bi(n);
1257 T[4] =
Surf->line_ai(m);
1258 T[5] =
Surf->line_cij(m, n);
1259 T[6] =
Surf->line_cij(l, n);
1260 T[7] =
Surf->line_cij(m, p);
1261 T[8] =
Surf->line_cij(r, s);
1265 int_vec_mone(new_lines, 27);
1269 for (i = 0; i < 9; i++) {
1270 new_lines[T[i]] = nine_line_idx[i];
1281 get_planes_through_line(new_lines,
Surf->line_cij(l, n), X1);
1285 int_vec_print(cout, X1, X1_len);
1288 int_vec_delete_element_assume_sorted(X1, X1_len,
1289 find_tritangent_plane_through_two_lines(
1290 new_lines[
Surf->line_ai(l)],
1291 new_lines[
Surf->line_bi(n)]));
1292 int_vec_delete_element_assume_sorted(X1, X1_len,
1293 find_tritangent_plane_through_two_lines(
1294 new_lines[
Surf->line_cij(n, l)],
1295 new_lines[
Surf->line_cij(p, m)]));
1298 int_vec_print(cout, X1, X1_len);
1301 for (i = 0; i < 3; i++) {
1303 find_two_lines_in_plane(pi,
1304 new_lines[
Surf->line_cij(l, n)],
1311 int_vec_print(cout, X2, X2_len);
1315 get_planes_through_line(new_lines,
Surf->line_cij(m, n), X3);
1319 int_vec_print(cout, X3, X3_len);
1322 int_vec_delete_element_assume_sorted(X3, X3_len,
1323 find_tritangent_plane_through_two_lines(
1324 new_lines[
Surf->line_ai(m)],
1325 new_lines[
Surf->line_bi(n)]));
1326 int_vec_delete_element_assume_sorted(X3, X3_len,
1327 find_tritangent_plane_through_two_lines(
1328 new_lines[
Surf->line_cij(p, l)],
1329 new_lines[
Surf->line_cij(n, m)]));
1332 int_vec_print(cout, X3, X3_len);
1335 for (i = 0; i < 3; i++) {
1337 find_two_lines_in_plane(pi,
1338 new_lines[
Surf->line_cij(m, n)],
1345 int_vec_print(cout, X4, X4_len);
1349 Sorting.int_vec_heapsort(X2, X2_len);
1350 Sorting.int_vec_heapsort(X4, X4_len);
1351 for (i = 0; i < X2_len; i++) {
1353 if (Sorting.int_vec_search(X4, X4_len, a, idx)) {
1358 cout <<
"found a set X5 of size " << X5_len <<
" : ";
1359 int_vec_print(cout, X5, X5_len);
1363 cout <<
"X5_len != 3" << endl;
1367 int nb_double_sixes;
1368 nb_double_sixes = 0;
1371 for (c1 = 0; c1 < X5_len; c1++) {
1374 cout <<
"c1=" << c1 <<
" / " << X5_len << endl;
1378 new_lines[
Surf->line_ai(n)] = X5[c1];
1381 pi = find_tritangent_plane_through_two_lines(
1382 new_lines[
Surf->line_ai(n)],
1383 new_lines[
Surf->line_cij(l, n)]);
1384 line = find_unique_line_in_plane(pi,
1385 new_lines[
Surf->line_ai(n)],
1386 new_lines[
Surf->line_cij(l, n)]);
1387 new_lines[
Surf->line_bi(l)] = line;
1390 pi = find_tritangent_plane_through_two_lines(
1391 new_lines[
Surf->line_ai(n)],
1392 new_lines[
Surf->line_cij(m, n)]);
1393 line = find_unique_line_in_plane(pi,
1394 new_lines[
Surf->line_ai(n)],
1395 new_lines[
Surf->line_cij(m, n)]);
1396 new_lines[
Surf->line_bi(m)] = line;
1399 pi = find_tritangent_plane_through_two_lines(
1400 new_lines[
Surf->line_bi(m)],
1401 new_lines[
Surf->line_cij(m, p)]);
1402 line = find_unique_line_in_plane(pi,
1403 new_lines[
Surf->line_bi(m)],
1404 new_lines[
Surf->line_cij(m, p)]);
1405 new_lines[
Surf->line_ai(p)] = line;
1407 find_common_transversals_to_four_disjoint_lines(
1408 new_lines[
Surf->line_ai(l)],
1409 new_lines[
Surf->line_ai(m)],
1410 new_lines[
Surf->line_ai(n)],
1411 new_lines[
Surf->line_ai(p)], X6);
1414 for (c2 = 0; c2 < 2; c2++) {
1417 cout <<
"c2=" << c2 <<
" / " << 2 << endl;
1422 new_lines[
Surf->line_bi(r)] = X6[c2];
1424 new_lines[
Surf->line_bi(s)] = X6[1];
1427 new_lines[
Surf->line_bi(s)] = X6[0];
1431 pi = find_tritangent_plane_through_two_lines(
1432 new_lines[
Surf->line_ai(n)],
1433 new_lines[
Surf->line_bi(r)]);
1434 line = find_unique_line_in_plane(pi,
1435 new_lines[
Surf->line_ai(n)],
1436 new_lines[
Surf->line_bi(r)]);
1437 new_lines[
Surf->line_cij(n, r)] = line;
1440 pi = find_tritangent_plane_through_two_lines(
1441 new_lines[
Surf->line_bi(n)],
1442 new_lines[
Surf->line_cij(n, r)]);
1443 line = find_unique_line_in_plane(pi,
1444 new_lines[
Surf->line_bi(n)],
1445 new_lines[
Surf->line_cij(n, r)]);
1446 new_lines[
Surf->line_ai(r)] = line;
1449 pi = find_tritangent_plane_through_two_lines(
1450 new_lines[
Surf->line_ai(n)],
1451 new_lines[
Surf->line_bi(s)]);
1452 line = find_unique_line_in_plane(pi,
1453 new_lines[
Surf->line_ai(n)],
1454 new_lines[
Surf->line_bi(s)]);
1455 new_lines[
Surf->line_cij(n, s)] = line;
1458 pi = find_tritangent_plane_through_two_lines(
1459 new_lines[
Surf->line_bi(n)],
1460 new_lines[
Surf->line_cij(n, s)]);
1461 line = find_unique_line_in_plane(pi,
1462 new_lines[
Surf->line_bi(n)],
1463 new_lines[
Surf->line_cij(n, s)]);
1464 new_lines[
Surf->line_ai(s)] = line;
1466 for (i = 0; i < 6; i++) {
1467 double_sixes[nb_double_sixes * 12 + i] =
1468 new_lines[
Surf->line_ai(i)];
1470 for (i = 0; i < 6; i++) {
1471 double_sixes[nb_double_sixes * 12 + 6 + i] =
1472 new_lines[
Surf->line_bi(i)];
1475 cout <<
"We found the following double six, "
1476 "nb_double_sixes=" << nb_double_sixes << endl;
1477 for (i = 0; i < 6; i++) {
1478 cout << setw(2) << new_lines[
Surf->line_ai(i)];
1484 for (i = 0; i < 6; i++) {
1485 cout << setw(2) << new_lines[
Surf->line_bi(i)];
1498 if (nb_double_sixes != 6) {
1499 cout <<
"surface_object::identify_double_six_from_"
1500 "trihedral_pair_type_two nb_double_sixes != 6" << endl;
1507 cout <<
"surface_object::identify_double_six_from_trihedral_pair_type_two done" << endl;
1511void surface_object::identify_double_six_from_trihedral_pair_type_three(
1512 int *Lines,
int t_idx,
int *nine_line_idx,
int *double_sixes,
1515 int f_v = (verbose_level >= 1);
1518 cout <<
"surface_object::identify_double_six_from_"
1519 "trihedral_pair_type_three" << endl;
1522 cout <<
"surface_object::identify_double_six_from_"
1523 "trihedral_pair_type_three done" << endl;
1528void surface_object::find_common_transversals_to_two_disjoint_lines(
1529 int a,
int b,
int *transversals5)
1534 for (i = 0; i < 27; i++) {
1535 if (i == a || i == b) {
1538 if (Adj_line_intersection_graph[i * 27 + a]
1539 && Adj_line_intersection_graph[i * 27 + b]) {
1540 transversals5[c++] = i;
1544 cout <<
"surface_object::find_common_transversals_"
1545 "to_two_disjoint_lines c != 5" << endl;
1550void surface_object::find_common_transversals_to_three_disjoint_lines(
1551 int a1,
int a2,
int a3,
int *transversals3)
1556 for (i = 0; i < 27; i++) {
1557 if (i == a1 || i == a2 || i == a3) {
1560 if (Adj_line_intersection_graph[i * 27 + a1]
1561 && Adj_line_intersection_graph[i * 27 + a2]
1562 && Adj_line_intersection_graph[i * 27 + a3]) {
1563 transversals3[c++] = i;
1567 cout <<
"surface_object::find_common_transversals_"
1568 "to_three_disjoint_lines c != 3" << endl;
1569 cout <<
"c=" << c << endl;
1574void surface_object::find_common_transversals_to_four_disjoint_lines(
1575 int a1,
int a2,
int a3,
int a4,
int *transversals2)
1580 for (i = 0; i < 27; i++) {
1581 if (i == a1 || i == a2 || i == a3 || i == a4) {
1584 if (Adj_line_intersection_graph[i * 27 + a1]
1585 && Adj_line_intersection_graph[i * 27 + a2]
1586 && Adj_line_intersection_graph[i * 27 + a3]
1587 && Adj_line_intersection_graph[i * 27 + a4]) {
1588 transversals2[c++] = i;
1592 cout <<
"surface_object::find_common_transversals_"
1593 "to_four_disjoint_lines c != 2" << endl;
1598int surface_object::find_tritangent_plane_through_two_lines(
1599 int line_a,
int line_b)
1604 for (i = 0; i < 5; i++) {
1605 pi = Tritangent_planes_on_lines[line_a * 5 + i];
1606 if (Sorting.lint_vec_search_linear(
1607 Lines_in_tritangent_plane + pi * 3, 3,
1612 cout <<
"surface_object::find_tritangent_plane_through_"
1613 "two_lines we could not find the tritangent "
1614 "plane through these two lines" << endl;
1618void surface_object::get_planes_through_line(
int *new_lines,
1619 int line_idx,
int *planes5)
1624 cout <<
"surface_object::get_planes_through_line " << endl;
1625 cout <<
"line=" <<
Surf->Line_label[line_idx] << endl;
1627 int_vec_copy(Tritangent_planes_on_lines + new_lines[line_idx] * 5,
1631void surface_object::find_two_lines_in_plane(
int plane_idx,
1632 int forbidden_line,
int &line1,
int &line2)
1636 for (i = 0; i < 3; i++) {
1637 if (Lines_in_tritangent_plane[plane_idx * 3 + i] == forbidden_line) {
1639 line1 = Lines_in_tritangent_plane[plane_idx * 3 + 1];
1640 line2 = Lines_in_tritangent_plane[plane_idx * 3 + 2];
1643 line1 = Lines_in_tritangent_plane[plane_idx * 3 + 0];
1644 line2 = Lines_in_tritangent_plane[plane_idx * 3 + 2];
1647 line1 = Lines_in_tritangent_plane[plane_idx * 3 + 0];
1648 line2 = Lines_in_tritangent_plane[plane_idx * 3 + 1];
1653 cout <<
"surface_object::find_two_lines_in_plane we "
1654 "could not find the forbidden line" << endl;
1657int surface_object::find_unique_line_in_plane(
int plane_idx,
1658 int forbidden_line1,
int forbidden_line2)
1662 for (i = 0; i < 3; i++) {
1663 a = Lines_in_tritangent_plane[plane_idx * 3 + i];
1664 if (a == forbidden_line1) {
1667 if (a == forbidden_line2) {
1672 cout <<
"surface_object::find_unique_line_in_plane we "
1673 "could not find the unique line" << endl;
1677int surface_object::choose_tritangent_plane(
1678 int line_a,
int line_b,
int transversal_line,
int verbose_level)
1681 int i, plane, idx, a;
1685 cout <<
"surface_object::choose_tritangent_plane" << endl;
1686 cout <<
"line_a=" << line_a << endl;
1687 cout <<
"line_b=" << line_b << endl;
1688 cout <<
"transversal_line=" << transversal_line << endl;
1693 cout <<
"Testing the following planes: ";
1695 Tritangent_planes_on_lines + transversal_line * 5, 5);
1698 for (i = 4; i >= 0; i--) {
1699 a = Tritangent_planes_on_lines[transversal_line * 5 + i];
1700 plane = Tritangent_plane_to_Eckardt[a];
1702 cout <<
"testing plane " << a <<
" = " << plane << endl;
1704 if (Sorting.lint_vec_search_linear(
1705 Lines_in_tritangent_plane + a * 3, 3, line_a, idx)) {
1707 cout <<
"The plane is bad, it contains line_a" << endl;
1711 if (Sorting.lint_vec_search_linear(
1712 Lines_in_tritangent_plane + a * 3, 3, line_b, idx)) {
1714 cout <<
"The plane is bad, it contains line_b" << endl;
1721 cout <<
"surface_object::choose_tritangent_plane "
1722 "could not find a tritangent plane" << endl;
1726 cout <<
"surface_object::choose_tritangent_plane done" << endl;
1731void surface_object::find_all_tritangent_planes(
1732 int line_a,
int line_b,
int transversal_line,
1733 int *tritangent_planes3,
1737 int i, plane, idx, a, nb;
1741 cout <<
"surface_object::find_all_tritangent_planes" << endl;
1742 cout <<
"line_a=" << line_a << endl;
1743 cout <<
"line_b=" << line_b << endl;
1744 cout <<
"transversal_line=" << transversal_line << endl;
1749 cout <<
"Testing the following planes: ";
1751 Tritangent_planes_on_lines + transversal_line * 5, 5);
1755 for (i = 4; i >= 0; i--) {
1756 a = Tritangent_planes_on_lines[transversal_line * 5 + i];
1757 plane = Tritangent_plane_to_Eckardt[a];
1759 cout <<
"testing plane " << a <<
" = " << plane << endl;
1761 if (Sorting.lint_vec_search_linear(
1762 Lines_in_tritangent_plane + a * 3, 3, line_a, idx)) {
1764 cout <<
"The plane is bad, it contains line_a" << endl;
1768 if (Sorting.lint_vec_search_linear(
1769 Lines_in_tritangent_plane + a * 3, 3, line_b, idx)) {
1771 cout <<
"The plane is bad, it contains line_b" << endl;
1775 tritangent_planes3[nb++] = plane;
1778 cout <<
"surface_object::find_all_tritangent_planes "
1783 cout <<
"surface_object::choose_tritangent_plane "
1790 int *line_idx,
int verbose_level)
1792 int f_v = (verbose_level >= 1);
1797 cout <<
"surface_object::identify_lines" << endl;
1801 cout <<
"surface_object::identify_lines could "
1802 "not find lines[" << i <<
"]=" << lines[i]
1803 <<
" in Lines[]" << endl;
1809 cout <<
"surface_object::identify_lines done" << endl;
1814 long int *nine_lines,
int *nine_lines_idx)
1821 nine_lines, 3, 3,
TRUE );
1824 ost <<
"\\qquad" << endl;
1825 ost <<
"\\begin{array}{c|ccc}" << endl;
1826 for (j = 0; j < 3; j++) {
1829 ost <<
"\\\\" << endl;
1830 ost <<
"\\hline" << endl;
1831 for (i = 0; i < 3; i++) {
1833 for (j = 0; j < 3; j++) {
1835 idx = nine_lines_idx[i * 3 + j];
1836 ost <<
"\\ell_{" << idx <<
"}";
1841 ost <<
"\\\\" << endl;
1843 ost <<
"\\end{array}" << endl;
1844 ost <<
"\\qquad" << endl;
1845 ost <<
"\\begin{array}{c|ccc}" << endl;
1846 for (j = 0; j < 3; j++) {
1849 ost <<
"\\\\" << endl;
1850 ost <<
"\\hline" << endl;
1851 for (i = 0; i < 3; i++) {
1853 for (j = 0; j < 3; j++) {
1855 idx = nine_lines_idx[i * 3 + j];
1861 ost <<
"\\\\" << endl;
1863 ost <<
"\\end{array}" << endl;
1864 ost <<
"$$" << endl;
1868void surface_object::compute_clebsch_maps(
int verbose_level)
1870 int f_v = (verbose_level >= 1);
1874 cout <<
"surface_object::compute_clebsch_maps" << endl;
1882 int Blown_up_lines[6];
1884 int transversal_line, plane_rk, plane_rk_global;
1890 for (i = 0; i < 27; i++) {
1891 for (j = i + 1; j < 27; j++) {
1892 if (Adj_line_intersection_graph[i * 27 + j] == 1) {
1898 cout <<
"#######################" << endl;
1899 cout <<
"clebsch map for lines " << i <<
", "
1900 << j <<
":" << endl;
1902 transversal_line = compute_transversal_line(i, j,
1905 plane_rk = choose_tritangent_plane(i, j,
1906 transversal_line, 0 );
1908 plane_rk_global = Tritangent_planes[plane_rk];
1910 cout <<
"transversal\\_line = " << transversal_line
1912 cout <<
"plane\\_rank = " << plane_rk <<
" = "
1913 << plane_rk_global <<
"\\\\" << endl;
1917 line_idx, plane_rk_global,
1918 Clebsch_map, Clebsch_coeff, 0 )) {
1919 cout <<
"The plane contains one of the lines, "
1920 "this should not happen" << endl;
1924 cout <<
"clebsch map for lines " << i <<
", " << j
1925 <<
" clebsch_map_print_fibers:" << endl;
1926 clebsch_map_print_fibers(Clebsch_map);
1929 cout <<
"clebsch map for lines " << i <<
", " << j
1930 <<
" clebsch_map_find_arc_and_lines:" << endl;
1931 clebsch_map_find_arc_and_lines(Clebsch_map, Arc,
1932 Blown_up_lines, 1 );
1934 cout <<
"after clebsch_map_find_arc_and_lines" << endl;
1937 cout <<
"Clebsch map for lines " << i <<
", " << j
1938 <<
" cnt=" << cnt <<
" : arc = ";
1939 int_vec_print(cout, Arc, 6);
1940 cout <<
" : blown up lines = ";
1941 int_vec_print(cout, Blown_up_lines, 6);
1948 int_vec_copy(Blown_up_lines, Blown_up2, 6);
1949 int_vec_heapsort(Blown_up2, 6);
1950 for (h = 0; h < 6; h++) {
1951 if (Blown_up2[h] >= 0 && Blown_up2[h] < 27) {
1952 cout <<
Surf->Line_label[Blown_up2[h]];
1968 cout <<
"surface_object::compute_clebsch_maps done" << endl;
std::string * Line_label_tex
schlaefli_labels * Labels
cubic surfaces in PG(3,q) with 27 lines
geometry::projective_space * P
int create_double_six_from_five_lines_with_a_common_transversal(long int *five_pts, long int *double_six, int verbose_level)
Given a five-plus-one five_pts[5], complete the double-six.
ring_theory::homogeneous_polynomial_domain * Poly3_4
void list_starter_configurations(long int *Lines, int nb_lines, data_structures::set_of_sets *line_intersections, int *&Table, int &N, int verbose_level)
void enumerate_points(int *coeff, std::vector< long int > &Pts, int verbose_level)
field_theory::finite_field * F
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 create_starter_configuration(int line_idx, int subset_idx, data_structures::set_of_sets *line_neighbors, long int *Lines, long int *S, int verbose_level)
void create_remaining_fifteen_lines(long int *double_six, long int *fifteen_lines, int verbose_level)
properties of a particular cubic surface in PG(3,q), as defined by an object of class surface_object
void init(surface_object *SO, int verbose_level)
void enumerate_points(int verbose_level)
void init_equation(surface_domain *Surf, int *eqn, int verbose_level)
surface_object_properties * SOP
void recompute_properties(int verbose_level)
void compute_properties(int verbose_level)
void identify_lines(long int *lines, int nb_lines, int *line_idx, int verbose_level)
void find_double_six_and_rearrange_lines(long int *Lines, int verbose_level)
void enumerate_points_and_lines(int verbose_level)
field_theory::finite_field * F
void init_with_27_lines(surface_domain *Surf, long int *Lines27, int *eqn, int f_find_double_six_and_rearrange_lines, int verbose_level)
void init_equation_points_and_lines_only(surface_domain *Surf, int *eqn, int verbose_level)
int find_point(long int P, int &idx)
void print_nine_lines_latex(std::ostream &ost, long int *nine_lines, int *nine_lines_idx)
void find_real_lines(std::vector< long int > &The_Lines, int verbose_level)
void matrix_print(int *p, int m, int n)
void init_from_adjacency_matrix(int n, int *Adj, int verbose_level)
a collection of functions related to sorted vectors
int lint_vec_search_linear(long int *v, int len, long int a, int &idx)
int lint_vec_search(long int *v, int len, long int a, int &idx, int verbose_level)
void lint_vec_heapsort(long int *v, int len)
void unrank_lint_here(int *Mtx, long int rk, int verbose_level)
void find_lines_which_are_contained(std::vector< long int > &Points, std::vector< long int > &Lines, int verbose_level)
long int dual_rank_of_plane_in_three_space(long int plane_rank, int verbose_level)
interface to create latex output files
void print_lint_matrix_with_standard_labels(std::ostream &ost, long int *p, int m, int n, int f_tex)
data_structures::int_vec * Int_vec
void substitute_line(int *coeff_in, int *coeff_out, int *Pt1_coeff, int *Pt2_coeff, int verbose_level)
#define Lint_vec_copy(A, B, C)
#define Lint_vec_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