Orbiter 2022
Combinatorial Objects
surfaces_arc_lifting_trace.cpp
Go to the documentation of this file.
1/*
2 * surfaces_arc_lifting_trace.cpp
3 *
4 * Created on: Jul 30, 2020
5 * Author: betten
6 */
7
8
9
10
11#include "orbiter.h"
12
13using namespace std;
14
15namespace orbiter {
16namespace layer5_applications {
17namespace applications_in_algebraic_geometry {
18namespace cubic_surfaces_and_arcs {
19
20
22{
23 Up = NULL;
24
25 f = f2 = po = so = 0;
26
27 Elt_alpha2 = NULL;
28 Elt_beta1 = NULL;
29 Elt_beta2 = NULL;
30
31 Elt_T1 = NULL;
32 Elt_T2 = NULL;
33 Elt_T3 = NULL;
34 Elt_T4 = NULL;
35
36 Elt_Alpha1 = NULL;
37 Elt_Alpha2 = NULL;
38 Elt_Beta1 = NULL;
39 Elt_Beta2 = NULL;
40 Elt_Beta3 = NULL;
41
42
43
44 upstep_idx = 0;
45
47
48}
49
51{
52 if (Elt_alpha2) {
54 }
55 if (Elt_beta1) {
57 }
58 if (Elt_beta2) {
60 }
61 if (Elt_T1) {
63 }
64 if (Elt_T2) {
66 }
67 if (Elt_T3) {
69 }
70 if (Elt_T4) {
72 }
73 if (Elt_Alpha1) {
75 }
76 if (Elt_Alpha2) {
78 }
79 if (Elt_Beta1) {
81 }
82 if (Elt_Beta2) {
84 }
85 if (Elt_Beta3) {
87 }
88
89}
90
91
93 int seventytwo_case_idx, int verbose_level)
94{
95 int f_v = (verbose_level >= 1);
96
97
98 if (f_v) {
99 cout << "surfaces_arc_lifting_trace::init" << endl;
100 cout << "verbose_level = " << verbose_level << endl;
101 cout << "flag orbit " << Up->f << " / " << Up->Lift->Flag_orbits->nb_flag_orbits
102 << " tritangent_plane_idx = " << Up->tritangent_plane_idx
103 << " seventytwo_case_idx = " << seventytwo_case_idx << endl;
104 }
107 f = Up->f;
108
110
111
115
120
126
127
130 if (f_v) {
131 cout << "surfaces_arc_lifting_upstep::process_flag_orbit "
132 "po=" << po << " so=" << so << endl;
133 }
134
135 upstep_idx = Up->tritangent_plane_idx * 72 + seventytwo_case_idx; //Up->line_idx * 24 + Up->cnt;
136
137 if (f_v) {
138 cout << "surfaces_arc_lifting_trace::init done" << endl;
139 }
140}
141
142
144{
145 int f_v = (verbose_level >= 1);
146 int f_vv = (verbose_level >= 2);
147 int f_vvv = (verbose_level >= 3);
148
149
150 if (f_v) {
151 cout << "surfaces_arc_lifting_trace::process_flag_orbit" << endl;
152 }
153
154
155 if (f_vv) {
156 cout << "f=" << f << " / " << Up->Lift->Flag_orbits->nb_flag_orbits
157 << ", tritangent_plane_idx=" << Up->tritangent_plane_idx << " / 45 "
158 << ", seventytwo_case_idx=" << seventytwo_case_idx << " / 72 "
159 << ", upstep " << upstep_idx << " / " << 3240
160 << " before move_arc" << endl;
161 }
162
163 move_arc(verbose_level - 2);
164
165 if (f_vv) {
166 cout << "f=" << f << " / " << Up->Lift->Flag_orbits->nb_flag_orbits
167 << ", tritangent_plane_idx=" << Up->tritangent_plane_idx << " / 45 "
168 << ", seventytwo_case_idx=" << seventytwo_case_idx << " / 72 "
169 << ", upstep " << upstep_idx << " / " << 3240
170 << " after move_arc" << endl;
171 }
172
173
174 if (f_vv) {
175 cout << "f=" << f << " / " << Up->Lift->Flag_orbits->nb_flag_orbits
176 << ", upstep " << upstep_idx << " / " << 3240;
177 cout << " f2=" << f2 << " before lift_group_elements_and_move_two_lines";
178 cout << endl;
179 }
181
182 if (f_vv) {
183 cout << "f=" << f << " / " << Up->Lift->Flag_orbits->nb_flag_orbits
184 << ", upstep " << upstep_idx << " / " << 3240;
185 cout << " f2=" << f2 << " after lift_group_elements_and_move_two_lines";
186 cout << endl;
187 }
188 if (f_vvv) {
189 cout << "f=" << f << " / " << Up->Lift->Flag_orbits->nb_flag_orbits
190 << ", upstep "
191 "tritangent_plane_idx=" << Up->tritangent_plane_idx << " / 45 ";
192 cout << " line_idx=" << The_case.line_idx
193 << " l1=" << The_case.l1 << " l2=" << The_case.l2;
194 cout << " f2=" << f2 << " the lifted group elements are:";
195 cout << endl;
196
197 cout << "Alpha1=" << endl;
199 cout << "Alpha2=" << endl;
201 cout << "Beta1=" << endl;
203 cout << "Beta2=" << endl;
205 cout << "Beta3=" << endl;
207 }
208
213
214
215 if (f_vvv) {
216 cout << "f=" << f << " / " << Up->Lift->Flag_orbits->nb_flag_orbits
217 << ", upstep "
218 "tritangent_plane_idx=" << Up->tritangent_plane_idx << " / 45 ";
219 cout << " line_idx=" << The_case.line_idx
220 << " l1=" << The_case.l1 << " l2=" << The_case.l2;
221 cout << " f2=" << f2;
222 cout << endl;
223 cout << "T4 = Alpha1 * Alpha2 * Beta1 * Beta2 * Beta3 = " << endl;
225 cout << endl;
226 }
227
228
229
230 if (f_v) {
231 cout << "surfaces_arc_lifting_trace::process_flag_orbit done" << endl;
232 }
233
234}
235
236
238// computes alpha1 (4x4), alpha2 (3x3), beta1 (3x3) and beta2 (3x3) and f2
239// The following data is computed but not stored:
240// P6_local, orbit_not_on_conic_idx, pair_orbit_idx, the_partition4
241//
242// This function defines a 4x4 projectivity Elt_alpha1
243// which maps the chosen plane tritangent_plane_idx
244// to the standard plane W=0.
245// P6a is the image of P6 under alpha1, preserving the order of elements.
246// After that, P6_local will be computed to contain the local coordinates of the arc.
247// After that, a 3x3 collineation alpha2 will be computed to map
248// P6_local to the canonical orbit representative from the classification
249// of non-conical six-arcs computed earlier.
250// After that, 3x3 collineations beta1 and beta2 will be computed.
251// beta1 takes the pair P1,P2 to the canonical orbit representative
252// under the stabilizer of the arc.
253// beta2 takes the set-partition imposed by ({P2,P3},{P4,P5})
254// to the canonical orbit representative under that stabilizer of the arc
255// and the pair of points {P1,P2}
256{
257 int f_v = (verbose_level >= 1);
258
259
260 if (f_v) {
261 cout << "surfaces_arc_lifting_trace::move_arc" << endl;
262 cout << "verbose_level = " << verbose_level;
263 cout << " f=" << f << " / " << Up->Lift->Flag_orbits->nb_flag_orbits
264 << ", "
265 "tritangent_plane_idx=" << Up->tritangent_plane_idx << " / 45, "
266 "line_idx=" << The_case.line_idx << " / 3, "
267 "l1=" << The_case.l1 << " l2=" << The_case.l2;
268 //cout << " transversals4=";
269 //lint_vec_print(cout, transversals4, 4);
270 cout << " P6=";
271 Lint_vec_print(cout, The_case.P6, 6);
272 cout << endl;
273 }
274
275
276 // compute Elt_alpha1 which is 4x4:
277 if (f_v) {
278 cout << "surfaces_arc_lifting_trace::move_arc before move_plane_and_arc" << endl;
279 }
280 move_plane_and_arc(The_case.P6a, verbose_level - 2);
281 if (f_v) {
282 cout << "surfaces_arc_lifting_trace::move_arc after move_plane_and_arc" << endl;
283 }
284
285
286
287 if (f_v) {
288 cout << "surfaces_arc_lifting_trace::move_arc before compute_local_coordinates_of_arc" << endl;
289 }
291 if (f_v) {
292 cout << "surfaces_arc_lifting_trace::move_arc after compute_local_coordinates_of_arc" << endl;
293 }
294
295
296
297
298
299 // compute Elt_alpha2 which is 3x3:
300
301 if (f_v) {
302 cout << "surfaces_arc_lifting_trace::move_arc before make_arc_canonical" << endl;
303 }
305 The_case.orbit_not_on_conic_idx, verbose_level);
306 if (f_v) {
307 cout << "surfaces_arc_lifting_trace::move_arc after make_arc_canonical" << endl;
308 }
309
310
311
312
313
314 // compute beta1 which is 3x3:
315 if (f_v) {
316 cout << "surfaces_arc_lifting_trace::move_arc before compute_beta1" << endl;
317 }
318 compute_beta1(&The_case, verbose_level);
319 if (f_v) {
320 cout << "surfaces_arc_lifting_trace::move_arc after compute_beta1" << endl;
321 }
322
323
324 // compute beta2 which is 3x3:
325 // also, compute f2
326
327
328
329 if (f_v) {
330 cout << "surfaces_arc_lifting_trace::move_arc before compute_beta2" << endl;
331 }
335 The_case.the_partition4, verbose_level);
336
337 The_case.f2 = f2;
338
339 if (f_v) {
340 cout << "surfaces_arc_lifting_trace::move_arc after compute_beta2" << endl;
341 }
342
343
344 if (f_v) {
345 cout << "surfaces_arc_lifting_trace::move_arc done" << endl;
346 }
347}
348
349void surfaces_arc_lifting_trace::move_plane_and_arc(long int *P6a, int verbose_level)
350{
351 int f_v = (verbose_level >= 1);
352
353
354 if (f_v) {
355 cout << "surfaces_arc_lifting_trace::move_plane_and_arc" << endl;
356 cout << "verbose_level = " << verbose_level;
357 cout << " f=" << f << " / " << Up->Lift->Flag_orbits->nb_flag_orbits
358 << ", "
359 "tritangent_plane_idx=" << Up->tritangent_plane_idx << " / 45, "
360 "line_idx=" << The_case.line_idx << " / 3, "
361 "l1=" << The_case.l1 << " l2=" << The_case.l2;
362 //cout << " transversals4=";
363 //lint_vec_print(cout, transversals4, 4);
364 cout << " P6=";
365 Lint_vec_print(cout, The_case.P6, 6);
366 cout << endl;
367 }
368
369 int i;
370
372
373 if (f_v) {
374 cout << "surfaces_arc_lifting_upstep::move_plane_and_arc" << endl;
375 cout << "tritangent_plane_rk = " << The_case.tritangent_plane_rk << endl;
376 }
377
379 The_case.tritangent_plane_rk, 0 /*verbose_level - 5*/);
380
381 if (f_v) {
382 cout << "surfaces_arc_lifting_trace::move_plane_and_arc" << endl;
383 cout << "Basis=" << endl;
385 }
386
388 if (f_v) {
389 cout << "surfaces_arc_lifting_trace::move_plane_and_arc" << endl;
390 cout << "Basis_inv=" << endl;
392 }
393
394 The_case.Basis_pi_inv[16] = 0; // in case the group is semilinear
395
396 Up->Lift->Surf_A->A->make_element(Elt_Alpha1, The_case.Basis_pi_inv, 0 /*verbose_level*/);
397 for (i = 0; i < 6; i++) {
398 P6a[i] = Up->Lift->Surf_A->A->image_of(Elt_Alpha1, The_case.P6[i]);
399 }
400 if (f_v) {
401 cout << "surfaces_arc_lifting_trace::move_plane_and_arc" << endl;
402 cout << "P6a=" << endl;
403 Lint_vec_print(cout, P6a, 6);
404 cout << endl;
405 }
406
407
408 if (f_v) {
409 cout << "surfaces_arc_lifting_trace::move_plane_and_arc done" << endl;
410 }
411}
412
413
415 long int *P6_local, long int *P6_local_canonical,
416 int &orbit_not_on_conic_idx, int verbose_level)
417{
418 int f_v = (verbose_level >= 1);
419
420 if (f_v) {
421 cout << "surfaces_arc_lifting_trace::make_arc_canonical" << endl;
422 }
423 int i;
424
425 Up->Lift->Six_arcs->recognize(P6_local, Elt_alpha2,
426 orbit_not_on_conic_idx, verbose_level - 2);
427
428 if (f_v) {
429 cout << "surfaces_arc_lifting_trace::make_arc_canonical" << endl;
430 cout << "P6_local=" << endl;
431 Lint_vec_print(cout, P6_local, 6);
432 cout << " orbit_not_on_conic_idx=" << orbit_not_on_conic_idx << endl;
433 }
434 for (i = 0; i < 6; i++) {
435 P6_local_canonical[i] = Up->Lift->A3->image_of(Elt_alpha2, P6_local[i]);
436 }
437 if (f_v) {
438 cout << "surfaces_arc_lifting_trace::make_arc_canonical" << endl;
439 cout << "P6_local_canonical=" << endl;
440 Lint_vec_print(cout, P6_local_canonical, 6);
441 cout << " orbit_not_on_conic_idx=" << orbit_not_on_conic_idx << endl;
442 cout << "The flag orbit f satisfies "
443 << Up->Lift->flag_orbit_fst[orbit_not_on_conic_idx]
444 << " <= f < "
445 << Up->Lift->flag_orbit_fst[orbit_not_on_conic_idx] +
446 Up->Lift->flag_orbit_len[orbit_not_on_conic_idx] << endl;
447 }
448
449 if (f_v) {
450 cout << "surfaces_arc_lifting_trace::make_arc_canonical done" << endl;
451 }
452}
453
455{
456 int f_v = (verbose_level >= 1);
457
458 if (f_v) {
459 cout << "surfaces_arc_lifting_trace::compute_beta1" << endl;
460 }
461 int i;
462
464 long int P6_orbit_rep[6];
465 int idx;
466
467 Lint_vec_copy(The_case->P6_local_canonical, P6_orbit_rep, 6);
468 Sorting.lint_vec_heapsort(P6_orbit_rep, 6);
469 for (i = 0; i < 6; i++) {
470 Sorting.lint_vec_search_linear(P6_orbit_rep, 6, The_case->P6_local_canonical[i], idx);
471 The_case->P6_perm[i] = idx;
472 }
473 The_case->pair[0] = The_case->P6_perm[0];
474 The_case->pair[1] = The_case->P6_perm[1];
475 if (f_v) {
476 cout << "surfaces_arc_lifting_trace::compute_beta1" << endl;
477 cout << "P6_orbit_rep=" << endl;
478 Lint_vec_print(cout, P6_orbit_rep, 6);
479 cout << endl;
480 cout << "P6_perm=" << endl;
482 cout << endl;
483 }
484
485
486 // compute beta1 which is 3x3:
487
488
489 if (f_v) {
490 cout << "surfaces_arc_lifting_trace::compute_beta1 before "
491 "Table_orbits_on_pairs[orbit_not_on_conic_idx].recognize" << endl;
492 }
494 The_case->pair_orbit_idx, verbose_level - 4);
495 if (f_v) {
496 cout << "surfaces_arc_lifting_trace::compute_beta1 after "
497 "Table_orbits_on_pairs[orbit_not_on_conic_idx].recognize" << endl;
498 cout << "pair_orbit_idx=" << The_case->pair_orbit_idx << endl;
499 }
500 for (i = 0; i < 6; i++) {
504 }
505
506
507 if (f_v) {
508 cout << "surfaces_arc_lifting_trace::compute_beta1 before "
509 "The_case->compute_partition" << endl;
510 }
511 The_case->compute_partition(verbose_level);
512 if (f_v) {
513 cout << "surfaces_arc_lifting_trace::compute_beta1 after "
514 "The_case->compute_partition" << endl;
515 }
516
517
518 if (f_v) {
519 cout << "surfaces_arc_lifting_trace::compute_beta1 after "
520 "Table_orbits_on_pairs[orbit_not_on_conic_idx].recognize" << endl;
521 cout << "the_partition4=";
523 cout << endl;
524 }
525
526 if (f_v) {
527 cout << "surfaces_arc_lifting_trace::compute_beta1 done" << endl;
528 }
529}
530
532 int orbit_not_on_conic_idx,
533 int pair_orbit_idx,
534 int &partition_orbit_idx,
535 int *the_partition4, int verbose_level)
536{
537 int f_v = (verbose_level >= 1);
538
539 if (f_v) {
540 cout << "surfaces_arc_lifting_trace::compute_beta2" << endl;
541 }
542
543 if (f_v) {
544 cout << "surfaces_arc_lifting_trace::compute_beta2 before "
545 "Table_orbits_on_pairs[orbit_not_on_conic_idx].recognize" << endl;
546 }
547 Up->Lift->Table_orbits_on_pairs[orbit_not_on_conic_idx].
548 Table_orbits_on_partition[pair_orbit_idx].recognize(
549 the_partition4, Elt_beta2,
550 partition_orbit_idx, verbose_level - 4);
551 if (f_v) {
552 cout << "surfaces_arc_lifting_trace::compute_beta2 after "
553 "Table_orbits_on_pairs[orbit_not_on_conic_idx].recognize" << endl;
554 cout << "pair_orbit_idx=" << pair_orbit_idx << endl;
555 cout << "partition_orbit_idx=" << partition_orbit_idx << endl;
556 }
557
558 f2 = Up->Lift->flag_orbit_fst[orbit_not_on_conic_idx] +
559 Up->Lift->Table_orbits_on_pairs[orbit_not_on_conic_idx].
560 partition_orbit_first[pair_orbit_idx] + partition_orbit_idx;
561
562
563 if (f_v) {
564 cout << "surfaces_arc_lifting_trace::compute_beta2 after "
565 "Table_orbits_on_pairs[orbit_not_on_conic_idx].recognize" << endl;
566 cout << "pair_orbit_idx=" << pair_orbit_idx << endl;
567 cout << "partition_orbit_idx=" << partition_orbit_idx << endl;
568 cout << "f2=" << f2 << endl;
569 }
570
571 if (Up->Lift->flag_orbit_on_arcs_not_on_a_conic_idx[f2] != orbit_not_on_conic_idx) {
572 cout << "flag_orbit_on_arcs_not_on_a_conic_idx[f2] != orbit_not_on_conic_idx" << endl;
573 exit(1);
574 }
575 if (Up->Lift->flag_orbit_on_pairs_idx[f2] != pair_orbit_idx) {
576 cout << "flag_orbit_on_pairs_idx[f2] != pair_orbit_idx" << endl;
577 exit(1);
578
579 }
580 if (Up->Lift->flag_orbit_on_partition_idx[f2] != partition_orbit_idx) {
581 cout << "flag_orbit_on_partition_idx[f2] != partition_orbit_idx" << endl;
582 exit(1);
583
584 }
585 if (f_v) {
586 cout << "surfaces_arc_lifting_trace::compute_beta2 done" << endl;
587 }
588
589}
590
592// uses Elt_Alpha2, Elt_Beta1, Elt_Beta2, Elt_Beta3, Elt_T1, Elt_T2, Elt_T3
593{
594 int f_v = (verbose_level >= 1);
595 int f_vv = (verbose_level >= 2);
596
597
598 if (f_v) {
599 cout << "surfaces_arc_lifting_trace::lift_group_elements_and_move_two_lines" << endl;
600 cout << "verbose_level = " << verbose_level;
601 cout << " f=" << f << " / " << Up->Lift->Flag_orbits->nb_flag_orbits
602 << ", "
603 "tritangent_plane_idx=" << Up->tritangent_plane_idx << " / 45, "
604 "line_idx=" << The_case.line_idx << " / 3, "
605 "l1=" << The_case.l1 << " l2=" << The_case.l2;
606 cout << " f2 = " << f2 << endl;
607 }
608
609
610 if (f_vv) {
611 cout << "surfaces_arc_lifting_trace::lift_group_elements_and_move_two_lines "
612 "before embedding" << endl;
613 cout << "Elt_alpha2=" << endl;
615 cout << "Elt_beta1=" << endl;
617 cout << "Elt_beta2=" << endl;
619 }
620
621
622
623 if (f_v) {
624 cout << "surfaces_arc_lifting_trace::lift_group_elements_and_move_two_lines "
625 "before embed Elt_alpha2" << endl;
626 }
627 embed(Elt_alpha2, Elt_Alpha2, verbose_level - 2);
628 if (f_v) {
629 cout << "surfaces_arc_lifting_trace::lift_group_elements_and_move_two_lines "
630 "before embed Elt_alpha2" << endl;
631 }
632 embed(Elt_beta1, Elt_Beta1, verbose_level - 2);
633 embed(Elt_beta2, Elt_Beta2, verbose_level - 2);
634
635 if (f_vv) {
636 cout << "surfaces_arc_lifting_trace::lift_group_elements_and_move_two_lines "
637 "after embedding" << endl;
638 cout << "Elt_Alpha2=" << endl;
640 cout << "Elt_Beta1=" << endl;
642 cout << "Elt_Beta2=" << endl;
644 }
645
646
650
651
652 // map the two lines:
653
654 //long int L1, L2;
655 int beta3[17];
656
657
658
659 The_case.L1 = Up->Lift->Surf_A->A2->element_image_of(Up->Lines[The_case.l1], Elt_T3, 0 /* verbose_level */);
660 The_case.L2 = Up->Lift->Surf_A->A2->element_image_of(Up->Lines[The_case.l2], Elt_T3, 0 /* verbose_level */);
661 if (f_v) {
662 cout << "surfaces_arc_lifting_trace::lift_group_elements_and_move_two_lines "
663 "L1=" << The_case.L1 << " L2=" << The_case.L2 << endl;
664 }
665
666 // compute beta 3:
667
668 //int orbit_not_on_conic_idx;
669 //int pair_orbit_idx;
670 //int partition_orbit_idx;
671 long int line1_to, line2_to;
672
673
674 //orbit_not_on_conic_idx = flag_orbit_on_arcs_not_on_a_conic_idx[f2];
675 //pair_orbit_idx = flag_orbit_on_pairs_idx[f2];
676 //partition_orbit_idx = flag_orbit_on_partition_idx[f2];
677
678#if 0
679 line1_to = Table_orbits_on_pairs[orbit_not_on_conic_idx].
680 Table_orbits_on_partition[pair_orbit_idx].;
681#endif
682
683 //int pt_representation_sz;
684
685 //pt_representation_sz = 6 + 1 + 2 + 1 + 1 + 2 + 20 + 27;
686
687 // Flag[0..5] : 6 for the arc P1,...,P6
688 // Flag[6] : 1 for orb, the selected orbit on pairs
689 // Flag[7..8] : 2 for the selected pair, i.e., {0,1} for P1,P2.
690 // Flag[9] : 1 for orbit, the selected orbit on set_partitions
691 // Flag[10] : 1 for the partition of the remaining points; values=0,1,2
692 // Flag[11..12] : 2 for the chosen lines line1 and line2 through P1 and P2
693 // Flag[13..32] : 20 for the equation of the surface
694 // Flag[33..59] : 27 for the lines of the surface
695
696 //Flag2_representation = NEW_lint(pt_representation_sz);
697
701
702
703 line1_to = Up->Flag2_representation[11];
704 line2_to = Up->Flag2_representation[12];
705
706 if (f_vv) {
707 cout << "surfaces_arc_lifting_trace::lift_group_elements_and_move_two_lines "
708 "line1_to=" << line1_to << " line2_to=" << line2_to << endl;
709 int A[8];
710 int B[8];
711 Up->Lift->Surf_A->Surf->P->unrank_line(A, line1_to);
712 cout << "line1_to=" << line1_to << "=" << endl;
713 Int_matrix_print(A, 2, 4);
714 Up->Lift->Surf_A->Surf->P->unrank_line(B, line2_to);
715 cout << "line2_to=" << line2_to << "=" << endl;
716 Int_matrix_print(B, 2, 4);
717 }
718
719 if (f_vv) {
720 cout << "surfaces_arc_lifting_trace::lift_group_elements_and_move_two_lines "
721 "L1=" << The_case.L1 << " L2=" << The_case.L2 << endl;
722 int A[8];
723 int B[8];
725 cout << "L1=" << The_case.L1 << "=" << endl;
726 Int_matrix_print(A, 2, 4);
728 cout << "L2=" << The_case.L2 << "=" << endl;
729 Int_matrix_print(B, 2, 4);
730 }
731
732 // test if L1 and line1_to are skew then switch L1 and L2:
733
734 //long int tritangent_plane_rk;
735 long int p1, p2;
736
737 //tritangent_plane_rk = SO->Tritangent_plane_rk[tritangent_plane_idx];
738
740 The_case.L1 /* line */,
741 0 /* plane */, 0 /* verbose_level */);
742
744 line1_to /* line */,
745 0 /* plane */, 0 /* verbose_level */);
746
747 if (f_vv) {
748 cout << "surfaces_arc_lifting_trace::lift_group_elements_and_move_two_lines "
749 "p1=" << p1 << " p2=" << p2 << endl;
750 }
751
752 if (p1 != p2) {
753
754 if (f_vv) {
755 cout << "L1 and line1_to do not intersect the plane in "
756 "the same point, so we switch L1 and L2" << endl;
757 }
758 int t;
759
760 t = The_case.L1;
762 The_case.L2 = t;
763 }
764 else {
765 if (f_vv) {
766 cout << "no need to switch" << endl;
767 }
768 }
769
770
772
773 if (f_v) {
774 cout << "surfaces_arc_lifting_trace::lift_group_elements_and_move_two_lines "
775 "before hyperplane_lifting_with_two_lines_moved" << endl;
776 }
778 The_case.L1 /* line1_from */, line1_to,
779 The_case.L2 /* line2_from */, line2_to,
780 beta3,
781 verbose_level - 4);
782 beta3[16] = 0;
783 if (f_v) {
784 cout << "surfaces_arc_lifting_trace::lift_group_elements_and_move_two_lines "
785 "after hyperplane_lifting_with_two_lines_moved" << endl;
786 }
787
788 Up->Lift->A4->make_element(Elt_Beta3, beta3, 0);
789
790 if (f_vv) {
791 cout << "surfaces_arc_lifting_trace::lift_group_elements_and_move_two_lines" << endl;
792 cout << "Elt_beta3=" << endl;
794 cout << "Elt_beta3=" << endl;
796 cout << endl;
797 }
798
799
800
801 //FREE_lint(Flag2_representation);
802 if (f_v) {
803 cout << "surfaces_arc_lifting_trace::lift_group_elements_and_move_two_lines done" << endl;
804 }
805}
806
807void surfaces_arc_lifting_trace::embed(int *Elt_A3, int *Elt_A4, int verbose_level)
808{
809 int f_v = (verbose_level >= 1);
810 int M3[9];
811 int M4[17];
812 int i, j, a;
813
814
815 if (f_v) {
816 cout << "surfaces_arc_lifting_trace::embed" << endl;
817 }
818 Int_vec_copy(Elt_A3, M3, 9);
819 Up->Lift->F->PG_element_normalize(M3, 1, 9);
820 Int_vec_zero(M4, 17);
821 for (i = 0; i < 3; i++) {
822 for (j = 0; j < 3; j++) {
823 a = M3[i * 3 + j];
824 M4[i * 4 + j] = a;
825 }
826 }
827 M4[3 * 4 + 3] = 1;
828 if (FALSE) {
829 cout << "surfaces_arc_lifting_trace::embed M4=" << endl;
830 Int_vec_print(cout, M4, 17);
831 cout << endl;
832 }
833 if (Up->Lift->f_semilinear) {
834 M4[16] = Elt_A3[9];
835 }
836 if (FALSE) {
837 cout << "surfaces_arc_lifting_trace::embed before make_element" << endl;
838 }
839 Up->Lift->A4->make_element(Elt_A4, M4, 0);
840
841
842 if (f_v) {
843 cout << "surfaces_arc_lifting_trace::embed done" << endl;
844 }
845}
846
847void surfaces_arc_lifting_trace::report_product(ostream &ost, int *Elt, int verbose_level)
848{
849 ost << "$$" << endl;
855 ost << "=";
856 Up->Lift->A4->element_print_latex(Elt, ost);
857 ost << "$$" << endl;
858
859 int f_print_as_exponentials_save = Up->Lift->F->f_print_as_exponentials;
860
861 if (f_print_as_exponentials_save == FALSE) {
862 return;
863 }
864
866
867 ost << "$$" << endl;
873 ost << "=";
874 Up->Lift->A4->element_print_latex(Elt, ost);
875 ost << "$$" << endl;
876
877 Up->Lift->F->f_print_as_exponentials = f_print_as_exponentials_save;
878
879
880}
881
882
883}}}}
884
description of a Clebsch map with a fixed tritangent plane
void compute_local_coordinates_of_arc(long int *P6, long int *P6_local, int verbose_level)
a collection of functions related to sorted vectors
int lint_vec_search_linear(long int *v, int len, long int a, int &idx)
Definition: sorting.cpp:699
various functions related to geometries
Definition: geometry.h:721
void hyperplane_lifting_with_two_lines_moved(projective_space *P, long int line1_from, long int line1_to, long int line2_from, long int line2_to, int *A4, int verbose_level)
void unrank_embedded_subspace_lint_here(int *Basis, long int rk, int verbose_level)
Definition: grassmann.cpp:318
int point_of_intersection_of_a_line_and_a_plane_in_three_space(long int line, int plane, int verbose_level)
void invert_matrix(int *A, int *A_inv, int n, int verbose_level)
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 make_element(int *Elt, int *data, int verbose_level)
Definition: action.cpp:1875
long int element_image_of(long int a, void *elt, int verbose_level)
Definition: action_cb.cpp:198
void compute_beta2(int orbit_not_on_conic_idx, int pair_orbit_idx, int &partition_orbit_idx, int *the_partition4, int verbose_level)
void make_arc_canonical(long int *P6_local, long int *P6_local_canonical, int &orbit_not_on_conic_idx, int verbose_level)
void recognize(long int *arc6, int *transporter, int &orbit_not_on_conic_idx, int verbose_level)
#define Lint_vec_copy(A, B, C)
Definition: foundations.h:694
#define FREE_int(p)
Definition: foundations.h:640
#define Int_vec_zero(A, B)
Definition: foundations.h:713
#define Lint_vec_print(A, B, C)
Definition: foundations.h:686
#define NEW_int(n)
Definition: foundations.h:625
#define Int_matrix_print(A, B, C)
Definition: foundations.h:707
#define FALSE
Definition: foundations.h:234
#define Int_vec_copy(A, B, C)
Definition: foundations.h:693
#define Int_vec_print(A, B, C)
Definition: foundations.h:685
the orbiter library for the classification of combinatorial objects