Orbiter 2022
Combinatorial Objects
seventytwo_cases.cpp
Go to the documentation of this file.
1/*
2 * seventytwo_cases.cpp
3 *
4 * Created on: Aug 2, 2020
5 * Author: betten
6 */
7
8
9#include "foundations.h"
10
11using namespace std;
12
13
14namespace orbiter {
15namespace layer1_foundations {
16namespace algebraic_geometry {
17
18
20{
21 Surf = NULL;
22
23 f = 0;
24
26 // the tritangent plane picked for the Clebsch map,
27 // using the Schlaefli labeling, in [0,44].
28
29
30 //int three_lines_idx[3];
31 // the index into Lines[] of the
32 // three lines in the chosen tritangent plane
33 // This is computed from the Schlaefli labeling
34 // using the eckardt point class.
35
36 //long int three_lines[3];
37
39
40 //int Basis_pi[16];
41 //int Basis_pi_inv[17]; // in case it is semilinear
42
43 line_idx = 0;
44 // the index of the line chosen to be P1,P2 in three_lines[3]
45
46 m1 = m2 = m3 = 0;
47 // rearrangement of three_lines_idx[3]
48 // m1 = line_idx is the line through P1 and P2.
49 // m2 and m3 are the two other lines.
50
51 l1 = l2 = 0;
52
54
55 //int transversals[5];
56
57 //long int half_double_six[6];
58
60
61 //long int P6[6];
62 // the points of intersection of l1, l2, and of the 4 transversals
63 // with the tritangent plane
64
65 L1 = L2 = 0;
66
67 //long int P6a[6];
68 // the arc after the plane has been moved
69
70 //long int P6_local[6];
71 //long int P6_local_canonical[6];
72
73 //long int P6_perm[6];
74 //long int P6_perm_mapped[6];
75 //long int pair[2];
76 //int the_rest[4];
77
80
82 //int the_partition4[4];
83
84 f2 = 0;
85}
86
88{
89}
90
91void seventytwo_cases::init(surface_domain *Surf, int f, int tritangent_plane_idx,
92 int *three_lines_idx, long int *three_lines,
93 int line_idx, int m1, int m2, int m3, int line_l1_l2_idx, int l1, int l2)
94{
100
102
110}
111
113
124{
125 int f_v = (verbose_level >= 1);
126
127 if (f_v) {
128 cout << "seventytwo_cases::compute_arc" << endl;
129 }
130 int i, j;
131
132 // determine the 5 transversals of lines l1 and l2:
133 int nb_t = 0;
134 int nb;
135 int f_taken[4];
136
137 for (i = 0; i < 27; i++) {
138 if (i == l1 || i == l2) {
139 continue;
140 }
141 if (SO->SOP->Adj_ij(i, l1) && SO->SOP->Adj_ij(i, l2)) {
142 transversals[nb_t++] = i;
143 }
144 }
145 if (nb_t != 5) {
146 cout << "seventytwo_cases::compute_arc nb_t != 5" << endl;
147 exit(1);
148 }
149
150 // one of the transversals must be m1, find it:
151 for (i = 0; i < 5; i++) {
152 if (transversals[i] == m1) {
153 break;
154 }
155 }
156 if (i == 5) {
157 cout << "seventytwo_cases::compute_arc could not find m1 in transversals[]" << endl;
158 exit(1);
159 }
160
161
162 // remove m1 from the list of transversals to form transversals4[4]:
163 for (j = 0; j < i; j++) {
165 }
166 for (j = i + 1; j < 5; j++) {
167 transversals4[j - 1] = transversals[j];
168 }
169 if (f_v) {
170 cout << "seventytwo_cases::compute_arc the four transversals are: ";
172 cout << endl;
173 }
174
175
176 if (f_v) {
177 cout << "seventytwo_cases::compute_arc before compute_half_double_six" << endl;
178 }
179 compute_half_double_six(SO, verbose_level);
180 if (f_v) {
181 cout << "seventytwo_cases::compute_arc after compute_half_double_six" << endl;
182 }
183
184
185
186
187 P6[0] = SO->Surf->P->intersection_of_two_lines(SO->Lines[l1], SO->Lines[m1]);
188 P6[1] = SO->Surf->P->intersection_of_two_lines(SO->Lines[l2], SO->Lines[m1]);
189 nb_t = 4;
190 nb = 2;
191 for (i = 0; i < nb_t; i++) {
192 f_taken[i] = FALSE;
193 }
194 for (i = 0; i < nb_t; i++) {
195 if (f_taken[i]) {
196 continue;
197 }
198 if (SO->SOP->Adj_ij(transversals4[i], m2)) {
199 P6[nb++] = SO->Surf->P->intersection_of_two_lines(
200 SO->Lines[transversals4[i]], SO->Lines[m2]);
201 f_taken[i] = TRUE;
202 }
203 }
204 if (nb != 4) {
205 cout << "seventytwo_cases::compute_arc after intersecting with m2, nb != 4" << endl;
206 exit(1);
207 }
208 for (i = 0; i < nb_t; i++) {
209 if (f_taken[i]) {
210 continue;
211 }
212 if (SO->SOP->Adj_ij(transversals4[i], m3)) {
213 P6[nb++] = SO->Surf->P->intersection_of_two_lines(
214 SO->Lines[transversals4[i]], SO->Lines[m3]);
215 f_taken[i] = TRUE;
216 }
217 }
218 if (nb != 6) {
219 cout << "seventytwo_cases::compute_arc after intersecting with m3, nb != 6" << endl;
220 exit(1);
221 }
222 if (f_v) {
223 cout << "seventytwo_cases::compute_arc P6=";
224 Lint_vec_print(cout, P6, 6);
225 cout << endl;
226 }
227
228 if (f_v) {
229 cout << "seventytwo_cases::compute_arc done" << endl;
230 }
231}
232
234{
235 int f_v = (verbose_level >= 1);
236 int i;
237
238 if (f_v) {
239 cout << "seventytwo_cases::compute_partition" << endl;
240 }
241 for (i = 0; i < 4; i++) {
242 the_rest[i] = P6_perm_mapped[2 + i];
243 }
244 for (i = 0; i < 4; i++) {
245 the_partition4[i] = the_rest[i];
246 if (the_rest[i] > P6_perm_mapped[0]) {
247 the_partition4[i]--;
248 }
249 if (the_rest[i] > P6_perm_mapped[1]) {
250 the_partition4[i]--;
251 }
252 }
253 for (i = 0; i < 4; i++) {
254 if (the_partition4[i] < 0) {
255 cout << "seventytwo_cases::compute_partition the_partition4[i] < 0" << endl;
256 exit(1);
257 }
258 if (the_partition4[i] >= 4) {
259 cout << "seventytwo_cases::compute_partition the_partition4[i] >= 4" << endl;
260 exit(1);
261 }
262 }
263 if (f_v) {
264 cout << "seventytwo_cases::compute_partition done" << endl;
265 }
266}
267
269// needs transversals4[]
270{
271 int f_v = (verbose_level >= 1);
272 int i;
273
274 if (f_v) {
275 cout << "seventytwo_cases::compute_half_double_six" << endl;
276 }
277
280 for (i = 0; i < 4; i++) {
281 half_double_six[2 + i] = transversals4[i];
282 }
284 if (f_v) {
285 cout << "seventytwo_cases::compute_half_double_six done" << endl;
286 }
287}
288
290{
291 cout << "line_idx=" << line_idx << " "
292 "m=(" << m1 << "," << m2 << "," << m3 << ") "
293 "l1=" << l1 << " l2=" << l2 << endl;
294}
295
297{
298 int c;
299
300 c = line_idx * 24 + line_l1_l2_idx;
301 ost << c << " & ";
302 ost << line_idx << " & ";
303 ost << "(" << Surf->Schlaefli->Labels->Line_label_tex[m1]
304 << ", " << Surf->Schlaefli->Labels->Line_label_tex[m2]
305 << ", " << Surf->Schlaefli->Labels->Line_label_tex[m3] << ") & ";
306 ost << "(" << Surf->Schlaefli->Labels->Line_label_tex[l1]
307 << ", " << Surf->Schlaefli->Labels->Line_label_tex[l2] << ") & ";
312 << ") & ";
313 ost << half_double_six_index << " & ";
314 ost << orbit_not_on_conic_idx << " & ";
315 ost << pair_orbit_idx << " & ";
316 ost << partition_orbit_idx << " & ";
317 ost << f2; // << " & ";
318 ost << "\\\\";
319}
320
322{
323 int t = tritangent_plane_idx;
324
325 ost << "{\\renewcommand{\\arraystretch}{1.5}" << endl;
326 ost << "$$" << endl;
327 ost << "\\begin{array}{|c|c|c|c|c|c|c|c|c|c|}" << endl;
328 ost << "\\hline" << endl;
329 ost << "\\multicolumn{10}{|c|}{\\mbox{Tritangent Plane}\\; \\pi_{" << t << "} = \\pi_{" << Surf->Schlaefli->Eckard_point_label_tex[t] << "} \\; \\mbox{Part "<< line_idx << "}}\\\\" << endl;
330 ost << "\\hline" << endl;
331 ost << "\\mbox{Clebsch} & m_1-\\mbox{Case} & (m_1,m_2,m_3) & (\\ell_1',\\ell_2') & (t_3',t_4',t_5',t_6') & HDS & \\mbox{Arc} & \\mbox{Pair} & \\mbox{Part} & \\mbox{Flag-Orb} \\\\" << endl;
332 ost << "\\hline" << endl;
333}
334
336{
337 ost << "\\hline" << endl;
338 ost << "\\end{array}" << endl;
339 ost << "$$}" << endl;
340 ost << "\\bigskip" << endl;
341}
342
343void seventytwo_cases::report_single_Clebsch_map(ostream &ost, int verbose_level)
344{
345 int f_v = (verbose_level >= 1);
346
347 if (f_v) {
348 cout << "surfaces_arc_lifting_definition_node::report_single_Clebsch_map" << endl;
349 }
350
354 if (f_v) {
355 cout << "surfaces_arc_lifting_definition_node::report_single_Clebsch_map done" << endl;
356 }
357}
358
359void seventytwo_cases::report_Clebsch_map_details(ostream &ost, surface_object *SO, int verbose_level)
360{
361 int f_v = (verbose_level >= 1);
362 long int *H;
363 int i;
364
365 if (f_v) {
366 cout << "surfaces_arc_lifting_definition_node::report_Clebsch_map_details" << endl;
367 }
368
369 ost << "\\bigskip" << endl << endl;
370
371 ost << "$\\ell_1=" << Surf->Schlaefli->Labels->Line_label_tex[l1] << " = " << SO->Lines[l1] << " = ";
373 ost << "$\\\\" << endl;
374
375 ost << "$\\ell_2=" << Surf->Schlaefli->Labels->Line_label_tex[l2] << " = " << SO->Lines[l2] << " = ";
377 ost << "$\\\\" << endl;
378
380
381 ost << "$m_1=" << Surf->Schlaefli->Labels->Line_label_tex[m1] << " = " << SO->Lines[m1] << " = ";
383 ost << "$\\\\" << endl;
384
385 ost << "$m_2=" << Surf->Schlaefli->Labels->Line_label_tex[m2] << " = " << SO->Lines[m2] << " = ";
387 ost << "$\\\\" << endl;
388
389 ost << "$m_3=" << Surf->Schlaefli->Labels->Line_label_tex[m3] << " = " << SO->Lines[m3] << " = ";
391 ost << "$\\\\" << endl;
392
393
394 ost << "\\bigskip" << endl << endl;
395
396 ost << "The associated half double six " << half_double_six_index << " is: $";
398 for (i = 0; i < 6; i++) {
399 ost << Surf->Schlaefli->Labels->Line_label_tex[H[i]];
400 if (i < 6 - 1) {
401 ost << ", ";
402 }
403 }
404 ost << "$\\\\" << endl;
405 for (i = 0; i < 6; i++) {
406 ost << "$";
407 ost << Surf->Schlaefli->Labels->Line_label_tex[H[i]];
408 ost << " = " << SO->Lines[H[i]] << " = ";
410 ost << "$\\\\" << endl;
411 }
412
413 //ost << "\\bigskip" << endl << endl;
414
415 ost << "P6, P6 * Alpha1, P6 * Alpha1 local, P6 * Alpha1 * Alpha2:\\\\" << endl;
416 ost << "{\\renewcommand*{\\arraystretch}{1.5}" << endl;
417 ost << "$$" << endl;
419 ost << "\\;" << endl;
421 ost << "\\;" << endl;
423 ost << "\\;" << endl;
425 ost << "$$}" << endl;
426
427
428 //ost << "\\bigskip" << endl << endl;
429
430 ost << "$\\ell_1\\tau=";
431 ost << L1 << " = ";
433 ost << "$\\\\" << endl;
434 ost << "$\\ell_2\\tau=";
435 ost << L2 << " = ";
437 ost << "$\\\\" << endl;
438
439 //ost << "\\bigskip" << endl << endl;
440
441 if (f_v) {
442 cout << "surfaces_arc_lifting_definition_node::report_Clebsch_map_details" << endl;
443 }
444}
445
446void seventytwo_cases::report_Clebsch_map_aut_coset(ostream &ost, int coset, int relative_order, int verbose_level)
447{
448 int f_v = (verbose_level >= 1);
449 long int *H;
450 int i;
451 int ds;
452
453 if (f_v) {
454 cout << "surfaces_arc_lifting_definition_node::report_Clebsch_map_aut_coset" << endl;
455 }
456 int c;
457
458 ds = half_double_six_index >> 1;
459 c = line_idx * 24 + line_l1_l2_idx;
460 ost << coset << " & ";
461 ost << c << " & ";
462 //ost << line_idx << " & ";
463 ost << "(" << Surf->Schlaefli->Labels->Line_label_tex[m1]
464 << ", " << Surf->Schlaefli->Labels->Line_label_tex[m2]
465 << ", " << Surf->Schlaefli->Labels->Line_label_tex[m3] << ") & ";
466 ost << "(" << Surf->Schlaefli->Labels->Line_label_tex[l1]
467 << ", " << Surf->Schlaefli->Labels->Line_label_tex[l2] << ") & ";
472 << ") & ";
473 ost << Surf->Schlaefli->Double_six_label_tex[ds] << " & ";
475 for (i = 0; i < 6; i++) {
476 ost << Surf->Schlaefli->Labels->Line_label_tex[H[i]];
477 if (i < 6 - 1) {
478 ost << ", ";
479 }
480 }
481 ost << " & " << relative_order;
482 ost << "\\\\" << endl;
483
484
485 //ost << half_double_six_index << " & ";
486 //ost << orbit_not_on_conic_idx << " & ";
487 //ost << pair_orbit_idx << " & ";
488 //ost << partition_orbit_idx << " & ";
489 //ost << f2; // << " & ";
490
491 if (f_v) {
492 cout << "surfaces_arc_lifting_definition_node::report_Clebsch_map_aut_coset done" << endl;
493 }
494}
495
496
497
498
499}}}
500
501
502
503
int third_line_in_tritangent_plane(int l1, int l2, int verbose_level)
Definition: schlaefli.cpp:657
void compute_half_double_six(surface_object *SO, int verbose_level)
void init(surface_domain *Surf, int f, int tritangent_plane_idx, int *three_lines_idx, long int *three_lines, int line_idx, int m1, int m2, int m3, int line_l1_l2_idx, int l1, int l2)
void compute_arc(surface_object *SO, int verbose_level)
Computes the six base points in a tritangent plane associated with the Clebsch map defined by two ske...
void report_single_Clebsch_map(std::ostream &ost, int verbose_level)
void report_Clebsch_map_details(std::ostream &ost, surface_object *SO, int verbose_level)
void report_Clebsch_map_aut_coset(std::ostream &ost, int coset, int relative_order, int verbose_level)
a particular cubic surface in PG(3,q), given by its equation
void display_table_of_projective_points_easy(std::ostream &ost, long int *Pts, int nb_pts, int len)
void print_single_generator_matrix_tex(std::ostream &ost, long int a)
Definition: grassmann.cpp:122
#define Lint_vec_copy(A, B, C)
Definition: foundations.h:694
#define Lint_vec_print(A, B, C)
Definition: foundations.h:686
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define Int_vec_copy(A, B, C)
Definition: foundations.h:693
the orbiter library for the classification of combinatorial objects