Orbiter 2022
Combinatorial Objects
surface_create.cpp
Go to the documentation of this file.
1// surface_create.cpp
2//
3// Anton Betten
4//
5// December 8, 2017
6//
7//
8//
9//
10//
11
12#include "orbiter.h"
13
14using namespace std;
15
16
17namespace orbiter {
18namespace layer5_applications {
19namespace applications_in_algebraic_geometry {
20namespace cubic_surfaces_in_general {
21
22
23
25{
27 F = NULL;
28 Surf = NULL;
29 Surf_A = NULL;
30 SO = NULL;
32 Sg = NULL;
34 nice_gens = NULL;
35 null();
36}
37
39{
40 freeself();
41}
42
44{
45}
46
48{
49 if (f_ownership) {
50 if (F) {
52 }
53 if (Surf) {
55 }
56 if (Surf_A) {
58 }
59 }
60 if (SO) {
62 }
63 if (Sg) {
65 }
66 if (nice_gens) {
68 }
69 null();
70}
71
74 surface_with_action *Surf_A,
75 int verbose_level)
76{
77 int f_v = (verbose_level >= 1);
79
80
81 if (f_v) {
82 cout << "surface_create::init_with_data" << endl;
83 }
84
86
89
90
91 if (NT.is_prime(q)) {
93 }
94 else {
96 }
97
99 q = F->q;
101 if (Descr->q != F->q) {
102 cout << "surface_create::init_with_data "
103 "Descr->q != F->q" << endl;
104 exit(1);
105 }
106
107 if (f_v) {
108 cout << "surface_create::init_with_data "
109 "before create_surface_from_description" << endl;
110 }
111 create_surface_from_description(verbose_level - 1);
112 if (f_v) {
113 cout << "surface_create::init_with_data "
114 "after create_surface_from_description" << endl;
115 }
116
117 if (f_v) {
118 cout << "surface_create::init_with_data "
119 "done" << endl;
120 }
121}
122
123
125 surface_with_action *Surf_A,
126 int verbose_level)
127{
128 int f_v = (verbose_level >= 1);
130
131
132 if (f_v) {
133 cout << "surface_create::init" << endl;
134 }
136
137 if (!Descr->f_q) {
138 cout << "surface_create::init !Descr->f_q" << endl;
139 exit(1);
140 }
141 q = Descr->q;
142 if (f_v) {
143 cout << "surface_create::init q = " << q << endl;
144 }
145
149 if (F->q != q) {
150 cout << "surface_create::init q = " << q << endl;
151 exit(1);
152 }
153
154
155
156
157 if (NT.is_prime(q)) {
159 }
160 else {
162 }
163
164
165 if (f_v) {
166 cout << "surface_create::init before create_surface_from_description" << endl;
167 }
168 create_surface_from_description(verbose_level);
169 if (f_v) {
170 cout << "surface_create::init after create_surface_from_description" << endl;
171 }
172
173
174 if (f_v) {
175 cout << "surface_create::init done" << endl;
176 }
177}
178
180{
181 int f_v = (verbose_level >= 1);
182
183
184 if (f_v) {
185 cout << "surface_create::create_surface_from_description" << endl;
186 }
187
188
189 if (Descr->f_family_Eckardt) {
190
191
193
194 }
195 else if (Descr->f_family_G13) {
196
197
198 create_surface_G13(Descr->family_G13_a, verbose_level);
199
200 }
201
202 else if (Descr->f_family_F13) {
203
204 create_surface_F13(Descr->family_F13_a, verbose_level);
205
206 }
207
208
209 else if (Descr->f_family_bes) {
210
212
213
214
215 }
216
217
218 else if (Descr->f_family_general_abcd) {
219
223 verbose_level);
224
225
226 }
227
228
229
230 else if (Descr->f_by_coefficients) {
231
232
236 verbose_level);
237
238
239 }
240
241 else if (Descr->f_by_rank) {
242
243
248 verbose_level);
249
250
251 }
252
253 else if (Descr->f_catalogue) {
254
255
257 Descr->iso,
259 verbose_level);
260
261
262
263
264 }
265 else if (Descr->f_arc_lifting) {
266
267
270 verbose_level);
271
272
273 }
275
276
280 verbose_level);
281
282 }
283 else if (Descr->f_Cayley_form) {
284
285
291 verbose_level);
292
293 }
294 else if (Descr->f_by_equation) {
295
304 verbose_level);
305 }
306
307 else if (Descr->f_by_double_six) {
308
313 verbose_level);
314 }
315
316 else if (Descr->f_by_skew_hexagon) {
317
321 verbose_level);
322 }
323
324 else {
325 cout << "surface_create::init2 we do not "
326 "recognize the type of surface" << endl;
327 exit(1);
328 }
329
330
331 if (Descr->f_override_group) {
332
336 verbose_level);
337 }
338
339 if (f_v) {
340 cout << "surface_create::init2 coeffs = ";
341 Int_vec_print(cout, SO->eqn, 20);
342 cout << endl;
343 }
344
345 if (f_v) {
346 cout << "surface_create::init2 Lines = ";
348 cout << endl;
349 }
350
351
352 if (f_v) {
353 if (f_has_group) {
354 cout << "surface_create::init2 the stabilizer is:" << endl;
356 }
357 else {
358 cout << "surface_create::init2 "
359 "The surface has no group computed" << endl;
360 }
361 }
362
363 if (f_has_group) {
364 if (f_v) {
365 cout << "surface_with_action::create_surface_and_do_report before Surf_A->test_group" << endl;
366 }
367 Surf_A->test_group(this, verbose_level);
368 if (f_v) {
369 cout << "surface_with_action::create_surface_and_do_report after Surf_A->test_group" << endl;
370 }
371 }
372
373 if (f_v) {
374 cout << "surface_create::init2 done" << endl;
375 }
376}
377
378void surface_create::override_group(std::string &group_order_text,
379 int nb_gens, std::string &gens_text, int verbose_level)
380{
381 int f_v = (verbose_level >= 1);
382 int *data;
383 int sz;
384
385 if (f_v) {
386 cout << "surface_create::override_group "
387 "group_order=" << group_order_text
388 << " nb_gens=" << nb_gens << endl;
389 }
391
392 if (f_v) {
393 cout << "surface_create::override_group before Sg->stabilizer_of_cubic_surface_from_catalogue" << endl;
394 }
395
396 Int_vec_scan(gens_text, data, sz);
397 if (sz != Surf_A->A->make_element_size * nb_gens) {
398 cout << "surface_create::override_group sz != Surf_A->A->make_element_size * nb_gens" << endl;
399 exit(1);
400 }
401
403
405 nb_gens, Surf_A->A->make_element_size, group_order_text.c_str(),
406 nice_gens,
407 verbose_level);
408
410
411
413
414 if (f_v) {
415 cout << "surface_create::override_group done" << endl;
416 }
417}
418
419void surface_create::create_Eckardt_surface(int a, int b, int verbose_level)
420{
421 int f_v = (verbose_level >= 1);
422 int alpha, beta;
423
424 if (f_v) {
425 cout << "surface_create::create_Eckardt_surface "
426 "a=" << Descr->family_Eckardt_a
427 << " b=" << Descr->family_Eckardt_b << endl;
428 }
429
430
431 if (f_v) {
432 cout << "surface_create::create_Eckardt_surface before Surf->create_Eckardt_surface" << endl;
433 }
434
436 alpha, beta,
437 verbose_level);
438
439 if (f_v) {
440 cout << "surface_create::create_Eckardt_surface after Surf->create_Eckardt_surface" << endl;
441 }
442
443
444
445
447
448
449
450 if (f_v) {
451 cout << "surface_create::create_Eckardt_surface before Sg->stabilizer_of_Eckardt_surface" << endl;
452 }
453
455 Surf_A->A,
456 F, FALSE /* f_with_normalizer */,
458 nice_gens,
459 verbose_level);
460
461 if (f_v) {
462 cout << "surface_create::create_Eckardt_surface after Sg->stabilizer_of_Eckardt_surface" << endl;
463 }
464
467
468 char str_q[1000];
469 char str_a[1000];
470 char str_b[1000];
471
472 sprintf(str_q, "%d", F->q);
473 sprintf(str_a, "%d", a);
474 sprintf(str_b, "%d", b);
475
476
477 prefix.assign("family_Eckardt_q");
478 prefix.append(str_q);
479 prefix.append("_a");
480 prefix.append(str_a);
481 prefix.append("_b");
482 prefix.append(str_b);
483
484 label_txt.assign("family_Eckardt_q");
485 label_txt.append(str_q);
486 label_txt.append("_a");
487 label_txt.append(str_a);
488 label_txt.append("_b");
489 label_txt.append(str_b);
490
491 label_tex.assign("family\\_Eckardt\\_q");
492 label_tex.append(str_q);
493 label_tex.append("\\_a");
494 label_tex.append(str_a);
495 label_tex.append("\\_b");
496 label_tex.append(str_b);
497
498 if (f_v) {
499 cout << "surface_create::create_Eckardt_surface done" << endl;
500 }
501
502}
503
504void surface_create::create_surface_G13(int a, int verbose_level)
505{
506 int f_v = (verbose_level >= 1);
507
508 if (f_v) {
509 cout << "surface_create::create_surface_G13" << endl;
510 }
511
512 if (f_v) {
513 cout << "surface_create::create_surface_G13 before Surf->create_surface_G13 a=" << Descr->family_G13_a << endl;
514 }
515
516 if (f_v) {
517 cout << "surface_create::create_surface_G13 before Surf->create_surface_G13" << endl;
518 }
519
520 SO = Surf->create_surface_G13(a, verbose_level);
521
522 if (f_v) {
523 cout << "surface_create::create_surface_G13 after Surf->create_surface_G13" << endl;
524 }
525
527
528 if (f_v) {
529 cout << "surface_create::create_surface_G13 before Sg->stabilizer_of_G13_surface" << endl;
530 }
531
533 Surf_A->A,
535 nice_gens,
536 verbose_level);
537
538 if (f_v) {
539 cout << "surface_create::create_surface_G13 after Sg->stabilizer_of_G13_surface" << endl;
540 }
541
544
545 char str_q[1000];
546 char str_a[1000];
547
548 sprintf(str_q, "%d", F->q);
549 sprintf(str_a, "%d", a);
550
551
552
553 prefix.assign("family_G13_q");
554 prefix.append(str_q);
555 prefix.append("_a");
556 prefix.append(str_a);
557
558 label_txt.assign("family_G13_q");
559 label_txt.append(str_q);
560 label_txt.append("_a");
561 label_txt.append(str_a);
562
563 label_tex.assign("family\\_G13\\_q");
564 label_tex.append(str_q);
565 label_tex.append("\\_a");
566 label_tex.append(str_a);
567
568 if (f_v) {
569 cout << "surface_create::create_surface_G13 done" << endl;
570 }
571}
572
573void surface_create::create_surface_F13(int a, int verbose_level)
574{
575 int f_v = (verbose_level >= 1);
576
577 if (f_v) {
578 cout << "surface_create::create_surface_F13" << endl;
579 }
580 if (f_v) {
581 cout << "surface_create::create_surface_F13 before Surf->create_surface_F13 a=" << a << endl;
582 }
583
584 if (f_v) {
585 cout << "surface_create::create_surface_F13 before Surf->create_surface_F13" << endl;
586 }
587
588 SO = Surf->create_surface_F13(a, verbose_level);
589
590 if (f_v) {
591 cout << "surface_create::create_surface_F13 after Surf->create_surface_F13" << endl;
592 }
593
594
596 if (f_v) {
597 cout << "surface_create::create_surface_F13 before Sg->stabilizer_of_F13_surface" << endl;
598 }
599
601 Surf_A->A,
602 F, a,
603 nice_gens,
604 verbose_level);
605
606 if (f_v) {
607 cout << "surface_create::create_surface_F13 after Sg->stabilizer_of_F13_surface" << endl;
608 }
609
612
613 char str_q[1000];
614 char str_a[1000];
615
616 sprintf(str_q, "%d", F->q);
617 sprintf(str_a, "%d", a);
618
619
620
621 prefix.assign("family_F13_q");
622 prefix.append(str_q);
623 prefix.append("_a");
624 prefix.append(str_a);
625
626 label_txt.assign("family_F13_q");
627 label_txt.append(str_q);
628 label_txt.append("_a");
629 label_txt.append(str_a);
630
631 label_tex.assign("family\\_F13\\_q");
632 label_tex.append(str_q);
633 label_tex.append("\\_a");
634 label_tex.append(str_a);
635
636 if (f_v) {
637 cout << "surface_create::create_surface_F13 done" << endl;
638 }
639
640}
641
642void surface_create::create_surface_bes(int a, int c, int verbose_level)
643{
644 int f_v = (verbose_level >= 1);
645
646 if (f_v) {
647 cout << "surface_create::create_surface_bes" << endl;
648 }
649
650 if (f_v) {
651 cout << "surface_create::create_surface_bes before Surf->create_surface_bes "
652 "a=" << Descr->family_bes_a << " " << Descr->family_bes_c << endl;
653 }
654
655 if (f_v) {
656 cout << "surface_create::create_surface_bes before Surf->create_surface_bes" << endl;
657 }
658
659 SO = Surf->create_surface_bes(a, c, verbose_level);
660
661 if (f_v) {
662 cout << "surface_create::create_surface_bes after Surf->create_surface_bes" << endl;
663 }
664
665
666#if 0
667 Sg = NEW_OBJECT(strong_generators);
668 //Sg->init(Surf_A->A, verbose_level);
669 if (f_v) {
670 cout << "surface_create::create_surface_bes before Sg->stabilizer_of_bes_surface" << endl;
671 }
673 Surf_A->A,
674 F, a,
675 nice_gens,
676 verbose_level);
677 if (f_v) {
678 cout << "surface_create::create_surface_bes after Sg->stabilizer_of_bes_surface" << endl;
679 }
680#endif
683
684 char str_q[1000];
685 char str[1000];
686 char str2[1000];
687
688 sprintf(str_q, "%d", F->q);
689 sprintf(str, "_a%d_c%d", a, c);
690 sprintf(str2, "\\_a%d\\_c%d", a, c);
691
692
693
694 prefix.assign("family_bes_q");
695 prefix.append(str_q);
696 prefix.append(str);
697
698 label_txt.assign("family_bes_q");
699 label_txt.append(str_q);
700 label_txt.append(str);
701
702 label_tex.assign("family\\_bes\\_q");
703 label_tex.append(str_q);
704 label_tex.append(str2);
705
706 if (f_v) {
707 cout << "surface_create::create_surface_bes done" << endl;
708 }
709}
710
711
712void surface_create::create_surface_general_abcd(int a, int b, int c, int d, int verbose_level)
713{
714 int f_v = (verbose_level >= 1);
715
716 if (f_v) {
717 cout << "surface_create::create_surface_general_abcd" << endl;
718 }
719 if (f_v) {
720 cout << "surface_create::create_surface_general_abcd before Surf->create_surface_general_abcd a="
721 << a << " b=" << b << " c="
722 << c << " d=" << d
723 << endl;
724 }
725
726 if (f_v) {
727 cout << "surface_create::create_surface_general_abcd before Surf->create_surface_general_abcd" << endl;
728 }
729
730 SO = Surf->create_surface_general_abcd(a, b, c, d, verbose_level);
731
732 if (f_v) {
733 cout << "surface_create::create_surface_general_abcd after Surf->create_surface_general_abcd" << endl;
734 }
735
736
737
738#if 0
739 Sg = NEW_OBJECT(strong_generators);
740 //Sg->init(Surf_A->A, verbose_level);
741 if (f_v) {
742 cout << "surface_create::create_surface_general_abcd before Sg->stabilizer_of_surface" << endl;
743 }
745 Surf_A->A,
747 nice_gens,
748 verbose_level);
749 if (f_v) {
750 cout << "surface_create::create_surface_general_abcd after Sg->stabilizer_of_surface" << endl;
751 }
752#endif
753
756
757 char str_q[1000];
758 char str[1000];
759 char str2[1000];
760
761 sprintf(str_q, "%d", F->q);
762 sprintf(str, "_a%d_b%d_c%d_d%d", a, b, c, d);
763 sprintf(str2, "\\_a%d\\_b%d\\_c%d\\_d%d", a, b, c, d);
764
765
766
767 prefix.assign("family_general_abcd_q");
768 prefix.append(str_q);
769 prefix.append(str);
770
771 label_txt.assign("family_general_abcd_q");
772 label_txt.append(str_q);
773 label_txt.append(str);
774
775 label_tex.assign("family\\_general\\_abcd\\_q");
776 label_tex.append(str_q);
777 label_tex.append(str2);
778
779 if (f_v) {
780 cout << "surface_create::create_surface_general_abcd done" << endl;
781 }
782}
783
784void surface_create::create_surface_by_coefficients(std::string &coefficients_text,
785 std::vector<std::string> &select_double_six_string,
786 int verbose_level)
787{
788 int f_v = (verbose_level >= 1);
789
790 if (f_v) {
791 cout << "surface_create::create_surface_by_coefficients" << endl;
792 }
793
794 if (f_v) {
795 cout << "surface_create::create_surface_by_coefficients surface is given "
796 "by the coefficients" << endl;
797 }
798
799 int coeffs20[20];
800 int *surface_coeffs;
801 int nb_coeffs, nb_terms;
802 int i, a, b;
803
804 Int_vec_scan(coefficients_text, surface_coeffs, nb_coeffs);
805 if (ODD(nb_coeffs)) {
806 cout << "surface_create::create_surface_by_coefficients number of surface "
807 "coefficients must be even" << endl;
808 exit(1);
809 }
810 Int_vec_zero(coeffs20, 20);
811 nb_terms = nb_coeffs >> 1;
812 for (i = 0; i < nb_terms; i++) {
813 a = surface_coeffs[2 * i + 0];
814 b = surface_coeffs[2 * i + 1];
815 if (a < 0) {
816 if (TRUE /*F->e == 1*/) {
818
819 a = NT.mod(a, F->p);
820 }
821 else {
822 cout << "surface_create::create_surface_by_coefficients "
823 "coefficient out of range" << endl;
824 exit(1);
825 }
826 }
827 if (b < 0 || b >= 20) {
828 cout << "surface_create::create_surface_by_coefficients "
829 "variable index out of range" << endl;
830 exit(1);
831 }
832 coeffs20[b] = a;
833 }
834 FREE_int(surface_coeffs);
835
836
837#if 0
838
839
840 SO = NEW_OBJECT(surface_object);
841
842 if (f_v) {
843 cout << "surface_create::create_surface_by_coefficients "
844 "before SO->init_equation" << endl;
845 }
846 SO->init_equation(Surf, coeffs20, verbose_level);
847 if (f_v) {
848 cout << "surface_create::create_surface_by_coefficients "
849 "after SO->init_equation" << endl;
850 }
851
852#if 0
853 // compute the group of the surface:
854 projective_space_with_action *PA;
855
856 PA = NEW_OBJECT(projective_space_with_action);
857
858 if (f_v) {
859 cout << "group_theoretic_activity::do_cubic_surface_properties before PA->init" << endl;
860 }
861 PA->init(
862 F, 3 /*n*/, f_semilinear,
863 TRUE /* f_init_incidence_structure */,
864 verbose_level);
865 if (f_v) {
866 cout << "group_theoretic_activity::do_cubic_surface_properties after PA->init" << endl;
867 }
868
869
870 if (f_v) {
871 cout << "surface_create::create_surface_by_coefficients "
872 "before SC->compute_group" << endl;
873 }
874 compute_group(PA, verbose_level);
875 if (f_v) {
876 cout << "surface_create::create_surface_by_coefficients "
877 "after SC->compute_group" << endl;
878 }
879
880 FREE_OBJECT(PA);
881#endif
882
883
884
885
886 int nb_select_double_six;
887
888 nb_select_double_six = select_double_six_string.size();
889
890 if (nb_select_double_six) {
891 int i;
892
893 for (i = 0; i < nb_select_double_six; i++) {
894 int *select_double_six;
895 int sz;
896 long int New_lines[27];
897
898 if (f_v) {
899 cout << "surface_create::create_surface_by_coefficients selecting "
900 "double six " << i << " / " << nb_select_double_six << endl;
901 }
902 int_vec_scan(select_double_six_string[i], select_double_six, sz);
903 if (sz != 12) {
904 cout << "surface_create::create_surface_by_coefficients "
905 "f_select_double_six double six must consist of 12 numbers" << endl;
906 exit(1);
907 }
908
909 if (f_v) {
910 cout << "surface_create::create_surface_by_coefficients select_double_six = ";
911 int_vec_print(cout, select_double_six, 12);
912 cout << endl;
913 }
914
915
916 if (f_v) {
917 cout << "surface_create::create_surface_by_coefficients before "
918 "Surf->rearrange_lines_according_to_a_given_double_six" << endl;
919 }
921 SO->Lines, select_double_six, New_lines, 0 /* verbose_level */);
922
923 lint_vec_copy(New_lines, SO->Lines, 27);
924 FREE_int(select_double_six);
925
926
927 }
928
929
930 if (f_v) {
931 cout << "surface_create::create_surface_by_coefficients before "
932 "compute_properties" << endl;
933 }
934 SO->compute_properties(verbose_level - 2);
935 if (f_v) {
936 cout << "surface_create::create_surface_by_coefficients after "
937 "compute_properties" << endl;
938 }
939
940
941 }
942
943
944#else
946 select_double_six_string,
947 verbose_level);
948#endif
949
950
951
952 char str_q[1000];
953
954 sprintf(str_q, "%d", F->q);
955
956
957 prefix.assign("by_coefficients_q");
958 prefix.append(str_q);
959
960 label_txt.assign("by_coefficients_q");
961 label_txt.append(str_q);
962
963 label_tex.assign("by\\_coefficients\\_q");
964 label_tex.append(str_q);
965
966 if (f_v) {
967 cout << "surface_create::create_surface_by_coefficients done" << endl;
968 }
969
970}
971
973 std::vector<std::string> &select_double_six_string,
974 int verbose_level)
975{
976 int f_v = (verbose_level >= 1);
977
978 if (f_v) {
979 cout << "surface_create::create_surface_by_coefficient_vector" << endl;
980 }
981
982 if (f_v) {
983 cout << "surface_create::create_surface_by_coefficient_vector surface is given "
984 "by the coefficients" << endl;
985 }
986
987
988
990
991 if (f_v) {
992 cout << "surface_create::create_surface_by_coefficient_vector "
993 "before SO->init_equation" << endl;
994 }
995 SO->init_equation(Surf, coeffs20, verbose_level);
996 if (f_v) {
997 cout << "surface_create::create_surface_by_coefficient_vector "
998 "after SO->init_equation" << endl;
999 }
1000
1001#if 0
1002 // compute the group of the surface:
1003 projective_space_with_action *PA;
1004
1005 PA = NEW_OBJECT(projective_space_with_action);
1006
1007 if (f_v) {
1008 cout << "group_theoretic_activity::create_surface_by_coefficient_vector before PA->init" << endl;
1009 }
1010 PA->init(
1011 F, 3 /*n*/, f_semilinear,
1012 TRUE /* f_init_incidence_structure */,
1013 verbose_level);
1014 if (f_v) {
1015 cout << "group_theoretic_activity::create_surface_by_coefficient_vector after PA->init" << endl;
1016 }
1017
1018
1019 if (f_v) {
1020 cout << "surface_create::create_surface_by_coefficient_vector "
1021 "before SC->compute_group" << endl;
1022 }
1023 compute_group(PA, verbose_level);
1024 if (f_v) {
1025 cout << "surface_create::create_surface_by_coefficient_vector "
1026 "after SC->compute_group" << endl;
1027 }
1028
1029 FREE_OBJECT(PA);
1030#endif
1031
1032
1033
1034
1035 int nb_select_double_six;
1036
1037 nb_select_double_six = select_double_six_string.size();
1038
1039 if (nb_select_double_six) {
1040 int i;
1041
1042 for (i = 0; i < nb_select_double_six; i++) {
1043 int *select_double_six;
1044 int sz;
1045 long int New_lines[27];
1046
1047 if (f_v) {
1048 cout << "surface_create::create_surface_by_coefficient_vector selecting "
1049 "double six " << i << " / " << nb_select_double_six << endl;
1050 }
1051
1052 Surf_A->Surf->read_string_of_schlaefli_labels(select_double_six_string[i], select_double_six, sz, verbose_level);
1053
1054
1055 //Orbiter->Int_vec.scan(select_double_six_string[i], select_double_six, sz);
1056 if (sz != 12) {
1057 cout << "surface_create::create_surface_by_coefficient_vector "
1058 "f_select_double_six double six must consist of 12 numbers" << endl;
1059 exit(1);
1060 }
1061
1062 if (f_v) {
1063 cout << "surface_create::create_surface_by_coefficient_vector select_double_six = ";
1064 Int_vec_print(cout, select_double_six, 12);
1065 cout << endl;
1066 }
1067
1068
1069 if (f_v) {
1070 cout << "surface_create::create_surface_by_coefficient_vector before "
1071 "Surf->rearrange_lines_according_to_a_given_double_six" << endl;
1072 }
1074 SO->Lines, select_double_six, New_lines, 0 /* verbose_level */);
1075
1076 Lint_vec_copy(New_lines, SO->Lines, 27);
1077 FREE_int(select_double_six);
1078
1079
1080 }
1081
1082
1083 if (f_v) {
1084 cout << "surface_create::create_surface_by_coefficient_vector before "
1085 "compute_properties" << endl;
1086 }
1087 SO->compute_properties(verbose_level - 2);
1088 if (f_v) {
1089 cout << "surface_create::create_surface_by_coefficient_vector after "
1090 "compute_properties" << endl;
1091 }
1092
1093
1094 }
1095
1096
1097
1098
1099 if (f_v) {
1100 cout << "surface_create::create_surface_by_coefficient_vector done" << endl;
1101 }
1102
1103}
1104
1105void surface_create::create_surface_by_rank(std::string &rank_text, int defining_q,
1106 std::vector<std::string> &select_double_six_string,
1107 int verbose_level)
1108{
1109 int f_v = (verbose_level >= 1);
1110
1111 if (f_v) {
1112 cout << "surface_create::create_surface_by_rank" << endl;
1113 }
1114
1115 if (f_v) {
1116 cout << "surface_create::create_surface_by_rank surface is given "
1117 "by the rank" << endl;
1118 }
1119
1120 int coeffs20[20];
1121 long int rank;
1123
1124 rank = ST.strtolint(rank_text);
1125
1126 if (f_v) {
1127 cout << "surface_create::create_surface_by_rank surface is given "
1128 "by the rank, rank = " << rank << endl;
1129 }
1130
1131 {
1133
1134 F0.finite_field_init(defining_q, FALSE /* f_without_tables */, 0);
1135
1136 F0.PG_element_unrank_modified_lint(coeffs20, 1, 20, rank);
1137 }
1138
1140 select_double_six_string,
1141 verbose_level);
1142
1143
1144
1145 char str_q[1000];
1146
1147 sprintf(str_q, "%d", F->q);
1148
1149
1150 prefix.assign("by_rank_q");
1151 prefix.append(str_q);
1152
1153 label_txt.assign("by_rank_q");
1154 label_txt.append(str_q);
1155
1156 label_tex.assign("by\\_rank\\_q");
1157 label_tex.append(str_q);
1158
1159 if (f_v) {
1160 cout << "surface_create::create_surface_by_rank done" << endl;
1161 }
1162
1163}
1164
1165
1166
1168 std::vector<std::string> &select_double_six_string,
1169 int verbose_level)
1170{
1171 int f_v = (verbose_level >= 1);
1172
1173 if (f_v) {
1174 cout << "surface_create::create_surface_from_catalogue" << endl;
1175 }
1176 if (f_v) {
1177 cout << "surface_create::create_surface_from_catalogue surface from catalogue" << endl;
1178 }
1179
1180 int nb_select_double_six;
1181
1182 nb_select_double_six = select_double_six_string.size();
1183 long int *p_lines;
1184 long int Lines27[27];
1185 int nb_iso;
1186 //int nb_E = 0;
1188
1189 nb_iso = K.cubic_surface_nb_reps(q);
1190 if (Descr->iso >= nb_iso) {
1191 cout << "surface_create::create_surface_from_catalogue iso >= nb_iso, "
1192 "this cubic surface does not exist" << endl;
1193 exit(1);
1194 }
1195 p_lines = K.cubic_surface_Lines(q, iso);
1196 Lint_vec_copy(p_lines, Lines27, 27);
1197 //nb_E = cubic_surface_nb_Eckardt_points(q, Descr->iso);
1198
1199 if (f_v) {
1200 cout << "surface_create::create_surface_from_catalogue before Surf->rearrange_lines_according_to_double_six" << endl;
1201 }
1203 Lines27, 0 /* verbose_level */);
1204 if (f_v) {
1205 cout << "surface_create::create_surface_from_catalogue after Surf->rearrange_lines_according_to_double_six" << endl;
1206 }
1207
1208 if (nb_select_double_six) {
1209 int i;
1210
1211 for (i = 0; i < nb_select_double_six; i++) {
1212 int *select_double_six;
1213 int sz;
1214 long int New_lines[27];
1215
1216 if (f_v) {
1217 cout << "surface_create::create_surface_from_catalogue selecting double six " << i << " / " << nb_select_double_six << endl;
1218 }
1219 Int_vec_scan(select_double_six_string[i], select_double_six, sz);
1220 if (sz != 12) {
1221 cout << "surface_create::create_surface_from_catalogue f_select_double_six double six must consist of 12 numbers" << endl;
1222 exit(1);
1223 }
1224
1225 if (f_v) {
1226 cout << "surface_create::create_surface_from_catalogue select_double_six = ";
1227 Int_vec_print(cout, select_double_six, 12);
1228 cout << endl;
1229 }
1230
1231
1232 if (f_v) {
1233 cout << "surface_create::create_surface_from_catalogue before Surf->rearrange_lines_according_to_a_given_double_six" << endl;
1234 }
1236 Lines27, select_double_six, New_lines, 0 /* verbose_level */);
1237
1238 Lint_vec_copy(New_lines, Lines27, 27);
1239 FREE_int(select_double_six);
1240 }
1241 }
1242
1243 int coeffs20[20];
1244
1245 if (f_v) {
1246 cout << "surface_create::create_surface_from_catalogue before Surf->build_cubic_surface_from_lines" << endl;
1247 }
1248 Surf->build_cubic_surface_from_lines(27, Lines27, coeffs20, 0 /* verbose_level */);
1249 if (f_v) {
1250 cout << "surface_create::create_surface_from_catalogue after Surf->build_cubic_surface_from_lines" << endl;
1251 }
1252
1254
1255 if (f_v) {
1256 cout << "surface_create::create_surface_from_catalogue before SO->init_with_27_lines" << endl;
1257 }
1259 Lines27, coeffs20,
1260 FALSE /* f_find_double_six_and_rearrange_lines */,
1261 verbose_level);
1262 if (f_v) {
1263 cout << "surface_create::create_surface_from_catalogue after SO->init_with_27_lines" << endl;
1264 }
1265
1266
1268 //Sg->init(Surf_A->A, verbose_level);
1269 if (f_v) {
1270 cout << "surface_create::create_surface_from_catalogue before Sg->stabilizer_of_cubic_surface_from_catalogue" << endl;
1271 }
1273 F, iso,
1274 verbose_level);
1275 f_has_group = TRUE;
1276
1277 if (f_v) {
1278 cout << "surface_create::create_surface_from_catalogue after Sg->stabilizer_of_cubic_surface_from_catalogue" << endl;
1279 }
1280
1281 char str_q[1000];
1282 char str_a[1000];
1283
1284 sprintf(str_q, "%d", F->q);
1285 sprintf(str_a, "%d", iso);
1286
1287
1288
1289 prefix.assign("catalogue_q");
1290 prefix.append(str_q);
1291 prefix.append("_iso");
1292 prefix.append(str_a);
1293
1294 label_txt.assign("catalogue_q");
1295 label_txt.append(str_q);
1296 label_txt.append("_iso");
1297 label_txt.append(str_a);
1298
1299 label_tex.assign("catalogue\\_q");
1300 label_tex.append(str_q);
1301 label_tex.append("\\_iso");
1302 label_tex.append(str_a);
1303 if (f_v) {
1304 cout << "surface_create::create_surface_from_catalogue done" << endl;
1305 }
1306}
1307
1309 std::string &arc_lifting_text,
1310 int verbose_level)
1311{
1312 int f_v = (verbose_level >= 1);
1313
1314 if (f_v) {
1315 cout << "surface_create::create_surface_by_arc_lifting" << endl;
1316 }
1317
1318 long int *arc;
1319 int arc_size;
1320
1321 Lint_vec_scan(Descr->arc_lifting_text, arc, arc_size);
1322
1323 if (arc_size != 6) {
1324 cout << "surface_create::create_surface_by_arc_lifting arc_size != 6" << endl;
1325 exit(1);
1326 }
1327
1328 if (f_v) {
1329 cout << "surface_create::init2 arc: ";
1330 Lint_vec_print(cout, arc, 6);
1331 cout << endl;
1332 }
1333
1336
1339
1340#if 1
1341 // classifying the trihedral pairs is expensive:
1342 if (f_v) {
1343 cout << "surface_create::create_surface_by_arc_lifting before Surf_A->"
1344 "Classify_trihedral_pairs->classify" << endl;
1345 }
1346 Surf_A->Classify_trihedral_pairs->classify(Control1, Control2, 0 /*verbose_level*/);
1347 if (f_v) {
1348 cout << "surface_create::create_surface_by_arc_lifting after Surf_A->"
1349 "Classify_trihedral_pairs->classify" << endl;
1350 }
1351#endif
1352
1353
1355 int coeffs20[20];
1356 long int Lines27[27];
1357
1359
1360
1361 if (f_v) {
1362 cout << "surface_create::create_surface_by_arc_lifting before "
1363 "AL->create_surface" << endl;
1364 }
1365 AL->create_surface_and_group(Surf_A, arc, verbose_level);
1366 if (f_v) {
1367 cout << "surface_create::create_surface_by_arc_lifting after "
1368 "AL->create_surface" << endl;
1369 }
1370
1371 AL->Web->print_Eckardt_point_data(cout, verbose_level);
1372
1374 + AL->Trihedral_pair->lambda_rk * 20, coeffs20, 20);
1375
1376 Lint_vec_copy(AL->Web->Lines27, Lines27, 27);
1377
1379
1380 if (f_v) {
1381 cout << "surface_create::create_surface_by_arc_lifting before SO->init_with_27_lines" << endl;
1382 }
1384 Lines27, coeffs20,
1385 FALSE /* f_find_double_six_and_rearrange_lines */,
1386 verbose_level);
1387 if (f_v) {
1388 cout << "surface_create::create_surface_by_arc_lifting after SO->init_with_27_lines" << endl;
1389 }
1390
1391
1393 f_has_group = TRUE;
1394
1395
1396 char str_q[1000];
1397 char str_a[1000];
1398
1399 sprintf(str_q, "%d", F->q);
1400 sprintf(str_a, "%ld_%ld_%ld_%ld_%ld_%ld", arc[0], arc[1], arc[2], arc[3], arc[4], arc[5]);
1401
1402
1403 prefix.assign("arc_lifting_trihedral_q");
1404 prefix.append(str_q);
1405 prefix.append("_arc");
1406 prefix.append(str_a);
1407
1408 label_txt.assign("arc_lifting_trihedral_q");
1409 label_txt.append(str_q);
1410 label_txt.append("_arc");
1411 label_txt.append(str_a);
1412
1413 sprintf(str_a, "\\_%ld\\_%ld\\_%ld\\_%ld\\_%ld\\_%ld", arc[0], arc[1], arc[2], arc[3], arc[4], arc[5]);
1414
1415 label_tex.assign("arc\\_lifting\\_trihedral\\_q");
1416 label_tex.append(str_q);
1417 label_tex.append("\\_arc");
1418 label_tex.append(str_a);
1419
1420 //AL->print(fp);
1421
1422
1423 FREE_OBJECT(AL);
1424 FREE_OBJECT(Control1);
1425 FREE_OBJECT(Control2);
1426
1427
1428 FREE_lint(arc);
1429 if (f_v) {
1430 cout << "surface_create::create_surface_by_arc_lifting done" << endl;
1431 }
1432}
1433
1435 std::string &arc_lifting_text,
1436 std::string &arc_lifting_two_lines_text,
1437 int verbose_level)
1438{
1439 int f_v = (verbose_level >= 1);
1440
1441 if (f_v) {
1442 cout << "surface_create::create_surface_by_arc_lifting_with_two_lines" << endl;
1443 }
1444 if (f_v) {
1445 cout << "surface_create::create_surface_by_arc_lifting_with_two_lines by "
1446 "arc lifting with two lines" << endl;
1447 }
1448
1449 long int *arc;
1450 int arc_size, lines_size;
1451 long int line1, line2;
1452 long int *lines;
1453
1454 Lint_vec_scan(arc_lifting_text, arc, arc_size);
1455
1456 if (arc_size != 6) {
1457 cout << "surface_create::create_surface_by_arc_lifting_with_two_lines arc_size != 6" << endl;
1458 exit(1);
1459 }
1460
1461 Lint_vec_scan(arc_lifting_two_lines_text, lines, lines_size);
1462
1463 if (lines_size != 2) {
1464 cout << "surface_create::init lines_size != 2" << endl;
1465 exit(1);
1466 }
1467
1468
1469 line1 = lines[0];
1470 line2 = lines[1];
1471
1472 if (f_v) {
1473 cout << "surface_create::create_surface_by_arc_lifting_with_two_lines arc: ";
1474 Lint_vec_print(cout, arc, 6);
1475 cout << endl;
1476 cout << "surface_create::create_surface_by_arc_lifting_with_two_lines lines: ";
1477 Lint_vec_print(cout, lines, 2);
1478 cout << endl;
1479 }
1480
1482 int coeffs20[20];
1483 long int Lines27[27];
1484
1486
1487
1488 if (f_v) {
1489 cout << "surface_create::create_surface_by_arc_lifting_with_two_lines before "
1490 "AL->create_surface" << endl;
1491 }
1492 AL->create_surface(Surf, arc, line1, line2, verbose_level);
1493 if (f_v) {
1494 cout << "surface_create::create_surface_by_arc_lifting_with_two_lines after "
1495 "AL->create_surface" << endl;
1496 }
1497
1498 Int_vec_copy(AL->coeff, coeffs20, 20);
1499 Lint_vec_copy(AL->lines27, Lines27, 27);
1500
1502
1503
1504 if (f_v) {
1505 cout << "surface_create::create_surface_by_arc_lifting_with_two_lines before SO->init_with_27_lines" << endl;
1506 }
1507
1509 Lines27, coeffs20,
1510 FALSE /* f_find_double_six_and_rearrange_lines */,
1511 verbose_level);
1512
1513 if (f_v) {
1514 cout << "surface_create::create_surface_by_arc_lifting_with_two_lines after SO->init_with_27_lines" << endl;
1515 }
1516
1517
1519
1520 char str_q[1000];
1521 char str_lines[1000];
1522 char str_a[1000];
1523
1524 sprintf(str_q, "%d", F->q);
1525 sprintf(str_lines, "%ld_%ld", line1, line2);
1526 sprintf(str_a, "%ld_%ld_%ld_%ld_%ld_%ld", arc[0], arc[1], arc[2], arc[3], arc[4], arc[5]);
1527
1528
1529 prefix.assign("arc_lifting_with_two_lines_q");
1530 prefix.append(str_q);
1531 prefix.append("_lines");
1532 prefix.append(str_lines);
1533 prefix.append("_arc");
1534 prefix.append(str_a);
1535
1536 label_txt.assign("arc_lifting_with_two_lines_q");
1537 label_txt.append(str_q);
1538 label_txt.append("_lines");
1539 label_txt.append(str_lines);
1540 label_txt.append("_arc");
1541 label_txt.append(str_a);
1542
1543 sprintf(str_lines, "\\_%ld\\_%ld", line1, line2);
1544 sprintf(str_a, "\\_%ld\\_%ld\\_%ld\\_%ld\\_%ld\\_%ld", arc[0], arc[1], arc[2], arc[3], arc[4], arc[5]);
1545
1546 label_tex.assign("arc\\_lifting\\_with\\_two\\_lines\\_q");
1547 label_tex.append(str_q);
1548 label_tex.append("\\_lines");
1549 label_tex.append(str_lines);
1550 label_tex.append("\\_arc");
1551 label_tex.append(str_a);
1552
1553
1554
1555
1556 //AL->print(fp);
1557
1558
1559 FREE_OBJECT(AL);
1560
1561
1562 FREE_lint(arc);
1563 FREE_lint(lines);
1564
1565 if (f_v) {
1566 cout << "surface_create::create_surface_by_arc_lifting_with_two_lines done" << endl;
1567 }
1568}
1569
1571 int k, int l, int m, int n,
1572 int verbose_level)
1573{
1574 int f_v = (verbose_level >= 1);
1575
1576 if (f_v) {
1577 cout << "surface_create::create_surface_Cayley_form" << endl;
1578 }
1579 if (f_v) {
1580 cout << "surface_create::create_surface_Cayley_form by "
1581 "arc lifting with two lines" << endl;
1582 }
1583
1584#if 0
1585 if (f_v) {
1586 cout << "surface_create::create_surface_by_arc_lifting_with_two_lines arc: ";
1587 Orbiter->Lint_vec.print(cout, arc, 6);
1588 cout << endl;
1589 cout << "surface_create::create_surface_by_arc_lifting_with_two_lines lines: ";
1590 Orbiter->Lint_vec.print(cout, lines, 2);
1591 cout << endl;
1592 }
1593#endif
1594
1595 int coeffs20[20];
1596
1597
1598 Surf->create_equation_Cayley_klmn(k, l, m, n, coeffs20, verbose_level);
1599
1600
1602
1603
1604 if (f_v) {
1605 cout << "surface_create::create_surface_by_arc_lifting_with_two_lines before SO->init_equation_points_and_lines_only" << endl;
1606 }
1607
1608 SO->init_equation_points_and_lines_only(Surf, coeffs20, verbose_level);
1609
1610 if (f_v) {
1611 cout << "surface_create::create_surface_by_arc_lifting_with_two_lines after SO->init_equation_points_and_lines_only" << endl;
1612 }
1613
1614
1616
1617 char str_q[1000];
1618 char str_parameters[1000];
1619
1620 sprintf(str_q, "%d", F->q);
1621 sprintf(str_parameters, "klmn_%d_%d_%d_%d", k, l, m, n);
1622
1623
1624 prefix.assign("Cayley_q");
1625 prefix.append(str_q);
1626 prefix.append("_");
1627 prefix.append(str_parameters);
1628
1629 label_txt.assign("Cayley_q");
1630 label_txt.append(str_q);
1631 label_txt.append("_");
1632 label_txt.append(str_parameters);
1633
1634 sprintf(str_parameters, "klmn\\_%d\\_%d\\_%d\\_%d", k, l, m, n);
1635
1636 label_tex.assign("Cayley\\_q");
1637 label_tex.append(str_q);
1638 label_tex.append("\\_");
1639 label_tex.append(str_parameters);
1640
1641
1642
1643
1644
1645
1646 if (f_v) {
1647 cout << "surface_create::create_surface_by_arc_lifting_with_two_lines done" << endl;
1648 }
1649}
1650
1651
1652
1654 std::string &name_of_formula,
1655 std::string &name_of_formula_tex,
1656 std::string &managed_variables,
1657 std::string &equation_text,
1658 std::string &equation_parameters,
1659 std::string &equation_parameters_tex,
1660 std::vector<std::string> &select_double_six_string,
1661 int verbose_level)
1662{
1663 int f_v = (verbose_level >= 1);
1664
1665 if (f_v) {
1666 cout << "surface_create::create_surface_by_equation" << endl;
1667 }
1668
1669 int coeffs20[20];
1671
1672
1673
1674
1677 int i;
1678
1680
1681 if (f_v) {
1682 cout << "surface_create::create_surface_by_equation Formula " << name_of_formula << " is " << equation_text << endl;
1683 cout << "surface_create::create_surface_by_equation Managed variables: " << managed_variables << endl;
1684 }
1685
1686 const char *p = managed_variables.c_str();
1687 char str[1000];
1688
1689 while (TRUE) {
1690 if (!ST.s_scan_token_comma_separated(&p, str)) {
1691 break;
1692 }
1693 string var;
1694
1695 var.assign(str);
1696 if (f_v) {
1697 cout << "surface_create::create_surface_by_equation adding managed variable " << var << endl;
1698 }
1699
1700 tree->managed_variables.push_back(var);
1702
1703 }
1704
1705 int nb_vars;
1706
1707 nb_vars = tree->managed_variables.size();
1708
1709 if (f_v) {
1710 cout << "surface_create::create_surface_by_equation Managed variables: " << endl;
1711 for (i = 0; i < nb_vars; i++) {
1712 cout << i << " : " << tree->managed_variables[i] << endl;
1713 }
1714 }
1715
1716
1717 if (f_v) {
1718 cout << "surface_create::create_surface_by_equation Starting to parse " << name_of_formula << endl;
1719 }
1720 Parser.parse(tree, equation_text, 0/*verbose_level*/);
1721 if (f_v) {
1722 cout << "Parsing " << name_of_formula << " finished" << endl;
1723 }
1724
1725
1726 if (f_v) {
1727 cout << "surface_create::create_surface_by_equation Syntax tree:" << endl;
1728 //tree->print(cout);
1729 }
1730
1731 std::string fname;
1732 fname.assign(name_of_formula);
1733 fname.append(".gv");
1734
1735 {
1736 std::ofstream ost(fname);
1737 tree->Root->export_graphviz(name_of_formula, ost);
1738 }
1739
1740 int ret, degree;
1741 if (f_v) {
1742 cout << "surface_create::create_surface_by_equation before is_homogeneous" << endl;
1743 }
1744 ret = tree->is_homogeneous(degree, 0 /* verbose_level */);
1745 if (f_v) {
1746 cout << "surface_create::create_surface_by_equation after is_homogeneous" << endl;
1747 }
1748 if (!ret) {
1749 cout << "surface_create::create_surface_by_equation The given equation is not homogeneous" << endl;
1750 exit(1);
1751 }
1752 if (f_v) {
1753 cout << "surface_create::create_surface_by_equation homogeneous of degree " << degree << endl;
1754 }
1755
1756 if (degree != 3) {
1757 cout << "surface_create::create_surface_by_equation The given equation is homogeneous, but not of degree 3" << endl;
1758 exit(1);
1759 }
1760
1762
1764
1765 if (f_v) {
1766 cout << "surface_create::create_surface_by_equation before Poly->init" << endl;
1767 }
1768 Poly->init(F,
1769 nb_vars /* nb_vars */, degree,
1770 FALSE /* f_init_incidence_structure */,
1771 t_PART,
1772 0/*verbose_level*/);
1773 if (f_v) {
1774 cout << "surface_create::create_surface_by_equation after Poly->init" << endl;
1775 }
1776
1778 int nb_monomials;
1779
1780
1781 nb_monomials = Poly->get_nb_monomials();
1782
1783 if (nb_monomials != 20) {
1784 cout << "surface_create::create_surface_by_equation nb_monomials != 20" << endl;
1785 exit(1);
1786 }
1787
1788 if (f_v) {
1789 cout << "surface_create::create_surface_by_equation before tree->split_by_monomials" << endl;
1790 }
1791 tree->split_by_monomials(Poly, Subtrees, 0 /*verbose_level*/);
1792 if (f_v) {
1793 cout << "surface_create::create_surface_by_equation after tree->split_by_monomials" << endl;
1794 }
1795
1796 if (f_v) {
1797 for (i = 0; i < nb_monomials; i++) {
1798 cout << "surface_create::create_surface_by_equation Monomial " << i << " : ";
1799 if (Subtrees[i]) {
1800 Subtrees[i]->print_expression(cout);
1801 cout << " * ";
1802 Poly->print_monomial(cout, i);
1803 cout << endl;
1804 }
1805 else {
1806 cout << "surface_create::create_surface_by_equation no subtree" << endl;
1807 }
1808 }
1809 }
1810
1811 if (f_v) {
1812 cout << "surface_create::create_surface_by_equation before evaluate" << endl;
1813 }
1814
1815 p = equation_parameters.c_str();
1816 //char str[1000];
1817
1818 std::map<std::string, std::string> symbol_table;
1819 //vector<string> symbols;
1820 //vector<string> values;
1821
1822 while (TRUE) {
1823 if (!ST.s_scan_token_comma_separated(&p, str)) {
1824 break;
1825 }
1826 string assignment;
1827 int len;
1828
1829 assignment.assign(str);
1830 len = strlen(str);
1831
1832 std::size_t found;
1833
1834 found = assignment.find('=');
1835 if (found == std::string::npos) {
1836 cout << "did not find '=' in variable assignment" << endl;
1837 exit(1);
1838 }
1839 std::string symb = assignment.substr (0, found);
1840 std::string val = assignment.substr (found + 1, len - found - 1);
1841
1842
1843
1844 if (f_v) {
1845 cout << "surface_create::create_surface_by_equation adding symbol " << symb << " = " << val << endl;
1846 }
1847
1848 symbol_table[symb] = val;
1849 //symbols.push_back(symb);
1850 //values.push_back(val);
1851
1852 }
1853
1854#if 0
1855 cout << "surface_create::create_surface_by_equation symbol table:" << endl;
1856 for (i = 0; i < symbol_table.size(); i++) {
1857 cout << i << " : " << symbol_table[i] << " = " << values[i] << endl;
1858 }
1859#endif
1860 int a;
1861
1862 for (i = 0; i < nb_monomials; i++) {
1863 if (f_v) {
1864 cout << "surface_create::create_surface_by_equation Monomial " << i << " : ";
1865 }
1866 if (Subtrees[i]) {
1867 //Subtrees[i]->print_expression(cout);
1868 a = Subtrees[i]->evaluate(symbol_table, F, 0/*verbose_level*/);
1869 coeffs20[i] = a;
1870 if (f_v) {
1871 cout << "surface_create::create_surface_by_equation Monomial " << i << " : ";
1872 cout << a << " * ";
1873 Poly->print_monomial(cout, i);
1874 cout << endl;
1875 }
1876 }
1877 else {
1878 if (f_v) {
1879 cout << "surface_create::create_surface_by_equation no subtree" << endl;
1880 }
1881 coeffs20[i] = 0;
1882 }
1883 }
1884 if (f_v) {
1885 cout << "surface_create::create_surface_by_equation evaluated polynomial:" << endl;
1886 for (i = 0; i < nb_monomials; i++) {
1887 cout << coeffs20[i] << " * ";
1888 Poly->print_monomial(cout, i);
1889 cout << endl;
1890 }
1891 cout << "surface_create::create_surface_by_equation coefficient vector: ";
1892 Int_vec_print(cout, coeffs20, nb_monomials);
1893 cout << endl;
1894 }
1895
1896
1897
1898 FREE_OBJECT(Poly);
1899
1900
1901
1902
1903
1904
1905
1906
1908
1909
1910 if (f_v) {
1911 cout << "surface_create::create_surface_by_equation before create_surface_by_coefficient_vector" << endl;
1912 }
1913
1915 select_double_six_string,
1916 verbose_level);
1917
1918
1919 if (f_v) {
1920 cout << "surface_create::create_surface_by_equation after create_surface_by_coefficient_vector" << endl;
1921 }
1922
1923
1925
1926 char str_q[1000];
1927
1928 sprintf(str_q, "%d", F->q);
1929
1930
1931 prefix.assign("equation_");
1932 prefix.append(name_of_formula);
1933 prefix.append("_q");
1934 prefix.append(str_q);
1935
1936 label_txt.assign("equation_");
1937 label_txt.append(name_of_formula);
1938 label_txt.append("_q");
1939 label_txt.append(str_q);
1940
1941 label_tex.assign(name_of_formula_tex);
1943
1944 string my_parameters_tex;
1945
1946 my_parameters_tex.assign(equation_parameters_tex);
1947 ST.string_fix_escape_characters(my_parameters_tex);
1948 label_tex.append(" with ");
1949 label_tex.append(my_parameters_tex);
1950
1951 //label_tex.append("\\_q");
1952 //label_tex.append(str_q);
1953
1954
1955
1956 cout << "prefix = " << prefix << endl;
1957 cout << "label_txt = " << label_txt << endl;
1958 cout << "label_tex = " << label_tex << endl;
1959
1960 //AL->print(fp);
1961
1962
1963 if (f_v) {
1964 cout << "surface_create::create_surface_by_equation done" << endl;
1965 }
1966}
1967
1968
1970 std::string &by_double_six_label,
1971 std::string &by_double_six_label_tex,
1972 std::string &by_double_six_text,
1973 int verbose_level)
1974{
1975 int f_v = (verbose_level >= 1);
1976
1977 if (f_v) {
1978 cout << "surface_create::create_surface_by_double_six" << endl;
1979 cout << "surface_create::create_surface_by_double_six double_six=" << by_double_six_text << endl;
1980 }
1981
1982 int coeffs20[20];
1983 long int Lines27[27];
1984 long int *double_six;
1985 int sz;
1986
1987 Lint_vec_scan(by_double_six_text, double_six, sz);
1988 if (sz != 12) {
1989 cout << "surface_create::create_surface_by_double_six need exactly 12 input lines" << endl;
1990 exit(1);
1991 }
1992 if (f_v) {
1993 cout << "surface_create::create_surface_by_double_six double_six=";
1994 Lint_vec_print(cout, double_six, 12);
1995 cout << endl;
1996 }
1997
1998
1999 if (!Surf->test_double_six_property(double_six, 0 /* verbose_level*/)) {
2000 cout << "The double six is wrong" << endl;
2001 exit(1);
2002 }
2003
2004 if (f_v) {
2005 cout << "surface_create::create_surface_by_double_six passes the double six property test" << endl;
2006 }
2007
2008
2009 if (f_v) {
2010 cout << "surface_create::create_surface_by_double_six before Surf->build_cubic_surface_from_lines" << endl;
2011 }
2012
2014 12, double_six,
2015 coeffs20, 0/* verbose_level*/);
2016
2017 if (f_v) {
2018 cout << "surface_create::create_surface_by_double_six after Surf->build_cubic_surface_from_lines" << endl;
2019 }
2020
2021 if (f_v) {
2022 cout << "surface_create::create_surface_by_double_six "
2023 "coeffs20:" << endl;
2024 Int_vec_print(cout, coeffs20, 20);
2025 cout << endl;
2026
2027 Surf->Poly3_4->print_equation(cout, coeffs20);
2028 cout << endl;
2029 }
2030
2031
2032 Lint_vec_copy(double_six, Lines27, 12);
2033
2034
2035 if (f_v) {
2036 cout << "surface_create::create_surface_by_double_six before Surf->create_the_fifteen_other_lines" << endl;
2037 }
2039 Lines27 + 12, verbose_level);
2040 if (f_v) {
2041 cout << "surface_create::create_surface_by_double_six after Surf->create_the_fifteen_other_lines" << endl;
2042 }
2043
2044
2045
2047
2048#if 0
2049 if (f_v) {
2050 cout << "surface_create::create_surface_by_double_six before SO->init_equation_points_and_lines_only" << endl;
2051 }
2052
2053 SO->init_equation_points_and_lines_only(Surf, coeffs20, verbose_level);
2054
2055 if (f_v) {
2056 cout << "surface_create::create_surface_by_double_six after SO->init_equation_points_and_lines_only" << endl;
2057 }
2058#else
2059 if (f_v) {
2060 cout << "surface_create::create_surface_by_double_six before SO->init_with_27_lines" << endl;
2061 }
2062
2064 Lines27, coeffs20,
2065 FALSE /* f_find_double_six_and_rearrange_lines */,
2066 verbose_level);
2067
2068 if (f_v) {
2069 cout << "surface_create::create_surface_by_double_six after SO->init_with_27_lines" << endl;
2070 }
2071
2072
2073#endif
2074
2075
2077
2078 char str_q[1000];
2079
2080 sprintf(str_q, "%d", F->q);
2081
2082
2083 prefix.assign("DoubleSix_q");
2084 prefix.append(str_q);
2085 prefix.append("_");
2086 prefix.append(by_double_six_label);
2087
2088 label_txt.assign("DoubleSix_q");
2089 label_txt.append(str_q);
2090 label_txt.append("_");
2091 label_txt.append(by_double_six_label);
2092
2093 label_tex.assign("DoubleSix\\_q");
2094 label_tex.append(str_q);
2095 label_tex.append("\\_");
2096 label_tex.append(by_double_six_label_tex);
2097
2098
2099
2100 if (f_v) {
2101 cout << "surface_create::create_surface_by_double_six done" << endl;
2102 }
2103}
2104
2106 std::string &given_label,
2107 std::string &given_label_tex,
2108 int verbose_level)
2109{
2110 int f_v = (verbose_level >= 1);
2111
2112 if (f_v) {
2113 cout << "surface_create::create_surface_by_skew_hexagon" << endl;
2114 }
2115
2116 int Pluecker_ccords[] = {1,0,0,0,0,0, 0,1,0,1,0,0, 0,1,1,0,0,0, 0,1,0,0,0,0, 1,0,0,1,0,0, 1,0,1,0,0,0};
2117 int i;
2118 long int *Pts;
2119 int nb_pts = 6;
2120
2121 Pts = NEW_lint(nb_pts);
2122
2123 for (i = 0; i < nb_pts; i++) {
2124 Pts[i] = Surf_A->Surf->Klein->Pluecker_to_line_rk(Pluecker_ccords + i * 6, 0 /*verbose_level*/);
2125 }
2126
2127 if (nb_pts != 6) {
2128 cout << "surface_create::create_surface_by_skew_hexagon nb_pts != 6" << endl;
2129 exit(1);
2130 }
2131
2132 if (f_v) {
2133 cout << "lines:" << endl;
2134 Lint_vec_print(cout, Pts, 6);
2135 cout << endl;
2136 }
2137
2138
2139 std::vector<std::vector<long int> > Double_sixes;
2140
2141 if (f_v) {
2142 cout << "surface_create::create_surface_by_skew_hexagon before Surf_A->complete_skew_hexagon" << endl;
2143 }
2144
2145 Surf_A->complete_skew_hexagon(Pts, Double_sixes, verbose_level);
2146
2147 if (f_v) {
2148 cout << "surface_create::create_surface_by_skew_hexagon after Surf_A->complete_skew_hexagon" << endl;
2149 }
2150
2151
2152 int coeffs20[20];
2153 long int Lines27[27];
2154 long int double_six[12];
2155
2156 for (i = 0; i < 12; i++) {
2157 double_six[i] = Double_sixes[0][i];
2158 }
2159
2160
2161 if (f_v) {
2162 cout << "surface_create::create_surface_by_skew_hexagon before Surf->build_cubic_surface_from_lines" << endl;
2163 }
2165 12, double_six,
2166 coeffs20, 0/* verbose_level*/);
2167 if (f_v) {
2168 cout << "surface_create::create_surface_by_skew_hexagon after Surf->build_cubic_surface_from_lines" << endl;
2169 }
2170
2171 if (f_v) {
2172 cout << "surface_create::create_surface_by_skew_hexagon "
2173 "coeffs20:" << endl;
2174 Int_vec_print(cout, coeffs20, 20);
2175 cout << endl;
2176
2177 Surf->Poly3_4->print_equation(cout, coeffs20);
2178 cout << endl;
2179 }
2180
2181
2182 Lint_vec_copy(double_six, Lines27, 12);
2183
2184
2185 if (f_v) {
2186 cout << "surface_create::create_surface_by_skew_hexagon before Surf->create_the_fifteen_other_lines" << endl;
2187 }
2189 Lines27 + 12, verbose_level);
2190 if (f_v) {
2191 cout << "surface_create::create_surface_by_skew_hexagon after Surf->create_the_fifteen_other_lines" << endl;
2192 }
2193
2194
2195
2196
2197
2198
2199
2201
2202 if (f_v) {
2203 cout << "surface_create::create_surface_by_skew_hexagon before SO->init_with_27_lines" << endl;
2204 }
2205
2207 Lines27, coeffs20,
2208 FALSE /* f_find_double_six_and_rearrange_lines */,
2209 verbose_level);
2210
2211 if (f_v) {
2212 cout << "surface_create::create_surface_by_skew_hexagon after SO->init_with_27_lines" << endl;
2213 }
2214
2215
2216
2218
2219 char str_q[1000];
2220
2221 sprintf(str_q, "%d", F->q);
2222
2223
2224 prefix.assign("SkewHexagon_q");
2225 prefix.append(str_q);
2226 prefix.append("_");
2227 prefix.append(given_label);
2228
2229 label_txt.assign("SkewHexagon_q");
2230 label_txt.append(str_q);
2231 label_txt.append("_");
2232 label_txt.append(given_label);
2233
2234 label_tex.assign("SkewHexagon\\_q");
2235 label_tex.append(str_q);
2236 label_tex.append("\\_");
2237 label_tex.append(given_label_tex);
2238
2239
2240
2241 if (f_v) {
2242 cout << "surface_create::create_surface_by_skew_hexagon done" << endl;
2243 }
2244}
2245
2247 std::vector<std::string> &transform_coeffs,
2248 std::vector<int> &f_inverse_transform,
2249 int verbose_level)
2250{
2251 int f_v = (verbose_level >= 1);
2252 int f_vv = (verbose_level >= 2);
2253 int h;
2254 int *Elt1;
2255 int *Elt2;
2256 int *Elt3;
2257 actions::action *A;
2258 int desired_sz;
2259
2260 if (f_v) {
2261 cout << "surface_create::apply_transformations" << endl;
2262 cout << "surface_create::apply_transformations verbose_level = " << verbose_level << endl;
2263 }
2264
2265 A = Surf_A->A;
2266
2267 Elt1 = NEW_int(A->elt_size_in_int);
2268 Elt2 = NEW_int(A->elt_size_in_int);
2269 Elt3 = NEW_int(A->elt_size_in_int);
2270
2271 if (f_semilinear) {
2272 desired_sz = 17;
2273 }
2274 else {
2275 desired_sz = 16;
2276 }
2277
2278
2279 if (transform_coeffs.size()) {
2280
2281 for (h = 0; h < transform_coeffs.size(); h++) {
2282 int *transformation_coeffs;
2283 int sz;
2284 int coeffs_out[20];
2285
2286 if (f_v) {
2287 cout << "surface_create::apply_transformations "
2288 "applying transformation " << h << " / "
2289 << transform_coeffs.size() << ":" << endl;
2290 }
2291
2292 Int_vec_scan(transform_coeffs[h], transformation_coeffs, sz);
2293
2294 if (sz != desired_sz) {
2295 cout << "surface_create::apply_transformations "
2296 "need exactly " << desired_sz
2297 << " coefficients for the transformation" << endl;
2298 cout << "transform_coeffs[h]=" << transform_coeffs[h] << endl;
2299 cout << "sz=" << sz << endl;
2300 exit(1);
2301 }
2302
2303 A->make_element(Elt1, transformation_coeffs, verbose_level);
2304
2305 if (f_inverse_transform[h]) {
2306 A->element_invert(Elt1, Elt2, 0 /*verbose_level*/);
2307 }
2308 else {
2309 A->element_move(Elt1, Elt2, 0 /*verbose_level*/);
2310 }
2311
2312 //A->element_transpose(Elt2, Elt3, 0 /*verbose_level*/);
2313
2314 A->element_invert(Elt2, Elt3, 0 /*verbose_level*/);
2315
2316 if (f_v) {
2317 cout << "surface_create::apply_transformations "
2318 "applying the transformation given by:" << endl;
2319 cout << "$$" << endl;
2320 A->print_quick(cout, Elt2);
2321 cout << endl;
2322 cout << "$$" << endl;
2323 cout << "surface_create::apply_transformations "
2324 "The inverse is:" << endl;
2325 cout << "$$" << endl;
2326 A->print_quick(cout, Elt3);
2327 cout << endl;
2328 cout << "$$" << endl;
2329 }
2330
2331 // apply the transformation to the equation of the surface:
2332
2334
2335 M = A->G.matrix_grp;
2337 SO->eqn, coeffs_out, Surf,
2338 verbose_level - 1);
2339
2340 if (f_v) {
2341 cout << "surface_create::apply_transformations "
2342 "The equation of the transformed surface is:" << endl;
2343 cout << "$$" << endl;
2344 Surf->print_equation_tex(cout, coeffs_out);
2345 cout << endl;
2346 cout << "$$" << endl;
2347 }
2348
2349 Int_vec_copy(coeffs_out, SO->eqn, 20);
2350
2351
2352
2353 if (f_has_group) {
2354
2355 // apply the transformation to the set of generators:
2356
2358
2360 if (f_v) {
2361 cout << "surface_create::apply_transformations "
2362 "before SG2->init_generators_for_the_conjugate_group_avGa" << endl;
2363 }
2364 SG2->init_generators_for_the_conjugate_group_avGa(Sg, Elt2, verbose_level);
2365
2366 if (f_v) {
2367 cout << "surface_create::apply_transformations "
2368 "after SG2->init_generators_for_the_conjugate_group_avGa" << endl;
2369 }
2370
2371 FREE_OBJECT(Sg);
2372 Sg = SG2;
2373
2375 // ToDo: need to conjugate nice_gens
2376 }
2377
2378
2379 if (f_vv) {
2380 cout << "surface_create::apply_transformations Lines = ";
2381 Lint_vec_print(cout, SO->Lines, SO->nb_lines);
2382 cout << endl;
2383 }
2384 int i;
2385
2386 // apply the transformation to the set of lines:
2387
2388
2389 for (i = 0; i < SO->nb_lines; i++) {
2390 if (f_vv) {
2391 cout << "line " << i << ":" << endl;
2393 }
2394 SO->Lines[i] = Surf_A->A2->element_image_of(SO->Lines[i], Elt2, 0 /*verbose_level*/);
2395 if (f_vv) {
2396 cout << "maps to " << endl;
2398 }
2399 }
2400
2401 // apply the transformation to the set of points:
2402
2403 for (i = 0; i < SO->nb_pts; i++) {
2404 if (f_vv) {
2405 cout << "point" << i << " = " << SO->Pts[i] << endl;
2406 }
2407 SO->Pts[i] = Surf_A->A->element_image_of(SO->Pts[i], Elt2, 0 /*verbose_level*/);
2408 if (f_vv) {
2409 cout << "maps to " << SO->Pts[i] << endl;
2410 }
2411 int a;
2412
2413 a = Surf->Poly3_4->evaluate_at_a_point_by_rank(coeffs_out, SO->Pts[i]);
2414 if (a) {
2415 cout << "surface_create::apply_transformations something is wrong, "
2416 "the image point does not lie on the transformed surface" << endl;
2417 exit(1);
2418 }
2419
2420 }
2422
2423 Sorting.lint_vec_heapsort(SO->Pts, SO->nb_pts);
2424
2425
2426 FREE_int(transformation_coeffs);
2427 } // next h
2428
2429 if (f_v) {
2430 cout << "surface_create::apply_transformations before SO->recompute_properties" << endl;
2431 }
2432 SO->recompute_properties(verbose_level - 3);
2433 if (f_v) {
2434 cout << "surface_create::apply_transformations after SO->recompute_properties" << endl;
2435 }
2436
2437 }
2438 else {
2439 if (f_v) {
2440 cout << "surface_create::apply_transformations nothing to do" << endl;
2441 }
2442 }
2443
2444
2445 FREE_int(Elt1);
2446 FREE_int(Elt2);
2447 FREE_int(Elt3);
2448
2449 if (f_v) {
2450 cout << "surface_create::apply_transformations done" << endl;
2451 }
2452}
2453
2454
2457 int verbose_level)
2458{
2459 int f_v = (verbose_level >= 1);
2460 int i;
2461 long int a;
2462 actions::action *A;
2463 char str[1000];
2464
2465 if (f_v) {
2466 cout << "surface_create::compute_group" << endl;
2467 }
2468
2469#if 0
2470 A = Surf_A->A;
2471
2472 projective_space_object_classifier_description *Descr;
2473 projective_space_object_classifier *Classifier;
2474
2475 Descr = NEW_OBJECT(projective_space_object_classifier_description);
2476 Classifier = NEW_OBJECT(projective_space_object_classifier);
2477
2478 Descr->f_input = TRUE;
2479 Descr->Data = NEW_OBJECT(data_input_stream_description);
2480 Descr->Data->input_type[Descr->Data->nb_inputs] = INPUT_TYPE_SET_OF_POINTS;
2481 Descr->Data->input_string[Descr->Data->nb_inputs].assign("");
2482 for (i = 0; i < SO->nb_pts; i++) {
2483 a = SO->Pts[i];
2484 sprintf(str, "%ld", a);
2485 Descr->Data->input_string[Descr->Data->nb_inputs].append(str);
2486 if (i < SO->nb_pts - 1) {
2487 Descr->Data->input_string[Descr->Data->nb_inputs].append(",");
2488 }
2489 }
2490 Descr->Data->input_string2[Descr->Data->nb_inputs].assign("");
2491 Descr->Data->nb_inputs++;
2492
2493 if (f_v) {
2494 cout << "surface_create::compute_group before Classifier->do_the_work" << endl;
2495 }
2496
2497#if 0
2498 Classifier->do_the_work(
2499 Descr,
2500 TRUE,
2501 PA,
2502 verbose_level);
2503#endif
2504
2505 if (f_v) {
2506 cout << "surface_create::compute_group after Classifier->do_the_work" << endl;
2507 }
2508
2509 int idx;
2510 long int ago;
2511
2512 idx = Classifier->CB->type_of[Classifier->CB->n - 1];
2513
2514
2515 object_in_projective_space_with_action *OiPA;
2516
2517 OiPA = (object_in_projective_space_with_action *) Classifier->CB->Type_extra_data[idx];
2518
2519 {
2520 int *Kernel;
2521 int r, ns;
2522
2524
2525
2526
2528 r, Kernel, 0 /*verbose_level */);
2529
2530 ns = SO->Surf->Poly3_4->get_nb_monomials() - r; // dimension of null space
2531 if (f_v) {
2532 cout << "surface_create::compute_group The system has rank " << r << endl;
2533 cout << "surface_create::compute_group The ideal has dimension " << ns << endl;
2534#if 1
2535 cout << "surface_create::compute_group The ideal is generated by:" << endl;
2537 cout << "surface_create::compute_group Basis "
2538 "of polynomials:" << endl;
2539
2540 int h;
2541
2542 for (h = 0; h < ns; h++) {
2543 SO->Surf->Poly3_4->print_equation(cout, Kernel + h * SO->Surf->Poly3_4->get_nb_monomials());
2544 cout << endl;
2545 }
2546#endif
2547 }
2548
2549 FREE_int(Kernel);
2550 }
2551
2552 ago = OiPA->ago;
2553
2554 Sg = OiPA->Aut_gens;
2555
2556 Sg->A = A;
2557 f_has_group = TRUE;
2558
2559
2560 if (f_v) {
2561 cout << "surface_create::compute_group ago = " << ago << endl;
2562 }
2563#endif
2564
2565
2566
2567 if (f_v) {
2568 cout << "surface_create::compute_group done" << endl;
2569 }
2570}
2571
2572
2573}}}}
2574
2575
2576
void create_surface(surface_domain *Surf, long int *Arc6, long int line1, long int line2, int verbose_level)
void read_string_of_schlaefli_labels(std::string &str, int *&v, int &sz, int verbose_level)
int test_double_six_property(long int *S12, int verbose_level)
Given a set of lines in S12[12], test the double six property.
surface_object * create_surface_general_abcd(int a, int b, int c, int d, int verbose_level)
void create_the_fifteen_other_lines(long int *double_six, long int *fifteen_other_lines, int verbose_level)
Given a double six in double_six[12], compute the 15 remaining lines cij.
void rearrange_lines_according_to_double_six(long int *Lines, int verbose_level)
Picks a double six and rearranges the lines accordingly.
ring_theory::homogeneous_polynomial_domain * Poly3_4
surface_object * create_surface_bes(int a, int c, int verbose_level)
surface_object * create_Eckardt_surface(int a, int b, int &alpha, int &beta, int verbose_level)
void create_equation_Cayley_klmn(int k, int l, int m, int n, int *coeff, int verbose_level)
void build_cubic_surface_from_lines(int len, long int *S, int *coeff, int verbose_level)
void rearrange_lines_according_to_a_given_double_six(long int *Lines, int *given_double_six, long int *New_lines, int verbose_level)
a particular cubic surface in PG(3,q), given by its equation
void init_equation(surface_domain *Surf, int *eqn, int verbose_level)
void init_with_27_lines(surface_domain *Surf, long int *Lines27, int *eqn, int f_find_double_six_and_rearrange_lines, int verbose_level)
void init_equation_points_and_lines_only(surface_domain *Surf, int *eqn, int verbose_level)
void print(std::ostream &ost, long int *v, int len)
Definition: lint_vec.cpp:246
a collection of functions related to sorted vectors
functions related to strings and character arrays
void parse(syntax_tree *tree, std::string &program, int verbose_level)
int evaluate(std::map< std::string, std::string > &symbol_table, field_theory::finite_field *F, int verbose_level)
void export_graphviz(std::string &name, std::ostream &ost)
void split_by_monomials(ring_theory::homogeneous_polynomial_domain *Poly, syntax_tree_node **&Subtrees, int verbose_level)
Definition: syntax_tree.cpp:85
int is_homogeneous(int &degree, int verbose_level)
Definition: syntax_tree.cpp:61
void finite_field_init(int q, int f_without_tables, int verbose_level)
void PG_element_unrank_modified_lint(int *v, int stride, int len, long int a)
void print_single_generator_matrix_tex(std::ostream &ost, long int a)
Definition: grassmann.cpp:122
provides access to pre-computed combinatorial data in encoded form
homogeneous polynomials of a given degree in a given number of variables over a finite field GF(q)
Definition: ring_theory.h:88
void init(field_theory::finite_field *F, int nb_vars, int degree, int f_init_incidence_structure, monomial_ordering_type Monomial_ordering_type, int verbose_level)
void vanishing_ideal(long int *Pts, int nb_pts, int &r, int *Kernel, int verbose_level)
a permutation group in a fixed action.
Definition: actions.h:99
void print_quick(std::ostream &ost, void *elt)
Definition: action_cb.cpp:137
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
long int element_image_of(long int a, void *elt, int verbose_level)
Definition: action_cb.cpp:198
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)
a strong generating set for a permutation group with respect to a fixed action
Definition: groups.h:1703
void stabilizer_of_F13_surface(actions::action *A, field_theory::finite_field *F, int a, data_structures_groups::vector_ge *&nice_gens, int verbose_level)
void stabilizer_of_cubic_surface_from_catalogue(actions::action *A, field_theory::finite_field *F, int iso, int verbose_level)
void stabilizer_of_G13_surface(actions::action *A, field_theory::finite_field *F, int a, data_structures_groups::vector_ge *&nice_gens, int verbose_level)
void init_generators_for_the_conjugate_group_avGa(strong_generators *SG, int *Elt_a, int verbose_level)
void stabilizer_of_Eckardt_surface(actions::action *A, field_theory::finite_field *F, int f_with_normalizer, int f_semilinear, data_structures_groups::vector_ge *&nice_gens, int verbose_level)
void init_from_data_with_target_go_ascii(actions::action *A, int *data, int nb_elements, int elt_size, const char *ascii_target_go, data_structures_groups::vector_ge *&nice_gens, int verbose_level)
to control the behavior of the poset classification algorithm
void classify(poset_classification::poset_classification_control *Control1, poset_classification::poset_classification_control *Control2, int verbose_level)
void create_surface_and_group(cubic_surfaces_in_general::surface_with_action *Surf_A, long int *Arc6, int verbose_level)
Definition: arc_lifting.cpp:64
void complete_skew_hexagon(long int *skew_hexagon, std::vector< std::vector< long int > > &Double_sixes, int verbose_level)
void apply_transformations(std::vector< std::string > &transform_coeffs, std::vector< int > &f_inverse_transform, int verbose_level)
void create_surface_by_double_six(std::string &by_double_six_label, std::string &by_double_six_label_tex, std::string &by_double_six_text, int verbose_level)
void create_surface_by_coefficients(std::string &coefficients_text, std::vector< std::string > &select_double_six_string, int verbose_level)
void create_surface_by_rank(std::string &rank_text, int defining_q, std::vector< std::string > &select_double_six_string, int verbose_level)
void create_surface_by_skew_hexagon(std::string &given_label, std::string &given_label_tex, int verbose_level)
void compute_group(projective_geometry::projective_space_with_action *PA, int verbose_level)
void override_group(std::string &group_order_text, int nb_gens, std::string &gens_text, int verbose_level)
void create_surface_from_catalogue(int iso, std::vector< std::string > &select_double_six_string, int verbose_level)
void create_surface_by_equation(std::string &name_of_formula, std::string &name_of_formula_tex, std::string &managed_variables, std::string &equation_text, std::string &equation_parameters, std::string &equation_parameters_tex, std::vector< std::string > &select_double_six_string, int verbose_level)
void init_with_data(surface_create_description *Descr, surface_with_action *Surf_A, int verbose_level)
void create_surface_by_coefficient_vector(int *coeffs20, std::vector< std::string > &select_double_six_string, int verbose_level)
void create_surface_by_arc_lifting_with_two_lines(std::string &arc_lifting_text, std::string &arc_lifting_two_lines_text, int verbose_level)
void init(surface_create_description *Descr, surface_with_action *Surf_A, int verbose_level)
projective space PG(n,q) with automorphism group PGGL(n+1,q)
#define Lint_vec_copy(A, B, C)
Definition: foundations.h:694
#define Int_vec_scan(A, B, C)
Definition: foundations.h:716
#define FREE_int(p)
Definition: foundations.h:640
#define Int_vec_zero(A, B)
Definition: foundations.h:713
#define Lint_vec_scan(A, B, C)
Definition: foundations.h:717
#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 TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define ODD(x)
Definition: foundations.h:222
#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
orbiter_kernel_system::orbiter_session * Orbiter
global Orbiter session
the orbiter library for the classification of combinatorial objects