Orbiter 2022
Combinatorial Objects
orthogonal.h
Go to the documentation of this file.
1/*
2 * orthogonal.h
3 *
4 * Created on: Dec 8, 2020
5 * Author: betten
6 */
7
8#ifndef SRC_LIB_FOUNDATIONS_ORTHOGONAL_ORTHOGONA_H_
9#define SRC_LIB_FOUNDATIONS_ORTHOGONAL_ORTHOGONA_H_
10
11namespace orbiter {
12namespace layer1_foundations {
13namespace orthogonal_geometry {
14
15
16// #############################################################################
17// blt_set_domain.cpp
18// #############################################################################
19
21
22
23
25
26public:
28 int f_semilinear; // from the command line
29 int epsilon; // the type of the quadric (0, 1 or -1)
30 int n; // algebraic dimension
31 int q; // field order
33 int degree; // number of points on the quadric
34
35 std::string prefix; // "BLT_q%d"
36
39
40
41 int *Pts; // [target_size * n]
42 int *Candidates; // [degree * n]
43
46
49 void null();
50 void freeself();
51 void init(orthogonal *O,
52 int verbose_level);
53 void compute_adjacency_list_fast(int first_point_of_starter,
54 long int *points, int nb_points, int *point_color,
56 int verbose_level);
57 void compute_colors(int orbit_at_level,
58 long int *starter, int starter_sz,
59 long int special_line,
60 long int *candidates, int nb_candidates,
61 int *&point_color, int &nb_colors,
62 int verbose_level);
63 void early_test_func(long int *S, int len,
64 long int *candidates, int nb_candidates,
65 long int *good_candidates, int &nb_good_candidates,
66 int verbose_level);
67 int pair_test(int a, int x, int y, int verbose_level);
68 int check_conditions(int len, long int *S, int verbose_level);
69 int collinearity_test(long int *S, int len, int verbose_level);
70 void print(std::ostream &ost, long int *S, int len);
71 void find_free_points(long int *S, int S_sz,
72 long int *&free_pts, int *&free_pt_idx, int &nb_free_pts,
73 int verbose_level);
74 int create_graph(
75 int case_number, int nb_cases_total,
76 long int *Starter_set, int starter_size,
77 long int *candidates, int nb_candidates,
78 int f_eliminate_graphs_if_possible,
80 int verbose_level);
81};
82
83
84// #############################################################################
85// blt_set_invariants.cpp
86// #############################################################################
87
89
90
91
93
94public:
95
97
98 int set_size; // = D->q + 1
99 long int *the_set_in_orthogonal; // [set_size]
100 long int *the_set_in_PG; // [set_size]
101
106
110
113
116
119 void null();
120 void freeself();
121 void init(blt_set_domain *D, long int *the_set,
122 int verbose_level);
123 void compute(int verbose_level);
124 void latex(std::ostream &ost, int verbose_level);
125};
126
127
128// #############################################################################
129// orthogonal_indexing.cpp
130// #############################################################################
131
133
134
136
137public:
141 void init(field_theory::finite_field *F, int verbose_level);
142 void Q_epsilon_unrank(
143 int *v, int stride, int epsilon, int k,
144 int c1, int c2, int c3, long int a, int verbose_level);
145 long int Q_epsilon_rank(
146 int *v, int stride, int epsilon, int k,
147 int c1, int c2, int c3, int verbose_level);
148 //void init_hash_table_parabolic(int k, int verbose_level);
149 void Q_unrank(int *v, int stride, int k, long int a, int verbose_level);
150 long int Q_rank(int *v, int stride, int k, int verbose_level);
151 void Q_unrank_directly(int *v, int stride, int k, long int a, int verbose_level);
152 // parabolic quadric
153 // k = projective dimension, must be even
154 long int Q_rank_directly(int *v, int stride, int k, int verbose_level);
155 void Qplus_unrank(int *v, int stride, int k, long int a, int verbose_level);
156 // hyperbolic quadric
157 // k = projective dimension, must be odd
158 long int Qplus_rank(int *v, int stride, int k, int verbose_level);
159 void Qminus_unrank(int *v,
160 int stride, int k, long int a,
161 int c1, int c2, int c3, int verbose_level);
162 // elliptic quadric
163 // k = projective dimension, must be odd
164 // the form is
165 // \sum_{i=0}^n x_{2i}x_{2i+1} + c1 x_{2n}^2 +
166 // c2 x_{2n} x_{2n+1} + c3 x_{2n+1}^2
167 long int Qminus_rank(int *v, int stride,
168 int k, int c1, int c2, int c3, int verbose_level);
169 void S_unrank(int *v, int stride, int n, long int a);
170 void S_rank(int *v, int stride, int n, long int &a);
171 void N_unrank(int *v, int stride, int n, long int a);
172 void N_rank(int *v, int stride, int n, long int &a);
173 void N1_unrank(int *v, int stride, int n, long int a);
174 void N1_rank(int *v, int stride, int n, long int &a);
175 void Sbar_unrank(int *v, int stride, int n, long int a, int verbose_level);
176 void Sbar_rank(int *v, int stride, int n, long int &a, int verbose_level);
177 void Nbar_unrank(int *v, int stride, int n, long int a);
178 void Nbar_rank(int *v, int stride, int n, long int &a);
179
180};
181
182
183
184// #############################################################################
185// orthogonal.cpp
186// #############################################################################
187
189
190
192
193public:
195 int n; // the algebraic dimension
196 int m; // Witt index
197 int q;
200
201 std::string label_txt;
202 std::string label_tex;
203
207
208
210 int *T1, *T2, *T3; // [n * n]
211 long int pt_P, pt_Q;
212 long int nb_points;
213 long int nb_lines;
214
215 long int T1_m;
216 long int T1_mm1;
217 long int T1_mm2;
218 long int T2_m;
219 long int T2_mm1;
220 long int T2_mm2;
221 long int N1_m;
222 long int N1_mm1;
223 long int N1_mm2;
224 long int S_m;
225 long int S_mm1;
226 long int S_mm2;
227 long int Sbar_m;
228 long int Sbar_mm1;
229 long int Sbar_mm2;
230
231 long int alpha; // number of points in the subspace
232 long int beta; // number of points in the subspace of the subspace
233 long int gamma; // = alpha * beta / (q + 1);
236
238 long int *A, *B, *P, *L;
239
240 // for hyperbolic:
241 long int p1, p2, p3, p4, p5, p6;
242 long int l1, l2, l3, l4, l5, l6, l7;
243 long int a11, a12, a22, a23, a26, a32, a34, a37;
244 long int a41, a43, a44, a45, a46, a47, a56, a67;
245 long int b11, b12, b22, b23, b26, b32, b34, b37;
246 long int b41, b43, b44, b45, b46, b47, b56, b67;
247
248
249
250 // additionally, for parabolic:
251 long int p7, l8;
252 long int a21, a36, a57, a22a, a33, a22b;
253 long int a32b, a42b, a51, a53, a54, a55, a66, a77;
254 long int b21, b36, b57, b22a, b33, b22b;
255 long int b32b, b42b, b51, b53, b54, b55, b66, b77;
256 long int a12b, a52a;
257 long int b12b, b52a;
258 long int delta, omega, lambda, mu, nu, zeta;
259 // parabolic q odd requires square / nonsquare tables
260 int *minus_squares; // [(q-1)/2]
261 int *minus_squares_without; // [(q-1)/2 - 1]
262 int *minus_nonsquares; // [(q-1)/2]
263 int *f_is_minus_square; // [q]
267
268 int *v1, *v2, *v3, *v4, *v5, *v_tmp;
269 int *v_tmp2; // for use in parabolic_type_and_index_to_point_rk
271
274
275 // stuff for rank_point
277
278 // stuff for Siegel_transformation
279 int *Sv1, *Sv2, *Sv3, *Sv4;
280 int *Gram2;
281 int *ST_N1, *ST_N2, *ST_w;
283
284 // for determine_line
286
287 // for lines_on_point
288 int *lines_on_point_coords1; // [alpha * n]
289 int *lines_on_point_coords2; // [alpha * n]
290
292
293 // for perp:
294 long int *line_pencil; // [nb_lines]
295 long int *Perp1; // [alpha * (q + 1)]
296
297
298 orthogonal();
299 ~orthogonal();
300 void init(int epsilon, int n, field_theory::finite_field *F,
301 int verbose_level);
302 void allocate();
303 void init_form_and_Gram_matrix(int verbose_level);
304 void init_counting_functions(int verbose_level);
305 void init_decomposition(int verbose_level);
306 void init_parabolic(int verbose_level);
307 void init_parabolic_even(int verbose_level);
308 void init_parabolic_odd(int verbose_level);
309 void init_hyperbolic(int verbose_level);
310 void fill(long int *M, int i, int j, long int a);
311 int evaluate_quadratic_form(int *v, int stride);
312 int evaluate_bilinear_form(int *u, int *v, int stride);
313 int evaluate_bilinear_form_by_rank(int i, int j);
314 void points_on_line_by_line_rank(long int line_rk,
315 long int *line, int verbose_level);
316 void points_on_line(long int pi, long int pj,
317 long int *line, int verbose_level);
318 void points_on_line_by_coordinates(long int pi, long int pj,
319 int *pt_coords, int verbose_level);
320 void lines_on_point(long int pt,
321 long int *line_pencil_point_ranks, int verbose_level);
323 int *line_pencil_line_ranks, int verbose_level);
324 void lines_on_point_by_line_rank(long int pt,
325 long int *line_pencil_line_ranks, int verbose_level);
327 int verbose_level);
328 void point_to_line_map(int size,
329 long int *point_ranks, int *&line_vector,
330 int verbose_level);
331 int test_if_minimal_on_line(int *v1, int *v2, int *v3);
332 void find_minimal_point_on_line(int *v1, int *v2, int *v3);
333 void zero_vector(int *u, int stride, int len);
334 int is_zero_vector(int *u, int stride, int len);
335 void change_form_value(int *u, int stride, int m, int multiplier);
336 void scalar_multiply_vector(int *u, int stride, int len, int multiplier);
337 int last_non_zero_entry(int *u, int stride, int len);
338 void normalize_point(int *v, int stride);
339 int is_ending_dependent(int *vec1, int *vec2);
340 void Gauss_step(int *v1, int *v2, int len, int idx);
341 // afterwards: v2[idx] = 0 and v2,v1
342 // span the same space as before
343 void perp(long int pt, long int *Perp_without_pt, int &sz,
344 int verbose_level);
345 void perp_of_two_points(long int pt1, long int pt2, long int *Perp,
346 int &sz, int verbose_level);
347 void perp_of_k_points(long int *pts, int nb_pts, long int *&Perp,
348 int &sz, int verbose_level);
349
350
351 // orthogonal_blt.cpp:
352 void create_FTWKB_BLT_set(long int *set, int *ABC, int verbose_level);
353 void create_K1_BLT_set(long int *set, int *ABC, int verbose_level);
354 void create_K2_BLT_set(long int *set, int *ABC, int verbose_level);
355 void create_LP_37_72_BLT_set(long int *set, int verbose_level);
356 void create_LP_37_4a_BLT_set(long int *set, int verbose_level);
357 void create_LP_37_4b_BLT_set(long int *set, int verbose_level);
358 void create_Law_71_BLT_set(long int *set, int verbose_level);
359 int BLT_test_full(int size, long int *set, int verbose_level);
360 int BLT_test(int size, long int *set, int verbose_level);
361 int triple_is_collinear(long int pt1, long int pt2, long int pt3);
362 int collinearity_test(int size, long int *set, int verbose_level);
364 int size, int *set,
365 int &nb_planes, int *&intersection_matrix,
366 int &Block_size, int *&Blocks,
367 int verbose_level);
368 int is_minus_square(int i);
370
371
372
373 // orthogonal_group.cpp:
374 long int find_root(long int rk2, int verbose_level);
376 long int rk_from, long int rk_to, long int root, int verbose_level);
378 long int rk_from, long int rk_to, long int root,
379 int m, int verbose_level);
380 void Siegel_Transformation(int *T,
381 long int rk_from, long int rk_to, long int root,
382 int verbose_level);
383 // root is not perp to from and to.
384 void Siegel_Transformation2(int *T,
385 long int rk_from, long int rk_to, long int root,
386 int *B, int *Bv, int *w, int *z, int *x,
387 int verbose_level);
388 void Siegel_Transformation3(int *T,
389 int *from, int *to, int *root,
390 int *B, int *Bv, int *w, int *z, int *x,
391 int verbose_level);
393 int f_action_is_semilinear,
394 int f_siegel,
395 int f_reflection,
396 int f_similarity,
397 int f_semisimilarity,
398 int *Mtx, int verbose_level);
400 int verbose_level);
401 // Only makes a n x n matrix.
402 // Does not put a semilinear component.
403 void create_random_semisimilarity(int *Mtx, int verbose_level);
404 void create_random_similarity(int *Mtx, int verbose_level);
405 // Only makes a d x d matrix.
406 // Does not put a semilinear component.
408 int verbose_level);
409 // Only makes a d x d matrix.
410 // Does not put a semilinear component.
411 void make_orthogonal_reflection(int *M, int *z,
412 int verbose_level);
413 void make_Siegel_Transformation(int *M, int *v, int *u,
414 int n, int *Gram, int verbose_level);
415 // if u is singular and v \in \la u \ra^\perp, then
416 // \pho_{u,v}(x) :=
417 // x + \beta(x,v) u - \beta(x,u) v - Q(v) \beta(x,u) u
418 // is called the Siegel transform (see Taylor p. 148)
419 // Here Q is the quadratic form and
420 // \beta is the corresponding bilinear form
421 void Siegel_move_forward_by_index(long int rk1, long int rk2,
422 int *v, int *w, int verbose_level);
423 void Siegel_move_backward_by_index(long int rk1, long int rk2,
424 int *w, int *v, int verbose_level);
425 void Siegel_move_forward(int *v1, int *v2, int *v3, int *v4,
426 int verbose_level);
427 void Siegel_move_backward(int *v1, int *v2, int *v3, int *v4,
428 int verbose_level);
430 long int pt_from, long int pt_to,
431 int nb, long int *ranks, int verbose_level);
432 void move_points_by_ranks(long int pt_from, long int pt_to,
433 int nb, long int *input_ranks, long int *output_ranks,
434 int verbose_level);
435 void move_points(long int pt_from, long int pt_to,
436 int nb, int *input_coords, int *output_coords,
437 int verbose_level);
438 void test_Siegel(int index, int verbose_level);
439
440
441
442 // orthogonal_hyperbolic.cpp:
443 long int hyperbolic_type_and_index_to_point_rk(long int type,
444 long int index, int verbose_level);
446 long int &type, long int &index);
447
448 void hyperbolic_unrank_line(long int &p1, long int &p2,
449 long int rk, int verbose_level);
450 long int hyperbolic_rank_line(long int p1, long int p2, int verbose_level);
451
452 void unrank_line_L1(long int &p1, long int &p2, long int index, int verbose_level);
453 long int rank_line_L1(long int p1, long int p2, int verbose_level);
454 void unrank_line_L2(long int &p1, long int &p2, long int index, int verbose_level);
455 long int rank_line_L2(long int p1, long int p2, int verbose_level);
456 void unrank_line_L3(long int &p1, long int &p2, long int index, int verbose_level);
457 long int rank_line_L3(long int p1, long int p2, int verbose_level);
458 void unrank_line_L4(long int &p1, long int &p2, long int index, int verbose_level);
459 long int rank_line_L4(long int p1, long int p2, int verbose_level);
460 void unrank_line_L5(long int &p1, long int &p2, long int index, int verbose_level);
461 long int rank_line_L5(long int p1, long int p2, int verbose_level);
462 void unrank_line_L6(long int &p1, long int &p2, long int index, int verbose_level);
463 long int rank_line_L6(long int p1, long int p2, int verbose_level);
464 void unrank_line_L7(long int &p1, long int &p2, long int index, int verbose_level);
465 long int rank_line_L7(long int p1, long int p2, int verbose_level);
466
467 void hyperbolic_canonical_points_of_line(int line_type,
468 long int pt1, long int pt2, long int &cpt1, long int &cpt2,
469 int verbose_level);
470
471 void canonical_points_L1(long int pt1, long int pt2, long int &cpt1, long int &cpt2);
472 void canonical_points_L2(long int pt1, long int pt2, long int &cpt1, long int &cpt2);
473 void canonical_points_L3(long int pt1, long int pt2, long int &cpt1, long int &cpt2);
474 void canonical_points_L4(long int pt1, long int pt2, long int &cpt1, long int &cpt2);
475 void canonical_points_L5(long int pt1, long int pt2, long int &cpt1, long int &cpt2);
476 void canonical_points_L6(long int pt1, long int pt2, long int &cpt1, long int &cpt2);
477 void canonical_points_L7(long int pt1, long int pt2, long int &cpt1, long int &cpt2);
478 int hyperbolic_line_type_given_point_types(long int pt1, long int pt2,
479 int pt1_type, int pt2_type);
480 int hyperbolic_decide_P1(long int pt1, long int pt2);
481 int hyperbolic_decide_P2(long int pt1, long int pt2);
482 int hyperbolic_decide_P3(long int pt1, long int pt2);
483 int find_root_hyperbolic(long int rk2, int m, int verbose_level);
484 // m = Witt index
485 void find_root_hyperbolic_xyz(long int rk2, int m,
486 int *x, int *y, int *z, int verbose_level);
488 int stride, int m);
489 int evaluate_hyperbolic_bilinear_form(int *u, int *v,
490 int stride, int m);
491
492
493 // orthogonal_io.cpp:
494 void list_points_by_type(int verbose_level);
495 void report_points_by_type(std::ostream &ost, int verbose_level);
496 void list_points_of_given_type(int t,
497 int verbose_level);
498 void report_points_of_given_type(std::ostream &ost, int t, int verbose_level);
499 void report_points(std::ostream &ost, int verbose_level);
500 void report_lines(std::ostream &ost, int verbose_level);
501 void list_all_points_vs_points(int verbose_level);
502 void list_points_vs_points(int t1, int t2,
503 int verbose_level);
504 void print_schemes();
505 void report_quadratic_form(std::ostream &ost, int verbose_level);
506 void report(std::ostream &ost, int verbose_level);
507 void report_schemes(std::ostream &ost, int verbose_level);
508 void report_schemes_easy(std::ostream &ost);
509 void create_latex_report(int verbose_level);
510 void export_incidence_matrix_to_csv(int verbose_level);
511 void make_fname_incidence_matrix_csv(std::string &fname);
512
513 // orthogonal_parabolic.cpp:
515 int index, int verbose_level);
517 int index, int verbose_level);
518 void parabolic_even_type1_index_to_point(int index, int *v);
519 void parabolic_even_type2_index_to_point(int index, int *v);
520 long int parabolic_odd_type_and_index_to_point_rk(long int type,
521 long int index, int verbose_level);
522 void parabolic_odd_type1_index_to_point(long int index,
523 int *v, int verbose_level);
524 void parabolic_odd_type2_index_to_point(long int index,
525 int *v, int verbose_level);
527 long int &type, long int &index, int verbose_level);
529 long int &type, long int &index, int verbose_level);
531 long int &type, long int &index, int verbose_level);
533 long int &type, long int &index, int verbose_level);
535 long int &type, long int &index, int verbose_level);
536
537 void parabolic_neighbor51_odd_unrank(long int index,
538 int *v, int verbose_level);
539 long int parabolic_neighbor51_odd_rank(int *v,
540 int verbose_level);
541 void parabolic_neighbor52_odd_unrank(long int index,
542 int *v, int verbose_level);
543 long int parabolic_neighbor52_odd_rank(int *v,
544 int verbose_level);
545 void parabolic_neighbor52_even_unrank(long int index,
546 int *v, int verbose_level);
547 long int parabolic_neighbor52_even_rank(int *v,
548 int verbose_level);
549 void parabolic_neighbor34_unrank(long int index,
550 int *v, int verbose_level);
551 long int parabolic_neighbor34_rank(int *v,
552 int verbose_level);
553 void parabolic_neighbor53_unrank(long int index,
554 int *v, int verbose_level);
555 long int parabolic_neighbor53_rank(int *v,
556 int verbose_level);
557 void parabolic_neighbor54_unrank(long int index,
558 int *v, int verbose_level);
559 long int parabolic_neighbor54_rank(int *v, int verbose_level);
560
561
562 void parabolic_unrank_line(long int &p1, long int &p2,
563 long int rk, int verbose_level);
564 long int parabolic_rank_line(long int p1, long int p2, int verbose_level);
565 void parabolic_unrank_line_L1_even(long int &p1, long int &p2,
566 long int index, int verbose_level);
567 long int parabolic_rank_line_L1_even(long int p1, long int p2,
568 int verbose_level);
569 void parabolic_unrank_line_L1_odd(long int &p1, long int &p2,
570 long int index, int verbose_level);
571 long int parabolic_rank_line_L1_odd(long int p1, long int p2,
572 int verbose_level);
573 void parabolic_unrank_line_L2_even(long int &p1, long int &p2,
574 long int index, int verbose_level);
575 void parabolic_unrank_line_L2_odd(long int &p1, long int &p2,
576 long int index, int verbose_level);
577 int parabolic_rank_line_L2_even(long int p1, long int p2,
578 int verbose_level);
579 long int parabolic_rank_line_L2_odd(long int p1, long int p2,
580 int verbose_level);
581 void parabolic_unrank_line_L3(long int &p1, long int &p2,
582 long int index, int verbose_level);
583 long int parabolic_rank_line_L3(long int p1, long int p2, int verbose_level);
584 void parabolic_unrank_line_L4(long int &p1, long int &p2,
585 long int index, int verbose_level);
586 long int parabolic_rank_line_L4(long int p1, long int p2, int verbose_level);
587 void parabolic_unrank_line_L5(long int &p1, long int &p2,
588 long int index, int verbose_level);
589 long int parabolic_rank_line_L5(long int p1, long int p2, int verbose_level);
590 void parabolic_unrank_line_L6(long int &p1, long int &p2,
591 long int index, int verbose_level);
592 long int parabolic_rank_line_L6(long int p1, long int p2,
593 int verbose_level);
594 void parabolic_unrank_line_L7(long int &p1, long int &p2,
595 long int index, int verbose_level);
596 long int parabolic_rank_line_L7(long int p1, long int p2,
597 int verbose_level);
598 void parabolic_unrank_line_L8(long int &p1, long int &p2,
599 long int index, int verbose_level);
600 long int parabolic_rank_line_L8(long int p1, long int p2,
601 int verbose_level);
602 long int parabolic_line_type_given_point_types(long int pt1, long int pt2,
603 long int pt1_type, long int pt2_type, int verbose_level);
604 int parabolic_decide_P11_odd(long int pt1, long int pt2);
605 int parabolic_decide_P22_even(long int pt1, long int pt2);
606 int parabolic_decide_P22_odd(long int pt1, long int pt2);
607 int parabolic_decide_P33(long int pt1, long int pt2);
608 int parabolic_decide_P35(long int pt1, long int pt2);
609 int parabolic_decide_P45(long int pt1, long int pt2);
610 int parabolic_decide_P44(long int pt1, long int pt2);
611 void find_root_parabolic_xyz(long int rk2,
612 int *x, int *y, int *z, int verbose_level);
613 long int find_root_parabolic(long int rk2, int verbose_level);
615 int line_type, long int pt1, long int pt2,
616 long int &cpt1, long int &cpt2, int verbose_level);
618 long int pt1, long int pt2, long int &cpt1, long int &cpt2);
620 long int pt1, long int pt2, long int &cpt1, long int &cpt2);
622 long int pt1, long int pt2, long int &cpt1, long int &cpt2);
624 long int pt1, long int pt2, long int &cpt1, long int &cpt2);
626 long int pt1, long int pt2, long int &cpt1, long int &cpt2);
628 int *u, int *v, int stride, int m);
629 void parabolic_point_normalize(int *v, int stride, int n);
630 void parabolic_normalize_point_wrt_subspace(int *v, int stride);
631 void parabolic_point_properties(int *v, int stride, int n,
632 int &f_start_with_one, int &value_middle, int &value_end,
633 int verbose_level);
634 int parabolic_is_middle_dependent(int *vec1, int *vec2);
635
636
637
638 // orthogonal_rank_unrank.cpp
639 void unrank_point(int *v,
640 int stride, long int rk, int verbose_level);
641 long int rank_point(int *v, int stride, int verbose_level);
642 void unrank_line(long int &p1, long int &p2,
643 long int index, int verbose_level);
644 long int rank_line(long int p1, long int p2, int verbose_level);
645 int line_type_given_point_types(long int pt1, long int pt2,
646 long int pt1_type, long int pt2_type);
647 long int type_and_index_to_point_rk(long int type,
648 long int index, int verbose_level);
649 void point_rk_to_type_and_index(long int rk,
650 long int &type, long int &index, int verbose_level);
651 void canonical_points_of_line(int line_type, long int pt1, long int pt2,
652 long int &cpt1, long int &cpt2, int verbose_level);
653 void unrank_S(int *v, int stride, int m, int rk);
654 long int rank_S(int *v, int stride, int m);
655 void unrank_N(int *v, int stride, int m, long int rk);
656 long int rank_N(int *v, int stride, int m);
657 void unrank_N1(int *v, int stride, int m, long int rk);
658 long int rank_N1(int *v, int stride, int m);
659 void unrank_Sbar(int *v, int stride, int m, long int rk);
660 long int rank_Sbar(int *v, int stride, int m);
661 void unrank_Nbar(int *v, int stride, int m, long int rk);
662 long int rank_Nbar(int *v, int stride, int m);
663
664
665
666};
667
668
669// #############################################################################
670// unusual.cpp
671// #############################################################################
672
674
675
677public:
680 int q;
681 int Q;
682 int alpha;
685
687 int *form_i;
688 int *form_j;
690 int *Gram;
691
696 int *r_Gram;
697
703
706 int basis[4 * 4];
707 int basis_subspace[2 * 2];
708 int *M;
709
713 // data computed by F.subfield_embedding_2dimensional
714
718 int verbose_level);
719 void setup2(
721 int f_sum_of_squares, int verbose_level);
722 void convert_to_ranks(int n, int *unusual_coordinates,
723 long int *ranks, int verbose_level);
724 void convert_from_ranks(int n, long int *ranks,
725 int *unusual_coordinates, int verbose_level);
726 long int convert_to_rank(int *unusual_coordinates, int verbose_level);
727 void convert_from_rank(long int rank, int *unusual_coordinates,
728 int verbose_level);
729 void convert_to_usual(int n, int *unusual_coordinates,
730 int *usual_coordinates, int verbose_level);
731 void create_Fisher_BLT_set(long int *Fisher_BLT, int *ABC, int verbose_level);
732 void convert_from_usual(int n, int *usual_coordinates,
733 int *unusual_coordinates, int verbose_level);
734 void create_Linear_BLT_set(long int *BLT, int *ABC, int verbose_level);
735 void create_Mondello_BLT_set(long int *BLT, int *ABC, int verbose_level);
736 int N2(int a);
737 int T2(int a);
738 int quadratic_form(int a, int b, int c, int verbose_level);
739 int bilinear_form(int a1, int b1, int c1, int a2, int b2, int c2,
740 int verbose_level);
741 void print_coordinates_detailed_set(long int *set, int len);
742 void print_coordinates_detailed(long int pt, int cnt);
743 int build_candidate_set(orthogonal &O, int q,
744 int gamma, int delta, int m, long int *Set,
745 int f_second_half, int verbose_level);
747 int gamma, int delta, int offset, int m, long int *Set,
748 int f_second_half, int verbose_level);
750 int gamma, int delta, int offset, int m, long int *Set,
751 int f_second_half, int f_test, int verbose_level);
752 int create_orbit_of_psi(orthogonal &O, int q,
753 int gamma, int delta, int m, long int *Set,
754 int f_test, int verbose_level);
756 int *M4, int *M5, int verbose_level);
758 int *M5, int *M4, int verbose_level);
759
760 void parse_4by4_matrix(int *M4,
761 int &a, int &b, int &c, int &d,
762 int &f_semi1, int &f_semi2, int &f_semi3, int &f_semi4);
763 void create_4by4_matrix(int *M4,
764 int a, int b, int c, int d,
765 int f_semi1, int f_semi2, int f_semi3, int f_semi4,
766 int verbose_level);
767 void print_2x2(int *v, int *f_semi);
768 void print_M5(orthogonal *O, int *M5);
769};
770
771
772
773
774}}}
775
776
777
778
779#endif /* SRC_LIB_FOUNDATIONS_ORTHOGONAL_ORTHOGONA_H_ */
compact storage of 0/1-data as bitvectors
data structure for set partitions following Jeffrey Leon
decomposition of an incidence matrix
Definition: geometry.h:400
to rank and unrank subspaces of a fixed dimension in F_q^n
Definition: geometry.h:892
projective space PG(n,q) of dimension n over Fq
Definition: geometry.h:1916
int pair_test(int a, int x, int y, int verbose_level)
void early_test_func(long int *S, int len, long int *candidates, int nb_candidates, long int *good_candidates, int &nb_good_candidates, int verbose_level)
int collinearity_test(long int *S, int len, int verbose_level)
void compute_adjacency_list_fast(int first_point_of_starter, long int *points, int nb_points, int *point_color, data_structures::bitvector *&Bitvec, int verbose_level)
void find_free_points(long int *S, int S_sz, long int *&free_pts, int *&free_pt_idx, int &nb_free_pts, int verbose_level)
void compute_colors(int orbit_at_level, long int *starter, int starter_sz, long int special_line, long int *candidates, int nb_candidates, int *&point_color, int &nb_colors, int verbose_level)
void print(std::ostream &ost, long int *S, int len)
int create_graph(int case_number, int nb_cases_total, long int *Starter_set, int starter_size, long int *candidates, int nb_candidates, int f_eliminate_graphs_if_possible, graph_theory::colored_graph *&CG, int verbose_level)
int check_conditions(int len, long int *S, int verbose_level)
void init(blt_set_domain *D, long int *the_set, int verbose_level)
indexing of points in an orthogonal geometry O^epsilon(n,q)
Definition: orthogonal.h:135
long int Q_rank_directly(int *v, int stride, int k, int verbose_level)
void Q_epsilon_unrank(int *v, int stride, int epsilon, int k, int c1, int c2, int c3, long int a, int verbose_level)
void Sbar_rank(int *v, int stride, int n, long int &a, int verbose_level)
void Q_unrank(int *v, int stride, int k, long int a, int verbose_level)
long int Qplus_rank(int *v, int stride, int k, int verbose_level)
void init(field_theory::finite_field *F, int verbose_level)
long int Q_epsilon_rank(int *v, int stride, int epsilon, int k, int c1, int c2, int c3, int verbose_level)
void Qminus_unrank(int *v, int stride, int k, long int a, int c1, int c2, int c3, int verbose_level)
void Qplus_unrank(int *v, int stride, int k, long int a, int verbose_level)
long int Qminus_rank(int *v, int stride, int k, int c1, int c2, int c3, int verbose_level)
long int Q_rank(int *v, int stride, int k, int verbose_level)
void Sbar_unrank(int *v, int stride, int n, long int a, int verbose_level)
void Q_unrank_directly(int *v, int stride, int k, long int a, int verbose_level)
void parabolic_neighbor54_unrank(long int index, int *v, int verbose_level)
long int rank_line_L7(long int p1, long int p2, int verbose_level)
long int parabolic_rank_line_L1_even(long int p1, long int p2, int verbose_level)
long int rank_point(int *v, int stride, int verbose_level)
void parabolic_odd_type2_index_to_point(long int index, int *v, int verbose_level)
void points_on_line_by_line_rank(long int line_rk, long int *line, int verbose_level)
void parabolic_unrank_line(long int &p1, long int &p2, long int rk, int verbose_level)
void report_schemes(std::ostream &ost, int verbose_level)
void parabolic_canonical_points_L8(long int pt1, long int pt2, long int &cpt1, long int &cpt2)
void list_points_vs_points(int t1, int t2, int verbose_level)
void Siegel_move_backward_by_index(long int rk1, long int rk2, int *w, int *v, int verbose_level)
long int hyperbolic_rank_line(long int p1, long int p2, int verbose_level)
void lines_on_point_by_line_rank(long int pt, long int *line_pencil_line_ranks, int verbose_level)
void canonical_points_L7(long int pt1, long int pt2, long int &cpt1, long int &cpt2)
void Siegel_move_forward_by_index(long int rk1, long int rk2, int *v, int *w, int verbose_level)
long int parabolic_odd_type_and_index_to_point_rk(long int type, long int index, int verbose_level)
void Siegel_Transformation3(int *T, int *from, int *to, int *root, int *B, int *Bv, int *w, int *z, int *x, int verbose_level)
void find_root_parabolic_xyz(long int rk2, int *x, int *y, int *z, int verbose_level)
void Siegel_Transformation(int *T, long int rk_from, long int rk_to, long int root, int verbose_level)
void canonical_points_L3(long int pt1, long int pt2, long int &cpt1, long int &cpt2)
void parabolic_unrank_line_L2_odd(long int &p1, long int &p2, long int index, int verbose_level)
int evaluate_hyperbolic_bilinear_form(int *u, int *v, int stride, int m)
void parabolic_canonical_points_L7(long int pt1, long int pt2, long int &cpt1, long int &cpt2)
void random_generator_for_orthogonal_group(int f_action_is_semilinear, int f_siegel, int f_reflection, int f_similarity, int f_semisimilarity, int *Mtx, int verbose_level)
void parabolic_odd_type1_index_to_point(long int index, int *v, int verbose_level)
void unrank_point(int *v, int stride, long int rk, int verbose_level)
void move_points(long int pt_from, long int pt_to, int nb, int *input_coords, int *output_coords, int verbose_level)
void create_Law_71_BLT_set(long int *set, int verbose_level)
int parabolic_type_and_index_to_point_rk(int type, int index, int verbose_level)
void create_FTWKB_BLT_set(long int *set, int *ABC, int verbose_level)
void Gauss_step(int *v1, int *v2, int len, int idx)
void fill(long int *M, int i, int j, long int a)
void report(std::ostream &ost, int verbose_level)
void canonical_points_L4(long int pt1, long int pt2, long int &cpt1, long int &cpt2)
void report_points_of_given_type(std::ostream &ost, int t, int verbose_level)
void parabolic_neighbor52_even_unrank(long int index, int *v, int verbose_level)
void parabolic_neighbor51_odd_unrank(long int index, int *v, int verbose_level)
long int rank_line_L5(long int p1, long int p2, int verbose_level)
int collinearity_test(int size, long int *set, int verbose_level)
long int parabolic_rank_line_L6(long int p1, long int p2, int verbose_level)
void create_LP_37_4a_BLT_set(long int *set, int verbose_level)
void perp_of_k_points(long int *pts, int nb_pts, long int *&Perp, int &sz, int verbose_level)
long int parabolic_rank_line(long int p1, long int p2, int verbose_level)
void parabolic_even_point_to_type_and_index(int *v, long int &type, long int &index, int verbose_level)
void change_form_value(int *u, int stride, int m, int multiplier)
void canonical_points_L1(long int pt1, long int pt2, long int &cpt1, long int &cpt2)
void canonical_points_L2(long int pt1, long int pt2, long int &cpt1, long int &cpt2)
void hyperbolic_canonical_points_of_line(int line_type, long int pt1, long int pt2, long int &cpt1, long int &cpt2, int verbose_level)
void parabolic_point_properties(int *v, int stride, int n, int &f_start_with_one, int &value_middle, int &value_end, int verbose_level)
void create_LP_37_72_BLT_set(long int *set, int verbose_level)
int hyperbolic_line_type_given_point_types(long int pt1, long int pt2, int pt1_type, int pt2_type)
long int parabolic_rank_line_L4(long int p1, long int p2, int verbose_level)
long int rank_line_L6(long int p1, long int p2, int verbose_level)
void parabolic_neighbor34_unrank(long int index, int *v, int verbose_level)
void lines_on_point_by_line_rank_must_fit_into_int(long int pt, int *line_pencil_line_ranks, int verbose_level)
int find_root_hyperbolic(long int rk2, int m, int verbose_level)
void Siegel_map_between_singular_points_hyperbolic(int *T, long int rk_from, long int rk_to, long int root, int m, int verbose_level)
void hyperbolic_point_rk_to_type_and_index(long int rk, long int &type, long int &index)
long int parabolic_rank_line_L8(long int p1, long int p2, int verbose_level)
void parabolic_unrank_line_L1_odd(long int &p1, long int &p2, long int index, int verbose_level)
void unrank_line_L7(long int &p1, long int &p2, long int index, int verbose_level)
void parabolic_canonical_points_L3(long int pt1, long int pt2, long int &cpt1, long int &cpt2)
void report_points(std::ostream &ost, int verbose_level)
long int hyperbolic_type_and_index_to_point_rk(long int type, long int index, int verbose_level)
long int rank_line(long int p1, long int p2, int verbose_level)
void Siegel_move_backward(int *v1, int *v2, int *v3, int *v4, int verbose_level)
long int rank_line_L4(long int p1, long int p2, int verbose_level)
void parabolic_unrank_line_L3(long int &p1, long int &p2, long int index, int verbose_level)
void canonical_points_L5(long int pt1, long int pt2, long int &cpt1, long int &cpt2)
void scalar_multiply_vector(int *u, int stride, int len, int multiplier)
void Siegel_map_between_singular_points(int *T, long int rk_from, long int rk_to, long int root, int verbose_level)
void parabolic_unrank_line_L4(long int &p1, long int &p2, long int index, int verbose_level)
int evaluate_parabolic_bilinear_form(int *u, int *v, int stride, int m)
int parabolic_even_type_and_index_to_point_rk(int type, int index, int verbose_level)
void create_K2_BLT_set(long int *set, int *ABC, int verbose_level)
void Siegel_Transformation2(int *T, long int rk_from, long int rk_to, long int root, int *B, int *Bv, int *w, int *z, int *x, int verbose_level)
void create_random_orthogonal_reflection(int *Mtx, int verbose_level)
void parabolic_point_rk_to_type_and_index(long int rk, long int &type, long int &index, int verbose_level)
void parabolic_neighbor52_odd_unrank(long int index, int *v, int verbose_level)
ring_theory::homogeneous_polynomial_domain * Poly
Definition: orthogonal.h:204
void parabolic_odd_point_rk_to_type_and_index(long int rk, long int &type, long int &index, int verbose_level)
long int parabolic_rank_line_L7(long int p1, long int p2, int verbose_level)
long int parabolic_line_type_given_point_types(long int pt1, long int pt2, long int pt1_type, long int pt2_type, int verbose_level)
void unrank_line(long int &p1, long int &p2, long int index, int verbose_level)
int BLT_test_full(int size, long int *set, int verbose_level)
void point_rk_to_type_and_index(long int rk, long int &type, long int &index, int verbose_level)
long int type_and_index_to_point_rk(long int type, long int index, int verbose_level)
int BLT_test(int size, long int *set, int verbose_level)
void parabolic_canonical_points_of_line(int line_type, long int pt1, long int pt2, long int &cpt1, long int &cpt2, int verbose_level)
long int parabolic_rank_line_L5(long int p1, long int p2, int verbose_level)
void perp_of_two_points(long int pt1, long int pt2, long int *Perp, int &sz, int verbose_level)
long int rank_line_L3(long int p1, long int p2, int verbose_level)
void point_to_line_map(int size, long int *point_ranks, int *&line_vector, int verbose_level)
int line_type_given_point_types(long int pt1, long int pt2, long int pt1_type, long int pt2_type)
void hyperbolic_unrank_line(long int &p1, long int &p2, long int rk, int verbose_level)
void parabolic_neighbor53_unrank(long int index, int *v, int verbose_level)
void create_K1_BLT_set(long int *set, int *ABC, int verbose_level)
void unrank_line_L3(long int &p1, long int &p2, long int index, int verbose_level)
void plane_invariant(unusual_model *U, int size, int *set, int &nb_planes, int *&intersection_matrix, int &Block_size, int *&Blocks, int verbose_level)
int triple_is_collinear(long int pt1, long int pt2, long int pt3)
void unrank_line_L2(long int &p1, long int &p2, long int index, int verbose_level)
void parabolic_unrank_line_L8(long int &p1, long int &p2, long int index, int verbose_level)
void find_root_hyperbolic_xyz(long int rk2, int m, int *x, int *y, int *z, int verbose_level)
long int parabolic_rank_line_L2_odd(long int p1, long int p2, int verbose_level)
void parabolic_unrank_line_L7(long int &p1, long int &p2, long int index, int verbose_level)
long int rank_line_L2(long int p1, long int p2, int verbose_level)
void unrank_line_L5(long int &p1, long int &p2, long int index, int verbose_level)
void points_on_line(long int pi, long int pj, long int *line, int verbose_level)
void unrank_line_L4(long int &p1, long int &p2, long int index, int verbose_level)
void parabolic_canonical_points_L1_even(long int pt1, long int pt2, long int &cpt1, long int &cpt2)
void make_Siegel_Transformation(int *M, int *v, int *u, int n, int *Gram, int verbose_level)
void canonical_points_of_line(int line_type, long int pt1, long int pt2, long int &cpt1, long int &cpt2, int verbose_level)
void lines_on_point(long int pt, long int *line_pencil_point_ranks, int verbose_level)
void init(int epsilon, int n, field_theory::finite_field *F, int verbose_level)
Definition: orthogonal.cpp:312
long int rank_line_L1(long int p1, long int p2, int verbose_level)
long int find_root(long int rk2, int verbose_level)
void parabolic_even_point_rk_to_type_and_index(long int rk, long int &type, long int &index, int verbose_level)
int parabolic_rank_line_L2_even(long int p1, long int p2, int verbose_level)
void perp(long int pt, long int *Perp_without_pt, int &sz, int verbose_level)
void unrank_line_L1(long int &p1, long int &p2, long int index, int verbose_level)
void move_points_by_ranks(long int pt_from, long int pt_to, int nb, long int *input_ranks, long int *output_ranks, int verbose_level)
void report_quadratic_form(std::ostream &ost, int verbose_level)
void create_LP_37_4b_BLT_set(long int *set, int verbose_level)
void parabolic_unrank_line_L1_even(long int &p1, long int &p2, long int index, int verbose_level)
void parabolic_unrank_line_L2_even(long int &p1, long int &p2, long int index, int verbose_level)
void parabolic_canonical_points_separate_P5(long int pt1, long int pt2, long int &cpt1, long int &cpt2)
void parabolic_unrank_line_L5(long int &p1, long int &p2, long int index, int verbose_level)
void create_random_Siegel_transformation(int *Mtx, int verbose_level)
void make_initial_partition(data_structures::partitionstack &S, int verbose_level)
void Siegel_move_forward(int *v1, int *v2, int *v3, int *v4, int verbose_level)
void unrank_line_L6(long int &p1, long int &p2, long int index, int verbose_level)
void make_orthogonal_reflection(int *M, int *z, int verbose_level)
void move_points_by_ranks_in_place(long int pt_from, long int pt_to, int nb, long int *ranks, int verbose_level)
void parabolic_unrank_line_L6(long int &p1, long int &p2, long int index, int verbose_level)
void report_points_by_type(std::ostream &ost, int verbose_level)
void report_lines(std::ostream &ost, int verbose_level)
long int parabolic_rank_line_L1_odd(long int p1, long int p2, int verbose_level)
long int parabolic_rank_line_L3(long int p1, long int p2, int verbose_level)
void parabolic_odd_point_to_type_and_index(int *v, long int &type, long int &index, int verbose_level)
void points_on_line_by_coordinates(long int pi, long int pj, int *pt_coords, int verbose_level)
void canonical_points_L6(long int pt1, long int pt2, long int &cpt1, long int &cpt2)
Penttila's unusual model to create BLT-sets.
Definition: orthogonal.h:676
int build_candidate_set_with_offset(orthogonal &O, int q, int gamma, int delta, int offset, int m, long int *Set, int f_second_half, int verbose_level)
void transform_matrix_unusual_to_usual(orthogonal *O, int *M4, int *M5, int verbose_level)
int build_candidate_set(orthogonal &O, int q, int gamma, int delta, int m, long int *Set, int f_second_half, int verbose_level)
void create_Mondello_BLT_set(long int *BLT, int *ABC, int verbose_level)
void convert_to_ranks(int n, int *unusual_coordinates, long int *ranks, int verbose_level)
void setup2(field_theory::finite_field *FQ, field_theory::finite_field *Fq, int f_sum_of_squares, int verbose_level)
void convert_from_rank(long int rank, int *unusual_coordinates, int verbose_level)
int quadratic_form(int a, int b, int c, int verbose_level)
void create_Linear_BLT_set(long int *BLT, int *ABC, int verbose_level)
void transform_matrix_usual_to_unusual(orthogonal *O, int *M5, int *M4, int verbose_level)
void parse_4by4_matrix(int *M4, int &a, int &b, int &c, int &d, int &f_semi1, int &f_semi2, int &f_semi3, int &f_semi4)
void convert_from_usual(int n, int *usual_coordinates, int *unusual_coordinates, int verbose_level)
void setup(field_theory::finite_field *FQ, field_theory::finite_field *Fq, int verbose_level)
int build_candidate_set_with_or_without_test(orthogonal &O, int q, int gamma, int delta, int offset, int m, long int *Set, int f_second_half, int f_test, int verbose_level)
int create_orbit_of_psi(orthogonal &O, int q, int gamma, int delta, int m, long int *Set, int f_test, int verbose_level)
void create_4by4_matrix(int *M4, int a, int b, int c, int d, int f_semi1, int f_semi2, int f_semi3, int f_semi4, int verbose_level)
void create_Fisher_BLT_set(long int *Fisher_BLT, int *ABC, int verbose_level)
int bilinear_form(int a1, int b1, int c1, int a2, int b2, int c2, int verbose_level)
void convert_from_ranks(int n, long int *ranks, int *unusual_coordinates, int verbose_level)
long int convert_to_rank(int *unusual_coordinates, int verbose_level)
void convert_to_usual(int n, int *unusual_coordinates, int *usual_coordinates, int verbose_level)
homogeneous polynomials of a given degree in a given number of variables over a finite field GF(q)
Definition: ring_theory.h:88
the orbiter library for the classification of combinatorial objects