Orbiter 2022
Combinatorial Objects
surfaces_and_arcs.h
Go to the documentation of this file.
1/*
2 * surfaces_and_arcs.h
3 *
4 * Created on: Jun 26, 2021
5 * Author: betten
6 */
7
8#ifndef SRC_LIB_TOP_LEVEL_SURFACES_SURFACES_AND_ARCS_SURFACES_AND_ARCS_H_
9#define SRC_LIB_TOP_LEVEL_SURFACES_SURFACES_AND_ARCS_SURFACES_AND_ARCS_H_
10
11namespace orbiter {
12namespace layer5_applications {
13namespace applications_in_algebraic_geometry {
14namespace cubic_surfaces_and_arcs {
15
16
17// #############################################################################
18// arc_lifting.cpp
19// #############################################################################
20
22
23
25
26public:
27
28 int q;
29 field_theory::finite_field *F;
30
31 algebraic_geometry::surface_domain *Surf;
32
34
35 long int *arc;
37
38
39
40
41
42 int *the_equation; // [20]
43
44 algebraic_geometry::web_of_cubic_curves *Web;
45
46
48
51 void null();
52 void freeself();
55 int verbose_level);
56 void create_web_of_cubic_curves(int verbose_level);
57 void report(std::ostream &ost, int verbose_level);
58 void report_equation(std::ostream &ost);
59};
60
61
62// #############################################################################
63// arc_orbits_on_pairs.cpp
64// #############################################################################
65
67
68
70public:
71
73
74 actions::action *A; // this is the 3x3 group
75
76 data_structures_groups::set_and_stabilizer *The_arc;
77 actions::action *A_on_arc;
78
80 poset_classification::poset_with_group_action *Poset;
81 poset_classification::poset_classification_control *Control;
82 poset_classification::poset_classification *Orbits_on_pairs;
83
85
86 arc_partition *Table_orbits_on_partition; // [nb_orbits_on_pairs]
87
89
90 int *partition_orbit_first; // [nb_orbits_on_pairs]
91 int *partition_orbit_len; // [nb_orbits_on_pairs]
92
93
96 void null();
97 void freeself();
98 void init(
100 actions::action *A,
101 int verbose_level);
102 void print();
103 void recognize(long int *pair, int *transporter,
104 int &orbit_idx, int verbose_level);
105
106};
107
108
109// #############################################################################
110// arc_partition.cpp
111// #############################################################################
112
114
115
117public:
118
120
121 actions::action *A;
122 actions::action *A_on_arc;
123
125 data_structures_groups::set_and_stabilizer *The_pair;
126
127 long int arc_remainder[4];
128
129 actions::action *A_on_rest;
130 actions::action *A_on_partition;
131
132 groups::schreier *Orbits_on_partition;
133
135
136
139 void null();
140 void freeself();
141 void init(
143 actions::action *A, actions::action *A_on_arc,
144 int verbose_level);
145 void recognize(int *partition, int *transporter,
146 int &orbit_idx, int verbose_level);
147
148};
149
150
151// #############################################################################
152// classify_trihedral_pairs.cpp
153// #############################################################################
154
155
157
158
160
161public:
162
163 int q;
164 field_theory::finite_field *F; // do not free
165 actions::action *A; // do not free
166
168 algebraic_geometry::surface_domain *Surf; // do not free
169
170 groups::strong_generators *gens_type1;
171 groups::strong_generators *gens_type2;
172
173 poset_classification::poset_with_group_action *Poset1;
174 poset_classification::poset_with_group_action *Poset2;
175 poset_classification::poset_classification *orbits_on_trihedra_type1;
176 poset_classification::poset_classification *orbits_on_trihedra_type2;
177
181
182 invariant_relations::flag_orbits *Flag_orbits;
183
185
186 invariant_relations::classification_step *Trihedral_pairs;
187
188
189
192 void null();
193 void freeself();
195 int verbose_level);
196
198 poset_classification::poset_classification_control *Control1,
199 poset_classification::poset_classification_control *Control2,
200 int verbose_level);
201 void report_summary(std::ostream &ost);
202 void report(std::ostream &ost);
203 void list_orbits_on_trihedra_type1(std::ostream &ost, int f_detailed);
204 void list_orbits_on_trihedra_type2(std::ostream &ost, int f_detailed);
205 void early_test_func_type1(long int *S, int len,
206 long int *candidates, int nb_candidates,
207 long int *good_candidates, int &nb_good_candidates,
208 int verbose_level);
209 void early_test_func_type2(long int *S, int len,
210 long int *candidates, int nb_candidates,
211 long int *good_candidates, int &nb_good_candidates,
212 int verbose_level);
213 void identify_three_planes(int p1, int p2, int p3,
214 int &type, int *transporter, int verbose_level);
215 void classify(
216 poset_classification::poset_classification_control *Control1,
217 poset_classification::poset_classification_control *Control2,
218 int verbose_level);
219 void downstep(int verbose_level);
220 void upstep(int verbose_level);
221 void print_trihedral_pairs_summary(std::ostream &ost);
222 void print_trihedral_pairs(std::ostream &ost,
223 int f_with_stabilizers);
224 groups::strong_generators *identify_trihedral_pair_and_get_stabilizer(
225 long int *planes6, int *transporter, int &orbit_index,
226 int verbose_level);
227 void identify_trihedral_pair(long int *planes6,
228 int *transporter, int &orbit_index, int verbose_level);
229
230};
231
232
233
234
235// #############################################################################
236// six_arcs_not_on_a_conic.cpp
237// #############################################################################
238
240
241
243
244public:
245
246 //projective_space *P2; // do not free
249
251
253
256
259 void null();
260 void freeself();
261 void init(
264 int f_test_nb_Eckardt_points, int nb_E,
265 //algebraic_geometry::surface_domain *Surf,
266 int verbose_level);
267 void recognize(long int *arc6, int *transporter,
268 int &orbit_not_on_conic_idx, int verbose_level);
269 void report_latex(std::ostream &ost);
270 void report_specific_arc_basic(std::ostream &ost, int arc_idx);
271 void report_specific_arc(std::ostream &ost, int arc_idx);
272};
273
274
275
276// #############################################################################
277// surface_classify_using_arc.cpp
278// #############################################################################
279
281
282
284public:
285
287
288
289
292
294
295
298 // allocated as [Six_arcs->nb_arcs_not_on_conic], used as [nb_surfaces]
299
301 int *Arc_identify; // [Six_arcs->nb_arcs_not_on_conic]
302 //[Six_arcs->nb_arcs_not_on_conic * Six_arcs->nb_arcs_not_on_conic]
303 int *f_deleted; // [Six_arcs->nb_arcs_not_on_conic]
304
305 int *Decomp; // [Six_arcs->nb_arcs_not_on_conic * nb_surfaces]
306
310 poset_classification::poset_classification_control *Control_six_arcs,
312 int f_test_nb_Eckardt_points, int nb_E,
313 int verbose_level);
314 void report(
315 graphics::layered_graph_draw_options *Opt,
316 int verbose_level);
317 void report2(std::ostream &ost,
318 graphics::layered_graph_draw_options *Opt,
319 int verbose_level);
320 void report_decomposition_matrix(std::ostream &ost, int verbose_level);
321};
322
323// #############################################################################
324// surface_create_by_arc_lifting.cpp
325// #############################################################################
326
328
329
331public:
332
334
337 long int *Arc6;
338
339
341
343
344
346 std::string arc_label;
347 std::string arc_label_short;
348
349 cubic_surfaces_in_general::surface_clebsch_map *Clebsch; // [SOA->Orbits_on_single_sixes->nb_orbits]
350 int *Other_arc_idx; // [SOA->Orbits_on_single_sixes->nb_orbits]
351
354 void init(int arc_idx,
355 surface_classify_using_arc *SCA, int verbose_level);
356 void report_summary(std::ostream &ost, int verbose_level);
357 void report(std::ostream &ost,
358 graphics::layered_graph_draw_options *Opt,
359 int verbose_level);
360
361};
362
363
364// #############################################################################
365// surfaces_arc_lifting_definition_node.cpp
366// #############################################################################
367
368
369
371
372
374public:
375
377
378 int f;
380
381 algebraic_geometry::surface_object *SO;
383
384
385
386 groups::strong_generators *Flag_stab_gens;
387 ring_theory::longinteger_object Flag_stab_go;
388
389
390 int three_lines_idx[45 * 3];
391 // the index into Lines[] of the
392 // three lines in the chosen tritangent plane
393 // This is computed from the Schlaefli labeling
394 // using the eckardt point class.
395
396 long int three_lines[45 * 3];
397 // the three lines in the chosen tritangent plane
398
399
400
401 algebraic_geometry::seventytwo_cases Seventytwo[45 * 72];
402 // for each of the 45 tritangent planes,
403 // there are 72 Clebsch maps
404
405
407 surfaces_arc_lifting_trace **T; // [nb_coset_reps]
408 data_structures_groups::vector_ge *coset_reps;
409
410 int *relative_order_table; // [nb_coset_reps]
411
413 int *F2; // F2[i] = Seventytwo[i].f2;
414 data_structures::tally *tally_F2;
415
416
420 int f, int orbit_idx, long int *Lines27, int *eqn20,
421 int verbose_level);
422 void tally_f2(int verbose_level);
423 void report(int verbose_level);
424 void report2(std::ostream &ost, int verbose_level);
425 void report_cosets(std::ostream &ost, int verbose_level);
426 void report_cosets_detailed(std::ostream &ost, int verbose_level);
427 void report_cosets_HDS(std::ostream &ost, int verbose_level);
428 void report_HDS_top(std::ostream &ost);
429 void report_HDS_bottom(std::ostream &ost);
430 void report_cosets_T3(std::ostream &ost, int verbose_level);
431 void report_T3_top(std::ostream &ost);
432 void report_T3_bottom(std::ostream &ost);
433 void report_tally_F2(std::ostream &ost, int verbose_level);
434 void report_Clebsch_maps(std::ostream &ost, int verbose_level);
436 int plane_idx, int verbose_level);
437};
438
439
440// #############################################################################
441// surfaces_arc_lifting_trace.cpp
442// #############################################################################
443
444
445
447
448
450public:
451
453
454 int f, f2;
455
456 int po, so;
457
458 // po = Lift->Flag_orbits->Flag_orbit_node[f].downstep_primary_orbit;
459 // so = Lift->Flag_orbits->Flag_orbit_node[f].downstep_secondary_orbit;
460
461 // 3x3 matrices of elements in PGGL(3,q)
463 // Using local coordinates P6_local[6],
464 // maps the arc P6[6] to the canonical arc in the classification.
466 // Moves the arc points on m1 to P1 and P2.
467 // Computed using
468 // Table_orbits_on_pairs[orbit_not_on_conic_idx].recognize
470 // Moves the partition, computed using
471 // Table_orbits_on_partition[pair_orbit_idx].recognize
472
473 // temporary matrices
474 int *Elt_T1;
475 int *Elt_T2;
476 int *Elt_T3;
477 int *Elt_T4;
478
479 // 4x4 matrices or elements in PGGL(4,q):
481 // Moves the chosen tritangent plane to the hyperplane X3=0
482
483 int *Elt_Alpha2; // embedding of alpha2
484 int *Elt_Beta1; // embedding of beta1
485 int *Elt_Beta2; // embedding of beta2
487 // Moves the two lines which are the images of l1 and l2
488 // under the group elements computed so far
489 // to the canonical ones associated with the flag f2.
490 // Computed with hyperplane_lifting_with_two_lines_moved
491
492 // if f2 = f then
493 // Alpha1 * Alpha2 * Beta1 * Beta2 * Beta3
494 // is an automorphism of the surface
495
496
498
499
500
502
503 algebraic_geometry::seventytwo_cases The_case;
504
505
509 int seventytwo_case_idx, int verbose_level);
510 void process_flag_orbit(surfaces_arc_lifting_upstep *Up, int verbose_level);
511 void move_arc(int verbose_level);
512 void move_plane_and_arc(long int *P6a, int verbose_level);
514 long int *P6_local, long int *P6_local_canonical,
515 int &orbit_not_on_conic_idx, int verbose_level);
516 void compute_beta1(algebraic_geometry::seventytwo_cases *The_case, int verbose_level);
517 void compute_beta2(int orbit_not_on_conic_idx,
518 int pair_orbit_idx, int &partition_orbit_idx,
519 int *the_partition4, int verbose_level);
520 void lift_group_elements_and_move_two_lines(int verbose_level);
521 void embed(int *Elt_A3, int *Elt_A4, int verbose_level);
522 void report_product(std::ostream &ost, int *Elt, int verbose_level);
523
524};
525
526
527
528// #############################################################################
529// surfaces_arc_lifting_upstep.cpp
530// #############################################################################
531
532
533
534
536
537
539public:
540
542
543 int *f_processed; // [Lift->Flag_orbits->nb_flag_orbits]
545
549 // used only in upstep_group_elements
550
551 ring_theory::longinteger_object A4_go;
552
553
554 double progress;
555 long int Lines[27];
556 int eqn20[20];
557
558
560
561 //vector_ge *coset_reps;
562 //int nb_coset_reps;
563
564 //strong_generators *Flag_stab_gens;
565 //longinteger_object Flag_stab_go;
566
567 int f;
568
570 // the tritangent plane picked for the Clebsch map,
571 // using the Schlaefli labeling, in [0,44].
572
573
575 // the index into Lines[] of the
576 // three lines in the chosen tritangent plane
577 // This is computed from the Schlaefli labeling
578 // using the eckardt point class.
579
580 long int three_lines[3];
581 // the three lines in the chosen tritangent plane
582
583
584
585 algebraic_geometry::seventytwo_cases Seventytwo[72];
586
588
589
592 void init(surfaces_arc_lifting *Lift, int verbose_level);
593 void process_flag_orbit(int verbose_level);
595 groups::strong_generators *&Aut_gens, int verbose_level);
597 int verbose_level);
598 void make_seventytwo_cases(int verbose_level);
599
600};
601
602
603
604
605
606// #############################################################################
607// surfaces_arc_lifting.cpp
608// #############################################################################
609
611
612
614public:
615 field_theory::finite_field *F;
616 int q;
617 groups::linear_group *LG4; // PGL(4,q)
618
620
621 std::string fname_base;
622
623 actions::action *A4; // the action of PGL(4,q) on points
624 actions::action *A3; // the action of PGL(3,q) on points
625
626 algebraic_geometry::surface_domain *Surf;
628
630
632 // [Six_arcs->nb_arcs_not_on_conic]
633
635
636 // classification of surfaces:
637 invariant_relations::flag_orbits *Flag_orbits;
638
639 int *flag_orbit_fst; // [Six_arcs->nb_arcs_not_on_conic]
640 int *flag_orbit_len; // [Six_arcs->nb_arcs_not_on_conic]
641
642 int *flag_orbit_on_arcs_not_on_a_conic_idx; // [Flag_orbits->nb_flag_orbits]
643 int *flag_orbit_on_pairs_idx; // [Flag_orbits->nb_flag_orbits]
644 int *flag_orbit_on_partition_idx; // [Flag_orbits->nb_flag_orbits]
645
646 invariant_relations::classification_step *Surfaces;
647
650 void null();
651 void freeself();
652 void init(
654 poset_classification::poset_classification_control *Control_six_arcs,
655 int f_test_nb_Eckardt_points, int nb_E,
656 int verbose_level);
657 void downstep(int verbose_level);
658 void downstep_one_arc(int arc_idx,
659 int &cur_flag_orbit, long int *Flag, int verbose_level);
660 void report(
661 graphics::layered_graph_draw_options *draw_options,
662 int verbose_level);
663 void report2(std::ostream &ost,
664 graphics::layered_graph_draw_options *draw_options,
665 int verbose_level);
666 void report_flag_orbits(std::ostream &ost, int verbose_level);
667 void report_flag_orbits_in_detail(std::ostream &ost, int verbose_level);
668 void report_surfaces_in_detail(std::ostream &ost, int verbose_level);
669};
670
671
672
673// #############################################################################
674// trihedral_pair_with_action.cpp
675// #############################################################################
676
678
679
681
682public:
683
685
686 int The_six_plane_equations[6 * 4]; // [6 * 4]
687 int *The_surface_equations; // [(q + 1) * 20]
690 int t_idx;
691
692 groups::strong_generators *stab_gens_trihedral_pair; // stabilizer of trihedral pair
693 groups::strong_generators *gens_subgroup;
694 ring_theory::longinteger_object stabilizer_of_trihedral_pair_go;
695 actions::action *A_on_equations;
696 groups::schreier *Orb;
697 ring_theory::longinteger_object stab_order;
699 data_structures_groups::vector_ge *cosets;
700
701 data_structures_groups::vector_ge *coset_reps;
702 long int nine_lines[9];
705 groups::strong_generators *Aut_gens;
706
707
708 int F_plane[3 * 4];
709 int G_plane[3 * 4];
710 int *System; // [3 * 4 * 3]
711 //int nine_lines[9];
712
714 data_structures::tally *Double_triplet_type_distribution;
715 data_structures::set_of_sets *Double_triplet_types;
718
721 int *Elt1;
722 int *Elt2;
723 int *Elt3;
724 int *Elt4;
725 int *Elt5;
726
727
730 void init(arc_lifting *AL, int verbose_level);
732 data_structures_groups::vector_ge *cosets,
733 data_structures_groups::vector_ge *&coset_reps,
734 int *&aut_T_index, int *&aut_coset_index, int verbose_level);
736 int verbose_level);
738 int t_idx,
739 int verbose_level);
740 // plane6[6]
741 // The_six_plane_equations[6 * 4]
742 // The_surface_equations[(q + 1) * 20]
743 groups::strong_generators *create_stabilizer_of_trihedral_pair(
744 int &trihedral_pair_orbit_index, int verbose_level);
747 groups::strong_generators *gens_for_stabilizer_of_trihedral_pair,
748 actions::action *&A_on_equations, groups::schreier *&Orb,
749 int verbose_level);
750 void create_clebsch_system(int verbose_level);
751 void compute_iso_types_as_double_triplets(int verbose_level);
752 void print_FG(std::ostream &ost);
753 void print_equations();
754 void report(std::ostream &ost, int verbose_level);
755 void report_iso_type_as_double_triplets(std::ostream &ost);
756
757};
758
759
760
761
762}}}}
763
764
765
766
767
768
769#endif /* SRC_LIB_TOP_LEVEL_SURFACES_SURFACES_AND_ARCS_SURFACES_AND_ARCS_H_ */
void early_test_func_type2(long int *S, int len, long int *candidates, int nb_candidates, long int *good_candidates, int &nb_good_candidates, int verbose_level)
void classify_orbits_on_trihedra(poset_classification::poset_classification_control *Control1, poset_classification::poset_classification_control *Control2, int verbose_level)
void early_test_func_type1(long int *S, int len, long int *candidates, int nb_candidates, long int *good_candidates, int &nb_good_candidates, int verbose_level)
groups::strong_generators * identify_trihedral_pair_and_get_stabilizer(long int *planes6, int *transporter, int &orbit_index, int verbose_level)
void classify(poset_classification::poset_classification_control *Control1, poset_classification::poset_classification_control *Control2, int verbose_level)
void compute_stabilizer(surfaces_arc_lifting_definition_node *D, groups::strong_generators *&Aut_gens, int verbose_level)
void init(surfaces_arc_lifting *SAL, int arc_idx, actions::action *A, int verbose_level)
void init_with_27_lines(surfaces_arc_lifting *Lift, int f, int orbit_idx, long int *Lines27, int *eqn20, int verbose_level)
tracing data to be used during the classification of cubic surfaces using lifted 6-arcs
void compute_beta2(int orbit_not_on_conic_idx, int pair_orbit_idx, int &partition_orbit_idx, int *the_partition4, int verbose_level)
void make_arc_canonical(long int *P6_local, long int *P6_local_canonical, int &orbit_not_on_conic_idx, int verbose_level)
a Clebsch map associated with a cubic surface and a choice of half double six
void classify_surfaces_through_arcs_and_trihedral_pairs(poset_classification::poset_classification_control *Control_six_arcs, cubic_surfaces_in_general::surface_with_action *Surf_A, int f_test_nb_Eckardt_points, int nb_E, int verbose_level)
void create_surface_and_group(cubic_surfaces_in_general::surface_with_action *Surf_A, long int *Arc6, int verbose_level)
Definition: arc_lifting.cpp:64
orbits on the partitions of the remaining four points of a non-conical arc
void init(arc_orbits_on_pairs *OP, int pair_orbit_idx, actions::action *A, actions::action *A_on_arc, int verbose_level)
void recognize(int *partition, int *transporter, int &orbit_idx, int verbose_level)
void init(cubic_surfaces_in_general::surface_with_action *Surf_A, poset_classification::poset_classification_control *Control_six_arcs, int f_test_nb_Eckardt_points, int nb_E, int verbose_level)
void report2(std::ostream &ost, graphics::layered_graph_draw_options *draw_options, int verbose_level)
void loop_over_trihedral_pairs(data_structures_groups::vector_ge *cosets, data_structures_groups::vector_ge *&coset_reps, int *&aut_T_index, int *&aut_coset_index, int verbose_level)
groups::strong_generators * create_stabilizer_of_trihedral_pair(int &trihedral_pair_orbit_index, int verbose_level)
void create_action_on_equations_and_compute_orbits(int *The_surface_equations, groups::strong_generators *gens_for_stabilizer_of_trihedral_pair, actions::action *&A_on_equations, groups::schreier *&Orb, int verbose_level)
void init(apps_geometry::arc_generator_description *Descr, projective_geometry::projective_space_with_action *PA, int f_test_nb_Eckardt_points, int nb_E, int verbose_level)
void recognize(long int *arc6, int *transporter, int &orbit_not_on_conic_idx, int verbose_level)
description of a classification problem of arcs in a geometry
Definition: tl_geometry.h:27
classification of arcs in desarguesian projective planes
Definition: tl_geometry.h:75
projective space PG(n,q) with automorphism group PGGL(n+1,q)
the orbiter library for the classification of combinatorial objects