16namespace layer5_applications {
17namespace applications_in_algebraic_geometry {
18namespace quartic_curves {
136 int f_v = (verbose_level >= 1);
139 cout <<
"quartic_curve_from_surface::init" << endl;
145 cout <<
"quartic_curve_from_surface::init done" << endl;
151 int f_v = (verbose_level >= 1);
156 cout <<
"quartic_curve_from_surface::quartic" << endl;
168 cout <<
"quartic_curve_from_surface::quartic before compute_quartic" << endl;
177 cout <<
"quartic_curve_from_surface::quartic after compute_quartic" << endl;
180 cout <<
"quartic_curve_from_surface::quartic "
181 "equation_nice=" << endl;
189 cout <<
"quartic_curve_from_surface::quartic "
190 "before Surf->split_nice_equation" << endl;
195 cout <<
"quartic_curve_from_surface::quartic "
196 "after Surf->split_nice_equation" << endl;
201 cout <<
"The equation is of the form $x_0^2f_1(x_1,x_2,x_3) "
202 "+ x_0f_2(x_1,x_2,x_3) + f_3(x_1,x_2,x_3)$, where" << endl;
203 cout <<
"f1=" << endl;
206 cout <<
"f2=" << endl;
209 cout <<
"f3=" << endl;
220 cout <<
"quartic_curve_from_surface::quartic "
221 "before Surf_A->A->map_a_set_and_reorder" << endl;
226 cout <<
"quartic_curve_from_surface::quartic "
227 "after Surf_A->A->map_a_set_and_reorder" << endl;
232 cout <<
"the transformed point does not satisfy "
233 "the transformed equation" << endl;
243 cout <<
"error, the transformed point " << i
244 <<
" does not lie on the transformed surface" << endl;
271 cout <<
"quartic_curve_from_surface::quartic before "
272 "Surf->assemble_tangent_quadric" << endl;
281 cout <<
"quartic_curve_from_surface::quartic "
282 "before Surf->Poly2_4->enumerate_points" << endl;
286 vector<long int> Points;
303 <<
" points on the tangent quadric." << endl;
320 type_collected[line_type[i]]++;
326 ost <<
"The line type of the tangent quadric is:" << endl;
329 if (type_collected[i] == 0) {
333 ost << i <<
"^{" << type_collected[i] <<
"}";
335 ost <<
", \\;" << endl;
341 C.get_class_by_value(Class_pts, nb_class_pts,
349 Pts_intersection, nb_pts_intersection);
352 ost <<
"The tangent quadric intersects the cubic surface in "
353 << nb_pts_intersection <<
" points." << endl;
361 cout <<
"quartic_curve_from_surface::quartic before "
362 "Surf->Poly4_x123->enumerate_points" << endl;
365 vector<long int> Points;
378 cout <<
"We found " <<
sz_curve <<
" points on the quartic." << endl;
388 fname_base.assign(surface_prefix);
389 fname_base.append(str);
390 fname_base.append(
"_quartic");
393 cout <<
"quartic_curve_from_surface::quartic "
394 "before GG.create_decomposition_of_projective_plane" << endl;
404 cout <<
"quartic_curve_from_surface::quartic "
405 "after GG.create_decomposition_of_projective_plane" << endl;
418 int *
equation,
long int *Lines,
int nb_lines,
421 int f_v = (verbose_level >= 1);
425 cout <<
"quartic_curve_from_surface::compute_quartic" << endl;
426 cout <<
"pt_orbit=" <<
pt_orbit << endl;
430 cout <<
"quartic_curve_from_surface::compute_quartic "
431 "Orbits_on_points_not_on_lines has not been computed" << endl;
435 cout <<
"quartic_curve_from_surface::compute_quartic "
436 "pt_orbit >= Orbits_on_points_not_on_lines->nb_orbits" << endl;
452 cout <<
"quartic_curve_from_surface::compute_quartic "
453 "pt_A = " <<
pt_A <<
" pt_B=" <<
pt_B << endl;
461 cout <<
"quartic_curve_from_surface::compute_quartic transporter element=" << endl;
469 cout <<
"quartic_curve_from_surface::compute_quartic "
470 "equation_nice=" << endl;
476 cout <<
"quartic_curve_from_surface::compute_quartic mapping the lines" << endl;
492 cout <<
"quartic_curve_from_surface::compute_quartic "
497 for (j = 0; j < 2; j++) {
501 cout <<
"quartic_curve_from_surface::compute_quartic "
507 cout <<
"quartic_curve_from_surface::compute_quartic "
508 "Bitangents[" << i <<
"] = " <<
Bitangents[i] << endl;
512 cout <<
"quartic_curve_from_surface::compute_quartic "
513 "after mapping the lines" << endl;
519 cout <<
"quartic_curve_from_surface::compute_quartic "
520 "before SOA->SO->Surf->compute_tangent_plane" << endl;
527 cout <<
"quartic_curve_from_surface::compute_quartic "
528 "after SOA->SO->Surf->compute_tangent_plane" << endl;
531 cout <<
"quartic_curve_from_surface::compute_quartic "
532 "plane_rk = " << plane_rk << endl;
538 cout <<
"quartic_curve_from_surface::compute_quartic Basis12=" << endl;
544 for (j = 0; j < 2; j++) {
545 Int_vec_copy(Basis12 + (j + 1) * 4 + 1, Basis6 + j * 3, 3);
549 cout <<
"quartic_curve_from_surface::compute_quartic "
555 cout <<
"quartic_curve_from_surface::compute_quartic Lines_nice = ";
563 cout <<
"quartic_curve_from_surface::compute_quartic done" << endl;
570 int f_v = (verbose_level >= 1);
573 cout <<
"quartic_curve_from_surface::compute_stabilizer" << endl;
585 int f_compute_canonical_form =
FALSE;
592 cout <<
"quartic_curve_from_surface::compute_stabilizer "
593 "before OiP->init_point_set" << endl;
599 cout <<
"quartic_curve_from_surface::compute_stabilizer "
600 "after OiP->init_point_set" << endl;
604 int nb_rows, nb_cols;
610 cout <<
"quartic_curve_from_surface::compute_stabilizer nb_rows = " << nb_rows << endl;
611 cout <<
"quartic_curve_from_surface::compute_stabilizer nb_cols = " << nb_cols << endl;
616 cout <<
"quartic_curve_from_surface::compute_stabilizer "
617 "before Nau.set_stabilizer_of_object" << endl;
625 NO->
allocate(nb_rows + nb_cols, 0 );
631 f_compute_canonical_form, Canonical_form,
636 cout <<
"quartic_curve_from_surface::compute_stabilizer "
637 "after Nau.set_stabilizer_of_object" << endl;
648 cout <<
"quartic_curve_from_surface::compute_stabilizer "
649 "pt_stab_order = " << pt_stab_order << endl;
658 cout <<
"quartic_curve_from_surface::compute_stabilizer "
659 "before AonHPD->init" << endl;
663 cout <<
"quartic_curve_from_surface::compute_stabilizer "
664 "after AonHPD->init" << endl;
680 cout <<
"quartic_curve_from_surface::compute_stabilizer "
681 "before Orb->init" << endl;
688 cout <<
"quartic_curve_from_surface::compute_stabilizer "
689 "after Orb->init" << endl;
690 cout <<
"quartic_curve_from_surface::compute_stabilizer "
691 "found an orbit of length " << Orb->
used_length << endl;
698 cout <<
"quartic_curve_from_surface::compute_stabilizer "
699 "before Orb->stabilizer_orbit_rep" << endl;
702 pt_stab_order, verbose_level);
704 cout <<
"quartic_curve_from_surface::compute_stabilizer "
705 "after Orb->stabilizer_orbit_rep" << endl;
716 cout <<
"quartic_curve_from_surface::compute_stabilizer" << endl;
721 std::string &surface_prefix,
723 std::ostream &ost_curves,
727 int f_v = (verbose_level >= 1);
730 cout <<
"quartic_curve_from_surface::cheat_sheet_quartic_curve" << endl;
737 cout <<
"quartic_curve_from_surface::cheat_sheet_quartic_curve "
738 "equation_nice=" << endl;
742 ost <<
"An equivalent surface containing the point (1,0,0,0) "
743 "on no line of the surface is obtained by applying "
744 "the transformation" << endl;
748 ost <<
"Which moves $P_{" <<
pt_A <<
"}$ to $P_{"
749 <<
pt_B <<
"}$." << endl;
751 ost <<
"\\bigskip" << endl;
753 ost <<
"The transformed surface is" << endl;
754 ost <<
"\\begin{align*}" << endl;
755 ost <<
"{\\cal F}^3 &={\\bf \\rm v}(" << endl;
759 ost <<
"\\end{align*}" << endl;
763 ost <<
"The equation is of the form $x_0^2f_1(x_1,x_2,x_3) "
764 "+ x_0f_2(x_1,x_2,x_3) + f_3(x_1,x_2,x_3)$, where" << endl;
765 cout <<
"f1=" << endl;
768 cout <<
"f2=" << endl;
771 cout <<
"f3=" << endl;
775 ost <<
"\\begin{align*}" << endl;
779 ost <<
"\\\\" << endl;
783 ost <<
"\\\\" << endl;
787 ost <<
"\\\\" << endl;
788 ost <<
"\\end{align*}" << endl;
793 ost <<
"The points on the moved surface are:\\\\" << endl;
794 ost <<
"\\begin{multicols}{2}" << endl;
797 ost << i <<
" : $P_{" << i <<
"} = P_{"
800 ost <<
"$\\\\" << endl;
802 ost <<
"\\end{multicols}" << endl;
807 ost <<
"The tangent quadric is given as" << endl;
808 ost <<
"\\begin{align*}" << endl;
809 ost <<
"{\\cal C}_2 = & {\\rm \\bf v}(2x_0 \\cdot f_1 + f_2) = {\\rm \\bf v}(";
812 ost <<
")\\\\" << endl;
813 ost <<
"\\end{align*}" << endl;
817 <<
" points.\\\\" << endl;
821 ost <<
"The points on the tangent quadric are:\\\\" << endl;
822 ost <<
"\\begin{multicols}{2}" << endl;
825 ost << i <<
" : $P_{" << i <<
"} = P_{"
828 ost <<
"$\\\\" << endl;
830 ost <<
"\\end{multicols}" << endl;
841 ost <<
"The intersection points are:\\\\" << endl;
842 ost <<
"\\begin{multicols}{2}" << endl;
843 for (i = 0; i < nb_pts_intersection; i++) {
845 ost << i <<
" : $P_{" << i <<
"} = P_{"
846 << Pts_intersection[i] <<
"}=";
848 ost <<
"$\\\\" << endl;
850 ost <<
"\\end{multicols}" << endl;
854 ost <<
"The quartic curve is given as" << endl;
855 ost <<
"\\begin{align*}" << endl;
856 ost <<
"{\\cal C}_4 = & {\\rm \\bf v}(";
858 ost,
curve, 10 ,
"\\\\\n&");
859 ost <<
")\\\\" << endl;
860 ost <<
"\\end{align*}" << endl;
865 cout <<
"We found " <<
sz_curve <<
" points on "
866 "the quartic curve." << endl;
868 ost <<
"The " <<
sz_curve <<
" points on the "
869 "quartic curve are:\\\\" << endl;
870 ost <<
"\\begin{multicols}{2}" << endl;
873 ost << i <<
" : $P_{" << i <<
"} = P_{"
876 ost <<
"$\\\\" << endl;
878 ost <<
"\\end{multicols}" << endl;
887 ost <<
"\\\\" << endl;
902 ost <<
"The stabilizer of the quartic curve is the following group:\\\\" << endl;
906 ost <<
"The curve has " <<
nb_bitangents <<
" bitangents, they are: ";
908 ost <<
"\\\\" << endl;
916 string fname_row_scheme;
917 string fname_col_scheme;
921 fname_base.assign(surface_prefix);
922 fname_base.append(str);
923 fname_base.append(
"_quartic");
927 fname_row_scheme.assign(fname_base);
928 fname_row_scheme.append(
"_row_scheme.tex");
929 fname_col_scheme.assign(fname_base);
930 fname_col_scheme.append(
"_col_scheme.tex");
935 ost <<
"\\input " << fname_row_scheme << endl;
938 ost <<
"\\input " << fname_col_scheme << endl;
944 cout <<
"quartic_curve_from_surface::cheat_sheet_quartic_curve" << endl;
geometry::projective_space * P2
void unrank_plane(int *v, long int rk)
ring_theory::homogeneous_polynomial_domain * Poly3_x123
void multiply_Poly2_3_times_Poly2_3(int *input1, int *input2, int *result, int verbose_level)
void split_nice_equation(int *nice_equation, int *&f1, int *&f2, int *&f3, int verbose_level)
ring_theory::homogeneous_polynomial_domain * Poly4_x123
geometry::projective_space * P
long int rank_point(int *v)
ring_theory::homogeneous_polynomial_domain * Poly3_4
long int compute_tangent_plane(int *pt_coords, int *equation20, int verbose_level)
ring_theory::homogeneous_polynomial_domain * Poly1_x123
ring_theory::homogeneous_polynomial_domain * Poly2_4
void multiply_Poly1_3_times_Poly3_3(int *input1, int *input2, int *result, int verbose_level)
void unrank_point(int *v, long int rk)
ring_theory::homogeneous_polynomial_domain * Poly2_x123
void assemble_tangent_quadric(int *f1, int *f2, int *f3, int *&tangent_quadric, int verbose_level)
long int * Pts_not_on_lines
surface_object_properties * SOP
compact storage of 0/1-data as bitvectors
void zero(int *v, long int len)
void print_fully(std::ostream &ost, std::vector< int > &v)
output data created by a run of nauty
void allocate(int N, int verbose_level)
a collection of functions related to sorted vectors
void vec_intersect(long int *v1, int len1, long int *v2, int len2, long int *&v3, int &len3)
linear_algebra::linear_algebra * Linear_algebra
various functions related to geometries
void create_decomposition_of_projective_plane(std::string &fname_base, projective_space *P, long int *points, int nb_points, long int *lines, int nb_lines, int verbose_level)
long int rank_lint_here(int *Mtx, int verbose_level)
void unrank_lint_here(int *Mtx, long int rk, int verbose_level)
void line_intersection_type(long int *set, int set_size, int *type, int verbose_level)
void unrank_point(int *v, long int rk)
void scalar_multiply_vector_in_place(int c, int *A, int m)
void add_vector(int *A, int *B, int *C, int m)
data_structures::int_vec * Int_vec
int evaluate_at_a_point_by_rank(int *coeff, int pt)
int evaluate_at_a_point(int *coeff, int *pt_vec)
void enumerate_points(int *coeff, std::vector< long int > &Pts, int verbose_level)
void print_equation(std::ostream &ost, int *coeffs)
void print_equation_with_line_breaks_tex(std::ostream &ost, int *coeffs, int nb_terms_per_line, const char *new_line_text)
a class to represent arbitrary precision integers
void element_print_latex(void *elt, std::ostream &ost)
void element_print_quick(void *elt, std::ostream &ost)
groups::strong_generators * Strong_gens
void map_a_set_and_reorder(long int *set, long int *image_set, int n, int *Elt, int verbose_level)
long int element_image_of(long int a, void *elt, int verbose_level)
Interface to the graph canonization software Nauty.
groups::strong_generators * set_stabilizer_of_object(geometry::object_with_canonical_form *OwCF, action *A_linear, int f_compute_canonical_form, data_structures::bitvector *&Canonical_form, data_structures::nauty_output *&NO, int verbose_level)
a strong generating set for a permutation group with respect to a fixed action
void print_generators_tex()
void make_element_which_moves_a_point_from_A_to_B(actions::action *A_given, int pt_A, int pt_B, int *Elt, int verbose_level)
void group_order(ring_theory::longinteger_object &go)
induced action on the set of homogeneous polynomials over a finite field
void init(actions::action *A, ring_theory::homogeneous_polynomial_domain *HPD, int verbose_level)
void compute_image_int_low_level(int *Elt, int *input, int *output, int verbose_level)
orbit of homogeneous equations using a Schreier tree
groups::strong_generators * stabilizer_orbit_rep(ring_theory::longinteger_object &full_group_order, int verbose_level)
void init(actions::action *A, field_theory::finite_field *F, induced_actions::action_on_homogeneous_polynomials *AonHPD, groups::strong_generators *SG, int *coeff_in, int verbose_level)
an instance of a cubic surface together with its stabilizer
field_theory::finite_field * F
surface_with_action * Surf_A
algebraic_geometry::surface_object * SO
groups::schreier * Orbits_on_points_not_on_lines
algebraic_geometry::surface_domain * Surf
cubic surfaces in projective space with automorphism group
projective_geometry::projective_space_with_action * PA
algebraic_geometry::surface_domain * Surf
induced_actions::action_on_homogeneous_polynomials * AonHPD_3_4
void quartic(std::string &surface_prefix, int pt_orbit, int f_TDO, int verbose_level)
quartic_curve_from_surface()
void compute_stabilizer(int verbose_level)
groups::strong_generators * Stab_gens_quartic
int nb_pts_on_tangent_quadric
void compute_quartic(int pt_orbit, int *equation, long int *Lines, int nb_lines, int verbose_level)
void init(cubic_surfaces_in_general::surface_object_with_action *SOA, int verbose_level)
cubic_surfaces_in_general::surface_object_with_action * SOA
~quartic_curve_from_surface()
long int * Pts_on_surface
long int * Pts_on_tangent_quadric
void cheat_sheet_quartic_curve(std::string &surface_prefix, std::ostream &ost, std::ostream &ost_curves, int f_TDO, int verbose_level)
geometry::projective_space * P
projective_space_with_action * PA2
field_theory::finite_field * F
#define Int_vec_print_fully(A, B, C)
#define Lint_vec_print(A, B, C)
#define Int_matrix_print(A, B, C)
#define Int_vec_copy(A, B, C)
orbiter_kernel_system::orbiter_session * Orbiter
global Orbiter session
std::vector< term > equation
the orbiter library for the classification of combinatorial objects