Orbiter 2022
Combinatorial Objects
surfaces_arc_lifting_upstep.cpp
Go to the documentation of this file.
1/*
2 * surfaces_arc_lifting_upstep.cpp
3 *
4 * Created on: Jul 27, 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 cubic_surfaces_and_arcs {
19
20
22{
23 Lift = NULL;
24 //f = f2 = po = so = 0;
25 f_processed = NULL;
26 nb_processed = 0;
30
31 //longinteger_object A4_go;
32
33
34 progress = 0.;
35 //long int Lines[27];
36 //int eqn20[20];
37
38
39 //coset_reps = NULL;
40 //nb_coset_reps = 0;
41
42 //Flag_stab_gens = NULL;
43 //Flag_stab_go;
44
45 //int three_lines_idx[3];
46 //long int three_lines[3];
47
48 D = NULL;
49
50 f = 0;
52
53 //struct seventytwo_cases Seventytwo[72];
54
56
57
58}
59
60
61
63{
64 if (f_processed) {
66 }
69 }
72 }
73}
74
76{
77 int f_v = (verbose_level >= 1);
78
79
80 if (f_v) {
81 cout << "surfaces_arc_lifting_upstep::init" << endl;
82 cout << "verbose_level = " << verbose_level << endl;
83 cout << "nb_flag_orbits = " << Lift->Flag_orbits->nb_flag_orbits << endl;
84 }
85
86
88
91 nb_processed = 0;
92
93 pt_representation_sz = 6 + 1 + 2 + 1 + 1 + 2 + 20 + 27;
94 // Flag[0..5] : 6 for the arc P1,...,P6
95 // Flag[6] : 1 for orb, the selected orbit on pairs
96 // Flag[7..8] : 2 for the selected pair, i.e., {0,1} for P1,P2.
97 // Flag[9] : 1 for orbit, the selected orbit on set_partitions
98 // Flag[10] : 1 for the partition of the remaining points; values=0,1,2
99 // Flag[11..12] : 2 for the chosen lines line1 and line2 through P1 and P2
100 // Flag[13..32] : 20 for the equation of the surface
101 // Flag[33..59] : 27 for the lines of the surface
102
105
107
109
112 verbose_level);
113
114
115
116 for (f = 0; f < Lift->Flag_orbits->nb_flag_orbits; f++) {
117
118
119 if (f_processed[f]) {
120 continue;
121 }
122
123 if (f_v) {
124 cout << "surfaces_arc_lifting_upstep::init before process_flag_orbit "
125 "f=" << f << " / " << Lift->Flag_orbits->nb_flag_orbits << endl;
126 }
127
128
129 process_flag_orbit(verbose_level);
130
131
132 if (f_v) {
133 cout << "surfaces_arc_lifting_upstep::init after process_flag_orbit "
134 "f=" << f << " / " << Lift->Flag_orbits->nb_flag_orbits << endl;
135 }
136
137 f_processed[f] = TRUE;
138 nb_processed++;
139
140 if (f_v) {
141 cout << "surfaces_arc_lifting_upstep::init flag orbit f=" << f
142 << " done, number of flag orbits processed = " << nb_processed
143 << " number of surfaces = "
145 }
146
147 } // next flag orbit f
148
149
150#if 1
152 cout << "warning: nb_processed != Flag_orbits->nb_flag_orbits" << endl;
153 cout << "nb_processed = " << nb_processed << endl;
154 cout << "Flag_orbits->nb_flag_orbits = "
155 << Lift->Flag_orbits->nb_flag_orbits << endl;
156 //exit(1);
157 }
158#endif
159
160
161 if (f_v) {
162 cout << "We found " << Lift->Surfaces->nb_orbits
163 << " isomorphism types of surfaces from "
165 << " flag orbits" << endl;
166 cout << "The group orders are: " << endl;
168 }
169
170
171
172
173 if (f_v) {
174 cout << "surfaces_arc_lifting_upstep::init done" << endl;
175 }
176}
177
179{
180 int f_v = (verbose_level >= 1);
181
182 if (f_v) {
183 cout << "surfaces_arc_lifting_upstep::process_flag_orbit f=" << f
184 << " / " << Lift->Flag_orbits->nb_flag_orbits << endl;
185 cout << "verbose_level = " << verbose_level << endl;
186 }
187
188 progress = ((double) nb_processed * 100. ) /
190
191 if (f_v) {
192 cout << "surfaces_arc_lifting_upstep::process_flag_orbit Defining surface "
194 << " from flag orbit " << f << " / "
196 << " progress=" << progress << "%" << endl;
197 }
200
201
203 cout << "Flag_orbits->pt_representation_sz != pt_representation_sz" << endl;
204 exit(1);
205 }
208
211
212
213
214
215
217
220 verbose_level);
221
222
223
224
226
227 if (f_v) {
228 cout << "surfaces_arc_lifting_upstep::process_flag_orbit before compute_stabilizer" << endl;
229 }
230 compute_stabilizer(D, Aut_gens, verbose_level);
231 if (f_v) {
232 cout << "surfaces_arc_lifting_upstep::process_flag_orbit after compute_stabilizer" << endl;
233 }
234
235
236
237 if (f_v) {
238 cout << "surfaces_arc_lifting_upstep::process_flag_orbit before Surfaces.init" << endl;
239 }
241 Lift->Surfaces,
243 Aut_gens, Lines, D /* extra_data */, verbose_level);
244 if (f_v) {
245 cout << "surfaces_arc_lifting_upstep::process_flag_orbit after init Aut_gens" << endl;
246 }
247
249
250 if (f_v) {
251 cout << "surfaces_arc_lifting_upstep::process_flag_orbit before D->SOA->init_with_group" << endl;
252 }
253
254
255 {
256
258 Lines, 27, eqn20,
259 Aut_gens,
260 FALSE /*f_find_double_six_and_rearrange_lines*/,
261 FALSE /*f_has_nice_gens*/, NULL /*vector_ge *nice_gens*/,
262 verbose_level);
263#if 0
265 SO,
266 Aut_gens,
267 FALSE /*f_has_nice_gens*/, NULL /*vector_ge *nice_gens*/,
268 verbose_level);
269#endif
270 }
271
272
273 if (f_v) {
274 cout << "surfaces_arc_lifting_upstep::process_flag_orbit after D->SOA->init_with_group" << endl;
275 }
276
279
280
281 if (f_v) {
282 cout << "surfaces_arc_lifting_upstep::process_flag_orbit f=" << f
283 << " / " << Lift->Flag_orbits->nb_flag_orbits << " done" << endl;
284 }
285
286}
287
289 groups::strong_generators *&Aut_gens, int verbose_level)
290{
291 int f_v = (verbose_level >= 1);
292 int f_vvv = (verbose_level >= 3);
293
294 if (f_v) {
295 cout << "surfaces_arc_lifting_upstep::compute_stabilizer f=" << f
296 << " / " << Lift->Flag_orbits->nb_flag_orbits << endl;
297 cout << "verbose_level = " << verbose_level << endl;
298 }
299
301 D->coset_reps->init(Lift->Surf_A->A, verbose_level - 2);
302 D->coset_reps->allocate(3240, verbose_level - 2); // 3240 = 45 * 3 * (8 * 6) / 2
304
305 if (f_vvv) {
306 cout << "surfaces_arc_lifting_upstep::compute_stabilizer Lines:";
307 Lint_vec_print(cout, Lines, 27);
308 cout << endl;
309 }
312
313 if (f_v) {
314 cout << "surfaces_arc_lifting_upstep::compute_stabilizer f=" << f
315 << " / " << Lift->Flag_orbits->nb_flag_orbits
316 << " Flag_stab_go = " << D->Flag_stab_go << endl;
317 }
318
319 D->nb_coset_reps = 0;
320 for (tritangent_plane_idx = 0;
323
324 if (f_v) {
325 cout << "surfaces_arc_lifting_upstep::compute_stabilizer "
326 "f=" << f << " / " << Lift->Flag_orbits->nb_flag_orbits
327 << ", upstep "
328 "tritangent_plane_idx=" << tritangent_plane_idx << " / 45" << endl;
329 }
330
331 if (f_v) {
332 cout << "surfaces_arc_lifting_upstep::compute_stabilizer "
333 "before process_tritangent_plane" << endl;
334 }
335
336 process_tritangent_plane(D, verbose_level - 2);
337
338 if (f_v) {
339 cout << "surfaces_arc_lifting_upstep::compute_stabilizer "
340 "after process_tritangent_plane" << endl;
341 }
342
345
348 }
349
350
351 if (f_v) {
352 cout << "surfaces_arc_lifting_upstep::compute_stabilizer "
353 "after process_tritangent_plane" << endl;
354 cout << "surfaces_arc_lifting_upstep::compute_stabilizer "
355 "f=" << f << " / " << Lift->Flag_orbits->nb_flag_orbits <<
356 " tritangent_plane_idx = " << tritangent_plane_idx
357 << " / 45 done, nb_coset_reps = " << D->nb_coset_reps << endl;
358 }
359
360
361 } // next tritangent_plane_idx
362
363
364#if 1
365 D->coset_reps->reallocate(D->nb_coset_reps, verbose_level - 2);
366
367
368 {
370
371 if (f_v) {
372 cout << "surfaces_arc_lifting_upstep::compute_stabilizer "
373 "Extending the group by a factor of "
374 << D->nb_coset_reps << endl;
375 }
378 D->nb_coset_reps, verbose_level - 2);
379
380 Aut_gens->group_order(ago);
381
382
383 if (f_v) {
384 cout << "surfaces_arc_lifting_upstep::compute_stabilizer "
385 "The surface has a stabilizer of order "
386 << ago << endl;
387 cout << "The surface stabilizer is:" << endl;
388 Aut_gens->print_generators_tex(cout);
389 }
390
392
393 if (f_v) {
394 cout << "surfaces_arc_lifting_upstep::compute_stabilizer "
395 "before Algebra.relative_order_vector_of_cosets" << endl;
396 }
399 D->coset_reps, D->relative_order_table, 0 /*verbose_level*/);
400 if (f_v) {
401 cout << "surfaces_arc_lifting_upstep::compute_stabilizer "
402 "after Algebra.relative_order_vector_of_cosets" << endl;
403 cout << "relative_order_table:" << endl;
404
406
409 D->coset_reps->len, 1,
410 FALSE /* f_tex */);
411
412 }
413 }
414
415
416#endif
417
418 if (f_v) {
419 cout << "surfaces_arc_lifting_upstep::compute_stabilizer before D->tally_f2" << endl;
420 }
421 D->tally_f2(verbose_level);
422 if (f_v) {
423 cout << "surfaces_arc_lifting_upstep::compute_stabilizer after D->tally_f2" << endl;
424 }
425
426
427
428 if (f_v) {
429 cout << "surfaces_arc_lifting_upstep::compute_stabilizer f=" << f
430 << " / " << Lift->Flag_orbits->nb_flag_orbits << " done" << endl;
431 }
432
433}
434
437 int verbose_level)
438{
439 int f_v = (verbose_level >= 1);
440 int f_vv = (verbose_level >= 2);
441 int f_vvv = (verbose_level >= 3);
442 int i, f2;
443
444 if (f_v) {
445 cout << "surfaces_arc_lifting_upstep::process_tritangent_plane "
446 "f=" << f << " / " << Lift->Flag_orbits->nb_flag_orbits <<
447 " tritangent_plane_idx=" << tritangent_plane_idx << " / 45 " << endl;
448 cout << "verbose_level = " << verbose_level << endl;
449 }
450
451
454
455
456 for (i = 0; i < 3; i++) {
458 }
459
460
461
462
463 if (f_vv) {
464 cout << "surfaces_arc_lifting_upstep::process_tritangent_plane "
465 "f=" << f << " / " << Lift->Flag_orbits->nb_flag_orbits
466 << ", upstep "
467 "tritangent_plane_idx=" << tritangent_plane_idx << " / 45 "
468 "three_lines_idx=";
470 cout << " three_lines=";
471 Lint_vec_print(cout, three_lines, 3);
472 cout << endl;
473 }
474
475 make_seventytwo_cases(verbose_level);
476
478
480
482
483 T->init(this, seventytwo_case_idx, verbose_level - 2);
484
485 T->process_flag_orbit(this, verbose_level);
486
487 f2 = T->f2;
488
489 if (f_vvv) {
490 cout << "surfaces_arc_lifting_upstep::process_tritangent_plane f=" << f << " / "
492 << ", upstep " << T->upstep_idx
493 << " / 3240, is "
494 "isomorphic to orbit " << f2 << endl;
495 }
496
497
498 // copy the results from the tracing back:
500
501 if (T->f2 == f) {
502 if (f_v) {
503 cout << "surfaces_arc_lifting_upstep::process_tritangent_plane "
504 "seventytwo_case_idx = " << seventytwo_case_idx << " " << T->upstep_idx
505 << " / 3240, We found an automorphism "
506 "of the surface, nb_coset_reps = " << D->nb_coset_reps << endl;
508 Lift->A4->element_print(T->Elt_T4, cout);
509 cout << endl;
510 }
512 D->T[D->nb_coset_reps] = T;
513 D->nb_coset_reps++;
514
515 // don't free T
516 }
517 else {
518 if (!f_processed[f2]) {
519 if (f_v) {
520 cout << "surfaces_arc_lifting_upstep::process_tritangent_plane " << T->upstep_idx
521 << " / 3240, We are identifying flag orbit " << T->f2
522 << " with flag orbit " << f << endl;
523 }
526
528
530
533
534
537
538 f_processed[f2] = TRUE;
539 nb_processed++;
540 }
541 else {
542 if (f_vvv) {
543 cout << "surfaces_arc_lifting_upstep::process_tritangent_plane "
544 "Flag orbit " << f2 << " has already been "
545 "identified with flag orbit " << f << endl;
546 }
548 cout << "Flag_orbits->Flag_orbit_node[f2]."
549 "fusion_with != f" << endl;
550 exit(1);
551 }
552 }
554 //FREE_OBJECT(T);
555
556 }
557
558
559
560 } // next seventytwo_case_idx
561
562
563
564 if (f_v) {
565 cout << "surfaces_arc_lifting_upstep::process_tritangent_plane "
566 "f=" << f << " / " << Lift->Flag_orbits->nb_flag_orbits <<
567 " tritangent_plane_idx = " << tritangent_plane_idx << " / 45 "
568 "done, nb_coset_reps = " << D->nb_coset_reps << endl;
569 }
570
571
572
573}
574
575
576
578{
579 int f_v = (verbose_level >= 1);
580 int c;
581 int line_idx, m1, m2, m3, line_l1_l2_idx, l1, l2;
582
583 if (f_v) {
584 cout << "surfaces_arc_lifting_upstep::make_seventytwo_cases "
585 "f=" << f << " / " << Lift->Flag_orbits->nb_flag_orbits <<
586 " tritangent_plane_idx=" << tritangent_plane_idx << " / 45 " << endl;
587 cout << "verbose_level = " << verbose_level << endl;
588 }
589
590
591 c = 0;
592
593 for (line_idx = 0; line_idx < 3; line_idx++) {
594 m1 = three_lines_idx[line_idx];
595 if (line_idx == 0) {
596 m2 = three_lines_idx[1];
597 m3 = three_lines_idx[2];
598 }
599 else if (line_idx == 1) {
600 m2 = three_lines_idx[0];
601 m3 = three_lines_idx[2];
602 }
603 else if (line_idx == 2) {
604 m2 = three_lines_idx[0];
605 m3 = three_lines_idx[1];
606 }
607
608 // there are 24 possibilities for l1 and l2:
609
610 line_l1_l2_idx = 0;
611
612 for (l1 = 0; l1 < 27; l1++) {
613 if (D->SO->SOP->Adj_ij(l1, m1) == 0) {
614 continue;
615 }
616 if (l1 == m1) {
617 continue;
618 }
619 if (l1 == m2) {
620 continue;
621 }
622 if (l1 == m3) {
623 continue;
624 }
625 for (l2 = l1 + 1; l2 < 27; l2++) {
626 if (D->SO->SOP->Adj_ij(l2, m1) == 0) {
627 continue;
628 }
629 if (l2 == m1) {
630 continue;
631 }
632 if (l2 == m2) {
633 continue;
634 }
635 if (l2 == m3) {
636 continue;
637 }
638 if (l2 == l1) {
639 continue;
640 }
641 if (D->SO->SOP->Adj_ij(l1, l2)) {
642 continue;
643 }
644
645
647 line_idx, m1, m2, m3, line_l1_l2_idx, l1, l2);
648 c++;
649 line_l1_l2_idx++;
650
651 } // l2
652 } // l1
653
654 if (line_l1_l2_idx != 24) {
655 cout << "surfaces_arc_lifting_upstep::make_seventytwo_cases line_l1_l2_idx != 24" << endl;
656 exit(1);
657 }
658
659 } // line_idx
660
661 if (c != 72) {
662 cout << "surfaces_arc_lifting_upstep::make_seventytwo_cases c != 72" << endl;
663 exit(1);
664 }
665
666 if (f_v) {
667 cout << "surfaces_arc_lifting_upstep::make_seventytwo_cases "
668 "f=" << f << " / " << Lift->Flag_orbits->nb_flag_orbits <<
669 " tritangent_plane_idx=" << tritangent_plane_idx << " / 45 computing the arcs" << endl;
670 }
671 for (c = 0; c < 72; c++) {
672 if (f_v) {
673 cout << "surfaces_arc_lifting_upstep::make_seventytwo_cases "
674 "f=" << f << " / " << Lift->Flag_orbits->nb_flag_orbits <<
675 " tritangent_plane_idx=" << tritangent_plane_idx << " / 45, computing arc " << c << " / 72" << endl;
676 }
677 Seventytwo[c].compute_arc(D->SO, verbose_level);
678 }
679 if (f_v) {
680 cout << "surfaces_arc_lifting_upstep::make_seventytwo_cases "
681 "f=" << f << " / " << Lift->Flag_orbits->nb_flag_orbits <<
682 " tritangent_plane_idx=" << tritangent_plane_idx << " / 45 computing the arcs done" << endl;
683 }
684
685 if (f_v) {
686 cout << "surfaces_arc_lifting_upstep::make_seventytwo_cases "
687 "f=" << f << " / " << Lift->Flag_orbits->nb_flag_orbits <<
688 " tritangent_plane_idx=" << tritangent_plane_idx << " / 45 done" << endl;
689 }
690}
691
692
693}}}}
694
695
void three_lines(surface_domain *S, int *three_lines)
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 print_integer_matrix_with_standard_labels(std::ostream &ost, int *p, int m, int n, int f_tex)
a class to represent arbitrary precision integers
Definition: ring_theory.h:366
void element_print(void *elt, std::ostream &ost)
Definition: action_cb.cpp:347
void element_invert(void *a, void *av, int verbose_level)
Definition: action_cb.cpp:322
void element_move(void *a, void *b, int verbose_level)
Definition: action_cb.cpp:335
void group_order(ring_theory::longinteger_object &go)
Definition: action.cpp:2223
void reallocate(int new_length, int verbose_level)
Definition: vector_ge.cpp:444
void init(actions::action *A, int verbose_level)
Definition: vector_ge.cpp:55
a strong generating set for a permutation group with respect to a fixed action
Definition: groups.h:1703
void init_group_extension(strong_generators *subgroup, int *data, int index, int verbose_level)
void group_order(ring_theory::longinteger_object &go)
a single step classification of combinatorial objects
Definition: classify.h:29
void init(actions::action *A, actions::action *A2, int max_orbits, int representation_sz, ring_theory::longinteger_object &go, int verbose_level)
void receive_trace_result(void *trace_result, int verbose_level)
void init(classification_step *C, int orbit_index, groups::strong_generators *gens, long int *Rep, void *extra_data, int verbose_level)
Definition: orbit_node.cpp:41
void compute_stabilizer(surfaces_arc_lifting_definition_node *D, groups::strong_generators *&Aut_gens, 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)
void init_with_group(surface_with_action *Surf_A, long int *Lines, int nb_lines, int *eqn, groups::strong_generators *Aut_gens, int f_find_double_six_and_rearrange_lines, int f_has_nice_gens, data_structures_groups::vector_ge *nice_gens, int verbose_level)
void init_with_surface_object(surface_with_action *Surf_A, algebraic_geometry::surface_object *SO, groups::strong_generators *Aut_gens, int f_has_nice_gens, data_structures_groups::vector_ge *nice_gens, int verbose_level)
tracing data to be used during the classification of cubic surfaces using lifted 6-arcs
void relative_order_vector_of_cosets(actions::action *A, groups::strong_generators *SG, data_structures_groups::vector_ge *cosets, int *&relative_order_table, int verbose_level)
#define Lint_vec_copy(A, B, C)
Definition: foundations.h:694
#define FREE_int(p)
Definition: foundations.h:640
#define Int_vec_zero(A, B)
Definition: foundations.h:713
#define NEW_pvoid(n)
Definition: foundations.h:637
#define NEW_OBJECT(type)
Definition: foundations.h:638
#define Lint_vec_print(A, B, C)
Definition: foundations.h:686
#define NEW_int(n)
Definition: foundations.h:625
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define Lint_vec_copy_to_int(A, B, C)
Definition: foundations.h:723
#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
#define Int_vec_print(A, B, C)
Definition: foundations.h:685
the orbiter library for the classification of combinatorial objects