Orbiter 2022
Combinatorial Objects
surfaces_arc_lifting.cpp
Go to the documentation of this file.
1/*
2 * surfaces_arc_lifting.cpp
3 *
4 * Created on: Jan 9, 2019
5 * Author: betten
6 */
7
8
9
10#include "orbiter.h"
11
12using namespace std;
13
14namespace orbiter {
15namespace layer5_applications {
16namespace applications_in_algebraic_geometry {
17namespace cubic_surfaces_and_arcs {
18
19
20static void callback_surfaces_arc_lifting_report(std::ostream &ost, int i,
21 invariant_relations::classification_step *Step, void *print_function_data);
22static void callback_surfaces_arc_lifting_free_trace_result(void *ptr,
23 void *data, int verbose_level);
24static void callback_surfaces_arc_lifting_latex_report_trace(std::ostream &ost,
25 void *trace_result, void *data, int verbose_level);
26
27
28
30{
31 F = NULL;
32 q = 0;
33 LG4 = NULL;
34
36
37 fname_base[0] = 0;
38
39 A4 = NULL;
40 A3 = NULL;
41
42 Surf = NULL;
43 Surf_A = NULL;
44
45 Six_arcs = NULL;
48
49
50 // classification of surfaces:
51 Flag_orbits = NULL;
52
53 flag_orbit_fst = NULL; // [Six_arcs->nb_arcs_not_on_conic]
54 flag_orbit_len = NULL; // [Six_arcs->nb_arcs_not_on_conic]
55
56 flag_orbit_on_arcs_not_on_a_conic_idx = NULL; // [Flag_orbits->nb_flag_orbits]
57 flag_orbit_on_pairs_idx = NULL; // [Flag_orbits->nb_flag_orbits]
58 flag_orbit_on_partition_idx = NULL; // [Flag_orbits->nb_flag_orbits]
59
60
61 Surfaces = NULL;
62 //null();
63}
64
66{
67 freeself();
68}
69
71{
72}
73
75{
76 int verbose_level = 0;
77 int f_v = (verbose_level >= 1);
78
79 if (f_v) {
80 cout << "surfaces_arc_lifting::freeself" << endl;
81 }
82 if (f_v) {
83 cout << "surfaces_arc_lifting::freeself before FREE_OBJECT(Six_arcs)" << endl;
84 }
85 if (Six_arcs) {
87 }
90 }
91
92 if (flag_orbit_fst) {
94 }
95 if (flag_orbit_len) {
97 }
100 }
103 }
106 }
107 if (f_v) {
108 cout << "surfaces_arc_lifting::freeself before FREE_OBJECT(Surfaces)" << endl;
109 }
110 if (Surfaces) {
112 }
113#if 0
114 if (f_v) {
115 cout << "surfaces_arc_lifting::freeself before FREE_OBJECT(A3)" << endl;
116 }
117 if (A3) {
119 }
120#endif
121
122 if (f_v) {
123 cout << "surfaces_arc_lifting::freeself done" << endl;
124 }
125 null();
126}
127
131 int f_test_nb_Eckardt_points, int nb_E,
132 int verbose_level)
133{
134 int f_v = (verbose_level >= 1);
136
137 if (f_v) {
138 cout << "surfaces_arc_lifting::init" << endl;
139 }
140 //surfaces_arc_lifting::LG4 = LG4;
144 q = F->q;
145
146 fname_base.assign("surfaces_arc_lifting_");
147 char str[1000];
148 sprintf(str, "%d", q);
149 fname_base.append(str);
150
151 A4 = Surf_A->PA->A;
152 if (f_v) {
153 cout << "surfaces_arc_lifting::init A4 = " << A4->label << endl;
154 cout << "surfaces_arc_lifting::init A4 = " << A4->label_tex << endl;
155 }
156 if (f_test_nb_Eckardt_points) {
157 cout << "f_test_nb_Eckardt_points is on, testing for " << nb_E << " Eckardt points" << endl;
158 }
159
161
162
163
164#if 0
165 A3 = NEW_OBJECT(action);
166
167
168
169 if (f_v) {
170 cout << "surfaces_arc_lifting::init "
171 "before A->init_projective_group" << endl;
172 }
173 vector_ge *nice_gens;
176 TRUE /*f_basis*/, TRUE /* f_init_sims */,
177 nice_gens,
178 0 /*verbose_level*/);
179 FREE_OBJECT(nice_gens);
180 if (f_v) {
181 cout << "surfaces_arc_lifting::init "
182 "after A->init_projective_group" << endl;
183 }
184#else
185 A3 = Surf_A->PA->PA2->A;
186#endif
187
188
189
192
193 if (f_v) {
194 cout << "surfaces_arc_lifting::init "
195 "before Six_arcs->init" << endl;
196 }
197
198 Descr->Control = Control_six_arcs;
199 Descr->f_target_size = TRUE;
200 Descr->target_size = 6;
201
202 Six_arcs->init(
203 Descr,
204 Surf_A->PA->PA2,
205 f_test_nb_Eckardt_points, nb_E, //Surf,
206 verbose_level - 2);
207
208
209 if (f_v) {
210 cout << "surfaces_arc_lifting::init "
211 "after Six_arcs->init" << endl;
212 cout << "surfaces_arc_lifting::init "
213 "Six_arcs->nb_arcs_not_on_conic = "
214 << Six_arcs->nb_arcs_not_on_conic << endl;
215 }
216
217
218
219 if (f_v) {
220 cout << "surfaces_arc_lifting::init before downstep" << endl;
221 }
222 downstep(verbose_level - 2);
223 if (f_v) {
224 cout << "surfaces_arc_lifting::init after downstep" << endl;
225 }
226
227
228 //exit(1);
229
230
231 if (f_v) {
232 cout << "surfaces_arc_lifting::init "
233 "before Up->init" << endl;
234 }
235
236
238
240
241 Up->init(this, verbose_level - 2);
242
243 Up->D->report(verbose_level);
244
245 //upstep(verbose_level - 2);
246 if (f_v) {
247 cout << "surfaces_arc_lifting::init "
248 "after Up->init" << endl;
249 }
250
251 FREE_OBJECT(Up);
252
253
254 if (f_v) {
255 cout << "surfaces_arc_lifting::init done" << endl;
256 }
257}
258
259void surfaces_arc_lifting::downstep(int verbose_level)
260{
261 int f_v = (verbose_level >= 1);
262 int arc_idx;
263 int pt_representation_sz;
264 long int *Flag;
265
266 if (f_v) {
267 cout << "surfaces_arc_lifting::downstep" << endl;
268 cout << "verbose_level = " << verbose_level << endl;
269 }
270 pt_representation_sz = 6 + 1 + 2 + 1 + 1 + 2 + 20 + 27;
271 // Flag[0..5] : 6 for the arc P1,...,P6
272 // Flag[6] : 1 for orb, the selected orbit on pairs
273 // Flag[7..8] : 2 for the selected pair, i.e., {0,1} for P1,P2.
274 // Flag[9] : 1 for orbit, the selected orbit on set_partitions
275 // Flag[10] : 1 for the partition of the remaining points; values=0,1,2
276 // Flag[11..12] : 2 for the chosen lines line1 and line2 through P1 and P2
277 // Flag[13..32] : 20 for the equation of the surface
278 // Flag[33..59] : 27 for the lines of the surface
279 Flag = NEW_lint(pt_representation_sz);
280
281
282
283 if (f_v) {
284 cout << "surfaces_arc_lifting::downstep computing orbits on pairs" << endl;
285 }
286
290
291 nb_flag_orbits = 0;
292
293 for (arc_idx = 0;
295 arc_idx++) {
296
297 if (f_v) {
298 cout << "surfaces_arc_lifting::downstep arc " << arc_idx << " / " << Six_arcs->nb_arcs_not_on_conic << endl;
299 }
300 if (f_v) {
301 cout << "surfaces_arc_lifting::downstep "
302 "before Table_orbits_on_pairs[" << arc_idx << "].init" << endl;
303 }
304 Table_orbits_on_pairs[arc_idx].init(this, arc_idx,
305 A3,
306 verbose_level - 2);
307
309 total_nb_orbits_on_partitions;
310
311 }
312 if (f_v) {
313 cout << "surfaces_arc_lifting::downstep "
314 "computing orbits on pairs done" << endl;
315 cout << "nb_flag_orbits=" << nb_flag_orbits << endl;
316 }
317 for (arc_idx = 0;
319 arc_idx++) {
320 cout << "arc_idx=" << arc_idx << " / " << Six_arcs->nb_arcs_not_on_conic
321 << " has " << Table_orbits_on_pairs[arc_idx].nb_orbits_on_pairs << " orbits on pairs and " <<
322 Table_orbits_on_pairs[arc_idx].total_nb_orbits_on_partitions << " orbits on partitions" << endl;
323 }
324
325
326 //nb_orbits = Six_arcs->nb_arcs_not_on_conic;
327
330 A4,
331 A4,
332 Six_arcs->nb_arcs_not_on_conic /* nb_primary_orbits_lower */,
333 pt_representation_sz,
335 3240 /* upper_bound_for_number_of_traces */,
336 callback_surfaces_arc_lifting_free_trace_result /* void (*func_to_free_received_trace)(void *trace_result, void *data, int verbose_level) */,
337 callback_surfaces_arc_lifting_latex_report_trace,
338 this /* void *free_received_trace_data */,
339 verbose_level - 3);
340
341 if (f_v) {
342 cout << "surfaces_arc_lifting::downstep initializing flag orbits" << endl;
343 }
344
345 int cur_flag_orbit;
346
347
350
351 cur_flag_orbit = 0;
352 for (arc_idx = 0;
354 arc_idx++) {
355
356
357 if (f_v) {
358 cout << "surfaces_arc_lifting::downstep "
359 "before downstep_one_arc" << endl;
360 }
361 downstep_one_arc(arc_idx, cur_flag_orbit, Flag, verbose_level - 3);
362
363 if (f_v) {
364 cout << "surfaces_arc_lifting::downstep "
365 "after downstep_one_arc" << endl;
366 }
367
368
369 } // next arc_idx
370
371
372 if (f_v) {
373 cout << "surfaces_arc_lifting::downstep " << endl;
374 cout << "arc_idx : orbit on pairs index : nb_orbits on partitions" << endl;
375 for (arc_idx = 0;
377 arc_idx++) {
378
380 int pair_orbit_idx, nb;
381
382 T = Table_orbits_on_pairs + arc_idx;
383
384 for (pair_orbit_idx = 0;
385 pair_orbit_idx < T->nb_orbits_on_pairs;
386 pair_orbit_idx++) {
387
389
390 cout << arc_idx << " & " << pair_orbit_idx << " & " << nb << endl;
391 }
392 }
393 }
394
395
396 //Flag_orbits->nb_flag_orbits = nb_flag_orbits;
397 FREE_lint(Flag);
398
399
403
404 cur_flag_orbit = 0;
405 for (arc_idx = 0;
407 arc_idx++) {
408
410
411 T = Table_orbits_on_pairs + arc_idx;
412
413 int orbit_on_pairs_idx, nb_orbits_on_pairs;
414 int downstep_secondary_orbit = 0;
415
416 nb_orbits_on_pairs = T->Orbits_on_pairs->nb_orbits_at_level(2);
417
418 for (orbit_on_pairs_idx = 0;
419 orbit_on_pairs_idx < nb_orbits_on_pairs;
420 orbit_on_pairs_idx++) {
421
422 int orbit_on_partition_idx;
423 int nb_partition_orbits;
424
425 nb_partition_orbits = T->Table_orbits_on_partition[orbit_on_pairs_idx].nb_orbits_on_partition;
426
427
428 //schreier *Sch;
429
430 //Sch = T->Table_orbits_on_partition[orbit_on_pairs_idx].Orbits_on_partition;
431
432
433
434 for (orbit_on_partition_idx = 0;
435 orbit_on_partition_idx < nb_partition_orbits;
436 orbit_on_partition_idx++) {
437
438
439 flag_orbit_on_arcs_not_on_a_conic_idx[cur_flag_orbit] = arc_idx;
440 flag_orbit_on_pairs_idx[cur_flag_orbit] = orbit_on_pairs_idx;
441 flag_orbit_on_partition_idx[cur_flag_orbit] = orbit_on_partition_idx;
442
443 cur_flag_orbit++;
444 downstep_secondary_orbit++;
445
446
447 } // orbit_on_partition_idx
448
449 } // next orbit_on_pairs_idx
450
451 } // next arc_idx
452
453 if (f_v) {
454 int f;
455 cout << "surfaces_arc_lifting::downstep "
456 "arc_idx : flag_orbit_fst[] : "
457 "flag_orbit_len[]" << endl;
458 for (arc_idx = 0;
460 arc_idx++) {
461
462 cout << arc_idx << " : " << flag_orbit_fst[arc_idx]
463 << " : " << flag_orbit_len[arc_idx] << endl;
464 }
465
466 cout << "surfaces_arc_lifting::downstep "
467 "i : flag_orbit_on_arcs_not_on_a_conic_idx[] : "
468 "flag_orbit_on_pairs_idx[] : "
469 "flag_orbit_on_partition_idx[]" << endl;
470 for (f = 0; f < Flag_orbits->nb_flag_orbits; f++) {
471 cout << f << " : " << flag_orbit_on_arcs_not_on_a_conic_idx[f]
472 << " : " << flag_orbit_on_pairs_idx[f] << " : "
473 << flag_orbit_on_partition_idx[f] << endl;
474 }
475 cout << "number of arcs not on a conic = "
476 << Six_arcs->nb_arcs_not_on_conic << endl;
477
478 cout << "number of flag orbits = "
479 << Flag_orbits->nb_flag_orbits << endl;
480
481 }
482
483
484 if (f_v) {
485 cout << "surfaces_arc_lifting::downstep "
486 "initializing flag orbits done" << endl;
487 }
488}
489
491 int &cur_flag_orbit, long int *Flag, int verbose_level)
492{
493 int f_v = (verbose_level >= 1);
494 int f_vv = (verbose_level >= 2);
497
498
499 if (f_v) {
500 cout << "surfaces_arc_lifting::downstep_one_arc" << endl;
501 }
503
504 if (f_v) {
505 cout << "surfaces_arc_lifting::downstep_one_arc "
506 "arc "
507 << arc_idx << " / "
508 << Six_arcs->nb_arcs_not_on_conic << endl;
509 }
510
511 flag_orbit_fst[arc_idx] = cur_flag_orbit;
512
514 6 /* level */,
515 Six_arcs->Not_on_conic_idx[arc_idx],
516 verbose_level);
517
518
519 if (f_v) {
520 cout << "surfaces_arc_lifting::downstep_one_arc "
521 "arc " << arc_idx << " / "
522 << Six_arcs->nb_arcs_not_on_conic << endl;
523 }
524
526
527 T = Table_orbits_on_pairs + arc_idx;
528
529
530 int orbit_on_pairs_idx, nb_orbits_on_pairs;
531 int downstep_secondary_orbit = 0;
532
533 nb_orbits_on_pairs = T->Orbits_on_pairs->nb_orbits_at_level(2);
534
535 for (orbit_on_pairs_idx = 0;
536 orbit_on_pairs_idx < nb_orbits_on_pairs;
537 orbit_on_pairs_idx++) {
538
539 if (f_v) {
540 cout << "surfaces_arc_lifting::downstep_one_arc "
541 "orbit on pairs "
542 << orbit_on_pairs_idx << " / "
543 << nb_orbits_on_pairs << endl;
544 }
545
546
549 2 /* level */,
550 orbit_on_pairs_idx,
551 0 /* verbose_level */);
552
553 if (f_v) {
554 cout << "surfaces_arc_lifting::downstep_one_arc "
555 "orbit on pairs "
556 << orbit_on_pairs_idx << " / "
557 << nb_orbits_on_pairs << " pair \\{";
558 Lint_vec_print(cout, pair_orbit->data, 2);
559 cout << "\\}_{" << pair_orbit->group_order_as_lint() << "}" << endl;
560 }
561
562 int orbit_on_partition_idx;
563 int nb_partition_orbits;
564
565 nb_partition_orbits = T->Table_orbits_on_partition[orbit_on_pairs_idx].nb_orbits_on_partition;
566
567
568 groups::schreier *Sch;
569 int part[4];
570 int h;
571
572 Sch = T->Table_orbits_on_partition[orbit_on_pairs_idx].Orbits_on_partition;
573
574
575
576 for (orbit_on_partition_idx = 0;
577 orbit_on_partition_idx < nb_partition_orbits;
578 orbit_on_partition_idx++) {
579
580 if (f_v) {
581 cout << "surfaces_arc_lifting::downstep_one_arc "
582 "orbit on partitions "
583 << orbit_on_partition_idx << " / "
584 << nb_partition_orbits << endl;
585 }
586
587
588 int f, l, partition_rk, p0, p1;
589
590 f = Sch->orbit_first[orbit_on_partition_idx];
591 l = Sch->orbit_len[orbit_on_partition_idx];
592
593 partition_rk = Sch->orbit[f + 0];
594 if (f_v) {
595 cout << "surfaces_arc_lifting::downstep_one_arc "
596 "orbit on partitions "
597 << orbit_on_partition_idx << " / "
598 << nb_partition_orbits
599 << " partition_rk = " << partition_rk << " orbit of size " << l << endl;
600 }
601
602 // prepare the flag
603 // copy the arc:
604 Lint_vec_copy(The_arc->data, Flag + 0, 6);
605 // copy orb and the pair:
606 Flag[6] = orbit_on_pairs_idx;
607 p0 = pair_orbit->data[0];
608 p1 = pair_orbit->data[1];
609 Lint_vec_copy(pair_orbit->data, Flag + 7, 2);
610 Flag[9] = orbit_on_partition_idx;
611 Flag[10] = partition_rk;
612
613 // Flag[11..12] : 2 for the chosen lines line1 and line2 through P1 and P2
614 // Flag[13..32] : 20 for the equation of the surface
615 // Flag[33..59] : 27 for the lines of the surface
616
617
618 Combi.set_partition_4_into_2_unrank(partition_rk, part);
619 if (f_vv) {
620 cout << "surfaces_arc_lifting::downstep_one_arc The partition is: ";
621 for (h = 0; h < 2; h++) {
622 Int_vec_print(cout, part + h * 2, 2);
623 }
624 cout << endl;
625 }
626
628 groups::strong_generators *SG; // stabilizer as 3x3 matrices
629
630 if (f_v) {
631 cout << "surfaces_arc_lifting::downstep_one_arc "
632 "computing partition stabilizer:" << endl;
633 }
634
635 ring_theory::longinteger_object full_group_order;
636
637 pair_orbit->Strong_gens->group_order(full_group_order);
638 if (f_v) {
639 cout << "surfaces_arc_lifting::downstep_one_arc "
640 "expecting a group of order "
641 << full_group_order << endl;
642 }
643 SG = Sch->stabilizer_orbit_rep(
644 A3,
645 full_group_order,
646 orbit_on_partition_idx,
647 verbose_level - 5);
648
649 if (f_v) {
650 cout << "surfaces_arc_lifting::downstep_one_arc "
651 "stabilizer of the flag:" << endl;
652 SG->print_generators(cout);
653 }
654
655
656 long int Arc6[6];
657 long int Arc6_rearranged[6];
658 long int P0, P1;
659 long int line1, line2;
660 int v4[4];
661
662 //int_vec_copy(The_arc->data, Arc6, 6);
663
664 if (f_v) {
665 cout << "surfaces_arc_lifting::downstep_one_arc "
666 "the arc is: ";
667 Lint_vec_print(cout, The_arc->data, 6);
668 cout << endl;
669 }
670 Surf->F->PG_elements_embed(The_arc->data, Arc6, 6, 3, 4, v4);
671
672 if (f_v) {
673 cout << "surfaces_arc_lifting::downstep_one_arc "
674 "after embedding, the arc is: ";
675 Lint_vec_print(cout, Arc6, 6);
676 cout << endl;
677 }
678
679
680 P0 = Arc6[p0];
681 P1 = Arc6[p1];
683 P0, P1, partition_rk, Arc6_rearranged,
684 verbose_level - 2);
685 if (f_v) {
686 cout << "surfaces_arc_lifting::downstep_one_arc "
687 "the rearranged arcs is: ";
688 Lint_vec_print(cout, Arc6_rearranged, 6);
689 cout << endl;
690 }
691
693 P0, P1, line1, line2,
694 verbose_level - 2);
695 if (f_v) {
696 cout << "surfaces_arc_lifting::downstep_one_arc "
697 "after find_two_lines_for_arc_lifting "
698 "line1=" << line1 << " line2=" << line2 << endl;
699 }
700
701 Flag[11] = line1;
702 Flag[12] = line2;
703 int coeff20[20];
704 long int lines27[27];
705
706 if (f_v) {
707 cout << "surfaces_arc_lifting::downstep_one_arc "
708 "before Surf->do_arc_lifting_with_two_lines" << endl;
709 }
711 Arc6, p0, p1, partition_rk,
712 line1, line2,
713 coeff20, lines27,
714 verbose_level - 2);
715 if (f_v) {
716 cout << "surfaces_arc_lifting::downstep_one_arc "
717 "after Surf->do_arc_lifting_with_two_lines" << endl;
718 cout << "coeff20: ";
719 Int_vec_print(cout, coeff20, 20);
720 cout << endl;
721 cout << "lines27: ";
722 Lint_vec_print(cout, lines27, 27);
723 cout << endl;
724 }
725 Int_vec_copy_to_lint(coeff20, Flag + 13, 20);
726 Lint_vec_copy(lines27, Flag + 33, 27);
727
728
729 long int arc_stab_order;
730 long int partition_stab_order;
731 int downstep_orbit_len;
732
733 arc_stab_order = The_arc->Strong_gens->group_order_as_lint();
734 partition_stab_order = SG->group_order_as_lint();
735
736 downstep_orbit_len = arc_stab_order / partition_stab_order;
737 if (f_v) {
738 cout << "surfaces_arc_lifting::downstep_one_arc" << endl;
739 cout << "arc_stab_order=" << arc_stab_order << endl;
740 cout << "partition_stab_order=" << partition_stab_order << endl;
741 cout << "downstep_orbit_len=" << downstep_orbit_len << endl;
742 }
743
744 // embed the generators into 4x4
745 groups::strong_generators *SG_induced;
746
748
749 SG_induced->init(A4);
750 if (f_v) {
751 cout << "surfaces_arc_lifting::downstep_one_arc "
752 "before SG_induced->hyperplane_lifting_with_two_lines_fixed" << endl;
753 }
755 SG,
756 Surf->P, line1, line2,
757 verbose_level - 2);
758 if (f_v) {
759 cout << "surfaces_arc_lifting::downstep_one_arc "
760 "after SG_induced->hyperplane_lifting_with_two_lines_fixed" << endl;
761 }
762 if (f_vv) {
763 cout << "lifted generators are:" << endl;
764 SG_induced->print_generators(cout);
765 }
766
767 if (f_v) {
768 cout << "surfaces_arc_lifting::downstep_one_arc "
769 "before Flag_orbit_node[].init" << endl;
770 }
771 Flag_orbits->Flag_orbit_node[cur_flag_orbit].init(
773 cur_flag_orbit /* flag_orbit_index */,
774 arc_idx /* downstep_primary_orbit */,
775 downstep_secondary_orbit,
776 downstep_orbit_len,
777 FALSE /* f_long_orbit */,
778 Flag /* int *pt_representation */,
779 SG_induced,
780 verbose_level - 2);
781
782 if (f_v) {
783 cout << "surfaces_arc_lifting::downstep_one_arc "
784 "after Flag_orbit_node[].init" << endl;
785 }
786
787 SG_induced = NULL;
788
789 FREE_OBJECT(SG);
790
791 cur_flag_orbit++;
792 downstep_secondary_orbit++;
793
794
795 } // next orbit
796 FREE_OBJECT(pair_orbit);
797 } // next orbit_on_pairs_idx
798
799 flag_orbit_len[arc_idx] = cur_flag_orbit - flag_orbit_fst[arc_idx];
800
801 FREE_OBJECT(The_arc);
802
803}
804
805
808 int verbose_level)
809{
810 int f_v = (verbose_level >= 1);
811
812
813 if (f_v) {
814 cout << "surfaces_arc_lifting::report" << endl;
815 }
816 std::string fname_arc_lifting;
817 char title[1000];
818 char author[1000];
819
820
821 fname_arc_lifting.assign(fname_base);
822 fname_arc_lifting.append(".tex");
823 snprintf(title, 1000, "Arc lifting over GF(%d) ", q);
824 strcpy(author, "");
825
826
827 {
828 ofstream fp(fname_arc_lifting.c_str());
830
831 L.head(fp,
832 FALSE /* f_book */,
833 TRUE /* f_title */,
834 title, author,
835 FALSE /*f_toc */,
836 FALSE /* f_landscape */,
837 FALSE /* f_12pt */,
838 TRUE /*f_enlarged_page */,
839 TRUE /* f_pagenumbers*/,
840 NULL /* extra_praeamble */);
841
842
843 if (f_v) {
844 cout << "surfaces_arc_lifting::report before report2" << endl;
845 }
846
847
848 report2(fp, draw_options, verbose_level);
849
850
851 if (f_v) {
852 cout << "surfaces_arc_lifting::report after report2" << endl;
853 }
854
855
856
857 L.foot(fp);
858
859
860 }
862
863 cout << "Written file " << fname_arc_lifting << " of size "
864 << Fio.file_size(fname_arc_lifting.c_str()) << endl;
865
866 if (f_v) {
867 cout << "surfaces_arc_lifting::report done" << endl;
868 }
869}
870
873 int verbose_level)
874{
875 int f_v = (verbose_level >= 1);
876 int nb_arcs, arc_idx;
877
878
879 if (f_v) {
880 cout << "surfaces_arc_lifting::report2" << endl;
881 }
882
883 //ost << "\\section{Cubic Surfaces over the field $\\mathbb F}_{" << q << "}$}" << endl << endl;
884
885 char str[1000];
886 sprintf(str, "\\section{The Classification of Cubic Surfaces with 27 Lines "
887 "over the field ${\\mathbb F}_{%d}$}", q);
888
889 string title;
890
891 title.assign(str);
892
893 //classification_step *Surfaces;
894
895 //ost << "\\section{The Group}" << endl << endl;
896
897 A4->report(ost, FALSE /* f_sims */, NULL /* sims *S */,
898 FALSE /* f_strong_gens */, NULL /* strong_generators *SG */,
899 draw_options,
900 verbose_level);
901
902
903 //ost << "\\section{The Classification of Cubic Surfaces with 27 Lines "
904 // "over the field ${\\mathbb F}_{" << q << "}$}" << endl << endl;
905
906
908 title, TRUE /* f_print_stabilizer_gens */,
909 TRUE /* f_has_print_function */,
910 callback_surfaces_arc_lifting_report /* void (*print_function)(ostream &ost, int i,
911 classification_step *Step, void *print_function_data) */,
912 this /* void *print_function_data */);
913
914 ost << "\\bigskip" << endl << endl;
915
916
917 ost << "\\section{Six-Arcs}" << endl << endl;
918
920
921
922
923 nb_arcs = Six_arcs->Gen->gen->nb_orbits_at_level(6);
924
925
926
927 ost << "There are " << nb_arcs << " arcs.\\\\" << endl << endl;
928
929
930
931
932
933 ost << "There are " << Six_arcs->nb_arcs_not_on_conic
934 << " arcs not on a conic. "
935 "They are as follows:\\\\" << endl << endl;
936
937
938 for (arc_idx = 0;
940 arc_idx++) {
941 {
943
945 6 /* level */,
946 Six_arcs->Not_on_conic_idx[arc_idx],
947 0 /* verbose_level */);
948
949
950
951 ost << "\\subsection*{Arc "
952 << arc_idx << " / "
953 << Six_arcs->nb_arcs_not_on_conic << "}" << endl;
954
955 ost << "$$" << endl;
956 //int_vec_print(ost, Arc6, 6);
957 The_arc->print_set_tex(ost);
958 ost << "$$" << endl;
959
961 The_arc->data, 6, 3);
962
963
964 ost << "The stabilizer is the following group:\\\\" << endl;
965 The_arc->Strong_gens->print_generators_tex(ost);
966
967 FREE_OBJECT(The_arc);
968 }
969 } // arc_idx
970
971 ost << "\\section{Flag Orbits}" << endl << endl;
972
973
974 report_flag_orbits(ost, verbose_level);
975
976
977
978 ost << "\\section{Surfaces in Detail}" << endl << endl;
979
980 report_surfaces_in_detail(ost, verbose_level);
981
982
983 A4->report_what_we_act_on(ost, draw_options, verbose_level);
984
985
986
987 ost << "\\section{Flag Orbits in Detail}" << endl << endl;
988
989 report_flag_orbits_in_detail(ost, verbose_level);
990
991
992 ost << "\\section{Six-Arcs in Detail}" << endl << endl;
993
995
996 Six_arcs->Gen->gen->report(ost, &Opt, verbose_level);
997
998
999
1000
1001 ost << "\\section{Basics}" << endl << endl;
1002
1003 Surf->print_basics(ost);
1004 //Surf->print_polynomial_domains(ost);
1005 //Surf->print_Schlaefli_labelling(ost);
1006
1007
1008
1009 if (f_v) {
1010 cout << "surfaces_arc_lifting::report2 done" << endl;
1011 }
1012}
1013
1014void surfaces_arc_lifting::report_flag_orbits(ostream &ost, int verbose_level)
1015{
1016 int flag_orbit_idx;
1017 int i;
1019
1020 ost << "Flag orbits: \\\\" << endl;
1021 ost << "The number of flag orbits is " << Flag_orbits->nb_flag_orbits << " \\\\" << endl;
1022
1023 ost << "$$" << endl;
1024 ost << "\\begin{array}{|c|c|c|c|c|c|c|c|c|c|}" << endl;
1025 ost << "\\hline" << endl;
1026 for (flag_orbit_idx = 0; flag_orbit_idx < Flag_orbits->nb_flag_orbits; flag_orbit_idx++) {
1027 //cout << "Flag orbit " << flag_orbit_idx << " : ";
1028 long int *Flag;
1029 long int lines[2];
1030 int arc_idx;
1031 int pair_orbit_idx;
1032 int part_orbit_idx;
1033 int part_rk;
1034 long int Arc6[6];
1035 long int P2[2];
1036 long int flag_stab_order;
1037
1038 Flag = Flag_orbits->Pt +
1039 flag_orbit_idx * Flag_orbits->pt_representation_sz;
1040
1041 // Flag[0..5] : 6 for the arc P1,...,P6
1042 // Flag[6] : 1 for orb, the selected orbit on pairs
1043 // Flag[7..8] : 2 for the selected pair, i.e., {0,1} for P1,P2.
1044 // Flag[9] : 1 for orbit, the selected orbit on set_partitions
1045 // Flag[10] : 1 for the partition of the remaining points; values=0,1,2
1046 // Flag[11..12] : 2 for the chosen lines line1 and line2 through P1 and P2
1047 // Flag[13..32] : 20 for the equation of the surface
1048 // Flag[33..59] : 27 for the lines of the surface
1049
1050
1051 arc_idx = Flag_orbits->Flag_orbit_node[flag_orbit_idx].downstep_primary_orbit;
1052
1053 for (i = 0; i < 6; i++) {
1054 Arc6[i] = Flag[i];
1055 }
1056
1057 pair_orbit_idx = Flag[6];
1058 part_orbit_idx = Flag[9];
1059
1060 lines[0] = Flag[11];
1061 lines[1] = Flag[12];
1062
1063 P2[0] = Flag[7];
1064 P2[1] = Flag[8];
1065
1066 part_rk = Flag[10];
1067
1068 flag_stab_order = Flag_orbits->Flag_orbit_node[flag_orbit_idx].gens->group_order_as_lint();
1069
1070 ost << flag_orbit_idx << " & ";
1071 ost << arc_idx << " & ";
1072 L.lint_set_print_tex(ost, Arc6, 6);
1073 ost << " & ";
1074 ost << pair_orbit_idx << " & ";
1075 L.lint_set_print_tex(ost, P2, 2);
1076 ost << " & ";
1077 ost << part_orbit_idx << " & ";
1078 ost << part_rk << " & ";
1079 L.lint_set_print_tex(ost, lines, 2);
1080 ost << " & ";
1081 ost << flag_stab_order << "\\\\" << endl;
1082 ost << "\\hline" << endl;
1083 }
1084 ost << "\\end{array}" << endl;
1085 ost << "$$" << endl;
1086}
1087
1088void surfaces_arc_lifting::report_flag_orbits_in_detail(ostream &ost, int verbose_level)
1089{
1090 int f_v = (verbose_level >= 1);
1092
1093 if (f_v) {
1094 cout << "surfaces_arc_lifting::report_flag_orbits_in_detail" << endl;
1095 }
1096
1097
1098
1099
1100
1101 //flag_orbit_on_arcs_not_on_a_conic_idx = NULL; // [Flag_orbits->nb_flag_orbits]
1102 //flag_orbit_on_pairs_idx = NULL; // [Flag_orbits->nb_flag_orbits]
1103 //flag_orbit_on_partition_idx = NULL; // [Flag_orbits->nb_flag_orbits]
1104
1105 ost << "There are " << Flag_orbits->nb_flag_orbits
1106 << " flag orbits. "
1107 "They are as follows:\\\\" << endl << endl;
1108
1109 int f, arc_idx, pair_idx, part_idx;
1110
1111 for (f = 0; f < Flag_orbits->nb_flag_orbits; f++) {
1112
1113
1114 ost << "\\subsection*{Flag Orbit "
1115 << f << " / "
1116 << Flag_orbits->nb_flag_orbits << "}" << endl;
1117
1119 pair_idx = flag_orbit_on_pairs_idx[f];
1120 part_idx = flag_orbit_on_partition_idx[f];
1121
1122 ost << "Associated with arc =" << arc_idx << ", pair orbit "
1123 << pair_idx << " and partition orbit " << part_idx << "\\\\" << endl;
1124
1125
1126
1127 long int *Flag;
1128 int line1, line2;
1129
1130 Flag = Flag_orbits->Pt +
1132
1133 // Flag[0..5] : 6 for the arc P1,...,P6
1134 // Flag[6] : 1 for orb, the selected orbit on pairs
1135 // Flag[7..8] : 2 for the selected pair, i.e., {0,1} for P1,P2.
1136 // Flag[9] : 1 for orbit, the selected orbit on set_partitions
1137 // Flag[10] : 1 for the partition of the remaining points; values=0,1,2
1138 // Flag[11..12] : 2 for the chosen lines line1 and line2 through P1 and P2
1139 // Flag[13..32] : 20 for the equation of the surface
1140 // Flag[33..59] : 27 for the lines of the surface
1141
1142 line1 = Flag[11];
1143 line2 = Flag[12];
1144
1145 ost << "line1=" << line1 << " line2=" << line2 << "\\\\" << endl;
1146 ost << "$$" << endl;
1147 ost << "\\ell_1 = " << endl;
1148 //ost << "\\left[" << endl;
1150 //ost << "\\right]" << endl;
1151 ost << "\\quad" << endl;
1152 ost << "\\ell_2 = " << endl;
1153 //fp << "\\left[" << endl;
1155 //fp << "\\right]" << endl;
1156 ost << "$$" << endl;
1157 ost << "The equation of the lifted surface is:" << endl;
1158 ost << "\\begin{align*}" << endl;
1159 ost << "&" << endl;
1160
1161#if 0
1162 Surf->print_equation_tex_lint(ost, Flag + 13);
1163#else
1165 ost, Flag + 13, 6 /* nb_terms_per_line */,
1166 "\\\\\n&" /*const char *new_line_text*/);
1167 ost << "=0" << endl;
1168#endif
1169
1170 ost << "\\end{align*}" << endl;
1171 ost << "$$" << endl;
1172 Lint_vec_print(ost, Flag + 13, 20);
1173 ost << "$$" << endl;
1174
1175
1176
1177 ost << "nb received = " << Flag_orbits->Flag_orbit_node[f].nb_received << "\\\\" << endl;
1178
1181 int i;
1182
1183 for (i = 0; i < Flag_orbits->Flag_orbit_node[f].nb_received; i++) {
1184 ost << "Flag orbit " << f << " / "
1186 << ", Trace event " << i << " / "
1187 << Flag_orbits->Flag_orbit_node[f].nb_received << ":\\\\" << endl;
1189 Flag_orbits->free_received_trace_data, 0 /*verbose_level*/);
1190 }
1191 }
1192 }
1193
1194
1195
1196
1197
1199 pair_orbit = Table_orbits_on_pairs[arc_idx].
1200 Orbits_on_pairs->get_set_and_stabilizer(
1201 2 /* level */,
1202 pair_idx,
1203 0 /* verbose_level */);
1204 ost << "Pair orbit: $";
1205 //int_vec_print(fp, Arc6, 6);
1206 pair_orbit->print_set_tex(ost);
1207 ost << "$\\\\" << endl;
1208 if (pair_orbit->Strong_gens->group_order_as_lint() > 1) {
1209 ost << "The stabilizer of the pair is the following group of order "
1210 << pair_orbit->Strong_gens->group_order_as_lint()
1211 << ":\\\\" << endl;
1212 pair_orbit->Strong_gens->print_generators_tex(ost);
1214 ost, Table_orbits_on_pairs[arc_idx].A_on_arc);
1215 }
1216
1217 groups::schreier *Sch;
1218 int part[4];
1219 int h;
1220
1221 Sch = Table_orbits_on_pairs[arc_idx].
1222 Table_orbits_on_partition[pair_idx].Orbits_on_partition;
1223
1224
1225 int f, l, orbit_rep;
1226
1227 f = Sch->orbit_first[part_idx];
1228 l = Sch->orbit_len[part_idx];
1229
1230 orbit_rep = Sch->orbit[f + 0];
1231 ost << "orbit of $" << orbit_rep << "$ has length " << l
1232 << ", and corresponds to the partition $";
1233 Combi.set_partition_4_into_2_unrank(orbit_rep, part);
1234 for (h = 0; h < 2; h++) {
1235 Int_vec_print(ost, part + h * 2, 2);
1236 }
1237 ost << "$\\\\" << endl;
1238
1241
1242 cout << "computing partition stabilizer:" << endl;
1243
1244 ring_theory::longinteger_object full_group_order;
1245
1246 pair_orbit->Strong_gens->group_order(full_group_order);
1247 cout << "expecting a group of order "
1248 << full_group_order << endl;
1249 SG = Sch->stabilizer_orbit_rep(
1250 A3,
1251 full_group_order,
1252 part_idx, verbose_level);
1253
1254 if (SG->group_order_as_lint() > 1) {
1255 ost << "The stabilizer is the following group of order "
1256 << SG->group_order_as_lint()
1257 << ":\\\\" << endl;
1258 SG->print_generators_tex(ost);
1260 ost, Table_orbits_on_pairs[arc_idx].A_on_arc);
1261 ost << "The embedded stabilizer is the "
1262 "following group of order "
1263 << SG->group_order_as_lint()
1264 << ":\\\\" << endl;
1266 if (SG->group_order_as_lint() < 10){
1267 ost << "The elements of the group of order "
1268 << SG->group_order_as_lint()
1269 << " are:\\\\" << endl;
1271 }
1272 }
1273 else {
1274 ost << "The stabilizer is trivial.\\\\" << endl;
1275
1276 }
1277
1278 FREE_OBJECT(pair_orbit);
1279
1280 }
1281
1282#if 0
1283 Six_arcs->report_latex(ost);
1284
1285
1286
1287 nb_arcs = Six_arcs->Gen->gen->nb_orbits_at_level(6);
1288
1289
1290
1291 ost << "There are " << nb_arcs << " arcs.\\\\" << endl << endl;
1292
1293
1294
1295
1296
1297 ost << "There are " << Six_arcs->nb_arcs_not_on_conic
1298 << " arcs not on a conic. "
1299 "They are as follows:\\\\" << endl << endl;
1300
1301
1302 for (arc_idx = 0;
1303 arc_idx < Six_arcs->nb_arcs_not_on_conic;
1304 arc_idx++) {
1305
1306 set_and_stabilizer *The_arc;
1307
1309 6 /* level */,
1310 Six_arcs->Not_on_conic_idx[arc_idx],
1311 0 /* verbose_level */);
1312
1313
1314
1315 ost << "\\subsection*{Arc "
1316 << arc_idx << " / "
1317 << Six_arcs->nb_arcs_not_on_conic << "}" << endl;
1318
1319 ost << "$$" << endl;
1320 //int_vec_print(ost, Arc6, 6);
1321 The_arc->print_set_tex(ost);
1322 ost << "$$" << endl;
1323
1325 The_arc->data, 6, 3);
1326
1327
1328 ost << "The stabilizer is the following group:\\\\" << endl;
1329 The_arc->Strong_gens->print_generators_tex(ost);
1330
1331 int orb, nb_orbits_on_pairs;
1332 int downstep_secondary_orbit = 0;
1333
1334 nb_orbits_on_pairs = Table_orbits_on_pairs[arc_idx].
1335 Orbits_on_pairs->nb_orbits_at_level(2);
1336
1337 ost << "There are " << nb_orbits_on_pairs
1338 << " orbits on pairs:" << endl;
1339 ost << "\\begin{enumerate}[(1)]" << endl;
1340
1341 for (orb = 0; orb < nb_orbits_on_pairs; orb++) {
1342 ost << "\\item" << endl;
1343 set_and_stabilizer *pair_orbit;
1344 pair_orbit = Table_orbits_on_pairs[arc_idx].
1345 Orbits_on_pairs->get_set_and_stabilizer(
1346 2 /* level */,
1347 orb,
1348 0 /* verbose_level */);
1349 ost << "$";
1350 //int_vec_print(fp, Arc6, 6);
1351 pair_orbit->print_set_tex(ost);
1352 ost << "$\\\\" << endl;
1353 if (pair_orbit->Strong_gens->group_order_as_lint() > 1) {
1354 ost << "The stabilizer is the following group of order "
1355 << pair_orbit->Strong_gens->group_order_as_lint()
1356 << ":\\\\" << endl;
1357 pair_orbit->Strong_gens->print_generators_tex(ost);
1358 pair_orbit->Strong_gens->print_generators_as_permutations_tex(
1359 ost, Table_orbits_on_pairs[arc_idx].A_on_arc);
1360 }
1361
1362 int orbit;
1363 int nb_partition_orbits;
1364
1365 nb_partition_orbits = Table_orbits_on_pairs[arc_idx].
1366 Table_orbits_on_partition[orb].nb_orbits_on_partition;
1367
1368 ost << "There are " << nb_partition_orbits
1369 << " orbits on partitions.\\\\" << endl;
1370 ost << "\\begin{enumerate}[(i)]" << endl;
1371
1372 schreier *Sch;
1373 int part[4];
1374 int h;
1375
1376 Sch = Table_orbits_on_pairs[arc_idx].
1377 Table_orbits_on_partition[orb].Orbits_on_partition;
1378
1379
1380 for (orbit = 0; orbit < nb_partition_orbits; orbit++) {
1381
1382 ost << "\\item" << endl;
1383
1384 int flag_orbit_idx;
1385
1387 arc_idx /* po */,
1388 downstep_secondary_orbit /* so */,
1389 flag_orbit_idx,
1390 verbose_level);
1391
1392 ost << "secondary orbit number " << downstep_secondary_orbit
1393 << " is flag orbit " << flag_orbit_idx
1394 << ":\\\\" << endl;
1395
1396 int f, l, orbit_rep;
1397
1398 f = Sch->orbit_first[orbit];
1399 l = Sch->orbit_len[orbit];
1400
1401 orbit_rep = Sch->orbit[f + 0];
1402 ost << "orbit of $" << orbit_rep << "$ has length " << l
1403 << ", and corresponds to the partition $";
1404 Combi.set_partition_4_into_2_unrank(orbit_rep, part);
1405 for (h = 0; h < 2; h++) {
1406 int_vec_print(ost, part + h * 2, 2);
1407 }
1408 ost << "$\\\\" << endl;
1409
1410 longinteger_object go;
1411 strong_generators *SG;
1412
1413 cout << "computing partition stabilizer:" << endl;
1414
1415 longinteger_object full_group_order;
1416
1417 pair_orbit->Strong_gens->group_order(full_group_order);
1418 cout << "expecting a group of order "
1419 << full_group_order << endl;
1420 SG = Sch->stabilizer_orbit_rep(
1421 A3,
1422 full_group_order,
1423 orbit, verbose_level);
1424
1425 if (SG->group_order_as_lint() > 1) {
1426 ost << "The stabilizer is the following group of order "
1427 << SG->group_order_as_lint()
1428 << ":\\\\" << endl;
1429 SG->print_generators_tex(ost);
1430 SG->print_generators_as_permutations_tex(
1431 ost, Table_orbits_on_pairs[arc_idx].A_on_arc);
1432 ost << "The embedded stabilizer is the "
1433 "following group of order "
1434 << SG->group_order_as_lint()
1435 << ":\\\\" << endl;
1436 Flag_orbits->Flag_orbit_node[flag_orbit_idx].gens->
1437 print_generators_tex(ost);
1438 }
1439 else {
1440 ost << "The stabilizer is trivial.\\\\" << endl;
1441
1442 }
1443 long int *Flag;
1444 int line1, line2;
1445
1446 Flag = Flag_orbits->Pt +
1447 flag_orbit_idx * Flag_orbits->pt_representation_sz;
1448
1449 // Flag[0..5] : 6 for the arc P1,...,P6
1450 // Flag[6] : 1 for orb, the selected orbit on pairs
1451 // Flag[7..8] : 2 for the selected pair, i.e., {0,1} for P1,P2.
1452 // Flag[9] : 1 for orbit, the selected orbit on set_partitions
1453 // Flag[10] : 1 for the partition of the remaining points; values=0,1,2
1454 // Flag[11..12] : 2 for the chosen lines line1 and line2 through P1 and P2
1455 // Flag[13..32] : 20 for the equation of the surface
1456 // Flag[33..59] : 27 for the lines of the surface
1457
1458 line1 = Flag[11];
1459 line2 = Flag[12];
1460
1461 ost << "line1=" << line1 << " line2=" << line2 << "\\\\" << endl;
1462 ost << "$$" << endl;
1463 ost << "\\ell_1 = " << endl;
1464 //ost << "\\left[" << endl;
1466 //ost << "\\right]" << endl;
1467 ost << "\\quad" << endl;
1468 ost << "\\ell_2 = " << endl;
1469 //fp << "\\left[" << endl;
1471 //fp << "\\right]" << endl;
1472 ost << "$$" << endl;
1473 ost << "The equation of the lifted surface is:" << endl;
1474 ost << "$$" << endl;
1475 Surf->print_equation_tex_lint(ost, Flag + 13);
1476 ost << "$$" << endl;
1477 ost << "$$" << endl;
1478 lint_vec_print(ost, Flag + 13, 20);
1479 ost << "$$" << endl;
1480
1481 downstep_secondary_orbit++;
1482
1483 //FREE_OBJECT(Stab);
1484
1485 }
1486 ost << "\\end{enumerate}" << endl;
1487 }
1488 ost << "\\end{enumerate}" << endl;
1489 ost << "There are in total " << Table_orbits_on_pairs[arc_idx].
1490 total_nb_orbits_on_partitions
1491 << " orbits on partitions.\\\\" << endl;
1492
1493 FREE_OBJECT(The_arc);
1494 }
1495#endif
1496
1497}
1498
1499
1500void surfaces_arc_lifting::report_surfaces_in_detail(ostream &ost, int verbose_level)
1501{
1502 int f_v = (verbose_level >= 1);
1503 int i;
1504 int f_print_stabilizer_gens = TRUE;
1509
1510 if (f_v) {
1511 cout << "surfaces_arc_lifting::report_surfaces_in_detail" << endl;
1512 }
1513
1514
1515
1516 //ost << "\\begin{enumerate}" << endl;
1517 for (i = 0; i < Surfaces->nb_orbits; i++) {
1518
1519 if (f_v) {
1520 cout << "orbit " << i << " / " << Surfaces->nb_orbits << ":" << endl;
1521 }
1522
1523 Surfaces->Orbit[i].gens->group_order(go1);
1524
1525 if (f_v) {
1526 cout << "stab order " << go1 << endl;
1527 }
1528
1529 Dom.integral_division_exact(Surfaces->go, go1, ol);
1530
1531 if (f_v) {
1532 cout << "orbit length " << ol << endl;
1533 }
1534
1535 //ost << "\\item" << endl;
1536 ost << "Surface $" << i << " / " << Surfaces->nb_orbits << "$ \\\\" << endl;
1537
1538
1539
1540 ost << "$" << endl;
1541
1543 Surfaces->Rep_ith(i),
1545
1546 ost << "_{";
1547 go1.print_not_scientific(ost);
1548 ost << "}$ orbit length $";
1549 ol.print_not_scientific(ost);
1550 ost << "$\\\\" << endl;
1551
1552 if (f_print_stabilizer_gens) {
1553 //ost << "Strong generators are:" << endl;
1555 }
1556
1557
1558
1560
1561
1562 D->SO->SOP->print_lines(ost);
1563
1564 D->SO->SOP->print_tritangent_planes(ost);
1565
1566 D->report_Clebsch_maps(ost, verbose_level);
1567 // too much output!
1568
1569 ost << "The automorphism group of the surface:\\\\" << endl;
1570
1571 if (D->SOA) {
1572 D->SOA->cheat_sheet_basic(ost, verbose_level);
1573 }
1574
1575
1576 //ost << "Coset Representatives:\\\\" << endl;
1577
1578 //D->report_cosets(ost, verbose_level);
1579
1580 ost << "Coset Representatives in detail:\\\\" << endl;
1581
1582 D->report_cosets_detailed(ost, verbose_level);
1583
1584 ost << "Coset Representatives HDS:\\\\" << endl;
1585
1586 D->report_cosets_HDS(ost, verbose_level);
1587
1588
1589 ost << "Coset Representatives T3:\\\\" << endl;
1590
1591 D->report_cosets_T3(ost, verbose_level);
1592
1593 //Dom.add_in_place(Ol, ol);
1594
1595
1596 }
1597 //ost << "\\end{enumerate}" << endl;
1598
1599
1600
1601 if (f_v) {
1602 cout << "surfaces_arc_lifting::report_surfaces_in_detail done" << endl;
1603 }
1604}
1605
1606
1607static void callback_surfaces_arc_lifting_report(std::ostream &ost, int i,
1608 invariant_relations::classification_step *Step, void *print_function_data)
1609{
1610 int verbose_level = 0;
1611 void *data;
1613 //surfaces_arc_lifting *SAL;
1614
1615
1616 data = Step->Orbit[i].extra_data;
1618 //SAL = (surfaces_arc_lifting *) print_function_data;
1619
1620 D->report_tally_F2(ost, verbose_level);
1621}
1622
1623static void callback_surfaces_arc_lifting_free_trace_result(void *ptr, void *data, int verbose_level)
1624{
1625 int f_v = (verbose_level >= 1);
1626
1627 if (f_v) {
1628 cout << "callback_surfaces_arc_lifting_free_trace_result" << endl;
1629 }
1630 //surfaces_arc_lifting *SAL;
1631 surfaces_arc_lifting_trace *T;
1632
1633 //SAL = (surfaces_arc_lifting *) data;
1634 T = (surfaces_arc_lifting_trace *) ptr;
1635
1636 FREE_OBJECT(T);
1637 if (f_v) {
1638 cout << "callback_surfaces_arc_lifting_free_trace_result done" << endl;
1639 }
1640}
1641
1642static void callback_surfaces_arc_lifting_latex_report_trace(std::ostream &ost, void *trace_result, void *data, int verbose_level)
1643{
1644 int f_v = (verbose_level >= 1);
1645
1646 if (f_v) {
1647 cout << "callback_surfaces_arc_lifting_latex_report_trace" << endl;
1648 }
1649 surfaces_arc_lifting *SAL;
1650 surfaces_arc_lifting_trace *T;
1651
1652 SAL = (surfaces_arc_lifting *) data;
1653 T = (surfaces_arc_lifting_trace *) trace_result;
1654
1655
1656 //T->report_product(ost, coset_reps->ith(i), verbose_level);
1657
1658 T->The_case.report_single_Clebsch_map(ost, verbose_level);
1659
1660
1661 //SO->print_lines(ost);
1662
1663 surfaces_arc_lifting_definition_node *D;
1664
1665 int idx;
1666
1667 idx = SAL->Flag_orbits->Flag_orbit_node[T->f2].upstep_primary_orbit;
1668
1669
1670 D = (surfaces_arc_lifting_definition_node *) SAL->Surfaces->Orbit[idx].extra_data;
1671
1672
1673 T->The_case.report_Clebsch_map_details(ost, D->SO, verbose_level);
1674
1675 T->report_product(ost, T->Elt_T3, verbose_level);
1676
1677 if (f_v) {
1678 cout << "callback_surfaces_arc_lifting_latex_report_trace done" << endl;
1679 }
1680
1681}
1682
1683
1684}}}}
1685
1686
ring_theory::homogeneous_polynomial_domain * Poly3_4
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 print_equation_tex_lint(std::ostream &ost, long int *coeffs)
void PG_elements_embed(long int *set_in, long int *set_out, int sz, int old_length, int new_length, int *v)
void display_table_of_projective_points(std::ostream &ost, long int *Pts, int nb_pts, int len)
various functions related to geometries
Definition: geometry.h:721
void find_two_lines_for_arc_lifting(projective_space *P, long int P1, long int P2, long int &line1, long int &line2, int verbose_level)
void rearrange_arc_for_lifting(long int *Arc6, long int P1, long int P2, int partition_rk, long int *arc, int verbose_level)
void print_single_generator_matrix_tex(std::ostream &ost, long int a)
Definition: grassmann.cpp:122
options for drawing an object of type layered_graph
Definition: graphics.h:457
void lint_set_print_tex_for_inline_text(std::ostream &ost, long int *v, int len)
void lint_set_print_tex(std::ostream &ost, long int *v, int len)
void head(std::ostream &ost, int f_book, int f_title, const char *title, const char *author, int f_toc, int f_landscape, int f_12pt, int f_enlarged_page, int f_pagenumbers, const char *extras_for_preamble)
void print_equation_with_line_breaks_tex_lint(std::ostream &ost, long int *coeffs, int nb_terms_per_line, const char *new_line_text)
domain to compute with objects of type longinteger
Definition: ring_theory.h:240
void integral_division_exact(longinteger_object &a, longinteger_object &b, longinteger_object &a_over_b)
a class to represent arbitrary precision integers
Definition: ring_theory.h:366
void report(std::ostream &ost, int f_sims, groups::sims *S, int f_strong_gens, groups::strong_generators *SG, graphics::layered_graph_draw_options *LG_Draw_options, int verbose_level)
Definition: action_io.cpp:22
void init_projective_group(int n, field_theory::finite_field *F, int f_semilinear, int f_basis, int f_init_sims, data_structures_groups::vector_ge *&nice_gens, int verbose_level)
void report_what_we_act_on(std::ostream &ost, graphics::layered_graph_draw_options *O, int verbose_level)
Definition: action_io.cpp:164
Schreier trees for orbits of groups on points.
Definition: groups.h:839
strong_generators * stabilizer_orbit_rep(actions::action *default_action, ring_theory::longinteger_object &full_group_order, int orbit_idx, int verbose_level)
Definition: schreier.cpp:2345
a strong generating set for a permutation group with respect to a fixed action
Definition: groups.h:1703
void print_generators_as_permutations_tex(std::ostream &ost, actions::action *A2)
void hyperplane_lifting_with_two_lines_fixed(strong_generators *SG_hyperplane, geometry::projective_space *P, int line1, int line2, int verbose_level)
void group_order(ring_theory::longinteger_object &go)
a single step classification of combinatorial objects
Definition: classify.h:29
void print_latex(std::ostream &ost, std::string &title, int f_print_stabilizer_gens, int f_has_print_function, void(*print_function)(std::ostream &ost, int i, classification_step *Step, void *print_function_data), void *print_function_data)
void init(flag_orbits *Flag_orbits, int flag_orbit_index, int downstep_primary_orbit, int downstep_secondary_orbit, int downstep_orbit_len, int f_long_orbit, long int *pt_representation, groups::strong_generators *Strong_gens, int verbose_level)
stores the set of flag orbits; related to the class classification_step
Definition: classify.h:75
int find_node_by_po_so(int po, int so, int &idx, int verbose_level)
void(* func_latex_report_trace)(std::ostream &ost, void *trace_result, void *data, int verbose_level)
Definition: classify.h:85
void init(actions::action *A, actions::action *A2, int nb_primary_orbits_lower, int pt_representation_sz, int nb_flag_orbits, int upper_bound_for_number_of_traces, void(*func_to_free_received_trace)(void *trace_result, void *data, int verbose_level), void(*func_latex_report_trace)(std::ostream &ost, void *trace_result, void *data, int verbose_level), void *free_received_trace_data, int verbose_level)
Definition: flag_orbits.cpp:75
to control the behavior of the poset classification algorithm
to control the behavior of the poset classification report function
data_structures_groups::set_and_stabilizer * get_set_and_stabilizer(int level, int orbit_at_level, int verbose_level)
void report(std::ostream &ost, poset_classification_report_options *Opt, int verbose_level)
void init(surfaces_arc_lifting *SAL, int arc_idx, actions::action *A, 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 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)
description of a classification problem of arcs in a geometry
Definition: tl_geometry.h:27
poset_classification::poset_classification_control * Control
Definition: tl_geometry.h:32
poset_classification::poset_classification * gen
Definition: tl_geometry.h:104
#define Lint_vec_copy(A, B, C)
Definition: foundations.h:694
#define FREE_OBJECTS(p)
Definition: foundations.h:652
#define FREE_int(p)
Definition: foundations.h:640
#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 NEW_OBJECTS(type, n)
Definition: foundations.h:639
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define Int_vec_copy_to_lint(A, B, C)
Definition: foundations.h:722
#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