Orbiter 2022
Combinatorial Objects
algebraic_geometry.h
Go to the documentation of this file.
1/*
2 * surfaces.h
3 *
4 * Created on: Jul 29, 2020
5 * Author: betten
6 */
7
8#ifndef SRC_LIB_FOUNDATIONS_ALGEBRAIC_GEOMETRY_ALGEBRAIC_GEOMETRY_H_
9#define SRC_LIB_FOUNDATIONS_ALGEBRAIC_GEOMETRY_ALGEBRAIC_GEOMETRY_H_
10
11namespace orbiter {
12namespace layer1_foundations {
13namespace algebraic_geometry {
14
15
16
17// #############################################################################
18// arc_lifting_with_two_lines.cpp
19// #############################################################################
20
22
23
25
26public:
27
28 int q;
30
31 surface_domain *Surf; // do not free
32
33 long int *Arc6;
34 int arc_size; // = 6
35
36 long int line1, line2;
37
38 long int plane_rk;
39
40 int *Arc_coords; // [6 * 4]
41
42 long int P[6];
43
47
48 long int transversal[4];
49
50 long int input_Lines[9];
51
52 int coeff[20];
53 long int lines27[27];
54
57 void null();
58 void freeself();
59 void create_surface(
61 long int *Arc6, long int line1, long int line2,
62 int verbose_level);
63 // The arc must be given as points in PG(3,q), not in PG(2,q).
64};
65
66
67
68// #############################################################################
69// clebsch_map.cpp
70// #############################################################################
71
73
74
76
77public:
81
82 int hds, ds, ds_row;
83
87
88 int line_idx[2];
90
93 int Plane[16];
94 int base_cols[4];
95
96
97 long int *Clebsch_map; // [SO->nb_pts], = Image_rk
98 int *Clebsch_coeff; // [SO->nb_pts * 4], = Image_coeff
99
100 long int Arc[6];
101 long int Blown_up_lines[6];
102
103 clebsch_map();
104 ~clebsch_map();
105 void freeself();
107 int hds, int verbose_level);
108 void compute_Clebsch_map_down(int verbose_level);
110 long int *Image_rk, int *Image_coeff,
111 int verbose_level);
112 // assuming:
113 // In:
114 // SO->Lines[27]
115 // SO->Pts[SO->nb_pts]
116 // Out:
117 // Image_rk[nb_pts] (image point in the plane in local coordinates)
118 // Note Image_rk[i] is -1 if Pts[i] does not have an image.
119 // Image_coeff[nb_pts * 4] (image point in the plane in PG(3,q) coordinates)
122 //long int *Clebsch_map,
123 //long int *Arc, long int *Blown_up_lines,
124 int verbose_level);
125 void report(std::ostream &ost, int verbose_level);
126
127};
128
129
130// #############################################################################
131// cubic_curve.cpp
132// #############################################################################
133
135
136
138
139public:
140 int q;
143
144
146
147
149 // cubic polynomials in three variables
151 // quadratic polynomials in three variables
152
154
155 int *gradient; // 3 * Poly2->nb_monomials
156
157
158 cubic_curve();
159 ~cubic_curve();
160 void freeself();
161 void init(field_theory::finite_field *F, int verbose_level);
163 int nb_pts, long int *pt_list, int verbose_level);
164 void compute_gradient(
165 int *eqn_in, int verbose_level);
167 int *eqn_in,
168 long int *Pts_on_curve, int nb_pts_on_curve,
169 long int *Pts, int &nb_pts,
170 int verbose_level);
172 int *eqn_in,
173 long int *Pts_on_curve, int nb_pts_on_curve,
174 long int *Pts, int &nb_pts,
175 int verbose_level);
176
177};
178
179
180
181
182// #############################################################################
183// del_pezzo_surface_of_degree_two_domain.cpp
184// #############################################################################
185
187
188
190
191public:
199 // quartic polynomials in three variables
200
203 void init(
206 int verbose_level);
207 void enumerate_points(int *coeff,
208 std::vector<long int> &Pts,
209 int verbose_level);
210 void print_equation_with_line_breaks_tex(std::ostream &ost, int *coeffs);
211 void unrank_point(int *v, long int rk);
212 long int rank_point(int *v);
213
214};
215
216
217// #############################################################################
218// del_pezzo_surface_of_degree_two_object.cpp
219// #############################################################################
220
222
223
225
226public:
228
232
234
235
238 void init(
243 int verbose_level);
244 void enumerate_points_and_lines(int verbose_level);
245 void create_latex_report(std::string &label, std::string &label_tex, int verbose_level);
246 void report_properties(std::ostream &ost, int verbose_level);
247 void print_equation(std::ostream &ost);
248 void print_points(std::ostream &ost);
249 void print_all_points_on_surface(std::ostream &ost);
250 void print_lines(std::ostream &ost);
251
252};
253
254
255
256// #############################################################################
257// eckardt_point_info.cpp
258// #############################################################################
259
261
262
264
265public:
266
267 //surface_domain *Surf;
269 long int arc6[6];
270
271 int *bisecants; // [15]
272 int *Intersections; // [15 * 15]
273 int *B_pts; // [nb_B_pts]
274 int *B_pts_label; // [nb_B_pts * 3]
275 int nb_B_pts; // at most 15
276 int *E2; // [6 * 5 * 2] Eckardt points of the second type
277 int nb_E2; // at most 30
278 int *conic_coefficients; // [6 * 6]
280 int nb_E;
281
284 void null();
285 void freeself();
287 long int *arc6, int verbose_level);
288 void print_bisecants(std::ostream &ost, int verbose_level);
289 void print_intersections(std::ostream &ost, int verbose_level);
290 void print_conics(std::ostream &ost, int verbose_level);
291 void print_Eckardt_points(std::ostream &ost, int verbose_level);
292
293};
294
295
296// #############################################################################
297// eckardt_point.cpp
298// #############################################################################
299
301
302
304
305public:
306
307 int len;
308 int pt;
309 int index[3];
310
311
314 void null();
315 void freeself();
316 void print();
317 void latex(std::ostream &ost);
318 void latex_index_only(std::ostream &ost);
319 void latex_to_str(char *str);
320 void latex_to_str_without_E(char *str);
321 void init2(int i, int j);
322 void init3(int ij, int kl, int mn);
323 void init6(int i, int j, int k, int l, int m, int n);
324 void init_by_rank(int rk);
326 int rank();
327 void unrank(int rk, int &i, int &j, int &k, int &l, int &m, int &n);
328
329};
330
331// #############################################################################
332// quartic_curve_domain.cpp
333// #############################################################################
334
336
337
339
340public:
343
345 // linear polynomials in three variables
347 // quadratic polynomials in three variables
349 // cubic polynomials in three variables
351 // quartic polynomials in three variables
352
354 // cubic polynomials in four variables
355
357
359
362 void init(field_theory::finite_field *F, int verbose_level);
363 void init_polynomial_domains(int verbose_level);
364 void print_equation_maple(std::stringstream &ost, int *coeffs);
365 void print_equation_with_line_breaks_tex(std::ostream &ost, int *coeffs);
366 void print_gradient_with_line_breaks_tex(std::ostream &ost, int *coeffs);
367 void unrank_point(int *v, long int rk);
368 long int rank_point(int *v);
369 void unrank_line_in_dual_coordinates(int *v, long int rk);
370 void print_lines_tex(std::ostream &ost, long int *Lines, int nb_lines);
372 long int *Pts, int nb_points,
373 long int *Lines, int nb_lines,
374 data_structures::set_of_sets *&pts_on_lines,
375 int *&f_is_on_line,
376 int verbose_level);
377 void multiply_conic_times_conic(int *six_coeff_a,
378 int *six_coeff_b, int *fifteen_coeff,
379 int verbose_level);
380 void multiply_conic_times_line(int *six_coeff,
381 int *three_coeff, int *ten_coeff,
382 int verbose_level);
383 void multiply_line_times_line(int *line1,
384 int *line2, int *six_coeff,
385 int verbose_level);
386 void multiply_three_lines(int *line1, int *line2, int *line3,
387 int *ten_coeff,
388 int verbose_level);
389 void multiply_four_lines(int *line1, int *line2, int *line3, int *line4,
390 int *fifteen_coeff,
391 int verbose_level);
392 void assemble_cubic_surface(int *f1, int *f2, int *f3, int *eqn20,
393 int verbose_level);
394 void create_surface(quartic_curve_object *Q, int *eqn20, int verbose_level);
395 // Given a quartic Q in X1,X2,X3, compute an associated cubic surface
396 // whose projection from (1,0,0,0) gives back the quartic Q.
397 // Pick 4 bitangents L0,L1,L2,L3 so that the 8 points of tangency lie on a conic C.
398 // Then, create the cubic surface with equation
399 // (- lambda * mu) / 4 * X0^2 * L0 (the equation of the first of the four bitangents)
400 // + X0 * lambda * C (the conic equation)
401 // + L1 * L2 * L3 (the product of the equations of the last three bitangents)
402 // Here 1, lambda, mu are the coefficients of a linear dependency between
403 // Q (the quartic), C^2, L0*L1*L2*L3, so
404 // Q + lambda * C^2 + mu * L0*L1*L2*L3 = 0.
405 void compute_gradient(int *equation15, int *&gradient, int verbose_level);
406
407};
408
409
410// #############################################################################
411// quartic_curve_object_properties.cpp
412// #############################################################################
413
415
416
418
419public:
420
422
423
425 // points are stored as indices into Pts[]
426 int *f_is_on_line; // [QO->nb_pts]
427
430
433
441
442 long int *Pts_off;
444
446 int *f_is_on_line2; // [QO->nb_pts]
447
450
451
453
454 long int *singular_pts;
457
458 long int *tangent_line_rank_global; // [QO->nb_pts]
459 long int *tangent_line_rank_dual; // [nb_non_singular_pts]
460
461
462
465 void init(quartic_curve_object *QO, int verbose_level);
466 void create_summary_file(std::string &fname,
467 std::string &surface_label, std::string &col_postfix, int verbose_level);
468 void report_properties_simple(std::ostream &ost, int verbose_level);
469 void print_equation(std::ostream &ost);
470 void print_gradient(std::ostream &ost);
471 void print_general(std::ostream &ost);
472 void print_points(std::ostream &ost);
473 void print_all_points(std::ostream &ost);
474 void print_bitangents(std::ostream &ost);
475 void print_lines_with_points_on_them(std::ostream &ost,
476 long int *Lines, int nb_lines, data_structures::set_of_sets *SoS);
477 //void print_bitangents_with_points_on_them(std::ostream &ost);
478 void points_on_curve_on_lines(int verbose_level);
479 void report_bitangent_line_type(std::ostream &ost);
480 void compute_gradient(int verbose_level);
481 void compute_singular_points_and_tangent_lines(int verbose_level);
482 // a singular point is a point where all partials vanish
483 // We compute the set of singular points into Pts[nb_pts]
484
485};
486
487
488
489// #############################################################################
490// quartic_curve_object.cpp
491// #############################################################################
492
494
495
497
498public:
499 int q;
502
503 long int *Pts; // in increasing order
505
506
507 //long int *Lines;
508 //int nb_lines;
509
510 int eqn15[15];
511
513 long int bitangents28[28];
514
516
517
518
521 void freeself();
522 void null();
524 int *eqn15,
525 int verbose_level);
527 int *eqn15, long int *bitangents28,
528 int verbose_level);
530 int *eqn15, long int *bitangents28,
531 int verbose_level);
532 void enumerate_points(int verbose_level);
533 void compute_properties(int verbose_level);
534 void recompute_properties(int verbose_level);
535 void identify_lines(long int *lines, int nb_lines, int *line_idx,
536 int verbose_level);
537 int find_point(long int P, int &idx);
538
539};
540
541
542
543
544// #############################################################################
545// schlaefli_labels.cpp
546// #############################################################################
547
549
550
552
553public:
554
555 long int *Sets; // [30 * 2]
556 int *M; // [6 * 6]
557 long int *Sets2; // [15 * 2]
558
559
560 std::string *Line_label; // [27]
561 std::string *Line_label_tex; // [27]
562
565 void init(int verbose_level);
566};
567
568
569// #############################################################################
570// schlaefli.cpp
571// #############################################################################
572
574
575
577
578public:
579
581
582
584
585#if 0
586 long int *Sets; // [30 * 2]
587 int *M; // [6 * 6]
588 long int *Sets2; // [15 * 2]
589
590 // Schlaefli stuff:
591
592 std::string *Line_label; // [27]
593 std::string *Line_label_tex; // [27]
594#endif
595
596 int *Trihedral_pairs; // [nb_trihedral_pairs * 9]
597 std::string *Trihedral_pair_labels; // [nb_trihedral_pairs]
598 int *Trihedral_pairs_row_sets; // [nb_trihedral_pairs * 3]
599 int *Trihedral_pairs_col_sets; // [nb_trihedral_pairs * 3]
600 int nb_trihedral_pairs; // = 120
601
602 int *Triads;
603 int nb_triads; // = 40
604
607
608 int nb_Eckardt_points; // = 45
610
611 std::string *Eckard_point_label; // [nb_Eckardt_points]
612 std::string *Eckard_point_label_tex; // [nb_Eckardt_points]
613
614 int nb_trihedral_to_Eckardt; // nb_trihedral_pairs * 6
616 // [nb_trihedral_pairs * 6]
617 // first the three rows, then the three columns
618 // long int so that we can induce the action on it
619
620
621
623 // nb_trihedral_pairs * 2
625 // as three subsets of 45 = nb_Eckardt_points
626
628
629
630 // Schlaefli stuff, part2:
631
632
633 long int *Double_six; // [36 * 12]
634 std::string *Double_six_label_tex; // [36]
635
636
637 long int *Half_double_sixes; // [72 * 6]
638 // warning: the half double sixes are sorted individually,
639 // so the pairing between the lines
640 // in the associated double six is gone.
641 std::string *Half_double_six_label_tex; // [72]
642
645
646
647 // Schlaefli stuff, part3:
648
650 // [27 * 27]
651 // indexed by the lines in Schlaefli labeling
652
654 // [27 * 45]
655 // indexed by the lines and tritangent planes in Schlaefli labeling
656
658 // [45 * 3]
659 // long int so that we can induce the action on it
660
661
662
663 schlaefli();
664 ~schlaefli();
665 void init(surface_domain *Surf, int verbose_level);
666 void init_line_data(int verbose_level);
667 void init_Schlaefli_labels(int verbose_level);
669 int line_idx,
670 int &plane1, int &plane2, int verbose_level);
671 void make_triads(int verbose_level);
672 void make_trihedral_pair_disjointness_graph(int *&Adj, int verbose_level);
673 void make_trihedral_pairs(int verbose_level);
674 void process_trihedral_pairs(int verbose_level);
675 int line_ai(int i);
676 int line_bi(int i);
677 int line_cij(int i, int j);
678 int type_of_line(int line);
679 // 0 = a_i, 1 = b_i, 2 = c_ij
680 void index_of_line(int line, int &i, int &j);
681 // returns i for a_i, i for b_i and (i,j) for c_ij
682 int third_line_in_tritangent_plane(int l1, int l2, int verbose_level);
683 void make_Tijk(int *T, int i, int j, int k);
684 void make_Tlmnp(int *T, int l, int m, int n, int p);
685 void make_Tdefght(int *T, int d, int e, int f, int g, int h, int t);
686 void make_Eckardt_points(int verbose_level);
687 void init_Trihedral_to_Eckardt(int verbose_level);
688 int Eckardt_point_from_tritangent_plane(int *tritangent_plane);
689 void init_collinear_Eckardt_triples(int verbose_level);
691 int *E_idx, int nb_E,
692 int *&T_idx, int &nb_T, int verbose_level);
693 void init_double_sixes(int verbose_level);
694 void create_half_double_sixes(int verbose_level);
695 int find_half_double_six(long int *half_double_six);
696 void ijklm2n(int i, int j, int k, int l, int m, int &n);
697 void ijkl2mn(int i, int j, int k, int l, int &m, int &n);
698 void ijk2lmn(int i, int j, int k, int &l, int &m, int &n);
699 void ij2klmn(int i, int j, int &k, int &l, int &m, int &n);
701 int line1, int line2, int transversal,
702 int hds[6],
703 int verbose_level);
704 void prepare_clebsch_map(int ds, int ds_row, int &line1,
705 int &line2, int &transversal, int verbose_level);
706 void init_adjacency_matrix_of_lines(int verbose_level);
708 void set_adjacency_matrix_of_lines(int i, int j);
709 int get_adjacency_matrix_of_lines(int i, int j);
710 int choose_tritangent_plane_for_Clebsch_map(int line_a, int line_b,
711 int transversal_line, int verbose_level);
712
713 void latex_table_of_double_sixes(std::ostream &ost);
714 void latex_table_of_half_double_sixes(std::ostream &ost);
715 void print_Steiner_and_Eckardt(std::ostream &ost);
716 void latex_abstract_trihedral_pair(std::ostream &ost, int t_idx);
717 void latex_table_of_Schlaefli_labeling_of_lines(std::ostream &ost);
718 void latex_trihedral_pair(std::ostream &ost, int *T, long int *TE);
719 void latex_table_of_trihedral_pairs(std::ostream &ost);
720 void latex_triads(std::ostream &ost);
721 void print_trihedral_pairs(std::ostream &ost);
722 void latex_half_double_six(std::ostream &ost, int idx);
723 void latex_table_of_Eckardt_points(std::ostream &ost);
724 void latex_table_of_tritangent_planes(std::ostream &ost);
725 void print_line(std::ostream &ost, int rk);
726 void print_Schlaefli_labelling(std::ostream &ost);
727 void print_set_of_lines_tex(std::ostream &ost, long int *v, int len);
728 void latex_table_of_clebsch_maps(std::ostream &ost);
730 int identify_Eckardt_point(int line1, int line2, int line3, int verbose_level);
731
732};
733
734// #############################################################################
735// seventytwo_cases.cpp
736// #############################################################################
737
739
741
742public:
743
745
746 int f;
747
749 // the tritangent plane picked for the Clebsch map,
750 // using the Schlaefli labeling, in [0,44].
751
752
754 // the index into Lines[] of the
755 // three lines in the chosen tritangent plane
756 // This is computed from the Schlaefli labeling
757 // using the eckardt point class.
758
759 long int three_lines[3];
760 // the three lines in the chosen tritangent plane
761
762
764
765 int Basis_pi[16];
766 int Basis_pi_inv[17]; // in case it is semilinear
767
768 int line_idx; // = i
769 // the index of the line chosen to be P1,P2 in three_lines[3]
770 // three_lines refers to class surfaces_arc_lifting_upstep
771
772 int m1, m2, m3;
773 // rearrangement of three_lines_idx[3]
774 // m1 = line_idx is the line through P1 and P2.
775 // m2 and m3 are the two other lines.
776
777 int l1, l2;
778 // the indices of the two lines defining the Clebsch map.
779 // They pass through m1.
780
781 int line_l1_l2_idx; // = j
782
784 // the 5 transversals of l1 and l2 in Schlaefli labeling
785
786 long int transversals4[4];
787 // the 4 transversals different from m1 in Schlaefli labeling
788
789 long int half_double_six[6];
790 // long int because surf->find_half_double_six() requires it that way
791
793
794 long int P6[6];
795 // the points of intersection of l1, l2, and of the 4 transversals
796 // with the tritangent plane
797
798 long int P6a[6];
799 // the arc after the plane has been moved
800
801 long int L1, L2; // images of l1 and l2 under Alpha1 * Alpha2 * Beta1 * Beta2
802
803 long int P6_local[6];
804 // the moved arc in local coordinates
805
807 // the canonical form of P6_local[]
808
809 long int P6_perm[6];
810 long int P6_perm_mapped[6];
811 long int pair[2];
812 int the_rest[4];
813
816
819
820 int f2;
821
825 int *three_lines_idx, long int *three_lines,
826 int line_idx, int m1, int m2, int m3, int line_l1_l2_idx, int l1, int l2);
827 void compute_arc(surface_object *SO, int verbose_level);
828 // We have chosen a tritangent planes and we know the three lines m1, m2, m3 in it.
829 // The lines l1 and l2 intersect m1 in the first two points.
830 // Computes the 5 transversals to the two lines l1 and l2.
831 // One of these lines must be m1, so we remove that to have 4 lines.
832 // These 4 lines intersect the two other lines m2 and m3 in the other 4 points.
833 // This makes up the arc of 6 points.
834 // They will be stored in P6[6].
835 void compute_partition(int verbose_level);
836 void compute_half_double_six(surface_object *SO, int verbose_level);
837 void print();
838 void report_seventytwo_maps_line(std::ostream &ost);
839 void report_seventytwo_maps_top(std::ostream &ost);
840 void report_seventytwo_maps_bottom(std::ostream &ost);
841 void report_single_Clebsch_map(std::ostream &ost, int verbose_level);
842 void report_Clebsch_map_details(std::ostream &ost, surface_object *SO, int verbose_level);
843 void report_Clebsch_map_aut_coset(std::ostream &ost, int coset, int relative_order, int verbose_level);
844};
845
846
847
848
849// #############################################################################
850// surface_domain.cpp
851// #############################################################################
852
854
855
857
858public:
859 int q;
860 int n; // = 4
861 int n2; // = 2 * n
869
872
873
874 int Basis0[16];
875 int Basis1[16];
876 int Basis2[16];
877
878 // used in line_to_wedge and klein_to_wedge:
879 int *v; // [n]
880 int *v2; // [(n * (n-1)) / 2]
881 int *w2; // [(n * (n-1)) / 2]
882
883 int nb_monomials; // = 20
884
886
887
889 // linear polynomials in three variables
891 // quadratic polynomials in three variables
893 // cubic polynomials in three variables
894
896 // linear polynomials in three variables
898 // quadratic polynomials in three variables
900 // cubic polynomials in three variables
902 // quartic polynomials in three variables
903
905 // linear polynomials in four variables
907 // quadratic polynomials in four variables
909 // cubic polynomials in four variables
910
912
913
919
922
926
927 int *Clebsch_coeffs; // [4 * Poly3->nb_monomials * nb_monomials3]
928 int **CC; // [4 * Poly3->nb_monomials]
929
932 void freeself();
933 void null();
934 void init(field_theory::finite_field *F, int verbose_level);
935 void init_polynomial_domains(int verbose_level);
936 void init_large_polynomial_domains(int verbose_level);
938 int verbose_level);
940 int verbose_level);
942 int verbose_level);
944 int verbose_level);
946 int verbose_level);
947 int index_of_monomial(int *v);
948 void unrank_point(int *v, long int rk);
949 long int rank_point(int *v);
950 void unrank_plane(int *v, long int rk);
951 long int rank_plane(int *v);
952 void enumerate_points(int *coeff,
953 std::vector<long int> &Pts,
954 int verbose_level);
955 void substitute_semilinear(int *coeff_in, int *coeff_out,
956 int f_semilinear, int frob, int *Mtx_inv, int verbose_level);
957 void list_starter_configurations(long int *Lines, int nb_lines,
958 data_structures::set_of_sets *line_intersections, int *&Table, int &N,
959 int verbose_level);
960 void create_starter_configuration(int line_idx, int subset_idx,
961 data_structures::set_of_sets *line_neighbors, long int *Lines, long int *S,
962 int verbose_level);
963 void wedge_to_klein(int *W, int *K);
964 void klein_to_wedge(int *K, int *W);
965 long int line_to_wedge(long int line_rk);
966 void line_to_wedge_vec(long int *Line_rk, long int *Wedge_rk, int len);
967 void line_to_klein_vec(long int *Line_rk, long int *Klein_rk, int len);
968 long int klein_to_wedge(long int klein_rk);
969 void klein_to_wedge_vec(long int *Klein_rk, long int *Wedge_rk, int len);
970 void save_lines_in_three_kinds(std::string &fname_csv,
971 long int *Lines_wedge, long int *Lines, long int *Lines_klein, int nb_lines);
972 int build_surface_from_double_six_and_count_Eckardt_points(long int *double_six, int verbose_level);
973
974
975 // surface_domain2.cpp:
976 void multiply_conic_times_linear(int *six_coeff, int *three_coeff,
977 int *ten_coeff, int verbose_level);
978 void multiply_linear_times_linear_times_linear(int *three_coeff1,
979 int *three_coeff2, int *three_coeff3, int *ten_coeff,
980 int verbose_level);
982 int *four_coeff1, int *four_coeff2, int *four_coeff3,
983 int *twenty_coeff, int verbose_level);
984 void multiply_Poly2_3_times_Poly2_3(int *input1, int *input2,
985 int *result, int verbose_level);
986 void multiply_Poly1_3_times_Poly3_3(int *input1, int *input2,
987 int *result, int verbose_level);
989 int *The_six_plane_equations, int *The_surface_equations,
990 int verbose_level);
991 // The_surface_equations[(q + 1) * 20]
992 long int plane_from_three_lines(long int *three_lines, int verbose_level);
993 void Trihedral_pairs_to_planes(long int *Lines, long int *Planes_by_rank,
994 int verbose_level);
995 // Planes_by_rank[nb_trihedral_pairs * 6]
996 void clebsch_cubics(int verbose_level);
997 void multiply_222_27_and_add(int *M1, int *M2, int *M3,
998 int scalar, int *MM, int verbose_level);
999 void minor22(int **P3, int i1, int i2, int j1, int j2,
1000 int scalar, int *Ad, int verbose_level);
1001 void multiply42_and_add(int *M1, int *M2, int *MM,
1002 int verbose_level);
1003 void prepare_system_from_FG(int *F_planes, int *G_planes,
1004 int lambda, int *&system, int verbose_level);
1005 void compute_nine_lines(int *F_planes, int *G_planes,
1006 long int *nine_lines, int verbose_level);
1007 void compute_nine_lines_by_dual_point_ranks(long int *F_planes_rank,
1008 long int *G_planes_rank, long int *nine_lines, int verbose_level);
1009 void split_nice_equation(int *nice_equation, int *&f1,
1010 int *&f2, int *&f3, int verbose_level);
1011 void assemble_tangent_quadric(int *f1, int *f2, int *f3,
1012 int *&tangent_quadric, int verbose_level);
1014 int tritangent_plane_idx,
1015 int &trihedral_pair_idx, int &position, int verbose_level);
1017 long int *Arc6, int p1_idx, int p2_idx, int partition_rk,
1018 long int line1, long int line2,
1019 int *coeff20, long int *lines27,
1020 int verbose_level);
1022 long int *P6, long int *P6_local, int verbose_level);
1023 void compute_gradient(int *equation20, int *&gradient, int verbose_level);
1024 long int compute_tangent_plane(int *pt_coords, int *equation20, int verbose_level);
1025
1026
1027
1028
1029 // surface_domain_lines.cpp:
1030 void init_Schlaefli(int verbose_level);
1031 void unrank_line(int *v, long int rk);
1032 void unrank_lines(int *v, long int *Rk, int nb);
1033 long int rank_line(int *v);
1034 void build_cubic_surface_from_lines(int len, long int *S, int *coeff,
1035 int verbose_level);
1036 int rank_of_system(int len, long int *S,
1037 int verbose_level);
1038 void create_system(int len, long int *S,
1039 int *&System, int &nb_rows, int verbose_level);
1040 void compute_intersection_points(int *Adj,
1041 long int *Lines, int nb_lines,
1042 long int *&Intersection_pt,
1043 int verbose_level);
1045 long int *Points, int nb_points,
1046 long int *Lines, int nb_lines,
1047 int *&Intersection_pt, int *&Intersection_pt_idx,
1048 int verbose_level);
1049 void lines_meet3_and_skew3(long int *lines_meet3, long int *lines_skew3,
1050 long int *&lines, int &nb_lines, int verbose_level);
1051 void perp_of_three_lines(long int *three_lines, long int *&perp, int &perp_sz,
1052 int verbose_level);
1053 int perp_of_four_lines(long int *four_lines, long int *trans12, int &perp_sz,
1054 int verbose_level);
1055 int rank_of_four_lines_on_Klein_quadric(long int *four_lines,
1056 int verbose_level);
1058 long int *five_pts, long int *double_six,
1059 int verbose_level);
1060 int create_double_six_from_six_disjoint_lines(long int *single_six,
1061 long int *double_six, int verbose_level);
1062 void create_the_fifteen_other_lines(long int *double_six,
1063 long int *fifteen_other_lines, int verbose_level);
1064 int test_double_six_property(long int *S12, int verbose_level);
1066 int *&Adj,
1067 long int *S, int n, int verbose_level);
1069 int *&Adj,
1070 long int *S, int n, int verbose_level);
1072 long int *Pts_on_surface,
1073 int nb_points_on_surface,
1074 long int *Lines, int nb_lines,
1075 data_structures::set_of_sets *&pts_on_lines,
1076 int *&f_is_on_line,
1077 int verbose_level);
1079 long int *&Rk, int &nb_subsets, long int *lines,
1080 int sz, int verbose_level);
1082 int *given_double_six,
1083 long int *New_lines,
1084 int verbose_level);
1085 void rearrange_lines_according_to_double_six(long int *Lines,
1086 int verbose_level);
1088 long int *Lines, long int *New_lines,
1089 int line_idx, int subset_idx, int *Adj,
1090 data_structures::set_of_sets *line_intersections, int verbose_level);
1092 int *four_lines_idx, int b6, int verbose_level);
1093 int intersection_of_five_lines(int *Adj, int *five_lines_idx,
1094 int verbose_level);
1096 long int *New_lines, long int *double_six, int verbose_level);
1097 void create_lines_from_plane_equations(int *The_plane_equations,
1098 long int *Lines, int verbose_level);
1100 long int *double_six, long int *fifteen_lines,
1101 int verbose_level);
1102 long int compute_cij(long int *double_six,
1103 int i, int j, int verbose_level);
1105 long int *&Trans, int &nb_subsets,
1106 long int *lines, int sz, int verbose_level);
1107 int read_schlaefli_label(const char *p);
1108 void read_string_of_schlaefli_labels(std::string &str, int *&v, int &sz, int verbose_level);
1109
1110 // surface_domain_io.cpp:
1111 void print_equation(std::ostream &ost, int *coeffs);
1112 void print_equation_maple(std::stringstream &ost, int *coeffs);
1113 void print_equation_tex(std::ostream &ost, int *coeffs);
1114 void print_equation_with_line_breaks_tex(std::ostream &ost, int *coeffs);
1115 void print_equation_tex_lint(std::ostream &ost, long int *coeffs);
1116 void latex_double_six(std::ostream &ost, long int *double_six);
1118 long int *Wedge_rk, long int *Line_rk, long int *Klein_rk, int nb_lines,
1119 int verbose_level);
1120 void print_equation_in_trihedral_form(std::ostream &ost,
1121 int *the_six_plane_equations, int lambda, int *the_equation);
1122 void print_equation_wrapped(std::ostream &ost, int *the_equation);
1123 void print_lines_tex(std::ostream &ost, long int *Lines, int nb_lines);
1124 void alice(std::ostream &ost, long int *Lines, int nb_lines);
1125 void print_clebsch_P(std::ostream &ost);
1126 void print_clebsch_P_matrix_only(std::ostream &ost);
1127 void print_clebsch_cubics(std::ostream &ost);
1128 void print_system(std::ostream &ost, int *system);
1130 long int *F_planes_rank, long int *G_planes_rank);
1131 void print_basics(std::ostream &ost);
1132 void print_polynomial_domains(std::ostream &ost);
1133 void sstr_line_label(std::stringstream &sstr, long int pt);
1134 void make_table_of_surfaces(int verbose_level);
1136 int *Q_table, int Q_table_len, int verbose_level);
1137 void make_table_of_surfaces2(std::ostream &ost,
1138 int *Q_table, int Q_table_len, int verbose_level);
1139 void table_top(std::ostream &ost);
1140 void table_bottom(std::ostream &ost);
1141 void compute_table_E(
1142 int *field_orders, int nb_fields,
1143 long int *&Table,
1144 int *&Q, int &nb_Q,
1145 int *&E, int &nb_E_types, int verbose_level);
1146
1147
1148 // surface_domain_families.cpp:
1149 void create_equation_general_abcd(int a, int b, int c, int d, int *coeff, int verbose_level);
1150 void create_equation_Cayley_klmn(int k, int l, int m, int n, int *coeff, int verbose_level);
1151 void create_equation_bes(int a, int c, int *coeff, int verbose_level);
1152 void create_equation_F13(int a, int *coeff, int verbose_level);
1153 void create_equation_G13(int a, int *coeff, int verbose_level);
1154 surface_object *create_surface_general_abcd(int a, int b, int c, int d,
1155 int verbose_level);
1156 surface_object *create_surface_bes(int a, int c,
1157 int verbose_level);
1158 surface_object *create_surface_F13(int a, int verbose_level);
1159 surface_object *create_surface_G13(int a, int verbose_level);
1161 int &alpha, int &beta,
1162 int verbose_level);
1163 void create_equation_Eckardt_surface(int a, int b, int *coeff, int verbose_level);
1164 int test_Eckardt_form_alpha_beta(int *coeff, int &alpha, int &beta,
1165 int verbose_level);
1166 void create_Eckardt_double_six(long int *double_six, int a, int b,
1167 int verbose_level);
1168 void create_Eckardt_fifteen_lines(long int *fifteen_lines, int a, int b,
1169 int verbose_level);
1170
1171};
1172
1173void callback_surface_domain_sstr_line_label(std::stringstream &sstr, long int pt, void *data);
1174
1175// #############################################################################
1176// surface_object_properties.cpp
1177// #############################################################################
1178
1180
1181
1183
1184public:
1185
1187
1188
1190 // points are stored as indices into Pts[]
1191 int *f_is_on_line; // [SO->nb_pts]
1192
1193
1197
1198 long int *Eckardt_points; // the orbiter rank of the Eckardt points
1199 int *Eckardt_points_index; // index into SO->Pts
1200 int *Eckardt_points_schlaefli_labels; // Schlaefli labels
1202 // true if the i-th Eckardt point in the Schlaefli labeling is present
1204
1205 int *Eckardt_points_line_type; // [nb_Eckardt_points + 1]
1206 int *Eckardt_points_plane_type; // [SO->Surf->P->Nb_subspaces[2]]
1207
1208 long int *Hesse_planes;
1210 int *Eckardt_point_Hesse_plane_incidence; // [nb_Eckardt_points * nb_Hesse_planes]
1211
1212
1214 int *Axes_index; // [nb_axes] two times the index into trihedral pairs + 0 or +1
1215 long int *Axes_Eckardt_points; // [nb_axes * 3] the Eckardt points in Schlaefli labels that lie on the axes
1217
1218
1219 long int *Double_points;
1222
1223 long int *Single_points;
1226
1229
1234
1235 long int *Tritangent_plane_rk; // [45]
1236 // list of tritangent planes in Schlaefli labeling
1238
1239 long int *Lines_in_tritangent_planes; // [nb_tritangent_planes * 3]
1240
1241 long int *Trihedral_pairs_as_tritangent_planes; // [nb_trihedral_pairs * 6]
1242
1243 long int *All_Planes; // [nb_trihedral_pairs * 6]
1244 int *Dual_point_ranks; // [nb_trihedral_pairs * 6]
1245
1246 int *Adj_line_intersection_graph; // [SO->nb_lines * SO->nb_lines]
1248 int *Line_intersection_pt; // [SO->nb_lines * SO->nb_lines]
1249 int *Line_intersection_pt_idx; // [SO->nb_lines * SO->nb_lines]
1250
1251
1252 int *gradient; // [4 * SO->Surf->Poly2_4->get_nb_monomials()]
1253
1254 long int *singular_pts;
1257
1258 long int *tangent_plane_rank_global; // [SO->nb_pts]
1259 long int *tangent_plane_rank_dual; // [nb_non_singular_pts]
1260
1263 void init(surface_object *SO, int verbose_level);
1264 void compute_properties(int verbose_level);
1265 void compute_axes(int verbose_level);
1266 void compute_gradient(int verbose_level);
1267 void compute_singular_points_and_tangent_planes(int verbose_level);
1269 int verbose_level);
1270 int Adj_ij(int i, int j);
1271 void compute_plane_type_by_points(int verbose_level);
1272 void compute_tritangent_planes_by_rank(int verbose_level);
1273 void compute_Lines_in_tritangent_planes(int verbose_level);
1274 void compute_Trihedral_pairs_as_tritangent_planes(int verbose_level);
1275
1276 void compute_planes_and_dual_point_ranks(int verbose_level);
1277 void print_everything(std::ostream &ost, int verbose_level);
1278 void report_properties(std::ostream &ost, int verbose_level);
1279 void report_properties_simple(std::ostream &ost, int verbose_level);
1280 void print_line_intersection_graph(std::ostream &ost);
1281 void print_adjacency_list(std::ostream &ost);
1282 void print_adjacency_matrix(std::ostream &ost);
1284 std::ostream &ost);
1285 void print_neighbor_sets(std::ostream &ost);
1286 void print_planes_in_trihedral_pairs(std::ostream &ost);
1287 void print_tritangent_planes(std::ostream &ost);
1288 void print_single_tritangent_plane(std::ostream &ost, int plane_idx);
1289
1290
1291 void print_plane_type_by_points(std::ostream &ost);
1292 void print_lines(std::ostream &ost);
1293 void print_lines_with_points_on_them(std::ostream &ost);
1294 void print_equation(std::ostream &ost);
1295 void print_general(std::ostream &ost);
1296 void print_affine_points_in_source_code(std::ostream &ost);
1297 void print_points(std::ostream &ost);
1298 void print_Eckardt_points(std::ostream &ost);
1299 void print_Hesse_planes(std::ostream &ost);
1300 void print_axes(std::ostream &ost);
1301 void print_singular_points(std::ostream &ost);
1302 void print_double_points(std::ostream &ost);
1303 void print_single_points(std::ostream &ost);
1304 void print_points_on_surface(std::ostream &ost);
1305 void print_all_points_on_surface(std::ostream &ost);
1306 void print_points_on_lines(std::ostream &ost);
1307 void print_points_on_surface_but_not_on_a_line(std::ostream &ost);
1308 void print_double_sixes(std::ostream &ost);
1309 void print_half_double_sixes(std::ostream &ost);
1310 void print_half_double_sixes_numerically(std::ostream &ost);
1311 void print_trihedral_pairs(std::ostream &ost);
1312 void print_trihedral_pairs_numerically(std::ostream &ost);
1314 int *T, int nb_T);
1315 void latex_table_of_trihedral_pairs(std::ostream &ost, int *T, int nb_T);
1316 void latex_trihedral_pair(std::ostream &ost, int t_idx);
1317 void make_equation_in_trihedral_form(int t_idx,
1318 int *F_planes, int *G_planes, int &lambda, int *equation,
1319 int verbose_level);
1320 void print_equation_in_trihedral_form(std::ostream &ost,
1321 int *F_planes, int *G_planes, int lambda);
1323 int *F_planes, int *G_planes, int lambda);
1324 void make_and_print_equation_in_trihedral_form(std::ostream &ost, int t_idx);
1325
1326 int compute_transversal_line(int line_a, int line_b,
1327 int verbose_level);
1329 int line_a, int line_b, int *transversals5,
1330 int verbose_level);
1331 void clebsch_map_find_arc_and_lines(long int *Clebsch_map,
1332 long int *Arc, long int *Blown_up_lines, int verbose_level);
1333 void clebsch_map_latex(std::ostream &ost,
1334 long int *Clebsch_map, int *Clebsch_coeff);
1335 void print_Steiner_and_Eckardt(std::ostream &ost);
1336 void latex_table_of_trihedral_pairs(std::ostream &ost);
1337 void latex_trihedral_pair(std::ostream &ost, int *T, long int *TE);
1338 void compute_reduced_set_of_points_not_on_lines_wrt_P(int P_idx, int *&f_deleted, int verbose_level);
1339 int test_full_del_pezzo(int P_idx, int *f_deleted, int verbose_level);
1340 void create_summary_file(std::string &fname,
1341 std::string &surface_label, std::string &col_postfix, int verbose_level);
1342
1343};
1344
1345
1346
1347// #############################################################################
1348// surface_object.cpp
1349// #############################################################################
1350
1352
1353
1355
1356public:
1357 int q;
1360
1361 long int *Pts; // in increasing order
1363
1364
1365 long int *Lines;
1367
1368 int eqn[20];
1369
1371
1372
1373
1376 void freeself();
1377 void null();
1379 int verbose_level);
1380 void init_equation(surface_domain *Surf, int *eqn, int verbose_level);
1381 void enumerate_points(int verbose_level);
1382 void enumerate_points_and_lines(int verbose_level);
1383 void find_real_lines(std::vector<long int> &The_Lines, int verbose_level);
1384 void init_with_27_lines(surface_domain *Surf, long int *Lines27, int *eqn,
1385 int f_find_double_six_and_rearrange_lines, int verbose_level);
1386 void compute_properties(int verbose_level);
1387 void recompute_properties(int verbose_level);
1388 void find_double_six_and_rearrange_lines(long int *Lines, int verbose_level);
1389 void identify_lines(long int *lines, int nb_lines, int *line_idx,
1390 int verbose_level);
1391 void print_nine_lines_latex(std::ostream &ost, long int *nine_lines,
1392 int *nine_lines_idx);
1393 int find_point(long int P, int &idx);
1394
1395
1396};
1397
1398
1399
1400// #############################################################################
1401// web_of_cubic_curves.cpp
1402// #############################################################################
1403
1405
1406
1408
1409public:
1411
1412
1413 long int arc6[6];
1414
1416
1417 int *E_idx;
1418
1419 int *T_idx;
1420 int nb_T;
1421
1422
1426 int six_curves[6 * 10];
1427 int *Web_of_cubic_curves; // [45 * 10]
1429 int *base_curves; // [4 * 10]
1430 long int *The_plane_rank; // [45]
1431 long int *The_plane_duals; // [45]
1432 long int *Dual_point_ranks; // [nb_T * 6]
1433 long int Lines27[27];
1434
1437 void init(surface_domain *Surf, long int *arc6, int verbose_level);
1438 void compute_web_of_cubic_curves(long int *arc6, int verbose_level);
1439 void rank_of_foursubsets(int *&rk, int &N, int verbose_level);
1441 long int *arc6, int *base_curves4,
1442 int verbose_level);
1443 void find_Eckardt_points(int verbose_level);
1444 void find_trihedral_pairs(int verbose_level);
1446 int verbose_level);
1448 int t_idx, int *surface_equation,
1449 int &lambda,
1450 int verbose_level);
1452 long int *arc6, int t_idx,
1453 int &lambda, int &lambda_rk,
1454 int verbose_level);
1455 void find_point_not_on_six_curves(int &pt, int &f_point_was_found,
1456 int verbose_level);
1457 void print_lines(std::ostream &ost);
1458 void print_trihedral_plane_equations(std::ostream &ost);
1460 int *The_six_plane_equations,
1461 long int *plane6, std::ostream &ost);
1463 int *The_surface_equations,
1464 int lambda, int lambda_rk, std::ostream &ost);
1465 void print_dual_point_ranks(std::ostream &ost);
1466 void print_Eckardt_point_data(std::ostream &ost, int verbose_level);
1467 void report_basics(std::ostream &ost, int verbose_level);
1468 void report(std::ostream &ost, int verbose_level);
1469 void print_web_of_cubic_curves(long int *arc6, std::ostream &ost);
1470
1471};
1472
1473
1474
1475
1476}}}
1477
1478
1479
1480
1481
1482#endif /* SRC_LIB_FOUNDATIONS_ALGEBRAIC_GEOMETRY_ALGEBRAIC_GEOMETRY_H_ */
void create_surface(surface_domain *Surf, long int *Arc6, long int line1, long int line2, int verbose_level)
records the images of a specific Clebsch map
void report(std::ostream &ost, int verbose_level)
int compute_Clebsch_map_down_worker(long int *Image_rk, int *Image_coeff, int verbose_level)
void init_half_double_six(surface_object *SO, int hds, int verbose_level)
Definition: clebsch_map.cpp:62
void compute_gradient(int *eqn_in, int verbose_level)
ring_theory::homogeneous_polynomial_domain * Poly
void init(field_theory::finite_field *F, int verbose_level)
Definition: cubic_curve.cpp:68
void compute_inflexion_points(int *eqn_in, long int *Pts_on_curve, int nb_pts_on_curve, long int *Pts, int &nb_pts, int verbose_level)
ring_theory::homogeneous_polynomial_domain * Poly2
void compute_singular_points(int *eqn_in, long int *Pts_on_curve, int nb_pts_on_curve, long int *Pts, int &nb_pts, int verbose_level)
int compute_system_in_RREF(int nb_pts, long int *pt_list, int verbose_level)
void init(geometry::projective_space *P, ring_theory::homogeneous_polynomial_domain *Poly4_3, int verbose_level)
void init(del_pezzo_surface_of_degree_two_domain *Dom, expression_parser::formula *RHS, expression_parser::syntax_tree_node **Subtrees, int *Coefficient_vector, int verbose_level)
information about the Eckardt points of a surface derived from a six-arc
void init(geometry::projective_space *P2, long int *arc6, int verbose_level)
Eckardt point on a cubic surface using the Schlaefli labeling.
void unrank(int rk, int &i, int &j, int &k, int &l, int &m, int &n)
void init6(int i, int j, int k, int l, int m, int n)
void three_lines(surface_domain *S, int *three_lines)
domain for quartic curves in PG(2,q) with 28 bitangents
void compute_points_on_lines(long int *Pts, int nb_points, long int *Lines, int nb_lines, data_structures::set_of_sets *&pts_on_lines, int *&f_is_on_line, int verbose_level)
void print_lines_tex(std::ostream &ost, long int *Lines, int nb_lines)
void multiply_conic_times_line(int *six_coeff, int *three_coeff, int *ten_coeff, int verbose_level)
void multiply_four_lines(int *line1, int *line2, int *line3, int *line4, int *fifteen_coeff, int verbose_level)
void multiply_line_times_line(int *line1, int *line2, int *six_coeff, int verbose_level)
void init(field_theory::finite_field *F, int verbose_level)
void assemble_cubic_surface(int *f1, int *f2, int *f3, int *eqn20, int verbose_level)
void multiply_three_lines(int *line1, int *line2, int *line3, int *ten_coeff, int verbose_level)
void create_surface(quartic_curve_object *Q, int *eqn20, int verbose_level)
void compute_gradient(int *equation15, int *&gradient, int verbose_level)
void multiply_conic_times_conic(int *six_coeff_a, int *six_coeff_b, int *fifteen_coeff, int verbose_level)
properties of a particular quartic curve surface in PG(2,q), as defined by an object of class quartic...
void print_lines_with_points_on_them(std::ostream &ost, long int *Lines, int nb_lines, data_structures::set_of_sets *SoS)
void create_summary_file(std::string &fname, std::string &surface_label, std::string &col_postfix, int verbose_level)
a particular quartic curve in PG(2,q), given by its equation
void init_equation_and_bitangents_and_compute_properties(quartic_curve_domain *Dom, int *eqn15, long int *bitangents28, int verbose_level)
void init_equation_and_bitangents(quartic_curve_domain *Dom, int *eqn15, long int *bitangents28, int verbose_level)
void identify_lines(long int *lines, int nb_lines, int *line_idx, int verbose_level)
void init_equation_but_no_bitangents(quartic_curve_domain *Dom, int *eqn15, int verbose_level)
schlaefli labeling of objects in cubic surfaces with 27 lines
schlaefli labeling of objects in cubic surfaces with 27 lines
void latex_abstract_trihedral_pair(std::ostream &ost, int t_idx)
Definition: schlaefli.cpp:1925
void find_trihedral_pairs_from_collinear_triples_of_Eckardt_points(int *E_idx, int nb_E, int *&T_idx, int &nb_T, int verbose_level)
Definition: schlaefli.cpp:918
int choose_tritangent_plane_for_Clebsch_map(int line_a, int line_b, int transversal_line, int verbose_level)
Definition: schlaefli.cpp:1868
void print_set_of_lines_tex(std::ostream &ost, long int *v, int len)
Definition: schlaefli.cpp:2393
int third_line_in_tritangent_plane(int l1, int l2, int verbose_level)
Definition: schlaefli.cpp:657
void find_tritangent_planes_intersecting_in_a_line(int line_idx, int &plane1, int &plane2, int verbose_level)
Definition: schlaefli.cpp:266
void make_trihedral_pair_disjointness_graph(int *&Adj, int verbose_level)
Definition: schlaefli.cpp:348
void make_Tlmnp(int *T, int l, int m, int n, int p)
Definition: schlaefli.cpp:739
void ijkl2mn(int i, int j, int k, int l, int &m, int &n)
Definition: schlaefli.cpp:1284
void make_Tdefght(int *T, int d, int e, int f, int g, int h, int t)
Definition: schlaefli.cpp:768
void ij2klmn(int i, int j, int &k, int &l, int &m, int &n)
Definition: schlaefli.cpp:1326
void latex_trihedral_pair(std::ostream &ost, int *T, long int *TE)
Definition: schlaefli.cpp:1945
void latex_half_double_six(std::ostream &ost, int idx)
Definition: schlaefli.cpp:2259
void ijklm2n(int i, int j, int k, int l, int m, int &n)
Definition: schlaefli.cpp:1265
void get_half_double_six_associated_with_Clebsch_map(int line1, int line2, int transversal, int hds[6], int verbose_level)
Definition: schlaefli.cpp:1345
void init(surface_domain *Surf, int verbose_level)
Definition: schlaefli.cpp:156
void init_incidence_matrix_of_lines_vs_tritangent_planes(int verbose_level)
Definition: schlaefli.cpp:1818
void prepare_clebsch_map(int ds, int ds_row, int &line1, int &line2, int &transversal, int verbose_level)
Definition: schlaefli.cpp:1643
int identify_Eckardt_point(int line1, int line2, int line3, int verbose_level)
Definition: schlaefli.cpp:2637
void ijk2lmn(int i, int j, int k, int &l, int &m, int &n)
Definition: schlaefli.cpp:1303
description of a Clebsch map with a fixed tritangent plane
void compute_half_double_six(surface_object *SO, int verbose_level)
void init(surface_domain *Surf, int f, int tritangent_plane_idx, int *three_lines_idx, long int *three_lines, int line_idx, int m1, int m2, int m3, int line_l1_l2_idx, int l1, int l2)
void compute_arc(surface_object *SO, int verbose_level)
Computes the six base points in a tritangent plane associated with the Clebsch map defined by two ske...
void report_single_Clebsch_map(std::ostream &ost, int verbose_level)
void report_Clebsch_map_details(std::ostream &ost, surface_object *SO, int verbose_level)
void report_Clebsch_map_aut_coset(std::ostream &ost, int coset, int relative_order, int verbose_level)
void latex_double_six(std::ostream &ost, long int *double_six)
int compute_rank_of_any_four(long int *&Rk, int &nb_subsets, long int *lines, int sz, int verbose_level)
int intersection_of_four_lines_but_not_b6(int *Adj, int *four_lines_idx, int b6, int verbose_level)
void prepare_system_from_FG(int *F_planes, int *G_planes, int lambda, int *&system, int verbose_level)
int compute_transversals_of_any_four(long int *&Trans, int &nb_subsets, long int *lines, int sz, int verbose_level)
void read_string_of_schlaefli_labels(std::string &str, int *&v, int &sz, int verbose_level)
ring_theory::homogeneous_polynomial_domain * Poly3_x123
void multiply_Poly2_3_times_Poly2_3(int *input1, int *input2, int *result, int verbose_level)
int build_surface_from_double_six_and_count_Eckardt_points(long int *double_six, int verbose_level)
void label_variables_27(ring_theory::homogeneous_polynomial_domain *HPD, int verbose_level)
void compute_points_on_lines(long int *Pts_on_surface, int nb_points_on_surface, long int *Lines, int nb_lines, data_structures::set_of_sets *&pts_on_lines, int *&f_is_on_line, int verbose_level)
void label_variables_3(ring_theory::homogeneous_polynomial_domain *HPD, int verbose_level)
int rank_of_four_lines_on_Klein_quadric(long int *four_lines, int verbose_level)
void print_trihedral_pair_in_dual_coordinates_in_GAP(long int *F_planes_rank, long int *G_planes_rank)
int test_double_six_property(long int *S12, int verbose_level)
Given a set of lines in S12[12], test the double six property.
void split_nice_equation(int *nice_equation, int *&f1, int *&f2, int *&f3, int verbose_level)
ring_theory::homogeneous_polynomial_domain * Poly4_x123
void create_equation_bes(int a, int c, int *coeff, int verbose_level)
surface_object * create_surface_general_abcd(int a, int b, int c, int d, int verbose_level)
void compute_intersection_points_and_indices(int *Adj, long int *Points, int nb_points, long int *Lines, int nb_lines, int *&Intersection_pt, int *&Intersection_pt_idx, int verbose_level)
void multiply_222_27_and_add(int *M1, int *M2, int *M3, int scalar, int *MM, int verbose_level)
void line_to_wedge_vec(long int *Line_rk, long int *Wedge_rk, int len)
void alice(std::ostream &ost, long int *Lines, int nb_lines)
void lines_meet3_and_skew3(long int *lines_meet3, long int *lines_skew3, long int *&lines, int &nb_lines, int verbose_level)
void print_equation_maple(std::stringstream &ost, int *coeffs)
void multiply42_and_add(int *M1, int *M2, int *MM, int verbose_level)
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.
void compute_nine_lines(int *F_planes, int *G_planes, long int *nine_lines, int verbose_level)
ring_theory::homogeneous_polynomial_domain * Poly1_4
void create_the_fifteen_other_lines(long int *double_six, long int *fifteen_other_lines, int verbose_level)
Given a double six in double_six[12], compute the 15 remaining lines cij.
void multiply_linear_times_linear_times_linear_in_space(int *four_coeff1, int *four_coeff2, int *four_coeff3, int *twenty_coeff, int verbose_level)
void create_Eckardt_fifteen_lines(long int *fifteen_lines, int a, int b, int verbose_level)
void save_lines_in_three_kinds(std::string &fname_csv, long int *Lines_wedge, long int *Lines, long int *Lines_klein, int nb_lines)
void make_spreadsheet_of_lines_in_three_kinds(data_structures::spreadsheet *&Sp, long int *Wedge_rk, long int *Line_rk, long int *Klein_rk, int nb_lines, int verbose_level)
void minor22(int **P3, int i1, int i2, int j1, int j2, int scalar, int *Ad, int verbose_level)
void klein_to_wedge_vec(long int *Klein_rk, long int *Wedge_rk, int len)
void rearrange_lines_according_to_double_six(long int *Lines, int verbose_level)
Picks a double six and rearranges the lines accordingly.
ring_theory::homogeneous_polynomial_domain * Poly3_24
void Trihedral_pairs_to_planes(long int *Lines, long int *Planes_by_rank, int verbose_level)
ring_theory::homogeneous_polynomial_domain * Poly3_4
void compute_gradient(int *equation20, int *&gradient, int verbose_level)
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 compute_intersection_points(int *Adj, long int *Lines, int nb_lines, long int *&Intersection_pt, int verbose_level)
void create_lines_from_plane_equations(int *The_plane_equations, long int *Lines, int verbose_level)
void enumerate_points(int *coeff, std::vector< long int > &Pts, int verbose_level)
void compute_local_coordinates_of_arc(long int *P6, long int *P6_local, int verbose_level)
void label_variables_4(ring_theory::homogeneous_polynomial_domain *HPD, int verbose_level)
long int compute_tangent_plane(int *pt_coords, int *equation20, int verbose_level)
int test_Eckardt_form_alpha_beta(int *coeff, int &alpha, int &beta, int verbose_level)
ring_theory::homogeneous_polynomial_domain * Poly1_x123
long int plane_from_three_lines(long int *three_lines, int verbose_level)
void perp_of_three_lines(long int *three_lines, long int *&perp, int &perp_sz, int verbose_level)
void line_to_klein_vec(long int *Line_rk, long int *Klein_rk, int len)
surface_object * create_surface_bes(int a, int c, int verbose_level)
void create_equation_general_abcd(int a, int b, int c, int d, int *coeff, int verbose_level)
surface_object * create_Eckardt_surface(int a, int b, int &alpha, int &beta, int verbose_level)
void rearrange_lines_according_to_starter_configuration(long int *Lines, long int *New_lines, int line_idx, int subset_idx, int *Adj, data_structures::set_of_sets *line_intersections, int verbose_level)
void make_table_of_surfaces2(std::ostream &ost, int *Q_table, int Q_table_len, int verbose_level)
void multiply_linear_times_linear_times_linear(int *three_coeff1, int *three_coeff2, int *three_coeff3, int *ten_coeff, int verbose_level)
void create_Eckardt_double_six(long int *double_six, int a, int b, int verbose_level)
void print_equation_with_line_breaks_tex(std::ostream &ost, int *coeffs)
ring_theory::homogeneous_polynomial_domain * Poly6_27
ring_theory::homogeneous_polynomial_domain * Poly2_4
void multiply_Poly1_3_times_Poly3_3(int *input1, int *input2, int *result, 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 do_arc_lifting_with_two_lines(long int *Arc6, int p1_idx, int p2_idx, int partition_rk, long int line1, long int line2, int *coeff20, long int *lines27, int verbose_level)
void label_variables_x123(ring_theory::homogeneous_polynomial_domain *HPD, int verbose_level)
void print_lines_tex(std::ostream &ost, long int *Lines, int nb_lines)
void tritangent_plane_to_trihedral_pair_and_position(int tritangent_plane_idx, int &trihedral_pair_idx, int &position, int verbose_level)
ring_theory::homogeneous_polynomial_domain * Poly2_27
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 substitute_semilinear(int *coeff_in, int *coeff_out, int f_semilinear, int frob, int *Mtx_inv, int verbose_level)
int perp_of_four_lines(long int *four_lines, long int *trans12, int &perp_sz, int verbose_level)
Given four general lines in four_lines[4], complete the two transversal lines.
void compute_table_E(int *field_orders, int nb_fields, long int *&Table, int *&Q, int &nb_Q, int *&E, int &nb_E_types, int verbose_level)
ring_theory::homogeneous_polynomial_domain * Poly4_27
void create_equation_Cayley_klmn(int k, int l, int m, int n, int *coeff, int verbose_level)
void print_equation_wrapped(std::ostream &ost, int *the_equation)
void compute_nine_lines_by_dual_point_ranks(long int *F_planes_rank, long int *G_planes_rank, long int *nine_lines, int verbose_level)
void make_table_of_surfaces_detailed(int *Q_table, int Q_table_len, int verbose_level)
void create_remaining_fifteen_lines(long int *double_six, long int *fifteen_lines, int verbose_level)
void create_equation_Eckardt_surface(int a, int b, int *coeff, int verbose_level)
int create_double_six_from_six_disjoint_lines(long int *single_six, long int *double_six, int verbose_level)
Given a single six in single_six[6], compute the other 6 lines in a double-six.
void print_equation_in_trihedral_form(std::ostream &ost, int *the_six_plane_equations, int lambda, int *the_equation)
void build_cubic_surface_from_lines(int len, long int *S, int *coeff, int verbose_level)
void print_equation_tex_lint(std::ostream &ost, long int *coeffs)
void create_system(int len, long int *S, int *&System, int &nb_rows, int verbose_level)
void sstr_line_label(std::stringstream &sstr, long int pt)
void rearrange_lines_according_to_a_given_double_six(long int *Lines, int *given_double_six, long int *New_lines, int verbose_level)
void label_variables_24(ring_theory::homogeneous_polynomial_domain *HPD, int verbose_level)
void compute_adjacency_matrix_of_line_disjointness_graph(int *&Adj, long int *S, int n, int verbose_level)
Given a set of lines in S[n], compute the associated disjointness graph.
void init(field_theory::finite_field *F, int verbose_level)
long int compute_cij(long int *double_six, int i, int j, int verbose_level)
Computes cij, given a double six.
void create_equations_for_pencil_of_surfaces_from_trihedral_pair(int *The_six_plane_equations, int *The_surface_equations, int verbose_level)
ring_theory::homogeneous_polynomial_domain * Poly2_x123
int intersection_of_five_lines(int *Adj, int *five_lines_idx, int verbose_level)
void assemble_tangent_quadric(int *f1, int *f2, int *f3, int *&tangent_quadric, int verbose_level)
void multiply_conic_times_linear(int *six_coeff, int *three_coeff, int *ten_coeff, int verbose_level)
properties of a particular cubic surface in PG(3,q), as defined by an object of class surface_object
void compute_reduced_set_of_points_not_on_lines_wrt_P(int P_idx, int *&f_deleted, int verbose_level)
void clebsch_map_latex(std::ostream &ost, long int *Clebsch_map, int *Clebsch_coeff)
void clebsch_map_find_arc_and_lines(long int *Clebsch_map, long int *Arc, long int *Blown_up_lines, int verbose_level)
void compute_transversal_lines(int line_a, int line_b, int *transversals5, int verbose_level)
void create_summary_file(std::string &fname, std::string &surface_label, std::string &col_postfix, int verbose_level)
void make_equation_in_trihedral_form(int t_idx, int *F_planes, int *G_planes, int &lambda, int *equation, int verbose_level)
void print_equation_in_trihedral_form(std::ostream &ost, int *F_planes, int *G_planes, int lambda)
void print_equation_in_trihedral_form_equation_only(std::ostream &ost, int *F_planes, int *G_planes, int lambda)
a particular cubic surface in PG(3,q), given by its equation
void init_equation(surface_domain *Surf, int *eqn, 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 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)
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)
a web of cubic curves which is used to create an algebraic variety
void create_web_and_equations_based_on_four_tritangent_planes(long int *arc6, int *base_curves4, int verbose_level)
void create_lambda_from_trihedral_pair_and_arc(long int *arc6, int t_idx, int &lambda, int &lambda_rk, int verbose_level)
void create_surface_equation_from_trihedral_pair(long int *arc6, int t_idx, int *surface_equation, int &lambda, int verbose_level)
void init(surface_domain *Surf, long int *arc6, int verbose_level)
void find_point_not_on_six_curves(int &pt, int &f_point_was_found, int verbose_level)
void print_surface_equations_on_line(int *The_surface_equations, int lambda, int lambda_rk, std::ostream &ost)
void print_the_six_plane_equations(int *The_six_plane_equations, long int *plane6, std::ostream &ost)
a statistical analysis of data consisting of single integers
to rank and unrank subspaces of a fixed dimension in F_q^n
Definition: geometry.h:892
the Klein correspondence between lines in PG(3,q) and points on the Klein quadric
Definition: geometry.h:1353
points and lines in projective space, for instance on a surface
Definition: geometry.h:1822
projective space PG(n,q) of dimension n over Fq
Definition: geometry.h:1916
homogeneous polynomials of a given degree in a given number of variables over a finite field GF(q)
Definition: ring_theory.h:88
partial derivative connects two homogeneous polynomial domains
Definition: ring_theory.h:432
void callback_surface_domain_sstr_line_label(std::stringstream &sstr, long int pt, void *data)
the orbiter library for the classification of combinatorial objects