Orbiter 2022
Combinatorial Objects
quartic_curve_from_surface.cpp
Go to the documentation of this file.
1/*
2 * quartic_curve_from_surface.cpp
3 *
4 * Created on: Jul 15, 2020
5 * Author: betten
6 */
7
8
9
10
11#include "orbiter.h"
12
13using namespace std;
14
15namespace orbiter {
16namespace layer5_applications {
17namespace applications_in_algebraic_geometry {
18namespace quartic_curves {
19
20
22{
23 SOA = NULL;
24 pt_orbit = 0;
25
26 // int equation_nice[20];
27 transporter = NULL;
28 // int v[4];
29 pt_A = pt_B = 0;
30
31 Lines_nice = NULL;
32 nb_lines = 0;
33
34 Bitangents = NULL;
35 nb_bitangents = 0;
36
37 f1 = f2 = f3 = NULL;
38
39 Pts_on_surface = NULL;
41
42 curve = NULL;
43 poly1 = NULL;
44 poly2 = NULL;
45 two = four = mfour = 0;
46 tangent_quadric = NULL;
49
50 //line_type = NULL;
51 //type_collected = NULL;
52
53 //Class_pts = NULL;
54 //nb_class_pts = 0;
55
56 //Pts_intersection = NULL;
57 //nb_pts_intersection = 0;
58
59 Pts_on_curve = NULL;
60 sz_curve = 0;
61
62#if 0
63 gens_copy = NULL;
64 moved_surface = NULL;
65 stab_gens_P0 = NULL;
66#endif
67
68 Stab_gens_quartic = NULL;
69}
70
71
72
73
75{
76 if (transporter) {
78 }
79 if (Lines_nice) {
81 }
82 if (Bitangents) {
84 }
85 if (f1) {
86 FREE_int(f1);
87 }
88 if (f2) {
89 FREE_int(f2);
90 }
91 if (f3) {
92 FREE_int(f3);
93 }
94 if (Pts_on_surface) {
96 }
97 if (curve) {
99 }
100 if (poly1) {
102 }
103 if (poly2) {
105 }
106 if (tangent_quadric) {
108 }
111 }
112 //if (Pts_intersection) {
113 // FREE_lint(Pts_intersection);
114 //}
115 if (Pts_on_curve) {
117 }
118#if 0
119 if (gens_copy) {
120 FREE_OBJECT(gens_copy);
121 }
122 if (moved_surface) {
123 FREE_OBJECT(moved_surface);
124 }
125 if (stab_gens_P0) {
126 FREE_OBJECT(stab_gens_P0);
127 }
128#endif
129 if (Stab_gens_quartic) {
131 }
132}
133
135{
136 int f_v = (verbose_level >= 1);
137
138 if (f_v) {
139 cout << "quartic_curve_from_surface::init" << endl;
140 }
141
143
144 if (f_v) {
145 cout << "quartic_curve_from_surface::init done" << endl;
146 }
147}
148
149void quartic_curve_from_surface::quartic(std::string &surface_prefix, int pt_orbit, int f_TDO, int verbose_level)
150{
151 int f_v = (verbose_level >= 1);
153 int i, a;
154
155 if (f_v) {
156 cout << "quartic_curve_from_surface::quartic" << endl;
157 }
158
159
161 return;
162 }
163
164
166
167 if (f_v) {
168 cout << "quartic_curve_from_surface::quartic before compute_quartic" << endl;
169 }
170
171
172
174 SOA->SO->eqn, SOA->SO->Lines, SOA->SO->nb_lines,
175 verbose_level);
176 if (f_v) {
177 cout << "quartic_curve_from_surface::quartic after compute_quartic" << endl;
178 }
179 if (f_v) {
180 cout << "quartic_curve_from_surface::quartic "
181 "equation_nice=" << endl;
183 cout << endl;
184 }
185
186
187
188 if (f_v) {
189 cout << "quartic_curve_from_surface::quartic "
190 "before Surf->split_nice_equation" << endl;
191 }
193 0 /* verbose_level */);
194 if (f_v) {
195 cout << "quartic_curve_from_surface::quartic "
196 "after Surf->split_nice_equation" << endl;
197 }
198
199
200 if (f_v) {
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;
205 cout << endl;
206 cout << "f2=" << endl;
208 cout << endl;
209 cout << "f3=" << endl;
211 cout << endl;
212 }
213
214
217
218
219 if (f_v) {
220 cout << "quartic_curve_from_surface::quartic "
221 "before Surf_A->A->map_a_set_and_reorder" << endl;
222 }
224 nb_pts_on_surface, transporter, 0 /* verbose_level */);
225 if (f_v) {
226 cout << "quartic_curve_from_surface::quartic "
227 "after Surf_A->A->map_a_set_and_reorder" << endl;
228 }
229 for (i = 0; i < nb_pts_on_surface; i++) {
232 cout << "the transformed point does not satisfy "
233 "the transformed equation" << endl;
234 exit(1);
235 }
236 }
237
238 for (i = 0; i < nb_pts_on_surface; i++) {
239
242 if (a) {
243 cout << "error, the transformed point " << i
244 << " does not lie on the transformed surface" << endl;
245 exit(1);
246 }
247 }
248
249
250
251
252 // the equation of the quartic curve in x1,x2,x3 is
253 // (f_2)^2 - 4*f_1*f_3 = 0
254
259 0 /* verbose_level */);
261 0 /* verbose_level */);
262 two = SOA->F->add(1, 1);
263 four = SOA->F->add(two, two);
264 mfour = SOA->F->negate(four);
268
269
270 if (f_v) {
271 cout << "quartic_curve_from_surface::quartic before "
272 "Surf->assemble_tangent_quadric" << endl;
273 }
275 tangent_quadric, verbose_level);
276
277
279
280 if (f_v) {
281 cout << "quartic_curve_from_surface::quartic "
282 "before Surf->Poly2_4->enumerate_points" << endl;
283 }
284
285 {
286 vector<long int> Points;
287 int h;
288
290 Points,
291 0 /* verbose_level */);
292
293 nb_pts_on_tangent_quadric = Points.size();
294
295 for (h = 0; h < nb_pts_on_tangent_quadric; h++) {
296 Pts_on_tangent_quadric[h] = Points[h];
297 }
298 }
299
300
301 if (f_v) {
302 cout << "We found " << nb_pts_on_tangent_quadric
303 << " points on the tangent quadric." << endl;
304 }
305
306
307
308#if 0
309 line_type = NEW_int(SOA->Surf->P->N_lines);
310
312 nb_pts_on_tangent_quadric, line_type, verbose_level);
313
314
315
316 type_collected = NEW_int(nb_pts_on_tangent_quadric + 1);
317
318 Orbiter->Int_vec.zero(type_collected, nb_pts_on_tangent_quadric + 1);
319 for (i = 0; i < SOA->Surf->P->N_lines; i++) {
320 type_collected[line_type[i]]++;
321 }
322#endif
323
324
325#if 0
326 ost << "The line type of the tangent quadric is:" << endl;
327 ost << "$$" << endl;
328 for (i = 0; i <= nb_pts_on_tangent_quadric; i++) {
329 if (type_collected[i] == 0) {
330 continue;
331 }
332
333 ost << i << "^{" << type_collected[i] <<"}";
334
335 ost << ", \\;" << endl;
336 }
337 ost << "$$" << endl;
338 tally C;
339
340 C.init(line_type, SOA->Surf->P->N_lines, FALSE, 0);
341 C.get_class_by_value(Class_pts, nb_class_pts,
342 SOA->q + 1 /* value */, 0 /* verbose_level */);
343
344
345
346
349 Pts_intersection, nb_pts_intersection);
350
351
352 ost << "The tangent quadric intersects the cubic surface in "
353 << nb_pts_intersection << " points." << endl;
354#endif
355
356
357
358
359
360 if (f_v) {
361 cout << "quartic_curve_from_surface::quartic before "
362 "Surf->Poly4_x123->enumerate_points" << endl;
363 }
364
365 vector<long int> Points;
366 int h;
367
368 SOA->Surf->Poly4_x123->enumerate_points(curve, Points, 0 /* verbose_level */);
369
370 sz_curve = Points.size();
372 for (h = 0; h < sz_curve; h++) {
373 Pts_on_curve[h] = Points[h];
374 }
375
376
377 if (f_v) {
378 cout << "We found " << sz_curve << " points on the quartic." << endl;
379 }
380
381
382 if (f_TDO) {
384 string fname_base;
385 char str[1000];
386
387 sprintf(str, "_orb%d", pt_orbit);
388 fname_base.assign(surface_prefix);
389 fname_base.append(str);
390 fname_base.append("_quartic");
391
392 if (f_v) {
393 cout << "quartic_curve_from_surface::quartic "
394 "before GG.create_decomposition_of_projective_plane" << endl;
395 }
396
398 SOA->Surf_A->PA->PA2->P,
401 verbose_level);
402
403 if (f_v) {
404 cout << "quartic_curve_from_surface::quartic "
405 "after GG.create_decomposition_of_projective_plane" << endl;
406 }
407
408 }
409
410
411
412
413
414}
415
416
418 int *equation, long int *Lines, int nb_lines,
419 int verbose_level)
420{
421 int f_v = (verbose_level >= 1);
422 int fst;
423
424 if (f_v) {
425 cout << "quartic_curve_from_surface::compute_quartic" << endl;
426 cout << "pt_orbit=" << pt_orbit << endl;
427 }
428
429 if (SOA->Orbits_on_points_not_on_lines == NULL) {
430 cout << "quartic_curve_from_surface::compute_quartic "
431 "Orbits_on_points_not_on_lines has not been computed" << endl;
432 exit(1);
433 }
435 cout << "quartic_curve_from_surface::compute_quartic "
436 "pt_orbit >= Orbits_on_points_not_on_lines->nb_orbits" << endl;
437 exit(1);
438 }
439 int i;
440
442 v[0] = 1;
443 v[1] = 0;
444 v[2] = 0;
445 v[3] = 0;
446 pt_B = SOA->Surf->rank_point(v); // = 0
450
451 if (f_v) {
452 cout << "quartic_curve_from_surface::compute_quartic "
453 "pt_A = " << pt_A << " pt_B=" << pt_B << endl;
454 }
455
457 SOA->Surf_A->A,
458 pt_A, pt_B, transporter, verbose_level);
459
460 if (f_v) {
461 cout << "quartic_curve_from_surface::compute_quartic transporter element=" << endl;
462 }
464
466 transporter, equation /*int *input*/,
467 equation_nice /* int *output */, verbose_level);
468 if (f_v) {
469 cout << "quartic_curve_from_surface::compute_quartic "
470 "equation_nice=" << endl;
472 cout << endl;
473 }
474
475 if (f_v) {
476 cout << "quartic_curve_from_surface::compute_quartic mapping the lines" << endl;
477 }
482 for (i = 0; i < nb_lines; i++) {
483
484 int Basis8[8];
485 int Basis6[6];
486 int j;
487
488 Lines_nice[i] = SOA->Surf_A->A2->element_image_of(Lines[i], transporter, 0);
489
491 if (f_v) {
492 cout << "quartic_curve_from_surface::compute_quartic "
493 "Basis8=" << endl;
494 Int_matrix_print(Basis8, 2, 4);
495 }
496
497 for (j = 0; j < 2; j++) {
498 Int_vec_copy(Basis8 + j * 4 + 1, Basis6 + j * 3, 3);
499 }
500 if (f_v) {
501 cout << "quartic_curve_from_surface::compute_quartic "
502 "Basis6=" << endl;
503 Int_matrix_print(Basis6, 2, 3);
504 }
505 Bitangents[i] = SOA->Surf_A->PA->PA2->P->Grass_lines->rank_lint_here(Basis6, 0);
506 if (f_v) {
507 cout << "quartic_curve_from_surface::compute_quartic "
508 "Bitangents[" << i << "] = " << Bitangents[i] << endl;
509 }
510 }
511 if (f_v) {
512 cout << "quartic_curve_from_surface::compute_quartic "
513 "after mapping the lines" << endl;
514 }
515
516 long int plane_rk;
517
518 if (f_v) {
519 cout << "quartic_curve_from_surface::compute_quartic "
520 "before SOA->SO->Surf->compute_tangent_plane" << endl;
521 }
522
523 plane_rk = SOA->SO->Surf->compute_tangent_plane(v, equation_nice, verbose_level);
524
525
526 if (f_v) {
527 cout << "quartic_curve_from_surface::compute_quartic "
528 "after SOA->SO->Surf->compute_tangent_plane" << endl;
529 }
530 if (f_v) {
531 cout << "quartic_curve_from_surface::compute_quartic "
532 "plane_rk = " << plane_rk << endl;
533 }
534 int Basis12[12];
535
536 SOA->Surf->unrank_plane(Basis12, plane_rk);
537 if (f_v) {
538 cout << "quartic_curve_from_surface::compute_quartic Basis12=" << endl;
539 Int_matrix_print(Basis12, 3, 4);
540 }
541 int Basis6[6];
542 int j;
543
544 for (j = 0; j < 2; j++) {
545 Int_vec_copy(Basis12 + (j + 1) * 4 + 1, Basis6 + j * 3, 3);
546 }
548 if (f_v) {
549 cout << "quartic_curve_from_surface::compute_quartic "
550 "Bitangents[nb_lines] = " << Bitangents[nb_lines] << endl;
551 }
552
553
554 if (f_v) {
555 cout << "quartic_curve_from_surface::compute_quartic Lines_nice = ";
557 cout << endl;
558 }
559
560
561
562 if (f_v) {
563 cout << "quartic_curve_from_surface::compute_quartic done" << endl;
564 }
565}
566
567
569{
570 int f_v = (verbose_level >= 1);
571
572 if (f_v) {
573 cout << "quartic_curve_from_surface::compute_stabilizer" << endl;
574 }
576
577 Surf_A = SOA->Surf_A;
578 // compute stabilizer of the set of points:
579
580
581 groups::strong_generators *SG_pt_stab = NULL;
584
585 int f_compute_canonical_form = FALSE;
586 data_structures::bitvector *Canonical_form;
587
588
590
591 if (f_v) {
592 cout << "quartic_curve_from_surface::compute_stabilizer "
593 "before OiP->init_point_set" << endl;
594 }
595 OiP->init_point_set(
597 verbose_level - 1);
598 if (f_v) {
599 cout << "quartic_curve_from_surface::compute_stabilizer "
600 "after OiP->init_point_set" << endl;
601 }
602 OiP->P = Surf_A->PA->PA2->P;
603
604 int nb_rows, nb_cols;
605
606 OiP->encoding_size(
607 nb_rows, nb_cols,
608 verbose_level);
609 if (f_v) {
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;
612 }
613
614
615 if (f_v) {
616 cout << "quartic_curve_from_surface::compute_stabilizer "
617 "before Nau.set_stabilizer_of_object" << endl;
618 }
619
622
624
625 NO->allocate(nb_rows + nb_cols, 0 /* verbose_level */);
626
627
628 SG_pt_stab = Nau.set_stabilizer_of_object(
629 OiP,
630 Surf_A->PA->PA2->A,
631 f_compute_canonical_form, Canonical_form,
632 NO,
633 verbose_level);
634
635 if (f_v) {
636 cout << "quartic_curve_from_surface::compute_stabilizer "
637 "after Nau.set_stabilizer_of_object" << endl;
638 }
639
640 if (f_v) {
641 NO->print_stats();
642 }
643
644 FREE_OBJECT(NO);
645
646 SG_pt_stab->group_order(pt_stab_order);
647 if (f_v) {
648 cout << "quartic_curve_from_surface::compute_stabilizer "
649 "pt_stab_order = " << pt_stab_order << endl;
650 }
651
652 FREE_OBJECT(OiP);
653
655
657 if (f_v) {
658 cout << "quartic_curve_from_surface::compute_stabilizer "
659 "before AonHPD->init" << endl;
660 }
661 AonHPD->init(Surf_A->PA->PA2->A, Surf_A->Surf->Poly4_x123, verbose_level);
662 if (f_v) {
663 cout << "quartic_curve_from_surface::compute_stabilizer "
664 "after AonHPD->init" << endl;
665 }
666
667
668
669
670 // compute the orbit of the equation under the stabilizer of the set of points:
671
672
674
676
677
678#if 1
679 if (f_v) {
680 cout << "quartic_curve_from_surface::compute_stabilizer "
681 "before Orb->init" << endl;
682 }
683 Orb->init(Surf_A->PA->PA2->A, Surf_A->PA->F,
684 AonHPD,
685 SG_pt_stab /* A->Strong_gens*/, curve,
686 verbose_level);
687 if (f_v) {
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;
692 }
693
694
695
696
697 if (f_v) {
698 cout << "quartic_curve_from_surface::compute_stabilizer "
699 "before Orb->stabilizer_orbit_rep" << endl;
700 }
702 pt_stab_order, verbose_level);
703 if (f_v) {
704 cout << "quartic_curve_from_surface::compute_stabilizer "
705 "after Orb->stabilizer_orbit_rep" << endl;
706 }
708#endif
709
710 FREE_OBJECT(SG_pt_stab);
711 FREE_OBJECT(Orb);
712 FREE_OBJECT(AonHPD);
713
714
715 if (f_v) {
716 cout << "quartic_curve_from_surface::compute_stabilizer" << endl;
717 }
718}
719
721 std::string &surface_prefix,
722 std::ostream &ost,
723 std::ostream &ost_curves,
724 int f_TDO,
725 int verbose_level)
726{
727 int f_v = (verbose_level >= 1);
728
729 if (f_v) {
730 cout << "quartic_curve_from_surface::cheat_sheet_quartic_curve" << endl;
731 }
732
733 int i;
734
735
736
737 cout << "quartic_curve_from_surface::cheat_sheet_quartic_curve "
738 "equation_nice=" << endl;
740 cout << endl;
741
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;
745 ost << "$$" << endl;
747 ost << "$$" << endl;
748 ost << "Which moves $P_{" << pt_A << "}$ to $P_{"
749 << pt_B << "}$." << endl;
750 ost << endl;
751 ost << "\\bigskip" << endl;
752 ost << endl;
753 ost << "The transformed surface is" << endl;
754 ost << "\\begin{align*}" << endl;
755 ost << "{\\cal F}^3 &={\\bf \\rm v}(" << endl;
757 equation_nice, 9 /* nb_terms_per_line */, "\\\\\n&");
758 ost << ")" << endl;
759 ost << "\\end{align*}" << endl;
760
761
762
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;
767 cout << endl;
768 cout << "f2=" << endl;
770 cout << endl;
771 cout << "f3=" << endl;
773 cout << endl;
774
775 ost << "\\begin{align*}" << endl;
776 ost << "f_1 = & ";
778 f1, 8 /* nb_terms_per_line */, "\\\\\n");
779 ost << "\\\\" << endl;
780 ost << "f_2 = & ";
782 f2, 8 /* nb_terms_per_line */, "\\\\\n&");
783 ost << "\\\\" << endl;
784 ost << "f_3 = & ";
786 f3, 8 /* nb_terms_per_line */, "\\\\\n");
787 ost << "\\\\" << endl;
788 ost << "\\end{align*}" << endl;
789
790
791
792#if 0
793 ost << "The points on the moved surface are:\\\\" << endl;
794 ost << "\\begin{multicols}{2}" << endl;
795 for (i = 0; i < nb_pts_on_surface; i++) {
797 ost << i << " : $P_{" << i << "} = P_{"
798 << Pts_on_surface[i] << "}=";
799 Orbiter->Int_vec.print_fully(ost, v, 4);
800 ost << "$\\\\" << endl;
801 }
802 ost << "\\end{multicols}" << endl;
803#endif
804
805
806
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}(";
811 tangent_quadric, 8 /* nb_terms_per_line */, "\\\\\n&");
812 ost << ")\\\\" << endl;
813 ost << "\\end{align*}" << endl;
814
815
816 ost << "The tangent quadric has " << nb_pts_on_tangent_quadric
817 << " points.\\\\" << endl;
818
819 //Sorting.lint_vec_heapsort(Pts_on_tangent_quadric, nb_pts_on_tangent_quadric);
820#if 0
821 ost << "The points on the tangent quadric are:\\\\" << endl;
822 ost << "\\begin{multicols}{2}" << endl;
823 for (i = 0; i < nb_pts_on_tangent_quadric; i++) {
825 ost << i << " : $P_{" << i << "} = P_{"
826 << Pts_on_tangent_quadric[i] << "}=";
827 Orbiter->Int_vec.print_fully(ost, v, 4);
828 ost << "$\\\\" << endl;
829 }
830 ost << "\\end{multicols}" << endl;
831#endif
832
833
834
835
836 //ost << "The tangent quadric intersects the cubic surface in "
837 // << nb_pts_intersection << " points." << endl;
838
839
840#if 0
841 ost << "The intersection points are:\\\\" << endl;
842 ost << "\\begin{multicols}{2}" << endl;
843 for (i = 0; i < nb_pts_intersection; i++) {
844 SOA->Surf->unrank_point(v, Pts_intersection[i]);
845 ost << i << " : $P_{" << i << "} = P_{"
846 << Pts_intersection[i] << "}=";
847 Orbiter->Int_vec.print_fully(ost, v, 4);
848 ost << "$\\\\" << endl;
849 }
850 ost << "\\end{multicols}" << endl;
851#endif
852
853
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 /* nb_terms_per_line */, "\\\\\n&");
859 ost << ")\\\\" << endl;
860 ost << "\\end{align*}" << endl;
861
862
863
864
865 cout << "We found " << sz_curve << " points on "
866 "the quartic curve." << endl;
867
868 ost << "The " << sz_curve << " points on the "
869 "quartic curve are:\\\\" << endl;
870 ost << "\\begin{multicols}{2}" << endl;
871 for (i = 0; i < sz_curve; i++) {
873 ost << i << " : $P_{" << i << "} = P_{"
874 << Pts_on_curve[i] << "}=";
875 Int_vec_print_fully(ost, v, 3);
876 ost << "$\\\\" << endl;
877 }
878 ost << "\\end{multicols}" << endl;
879
880
881 for (i = 0; i < sz_curve; i++) {
882 ost << Pts_on_curve[i];
883 if (i < sz_curve - 1) {
884 ost << ", ";
885 }
886 }
887 ost << "\\\\" << endl;
888
889
890 ost_curves << sz_curve << " ";
891 for (i = 0; i < sz_curve; i++) {
892 ost_curves << Pts_on_curve[i];
893 if (i < sz_curve - 1) {
894 ost_curves << " ";
895 }
896 }
897 ost_curves << endl;
898
899
900
901
902 ost << "The stabilizer of the quartic curve is the following group:\\\\" << endl;
904
905
906 ost << "The curve has " << nb_bitangents << " bitangents, they are: ";
908 ost << "\\\\" << endl;
909
910
911
912 if (f_TDO) {
913 string fname_base;
914 char str[1000];
915
916 string fname_row_scheme;
917 string fname_col_scheme;
918
919
920 sprintf(str, "_orb%d", pt_orbit);
921 fname_base.assign(surface_prefix);
922 fname_base.append(str);
923 fname_base.append("_quartic");
924
925
926
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");
931
932
933 ost << endl << endl;
934 ost << "$$" << endl;
935 ost << "\\input " << fname_row_scheme << endl;
936 ost << "$$" << endl;
937 ost << "$$" << endl;
938 ost << "\\input " << fname_col_scheme << endl;
939 ost << "$$" << endl;
940 ost << endl << endl;
941 }
942
943 if (f_v) {
944 cout << "quartic_curve_from_surface::cheat_sheet_quartic_curve" << endl;
945 }
946}
947
948
949}}}}
950
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
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)
ring_theory::homogeneous_polynomial_domain * Poly2_x123
void assemble_tangent_quadric(int *f1, int *f2, int *f3, int *&tangent_quadric, int verbose_level)
compact storage of 0/1-data as bitvectors
void print_fully(std::ostream &ost, std::vector< int > &v)
Definition: int_vec.cpp:513
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)
Definition: sorting.cpp:741
various functions related to geometries
Definition: geometry.h:721
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)
Definition: grassmann.cpp:275
void unrank_lint_here(int *Mtx, long int rk, int verbose_level)
Definition: grassmann.cpp:269
a combinatorial object for which a canonical form can be computed using Nauty
Definition: geometry.h:1487
void encoding_size(int &nb_rows, int &nb_cols, int verbose_level)
void line_intersection_type(long int *set, int set_size, int *type, int verbose_level)
void enumerate_points(int *coeff, std::vector< long int > &Pts, int verbose_level)
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
Definition: ring_theory.h:366
void element_print_latex(void *elt, std::ostream &ost)
Definition: action_cb.cpp:364
void element_print_quick(void *elt, std::ostream &ost)
Definition: action_cb.cpp:353
groups::strong_generators * Strong_gens
Definition: actions.h:130
void map_a_set_and_reorder(long int *set, long int *image_set, int n, int *Elt, int verbose_level)
Definition: action.cpp:698
long int element_image_of(long int a, void *elt, int verbose_level)
Definition: action_cb.cpp:198
Interface to the graph canonization software Nauty.
Definition: actions.h:1154
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
Definition: groups.h:1703
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)
orbit of homogeneous equations using a Schreier tree
Definition: orbits.h:30
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)
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)
void cheat_sheet_quartic_curve(std::string &surface_prefix, std::ostream &ost, std::ostream &ost_curves, int f_TDO, int verbose_level)
#define FREE_int(p)
Definition: foundations.h:640
#define Int_vec_print_fully(A, B, C)
Definition: foundations.h:687
#define NEW_OBJECT(type)
Definition: foundations.h:638
#define Lint_vec_print(A, B, C)
Definition: foundations.h:686
#define FREE_OBJECT(p)
Definition: foundations.h:651
#define NEW_int(n)
Definition: foundations.h:625
#define Int_matrix_print(A, B, C)
Definition: foundations.h:707
#define FALSE
Definition: foundations.h:234
#define Int_vec_copy(A, B, C)
Definition: foundations.h:693
#define FREE_lint(p)
Definition: foundations.h:642
#define NEW_lint(n)
Definition: foundations.h:628
orbiter_kernel_system::orbiter_session * Orbiter
global Orbiter session
the orbiter library for the classification of combinatorial objects