Orbiter 2022
Combinatorial Objects
trihedral_pair_with_action.cpp
Go to the documentation of this file.
1/*
2 * trihedral_pair_with_action.cpp
3 *
4 * Created on: Jul 19, 2020
5 * Author: betten
6 */
7
8
9
10
11#include "orbiter.h"
12
13using namespace std;
14
15
16namespace orbiter {
17namespace layer5_applications {
18namespace applications_in_algebraic_geometry {
19namespace cubic_surfaces_and_arcs {
20
21
23{
24 AL = NULL;
25
26 //int The_six_plane_equations[6 * 4];
28 //long int plane6_by_dual_ranks[6];
29 lambda = lambda_rk = 0;
30 t_idx = 0;
31
33 gens_subgroup = NULL;
34 A_on_equations = NULL;
35 Orb = NULL;
37 cosets = NULL;
38 coset_reps = NULL;
39 aut_T_index = NULL;
40 aut_coset_index = NULL;
41 Aut_gens = NULL;
42
43 //int F_plane[3 * 4];
44 //int G_plane[3 * 4];
45 System = NULL;
46
47 //int Iso_type_as_double_triplet[120];
52
53 transporter0 = NULL;
54 transporter = NULL;
55 Elt1 = NULL;
56 Elt2 = NULL;
57 Elt3 = NULL;
58 Elt4 = NULL;
59 Elt5 = NULL;
60}
61
62
63
64
65
67{
70 }
71
72
75 }
76 if (gens_subgroup) {
78 }
79 if (A_on_equations) {
81 }
82 if (Orb) {
84 }
85 if (cosets) {
87 }
88 if (coset_reps) {
90 }
91 if (aut_T_index) {
93 }
94 if (aut_coset_index) {
96 }
97 if (Aut_gens) {
99 }
100
101
102
103 if (System) {
105 }
106
109 }
112 }
115 }
116
117 if (transporter0) {
119 }
120 if (transporter) {
122 }
123 if (Elt1) {
124 FREE_int(Elt1);
125 }
126 if (Elt2) {
127 FREE_int(Elt2);
128 }
129 if (Elt3) {
130 FREE_int(Elt3);
131 }
132 if (Elt4) {
133 FREE_int(Elt4);
134 }
135 if (Elt5) {
136 FREE_int(Elt5);
137 }
138}
139
141{
142 int f_v = (verbose_level >= 1);
143
144 if (f_v) {
145 cout << "trihedral_pair_with_action::init" << endl;
146 }
147
149
150
158
159
160
161 if (f_v) {
162 cout << "trihedral_pair_with_action::init before "
163 "create_surface_from_trihedral_pair_and_arc"
164 << endl;
165 }
167 AL->Web->t_idx0,
168 verbose_level - 2);
169 if (f_v) {
170 cout << "trihedral_pair_with_action::init after "
171 "create_surface_from_trihedral_pair_and_arc"
172 << endl;
173 }
174
175 if (f_v) {
177 }
178
179
180 if (f_v) {
181 cout << "trihedral_pair_with_action::init "
182 "before create_clebsch_system" << endl;
183 }
185 //The_six_plane_equations,
186 //lambda,
187 0 /* verbose_level */);
188 if (f_v) {
189 cout << "trihedral_pair_with_action::init "
190 "after create_clebsch_system" << endl;
191 }
192
193
194
195 if (f_v) {
196 cout << "trihedral_pair_with_action::init before "
197 "create_stabilizer_of_trihedral_pair" << endl;
198 }
200 //plane6_by_dual_ranks,
202 verbose_level - 2);
203 if (f_v) {
204 cout << "trihedral_pair_with_action::init after "
205 "create_stabilizer_of_trihedral_pair" << endl;
206 }
207
209 if (f_v) {
210 cout << "trihedral_pair_with_action::init the stabilizer of "
211 "the trihedral pair has order "
213 }
214
215
216
217 if (f_v) {
218 cout << "trihedral_pair_with_action::init before "
219 "create_action_on_equations_and_compute_orbits" << endl;
220 }
224 /* strong_generators *gens_for_stabilizer_of_trihedral_pair */,
226 verbose_level - 2);
227 if (f_v) {
228 cout << "trihedral_pair_with_action::init after "
229 "create_action_on_equations_and_compute_orbits" << endl;
230 }
231
232
233 if (f_v) {
234 cout << "trihedral_pair_with_action::init the orbits "
235 "on the pencil of surfaces are:" << endl;
236 }
238
239
240
241 //Surf_A->A->group_order(go_PGL);
242
243
244 if (f_v) {
245 cout << "trihedral_pair_with_action::init before "
246 "Orb->stabilizer_any_point_plus_cosets" << endl;
247 }
250 AL->Surf_A->A,
252 lambda_rk /* pt */,
253 cosets,
254 verbose_level - 2);
255
256 if (f_v) {
257 cout << "trihedral_pair_with_action::init after "
258 "Orb->stabilizer_any_point_plus_cosets" << endl;
259 }
260
261 if (f_v) {
262 cout << "trihedral_pair_with_action::init we found the "
263 "following coset representatives:" << endl;
264 cosets->print(cout);
265 }
266
267
268
269
270 if (f_v) {
271 cout << "trihedral_pair_with_action::init after "
272 "Orb->stabilizer_any_point" << endl;
273 }
275 if (f_v) {
276 cout << "trihedral_pair_with_action::init "
277 "The stabilizer of the trihedral pair inside "
278 "the group of the surface has order "
279 << stab_order << endl;
280 }
281
282 if (f_v) {
283 cout << "trihedral_pair_with_action::init elements "
284 "in the stabilizer:" << endl;
286 }
287
288 if (f_v) {
289 cout << "trihedral_pair_with_action::init The stabilizer of "
290 "the trihedral pair inside the stabilizer of the "
291 "surface is generated by:" << endl;
293 }
294
295
296
297
298
299
301 AL->Web->Dual_point_ranks + 0 * 6,
302 AL->Web->Dual_point_ranks + 0 * 6 + 3,
304 0 /* verbose_level */);
305
306
307 if (f_v) {
308 cout << "trihedral_pair_with_action::init before compute_iso_types_as_double_triplets" << endl;
309 }
311 if (f_v) {
312 cout << "trihedral_pair_with_action::init after compute_iso_types_as_double_triplets" << endl;
314 }
315
316 if (f_v) {
317 cout << "trihedral_pair_with_action::init before "
318 "loop_over_trihedral_pairs" << endl;
319 }
324 verbose_level - 2);
325 if (f_v) {
326 cout << "trihedral_pair_with_action::init after "
327 "loop_over_trihedral_pairs" << endl;
328 cout << "arc_lifting::create_surface we found an "
329 "orbit of length " << coset_reps->len << endl;
330 }
331
332
333
334 // the problem is here:
335 {
337
338 if (f_v) {
339 cout << "trihedral_pair_with_action::init "
340 "Extending the group:" << endl;
341 }
344 coset_reps, coset_reps->len, verbose_level - 3);
345
346 Aut_gens->group_order(ago);
347 if (f_v) {
348 cout << "trihedral_pair_with_action::init "
349 "The automorphism group has order " << ago << endl;
350 cout << "trihedral_pair_with_action::init "
351 "The automorphism group is:" << endl;
353 }
354 }
355 if (f_v) {
356 cout << "trihedral_pair_with_action::init done" << endl;
357 }
358}
359
360
364 int *&aut_T_index, int *&aut_coset_index,
365 int verbose_level)
366{
367 int f_v = (verbose_level >= 1);
368 int f_vv = (verbose_level >= 3);
369 //int f_vvv = (verbose_level >= 5);
370 int i, j;
371 long int planes6[6];
372 int orbit_index0;
373 int orbit_index;
374 int orbit_length;
375 //long int Nine_lines0[9];
376 //long int Nine_lines[9];
377 //long int *v;
378 //int sz;
380
381 if (f_v) {
382 cout << "trihedral_pair_with_action::loop_over_trihedral_pairs" << endl;
383 }
384
385 if (f_v) {
386 cout << "trihedral_pair_with_action::loop_over_trihedral_pairs "
387 "we are considering " << cosets->len
388 << " cosets from the downstep" << endl;
389 }
390
391
392 orbit_length = 0;
393
394
398 orbit_index0,
399 0 /*verbose_level*/);
400 if (f_v) {
401 cout << "trihedral_pair_with_action::loop_over_trihedral_pairs "
402 "Trihedral pair " << AL->Web->t_idx0
403 << " lies in orbit " << orbit_index0 << endl;
404 }
405
406#if 0
407 Surf->compute_nine_lines_by_dual_point_ranks(
408 Web->Dual_point_ranks + Web->t_idx0 * 6,
409 Web->Dual_point_ranks + Web->t_idx0 * 6 + 3,
410 Nine_lines0,
411 0 /* verbose_level */);
412
413 if (FALSE) {
414 cout << "trihedral_pair_with_action::loop_over_trihedral_pairs "
415 "The first trihedral pair gives "
416 "the following nine lines: ";
417 lint_vec_print(cout, Nine_lines0, 9);
418 cout << endl;
419 }
420#endif
421
423 coset_reps->init(AL->Surf_A->A, verbose_level - 2);
424 coset_reps->allocate(AL->Web->nb_T * cosets->len, verbose_level - 2);
425
428
429 for (i = 0; i < AL->Web->nb_T; i++) {
430
431 if (f_vv) {
432 cout << "trihedral_pair_with_action::loop_over_trihedral_pairs "
433 "testing if trihedral pair "
434 << i << " / " << AL->Web->nb_T << " = " << AL->Web->T_idx[i];
435 cout << " lies in the orbit:" << endl;
436 }
437
438 Lint_vec_copy(AL->Web->Dual_point_ranks + i * 6, planes6, 6);
439
440#if 0
441 Surf->compute_nine_lines_by_dual_point_ranks(
442 planes6,
443 planes6 + 3,
444 Nine_lines,
445 0 /* verbose_level */);
446
447 if (FALSE) {
448 cout << "trihedral_pair_with_action::loop_over_trihedral_pairs "
449 "The " << i << "-th trihedral "
450 "pair gives the following nine lines: ";
451 lint_vec_print(cout, Nine_lines, 9);
452 cout << endl;
453 }
454
455 Sorting.vec_intersect(Nine_lines0, 9, Nine_lines, 9, v, sz);
456
457 if (FALSE) {
458 cout << "trihedral_pair_with_action::loop_over_trihedral_pairs "
459 "The nine lines of the " << i
460 << "-th trihedral pair intersect the "
461 "nine lines of the first in " << sz
462 << " lines, which are: ";
463 lint_vec_print(cout, v, sz);
464 cout << endl;
465 }
466
467 if (FALSE) {
468 Surf->print_trihedral_pair_in_dual_coordinates_in_GAP(
469 planes6, planes6 + 3);
470 cout << endl;
471 }
472
473 FREE_lint(v);
474#endif
475
476
477
479 planes6,
481 orbit_index,
482 0 /*verbose_level */);
483
484
485 if (orbit_index != orbit_index0) {
486 if (f_vv) {
487 cout << "trihedral_pair_with_action::loop_over_trihedral_pairs "
488 "trihedral pair " << i << " / " << AL->Web->nb_T
489 << " lies in orbit " << orbit_index
490 << " and so $T_{" << AL->Web->t_idx0
491 << "}$ and T_i are not isomorphic" << endl;
492 }
493 continue;
494 }
495 if (f_v) {
496 cout << "trihedral_pair_with_action::loop_over_trihedral_pairs "
497 "trihedral pair " << i << " / " << AL->Web->nb_T
498 << " lies in orbit " << orbit_index
499 << " and so $T_{" << AL->Web->t_idx0
500 << "}$ and T_i are isomorphic" << endl;
501 }
502
503
506 if (f_vv) {
507 cout << "Elt2:" << endl;
509 }
510
511 for (j = 0; j < cosets->len; j++) {
512
513 if (f_v) {
514 cout << "trihedral_pair_with_action::loop_over_trihedral_pairs "
515 "testing coset j=" << j << " / "
516 << cosets->len << " orbit_length = " << orbit_length << endl;
517 }
518
519 // contragredient action:
520
521 AL->Surf_A->A->element_transpose(Elt2, Elt3, 0 /* verbose_level*/);
522
523
524
525 AL->Surf_A->A->element_move(cosets->ith(j), Elt5, 0);
526 //AL->Surf_A->A->element_invert(cosets->ith(j), Elt5, 0);
528 //AL->Surf_A->A->element_mult(Elt3, Elt5, Elt4, 0);
529
530 //cout << "transporter transposed:" << endl;
531 //A->print_quick(cout, Elt2);
532
533 int coeff_out[20];
534
535
536 //Surf_A->A->element_invert(Elt4, Elt5, 0);
537
538 if (FALSE) {
539 cout << "trihedral_pair_with_action::loop_over_trihedral_pairs "
540 "Elt4:" << endl;
542 }
543
544
545
547
548 if (f_v) {
549 cout << "trihedral_pair_with_action::loop_over_trihedral_pairs "
550 "before M->substitute_surface_equation" << endl;
551 }
552
553 M = AL->Surf_A->A->G.matrix_grp;
554
556 AL->the_equation, coeff_out, AL->Surf,
557 verbose_level - 6);
558
559
560 AL->F->PG_element_normalize(coeff_out, 1, 20);
561
562 if (f_v) {
563 cout << "trihedral_pair_with_action::loop_over_trihedral_pairs "
564 "The transformed equation is:" << endl;
565 Int_vec_print(cout, coeff_out, 20);
566 cout << endl;
567 }
568
569
570 if (Sorting.int_vec_compare(coeff_out, AL->the_equation, 20) == 0) {
571 if (f_v) {
572 cout << "trihedral_pair_with_action::loop_over_trihedral_pairs "
573 "trihedral pair " << i << " / " << AL->Web->nb_T
574 << ", coset " << j << " / " << cosets->len
575 << " gives automorphism, increased "
576 "orbit length is " << orbit_length + 1 << endl;
577 cout << "coset rep = " << endl;
579 }
580#if 0
581 Surf->compute_nine_lines_by_dual_point_ranks(
582 planes6, planes6 + 3,
583 Nine_lines,
584 0 /* verbose_level */);
585
586
587 if (FALSE) {
588 cout << "trihedral_pair_with_action::loop_over_trihedral_pairs "
589 "The " << orbit_length + 1 << "-th "
590 "trihedral pair in the orbit gives "
591 "the following nine lines: ";
592 lint_vec_print(cout, Nine_lines, 9);
593 cout << endl;
594 }
595#endif
596
597
598 AL->Surf_A->A->element_move(Elt4, coset_reps->ith(orbit_length), 0);
599
600 aut_T_index[orbit_length] = i;
601 aut_coset_index[orbit_length] = j;
602 orbit_length++;
603 }
604 else {
605 if (f_v) {
606 cout << "trihedral_pair_with_action::loop_over_trihedral_pairs "
607 "trihedral pair " << i << " / " << AL->Web->nb_T
608 << " coset " << j << " / " << cosets->len
609 << " does not lie in the orbit" << endl;
610 }
611 //exit(1);
612 }
613 } // next j
614
615 } // next i
616
617 if (f_v) {
618 cout << "trihedral_pair_with_action::loop_over_trihedral_pairs orbit_length = " << orbit_length << endl;
619 cout << "i : aut_T_index[i] : aut_coset_index[i]" << endl;
620 for (i = 0; i < orbit_length; i++) {
621 cout << i << " : " << aut_T_index[i] << " : " << aut_coset_index[i] << endl;
622 }
623 }
624
625 coset_reps->reallocate(orbit_length, verbose_level - 2);
626
627 if (f_v) {
628 cout << "trihedral_pair_with_action::loop_over_trihedral_pairs we found an "
629 "orbit of trihedral pairs of length "
630 << orbit_length << endl;
631 //cout << "coset reps:" << endl;
632 //coset_reps->print_tex(cout);
633 }
634
635 if (f_v) {
636 cout << "trihedral_pair_with_action::loop_over_trihedral_pairs done" << endl;
637 }
638}
639
640
641
643{
644 int f_v = (verbose_level >= 1);
645 int i;
646
647 if (f_v) {
648 cout << "trihedral_pair_with_action::create_the_six_plane_equations "
649 "t_idx=" << t_idx << endl;
650 }
651
652
655
656 for (i = 0; i < 6; i++) {
658 The_six_plane_equations + i * 4, 4);
659 }
660
661 if (f_v) {
662 cout << "trihedral_pair_with_action::create_the_six_plane_equations" << endl;
663 cout << "The_six_plane_equations=" << endl;
665 }
666
667 for (i = 0; i < 6; i++) {
669 }
670
671 if (f_v) {
672 cout << "trihedral_pair_with_action::create_the_six_plane_equations done" << endl;
673 }
674}
675
677 int t_idx,
678 int verbose_level)
679{
680 int f_v = (verbose_level >= 1);
681
682 if (f_v) {
683 cout << "trihedral_pair_with_action::create_surface_from_trihedral_pair_and_arc t_idx=" << t_idx << endl;
684 }
685
686 The_surface_equations = NEW_int((AL->q + 1) * 20);
687
689
690
691 if (f_v) {
692 cout << "trihedral_pair_with_action::create_surface_from_trihedral_pair_and_arc "
693 "before create_equations_for_pencil_of_surfaces_from_trihedral_pair" << endl;
694 }
697 verbose_level);
698
699 if (f_v) {
700 cout << "trihedral_pair_with_action::create_surface_from_trihedral_pair_and_arc "
701 "before create_lambda_from_trihedral_pair_and_arc" << endl;
702 }
705 verbose_level);
706
707
709
710 if (f_v) {
711 cout << "trihedral_pair_with_action::create_surface_from_trihedral_pair_and_arc done" << endl;
712 }
713}
714
716 int &trihedral_pair_orbit_index,
717 int verbose_level)
718{
719 int f_v = (verbose_level >= 1);
720
721 groups::strong_generators *gens_dual;
724
726
727
728 if (f_v) {
729 cout << "trihedral_pair_with_action::create_stabilizer_of_trihedral_pair" << endl;
730 }
731
732 if (f_v) {
733 cout << "trihedral_pair_with_action::create_stabilizer_of_trihedral_pair "
734 "before Surf_A->identify_trihedral_pair_and_get_stabilizer" << endl;
735 }
736
737 gens_dual =
740 verbose_level);
741
742 if (f_v) {
743 cout << "trihedral_pair_with_action::create_stabilizer_of_trihedral_pair "
744 "after Surf_A->identify_trihedral_pair_and_get_stabilizer" << endl;
745 }
746 gens_dual->group_order(go);
747
748
749 if (f_v) {
750 cout << "trihedral_pair_with_action::create_stabilizer_of_trihedral_pair "
751 "trihedral_pair_orbit_index="
753 << " group order = " << go << endl;
754 }
755
756 if (f_v) {
757 cout << "trihedral_pair_with_action::create_stabilizer_of_trihedral_pair "
758 "group generators:" << endl;
759 gens_dual->print_generators_tex(cout);
760 //gens_dual->print_elements_ost(cout);
761 }
762
763
764 gens->init(AL->Surf_A->A);
765
766 if (f_v) {
767 cout << "trihedral_pair_with_action::create_stabilizer_of_trihedral_pair "
768 "before gens->init_transposed_group" << endl;
769 }
770 gens->init_transposed_group(gens_dual, verbose_level);
771
772 if (f_v) {
773 cout << "trihedral_pair_with_action::create_stabilizer_of_trihedral_pair "
774 "The transposed stabilizer is generated by:" << endl;
775 gens->print_generators_tex(cout);
776 //gens->print_elements_ost(cout);
777 }
778
779 FREE_OBJECT(gens_dual);
780
781 if (f_v) {
782 cout << "trihedral_pair_with_action::create_stabilizer_of_trihedral_pair done" << endl;
783 }
784 return gens;
785}
786
788 int *The_surface_equations,
789 groups::strong_generators *gens_for_stabilizer_of_trihedral_pair,
790 actions::action *&A_on_equations, groups::schreier *&Orb,
791 int verbose_level)
792{
793 int f_v = (verbose_level >= 1);
794
795 if (f_v) {
796 cout << "trihedral_pair_with_action::create_action_on_equations_and_compute_orbits "
797 "verbose_level = " << verbose_level << endl;
798 }
799
800 if (f_v) {
801 cout << "trihedral_pair_with_action::create_action_on_equations_and_compute_orbits "
802 "before orbits_on_equations" << endl;
803 }
804
806 AL->Surf->Poly3_4,
808 AL->q + 1 /* nb_equations */,
809 gens_for_stabilizer_of_trihedral_pair,
811 Orb,
812 verbose_level);
813
814 if (f_v) {
815 cout << "trihedral_pair_with_action::create_action_on_equations_and_compute_orbits done" << endl;
816 }
817}
818
820{
821 int f_v = (verbose_level >= 1);
822 int i, j;
823
824 if (f_v) {
825 cout << "trihedral_pair_with_action::create_clebsch_system" << endl;
826 }
827
830 if (f_v) {
831 cout << "F_planes:" << endl;
833 cout << "G_planes:" << endl;
835 }
836
837 AL->Surf->compute_nine_lines(F_plane, G_plane, nine_lines, 0 /* verbose_level */);
838
839 if (f_v) {
840 cout << "trihedral_pair_with_action::create_clebsch_system" << endl;
841 cout << "The nine lines are: ";
842 Lint_vec_print(cout, nine_lines, 9);
843 cout << endl;
844 }
845
847 lambda, System, verbose_level);
848
849 if (f_v) {
850 cout << "trihedral_pair_with_action::create_clebsch_system "
851 "The System:" << endl;
852 for (i = 0; i < 3; i++) {
853 for (j = 0; j < 4; j++) {
854 int *p = System + (i * 4 + j) * 3;
855 AL->Surf->Poly1->print_equation(cout, p);
856 cout << endl;
857 }
858 }
859 }
860
861 if (f_v) {
862 cout << "trihedral_pair_with_action::create_clebsch_system done" << endl;
863 }
864}
865
867{
868 int f_v = (verbose_level >= 1);
869 long int planes6[6];
870 int i, orbit_index;
871
872 if (f_v) {
873 cout << "trihedral_pair_with_action::compute_iso_types_as_double_triplets" << endl;
874 }
875
876 for (i = 0; i < AL->Web->nb_T; i++) {
877
878 if (f_v) {
879 cout << "computing iso type of trihedral pair " << i << " / "
880 << AL->Web->nb_T << " = " << AL->Web->T_idx[i];
881 cout << ":" << endl;
882 }
883
884 Lint_vec_copy(AL->Web->Dual_point_ranks + i * 6, planes6, 6);
886 planes6,
888 orbit_index,
889 0 /*verbose_level */);
890
891 if (f_v) {
892 cout << "Trihedral pair " << i << " lies in orbit "
893 << orbit_index << "\\\\" << endl;
894 cout << "An isomorphism is given by" << endl;
895 cout << "$$" << endl;
897 cout << "$$" << endl;
898 }
899
900
901 Iso_type_as_double_triplet[i] = orbit_index;
902 }
903
904
906
909
912 nb_double_triplet_types, 0 /*verbose_level*/);
913
914 for (i = 0; i < nb_double_triplet_types; i++) {
916 }
917
918
919
920 if (f_v) {
921 cout << "trihedral_pair_with_action::compute_iso_types_as_double_triplets done" << endl;
922 }
923}
924
926{
928
929 ost << "$F$-planes:\\\\";
930 ost << "$$" << endl;
932 F_plane, 3, 4, TRUE /* f_tex*/);
933 ost << "$$" << endl;
934 ost << "$G$-planes:\\\\";
935 ost << "$$" << endl;
937 G_plane, 3, 4, TRUE /* f_tex*/);
938 ost << "$$" << endl;
939}
940
941
942
943
945{
946
947 cout << "lambda = " << lambda << endl;
948 cout << "lambda_rk = " << lambda_rk << endl;
949 cout << "The six plane equations:" << endl;
951 cout << endl;
952 cout << "The q+1 surface equations in the pencil:" << endl;
954 cout << endl;
955
956 cout << "The surface equation corresponding to "
957 "lambda = " << lambda << " which is equation "
958 "number " << lambda_rk << ":" << endl;
960 cout << endl;
961 cout << "the_equation:" << endl;
962 Int_vec_print(cout, AL->the_equation, 20);
963 cout << endl;
964}
965
966
967#if 0
968void trihedral_pair_with_action::print_isomorphism_types_of_trihedral_pairs(
969 ostream &ost,
970 vector_ge *cosets)
971{
972 int i, j;
973 long int planes6[6];
974 int orbit_index0;
975 int orbit_index;
976 int list[120];
977 int list_sz = 0;
978 int Tt[17];
979 int Iso[120];
980 latex_interface L;
981
982 cout << "trihedral_pair_with_action::print_isomorphism_types_of_trihedral_pairs" << endl;
983
984 ost << "\\bigskip" << endl;
985 ost << "" << endl;
986 ost << "\\section*{Computing the Automorphism Group}" << endl;
987 ost << "" << endl;
988
989 ost << "The equation of the surface is: $" << endl;
990 int_vec_print(ost, AL->the_equation, 20);
991 ost << "$\\\\" << endl;
992
993
994
995 ost << "\\bigskip" << endl;
996 ost << "" << endl;
997 ost << "\\subsection*{Computing the Automorphism "
998 "Group, Step 1}" << endl;
999 ost << "" << endl;
1000
1001
1002
1003
1005 AL->Web->Dual_point_ranks + AL->Web->t_idx0 * 6,
1007 orbit_index0,
1008 0 /*verbose_level*/);
1009 ost << "Trihedral pair $T_{" << AL->Web->t_idx0 << "}$ lies in orbit "
1010 << orbit_index0 << "\\\\" << endl;
1011 ost << "An isomorphism is given by" << endl;
1012 ost << "$$" << endl;
1014 ost << "$$" << endl;
1015
1016
1017
1018
1019 for (i = 0; i < AL->Web->nb_T; i++) {
1020
1021 cout << "testing if trihedral pair " << i << " / "
1022 << AL->Web->nb_T << " = " << AL->Web->T_idx[i];
1023 cout << " lies in the orbit:" << endl;
1024
1025 lint_vec_copy(AL->Web->Dual_point_ranks + i * 6, planes6, 6);
1027 planes6,
1029 orbit_index,
1030 0 /*verbose_level */);
1031
1032 ost << "Trihedral pair " << i << " lies in orbit "
1033 << orbit_index << "\\\\" << endl;
1034 ost << "An isomorphism is given by" << endl;
1035 ost << "$$" << endl;
1037 ost << "$$" << endl;
1038
1039
1040 Iso[i] = orbit_index;
1041
1042 if (orbit_index != orbit_index0) {
1043 continue;
1044 }
1045
1046 list[list_sz++] = i;
1047
1050
1051 ost << "An isomorphism between $T_{" << i << "}$ and $T_{"
1052 << AL->Web->t_idx0 << "}$ is given by" << endl;
1053 ost << "$$" << endl;
1055 ost << "$$" << endl;
1056
1057
1058 } // next i
1059
1060 ost << "The isomorphism types of the trihedral pairs "
1061 "in the list of double triplets are:" << endl;
1062 ost << "$$" << endl;
1063 L.print_integer_matrix_with_standard_labels_and_offset(ost,
1064 Iso + 0 * 1, 40, 1, 0, 0, TRUE /* f_tex */);
1065 ost << "\\quad" << endl;
1066 L.print_integer_matrix_with_standard_labels_and_offset(ost,
1067 Iso + 40 * 1, 40, 1, 40, 0, TRUE /* f_tex */);
1068 ost << "\\quad" << endl;
1069 L.print_integer_matrix_with_standard_labels_and_offset(ost,
1070 Iso + 80 * 1, 40, 1, 80, 0, TRUE /* f_tex */);
1071 ost << "$$" << endl;
1072
1073 int I, h, iso;
1074 ost << "The isomorphism types of the trihedral pairs in the "
1075 "list of double triplets are:" << endl;
1076 for (I = 0; I < 12; I++) {
1077 ost << "$$" << endl;
1078 ost << "\\begin{array}{c|c|c|c|c|c|}" << endl;
1079 ost << "i & T_i & \\mbox{trihedral pair} & \\mbox{double "
1080 "triplet} & \\mbox{iso} & \\mbox{map}\\\\" << endl;
1081 ost << "\\hline" << endl;
1082 for (h = 0; h < 10; h++) {
1083 i = I * 10 + h;
1084 ost << i << " & T_{" << AL->Surf_A->Surf->Trihedral_pair_labels[i]
1085 << "} & ";
1086
1087 lint_vec_copy(AL->Web->Dual_point_ranks + i * 6, planes6, 6);
1089 planes6,
1091 orbit_index,
1092 0 /*verbose_level */);
1093
1094
1095 ost << "\\{";
1096 for (j = 0; j < 3; j++) {
1097 ost << planes6[j];
1098 if (j < 3 - 1) {
1099 ost << ", ";
1100 }
1101 }
1102 ost << "; ";
1103 for (j = 0; j < 3; j++) {
1104 ost << planes6[3 + j];
1105 if (j < 3 - 1) {
1106 ost << ", ";
1107 }
1108 }
1109 ost << "\\}";
1110
1111 iso = Iso[i];
1112 lint_vec_copy(
1115 planes6, 6);
1116
1117 ost << " & ";
1118 ost << "\\{";
1119 for (j = 0; j < 3; j++) {
1120 ost << planes6[j];
1121 if (j < 3 - 1) {
1122 ost << ", ";
1123 }
1124 }
1125 ost << "; ";
1126 for (j = 0; j < 3; j++) {
1127 ost << planes6[3 + j];
1128 if (j < 3 - 1) {
1129 ost << ", ";
1130 }
1131 }
1132 ost << "\\}";
1133 ost << " & " << iso << " & " << endl;
1135 ost << "\\\\[4pt]" << endl;
1136 ost << "\\hline" << endl;
1137 }
1138 ost << "\\end{array}" << endl;
1139 ost << "$$" << endl;
1140 }
1141
1142 ost << "There are " << list_sz << " trihedral pairs which "
1143 "are isomorphic to the double triplet of $T_0$:\\\\" << endl;
1144 L.int_set_print_tex(ost, list, list_sz);
1145 ost << "$$" << endl;
1146 ost << "\\{ ";
1147 for (i = 0; i < list_sz; i++) {
1148 ost << "T_{" << list[i] << "}";
1149 if (i < list_sz - 1) {
1150 ost << ", ";
1151 }
1152 }
1153 ost << " \\}";
1154 ost << "$$" << endl;
1155
1156
1157 ost << "\\bigskip" << endl;
1158 ost << "" << endl;
1159 ost << "\\subsection*{Computing the Automorphism Group, Step 2}" << endl;
1160 ost << endl;
1161
1162
1163
1164
1165 ost << "We are now looping over the " << list_sz
1166 << " trihedral pairs which are isomorphic to the "
1167 "double triplet of $T_0$ and over the "
1168 << cosets->len << " cosets:\\\\" << endl;
1169 for (i = 0; i < list_sz; i++) {
1170 ost << "i=" << i << " / " << list_sz
1171 << " considering $T_{" << list[i] << "}$:\\\\";
1172
1173 lint_vec_copy(AL->Web->Dual_point_ranks + list[i] * 6, planes6, 6);
1174
1175
1177 planes6,
1179 orbit_index,
1180 0 /*verbose_level */);
1181
1184
1185 ost << "The isomorphism from $T_0$ to $T_{"
1186 << list[i] << "}$ is :" << endl;
1187 ost << "$$" << endl;
1189 ost << " = " << endl;
1191 ost << " \\cdot " << endl;
1192 ost << "\\left(" << endl;
1194 ost << "\\right)^{-1}" << endl;
1195 ost << "$$" << endl;
1196
1197 for (j = 0; j < cosets->len; j++) {
1198 ost << "i=" << i << " / " << list_sz << " j=" << j
1199 << " / " << cosets->len << " considering "
1200 "coset given by:" << endl;
1201 ost << "$$" << endl;
1202 AL->Surf_A->A->element_print_latex(cosets->ith(j), ost);
1203 ost << "$$" << endl;
1204
1205
1206
1207 matrix_group *mtx;
1208
1209 mtx = AL->Surf_A->A->G.matrix_grp;
1210
1211 // ToDo:
1212 AL->F->transpose_matrix(Elt2, Tt, 4, 4);
1213 if (mtx->f_semilinear) {
1214 // if we are doing semilinear:
1215 Tt[4 * 4] = Elt2[4 * 4];
1216 }
1217
1218
1219 AL->Surf_A->A->make_element(Elt3, Tt, 0);
1220 AL->Surf_A->A->element_invert(cosets->ith(j), Elt5, 0);
1221 AL->Surf_A->A->element_mult(Elt3, Elt5, Elt4, 0);
1222
1223 //cout << "transporter transposed:" << endl;
1224 //A->print_quick(cout, Elt2);
1225
1226 int coeff_out[20];
1227
1228
1229 //Surf_A->A->element_invert(Elt4, Elt5, 0);
1230
1231 ost << "i=" << i << " / " << list_sz << " j=" << j
1232 << " / " << cosets->len << " testing element:" << endl;
1233 ost << "$$" << endl;
1235 ost << " = " << endl;
1237 ost << " \\cdot " << endl;
1239 ost << "$$" << endl;
1240
1241
1242 //matrix_group *M;
1243
1244 //M = A->G.matrix_grp;
1245 mtx->substitute_surface_equation(Elt4,
1246 AL->the_equation, coeff_out, AL->Surf,
1247 0 /*verbose_level - 1*/);
1248
1249
1250 AL->F->PG_element_normalize(coeff_out, 1, 20);
1251
1252 ost << "The transformed equation is: $" << endl;
1253 int_vec_print(ost, coeff_out, 20);
1254 ost << "$\\\\" << endl;
1255
1256
1257 if (int_vec_compare(coeff_out, AL->the_equation, 20) == 0) {
1258 ost << "trihedral pair " << i << " / " << AL->Web->nb_T
1259 << ", coset " << j << " / " << cosets->len
1260 << " gives an automorphism\\\\" << endl;
1261 ost << "automorphism = " << endl;
1262 ost << "$$" << endl;
1264 ost << "$$" << endl;
1265
1266 }
1267 else {
1268 ost << "The equation is different, the group "
1269 "element is not an automorphism\\\\" << endl;
1270 }
1271
1272 } // next j
1273 } // next i
1274
1275
1276}
1277#endif
1278
1279void trihedral_pair_with_action::report(ostream &ost, int verbose_level)
1280{
1281 int f_v = (verbose_level >= 1);
1282 int i;
1283
1284 if (f_v) {
1285 cout << "trihedral_pair_with_action::report" << endl;
1286 }
1287
1288
1289
1290 cout << "trihedral_pair_with_action::print before "
1291 "print_the_six_plane_equations" << endl;
1294
1295 cout << "trihedral_pair_with_action::print before "
1296 "print_surface_equations_on_line" << endl;
1298 lambda, lambda_rk, ost);
1299
1300 int *coeffs;
1301 int coeffs2[20];
1302
1303 coeffs = The_surface_equations + lambda_rk * 20;
1304 Int_vec_copy(coeffs, coeffs2, 20);
1305 AL->F->PG_element_normalize_from_front(coeffs2, 1, 20);
1306
1307 ost << "\\bigskip" << endl;
1308 ost << "The normalized equation of the surface is:" << endl;
1309 ost << "$$" << endl;
1310 AL->Surf->print_equation_tex(ost, coeffs2);
1311 ost << "$$" << endl;
1312 ost << "The equation in coded form: $";
1313 for (i = 0; i < 20; i++) {
1314 if (coeffs2[i]) {
1315 ost << coeffs2[i] << ", " << i << ", ";
1316 }
1317 }
1318 ost << "$\\\\" << endl;
1319
1320 //cout << "do_arc_lifting before arc_lifting->
1321 //print_trihedral_pairs" << endl;
1322 //AL->print_trihedral_pairs(fp);
1323
1324
1325
1326 ost << "\\bigskip" << endl;
1327
1329
1330
1331 ost << "\\bigskip" << endl;
1332 ost << "The trihedral pair is isomorphic to double triplet no "
1333 << trihedral_pair_orbit_index << " in the classification."
1334 << endl;
1335 ost << endl;
1336 ost << "\\bigskip" << endl;
1337 ost << endl;
1338 ost << "The stabilizer of the trihedral pair is a group of order "
1340 ost << endl;
1341
1342 ost << "The stabilizer of the trihedral pair is the following group:\\\\" << endl;
1344
1345 ost << "The orbits of the stabilizer of the trihedral pair on the $q+1$ "
1346 "surfaces on the line are:\\\\" << endl;
1347#if 0
1350#else
1351 ost << "The stabilizer of the trihedral pair has " << Orb->nb_orbits << " orbits on the pencil of surfaces.\\\\" << endl;
1352#endif
1353
1354
1355 ost << "The subgroup which stabilizes "
1356 "the equation has index " << cosets->len
1357 << " in the stabilizer of "
1358 "the trihedral pair. Coset representatives are:\\\\" << endl;
1359 for (i = 0; i < cosets->len; i++) {
1360 ost << "Coset " << i << " / " << cosets->len
1361 << ", coset rep:" << endl;
1362 ost << "$$" << endl;
1363 AL->Surf_A->A->element_print_latex(cosets->ith(i), ost);
1364 ost << "$$" << endl;
1365 }
1366 ost << "The stabilizer of the trihedral pair and the equation is "
1367 "the following group\\\\" << endl;
1369
1370 ost << "The automorphism group consists of "
1371 << coset_reps->len << " cosets of the subgroup.\\\\" << endl;
1372#if 0
1373 for (i = 0; i < coset_reps->len; i++) {
1374 ost << "Aut coset " << i << " / " << coset_reps->len
1375 << ", trihedral pair " << aut_T_index[i]
1376 << ", subgroup coset " << aut_coset_index[i]
1377 << ", coset rep:" << endl;
1378 ost << "$$" << endl;
1380 ost << "$$" << endl;
1381 }
1382#endif
1383
1384
1386
1387 Aut_gens->group_order(go);
1388 ost << "The automorphism group of the surface has order "
1389 << go << "\\\\" << endl;
1391
1392
1393 //print_isomorphism_types_of_trihedral_pairs(ost, cosets);
1394
1395 if (f_v) {
1396 cout << "trihedral_pair_with_action::report done" << endl;
1397 }
1398}
1399
1401{
1403 int i;
1404
1405 ost << "The isomorphism types of the trihedral pairs "
1406 "in the list of double triplets are:" << endl;
1407 ost << "$$" << endl;
1408 for (i = 0; i < 6; i++) {
1410 Iso_type_as_double_triplet + i * 20, 20, 1, i * 20, 0, TRUE /* f_tex */);
1411 if (i < 6 - 1) {
1412 ost << "\\quad" << endl;
1413 }
1414 }
1415 ost << "$$" << endl;
1416
1417
1418 ost << "Distribution of isomorphism types:\\\\" << endl;
1419 ost << "$$" << endl;
1421 ost << "$$" << endl;
1422
1423
1424 for (i = 0; i < nb_double_triplet_types; i++) {
1425 ost << "type value " << Double_triplet_type_values[i]
1426 << " appears " << Double_triplet_types->Set_size[i]
1427 << " times for these trihedral pairs: ";
1429 ost << "\\\\" << endl;
1430 }
1431
1432}
1433
1434}}}}
1435
void prepare_system_from_FG(int *F_planes, int *G_planes, int lambda, int *&system, int verbose_level)
void compute_nine_lines(int *F_planes, int *G_planes, long int *nine_lines, int verbose_level)
ring_theory::homogeneous_polynomial_domain * Poly3_4
void compute_nine_lines_by_dual_point_ranks(long int *F_planes_rank, long int *G_planes_rank, long int *nine_lines, int verbose_level)
void create_equations_for_pencil_of_surfaces_from_trihedral_pair(int *The_six_plane_equations, int *The_surface_equations, int verbose_level)
void create_lambda_from_trihedral_pair_and_arc(long int *arc6, int t_idx, int &lambda, int &lambda_rk, int verbose_level)
void print_surface_equations_on_line(int *The_surface_equations, int lambda, int lambda_rk, std::ostream &ost)
void print_the_six_plane_equations(int *The_six_plane_equations, long int *plane6, std::ostream &ost)
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
a statistical analysis of data consisting of single integers
void init(int *data, int data_length, int f_second, int verbose_level)
Definition: tally.cpp:72
data_structures::set_of_sets * get_set_partition_and_types(int *&types, int &nb_types, int verbose_level)
Definition: tally.cpp:702
void print_naked_tex(std::ostream &ost, int f_backwards)
Definition: tally.cpp:413
void print_integer_matrix_with_standard_labels(std::ostream &ost, int *p, int m, int n, int f_tex)
void print_integer_matrix_with_standard_labels_and_offset(std::ostream &ost, int *p, int m, int n, int m_offset, int n_offset, int f_tex)
a class to represent arbitrary precision integers
Definition: ring_theory.h:366
a permutation group in a fixed action.
Definition: actions.h:99
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
void element_mult(void *a, void *b, void *ab, int verbose_level)
Definition: action_cb.cpp:315
void orbits_on_equations(ring_theory::homogeneous_polynomial_domain *HPD, int *The_equations, int nb_equations, groups::strong_generators *gens, action *&A_on_equations, groups::schreier *&Orb, int verbose_level)
void element_invert(void *a, void *av, int verbose_level)
Definition: action_cb.cpp:322
void make_element(int *Elt, int *data, int verbose_level)
Definition: action.cpp:1875
void element_move(void *a, void *b, int verbose_level)
Definition: action_cb.cpp:335
void element_transpose(void *a, void *at, int verbose_level)
Definition: action_cb.cpp:329
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 matrix group over a finite field in projective, vector space or affine action
Definition: groups.h:318
void substitute_surface_equation(int *Elt, int *coeff_in, int *coeff_out, algebraic_geometry::surface_domain *Surf, int verbose_level)
Schreier trees for orbits of groups on points.
Definition: groups.h:839
void print_fancy(std::ostream &ost, int f_tex, actions::action *default_action, strong_generators *gens_full_group)
strong_generators * stabilizer_any_point_plus_cosets(actions::action *default_action, ring_theory::longinteger_object &full_group_order, int pt, data_structures_groups::vector_ge *&cosets, int verbose_level)
Definition: schreier.cpp:2148
a strong generating set for a permutation group with respect to a fixed action
Definition: groups.h:1703
void init_transposed_group(strong_generators *SG, int verbose_level)
void init_group_extension(strong_generators *subgroup, int *data, int index, int verbose_level)
void group_order(ring_theory::longinteger_object &go)
groups::strong_generators * identify_trihedral_pair_and_get_stabilizer(long int *planes6, int *transporter, int &orbit_index, 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)
#define Lint_vec_copy(A, B, C)
Definition: foundations.h:694
#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 Int_matrix_print(A, B, C)
Definition: foundations.h:707
#define TRUE
Definition: foundations.h:231
#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 Int_vec_print(A, B, C)
Definition: foundations.h:685
the orbiter library for the classification of combinatorial objects