Orbiter 2022
Combinatorial Objects
geometry.h
Go to the documentation of this file.
1// geometry.h
2//
3// Anton Betten
4//
5// moved here from galois.h: July 27, 2018
6// started as orbiter: October 23, 2002
7// 2nd version started: December 7, 2003
8// galois started: August 12, 2005
9
10
11
12#ifndef ORBITER_SRC_LIB_FOUNDATIONS_GEOMETRY_GEOMETRY_H_
13#define ORBITER_SRC_LIB_FOUNDATIONS_GEOMETRY_GEOMETRY_H_
14
15
16namespace orbiter {
17namespace layer1_foundations {
18namespace geometry {
19
20
21// #############################################################################
22// andre_construction.cpp
23// #############################################################################
24
26
27
29public:
30 int order; // = q^k
31 int spread_size; // order + 1
32 int n; // = 2 * k
33 int k;
34 int q;
35 int N; // order^2 + order + 1
36
37
40
41 long int *spread_elements_numeric; // [spread_size]
42 long int *spread_elements_numeric_sorted; // [spread_size]
43
46
47 int *spread_elements_genma; // [spread_size * k * n]
48 int *pivot; //[spread_size * k]
49 int *non_pivot; //[spread_size * (n - k)]
50
51
54 void null();
55 void freeself();
57 int verbose_level);
59 int *pts_on_line, int verbose_level);
60 void report(std::ostream &ost, int verbose_level);
61
62};
63
64
65
66
67// #############################################################################
68// andre_construction_point_element.cpp
69// #############################################################################
70
71
73
74
76public:
78 int k, n, q, spread_size;
84 int *coordinates; // [n]
85
88 void null();
89 void freeself();
90 void init(andre_construction *Andre, int verbose_level);
91 void unrank(int point_rank, int verbose_level);
92 int rank(int verbose_level);
93};
94
95
96// #############################################################################
97// andre_construction_line_element.cpp
98// #############################################################################
99
100
102
103
105public:
107 int k, n, q, spread_size;
114 int *pivots; // [k]
115 int *non_pivots; // [n - k]
116 int *coset; // [n - k]
117 int *coordinates; // [(k + 1) * n], last row is special vector
118
121 void null();
122 void freeself();
123 void init(andre_construction *Andre, int verbose_level);
124 void unrank(int line_rank, int verbose_level);
125 int rank(int verbose_level);
126 int make_affine_point(int idx, int verbose_level);
127 // 0 \le idx \le order
128};
129
130
131// #############################################################################
132// arc_basic.cpp
133// #############################################################################
134
136
137
139public:
140
142
143 arc_basic();
144 ~arc_basic();
145 void init(field_theory::finite_field *F, int verbose_level);
146
147 void Segre_hyperoval(
148 long int *&Pts, int &nb_pts, int verbose_level);
149 void GlynnI_hyperoval(
150 long int *&Pts, int &nb_pts, int verbose_level);
152 long int *&Pts, int &nb_pts, int verbose_level);
153 void Subiaco_oval(
154 long int *&Pts, int &nb_pts, int f_short, int verbose_level);
155 // following Payne, Penttila, Pinneri:
156 // Isomorphisms Between Subiaco q-Clan Geometries,
157 // Bull. Belg. Math. Soc. 2 (1995) 197-222.
158 // formula (53)
160 long int *&Pts, int &nb_pts, int verbose_level);
161 int OKeefe_Penttila_32(int t);
162 int Subiaco64_1(int t);
163 int Subiaco64_2(int t);
164 int Adelaide64(int t);
165 void LunelliSce(int *pts18, int verbose_level);
166 int LunelliSce_evaluate_cubic1(int *v);
167 // computes X^3 + Y^3 + Z^3 + \eta^3 XYZ
168 int LunelliSce_evaluate_cubic2(int *v);
169 // computes X^3 + Y^3 + Z^3 + \eta^{12} XYZ
170
171};
172
173
174
175// #############################################################################
176// arc_in_projective_space.cpp
177// #############################################################################
178
180
181
183public:
184
186
189 void init(projective_space *P, int verbose_level);
190
191 void PG_2_8_create_conic_plus_nucleus_arc_1(long int *the_arc, int &size,
192 int verbose_level);
193 void PG_2_8_create_conic_plus_nucleus_arc_2(long int *the_arc, int &size,
194 int verbose_level);
195 void create_Maruta_Hamada_arc(long int *the_arc, int &size,
196 int verbose_level);
197 void create_Maruta_Hamada_arc2(long int *the_arc, int &size,
198 int verbose_level);
199 void create_pasch_arc(long int *the_arc, int &size, int verbose_level);
200 void create_Cheon_arc(long int *the_arc, int &size, int verbose_level);
201 void create_regular_hyperoval(long int *the_arc, int &size,
202 int verbose_level);
203 void create_translation_hyperoval(long int *the_arc, int &size,
204 int exponent, int verbose_level);
205 void create_Segre_hyperoval(long int *the_arc, int &size,
206 int verbose_level);
207 void create_Payne_hyperoval(long int *the_arc, int &size,
208 int verbose_level);
209 void create_Cherowitzo_hyperoval(long int *the_arc, int &size,
210 int verbose_level);
211 void create_OKeefe_Penttila_hyperoval_32(long int *the_arc, int &size,
212 int verbose_level);
213
215 long int *arc, int arc_sz,
216 int target_sz, int target_d,
218 int verbose_level);
220 long int *s_lines, int nb_s_lines,
221 int target_sz, int arc_d, int arc_d_low, int arc_s,
222 int f_dualize,
224 int verbose_level);
226 long int *s_lines, int nb_s_lines, int arc_s,
227 long int *t_lines, int nb_t_lines, int arc_t,
228 int target_sz, int arc_d, int arc_d_low,
229 int f_dualize,
231 int verbose_level);
233 long int *s_lines, int nb_s_lines, int arc_s,
234 long int *t_lines, int nb_t_lines, int arc_t,
235 long int *u_lines, int nb_u_lines, int arc_u,
236 int target_sz, int arc_d, int arc_d_low,
237 int f_dualize,
239 int verbose_level);
241 int arc_sz, int arc_d,
242 std::string &secant_lines_text,
243 std::string &external_lines_as_subset_of_secants_text,
245 int verbose_level);
246 void arc_lifting1(
247 int arc_size,
248 int arc_d,
249 int arc_d_low,
250 int arc_s,
251 std::string arc_input_set,
252 std::string arc_label,
253 int verbose_level);
254 void arc_lifting2(
255 int arc_size,
256 int arc_d,
257 int arc_d_low,
258 int arc_s,
259 std::string arc_input_set,
260 std::string arc_label,
261 int arc_t,
262 std::string t_lines_string,
263 int verbose_level);
264 void arc_lifting3(
265 int arc_size,
266 int arc_d,
267 int arc_d_low,
268 int arc_s,
269 std::string arc_input_set,
270 std::string arc_label,
271 int arc_t,
272 std::string t_lines_string,
273 int arc_u,
274 std::string u_lines_string,
275 int verbose_level);
276 void create_hyperoval(
277 int f_translation, int translation_exponent,
278 int f_Segre, int f_Payne, int f_Cherowitzo, int f_OKeefe_Penttila,
279 std::string &label_txt,
280 std::string &label_tex,
281 int &nb_pts, long int *&Pts,
282 int verbose_level);
284 int f_short,
285 std::string &label_txt,
286 std::string &label_tex,
287 int &nb_pts, long int *&Pts,
288 int verbose_level);
290 std::string &label_txt,
291 std::string &label_tex,
292 int &nb_pts, long int *&Pts,
293 int verbose_level);
295 std::string &label_txt,
296 std::string &label_tex,
297 int &nb_pts, long int *&Pts,
298 int verbose_level);
299 int arc_test(long int *input_pts, int nb_pts,
300 int verbose_level);
301 void compute_bisecants_and_conics(long int *arc6,
302 int *&bisecants, int *&conics, int verbose_level);
303 // bisecants[15 * 3]
304 // conics[6 * 6]
305
306
307};
308
309
310// #############################################################################
311// buekenhout_metz.cpp
312// #############################################################################
313
315
316
318public:
320 int q;
321 int Q;
322
324 int f_Uab;
327
328 projective_space *P2; // PG(2,q^2), where the unital lives
329 projective_space *P3; // PG(3,q), where the ovoid lives
330
331 int *v; // [3]
332 int *w1; // [6]
333 int *w2; // [6]
334 int *w3; // [6]
335 int *w4; // [6]
336 int *w5; // [6]
340 long int *ovoid;
341 long int *U;
342 int sz;
343 int alpha, t0, t1, T0, T1;
344 long int theta_3;
347
348
349 // compute_the_design:
350 long int *secant_lines;
352 long int *tangent_lines;
356 long int *block;
364
365
366 // the block that we choose:
368 int *good_points; // = q + 1
369
370
373 void null();
374 void freeself();
376 int f_Uab, int a, int b,
377 int f_classical, int verbose_level);
378 void init_ovoid(int verbose_level);
379 void init_ovoid_Uab_even(int a, int b, int verbose_level);
380 void create_unital(int verbose_level);
381 void create_unital_tex(int verbose_level);
382 void create_unital_Uab_tex(int verbose_level);
383 void compute_the_design(int verbose_level);
385 void get_name(std::string &name);
386
387};
388
389
390
391
392// #############################################################################
393// decomposition.cpp
394// #############################################################################
395
396
398
399
401
402public:
403
406 int *Inc;
409
421
422
423
426 void null();
427 void freeself();
430 int verbose_level);
431 void init_incidence_matrix(int m, int n, int *M,
432 int verbose_level);
433 // copies the incidence matrix
434 void setup_default_partition(int verbose_level);
435 void compute_TDO(int max_depth, int verbose_level);
436 void print_row_decomposition_tex(std::ostream &ost,
437 int f_enter_math, int f_print_subscripts,
438 int verbose_level);
439 void print_column_decomposition_tex(std::ostream &ost,
440 int f_enter_math, int f_print_subscripts,
441 int verbose_level);
442 void get_row_scheme(int verbose_level);
443 void get_col_scheme(int verbose_level);
444
445};
446
447
448// #############################################################################
449// desarguesian_spread.cpp
450// #############################################################################
451
452
454
455
456
458public:
459 int n;
460 int m;
461 int s;
462 int q;
463 int Q;
468
469 int N;
470 // = number of points in PG(m - 1, Q)
471
473 // = number of points in PG(n - 1, q)
474
476 // = number of points in PG(s - 1, q)
477
479 // = s * n
480
482 // [N * spread_element_size]
483
484 long int *Rk;
485 // [N]
486
488 // [N * nb_points_per_spread_element]
489
492 void null();
493 void freeself();
494 void init(int n, int m, int s,
496 int verbose_level);
497 void calculate_spread_elements(int verbose_level);
498 void compute_intersection_type(int k, int *subspace,
499 int *intersection_dimensions, int verbose_level);
500 // intersection_dimensions[h]
501 void compute_shadow(int *Basis, int basis_sz,
502 int *is_in_shadow, int verbose_level);
503 void compute_linear_set(int *Basis, int basis_sz,
504 long int *&the_linear_set, int &the_linear_set_sz,
505 int verbose_level);
506 void print_spread_element_table_tex(std::ostream &ost);
507 void print_spread_elements_tex(std::ostream &ost);
508 void print_linear_set_tex(long int *set, int sz);
509 void print_linear_set_element_tex(long int a, int sz);
510 void create_latex_report(int verbose_level);
511 void report(std::ostream &ost, int verbose_level);
512
513};
514
515// #############################################################################
516// flag.cpp
517// #############################################################################
518
520
521
522class flag {
523public:
526 int n;
527 int s0, s1, s2;
528 int k, K;
529 int *type;
531 int idx;
532 int N0, N, N1;
534
535
536 int *M; // [K * n]
537 int *M_Gauss; // [K * n] the echelon form (RREF)
538 int *transform; // [K * K] the transformation matrix, used as s2 * s2
539 int *base_cols; // [n] base_cols for the matrix M_Gauss
540 int *M1; // [n * n]
541 int *M2; // [n * n]
542 int *M3; // [n * n]
543
544 flag();
545 ~flag();
546 void null();
547 void freeself();
548 void init(int n, int *type, int type_len, field_theory::finite_field *F,
549 int verbose_level);
550 void init_recursion(int n, int *type, int type_len, int idx,
551 field_theory::finite_field *F, int verbose_level);
552 void unrank(long int rk, int *subspace, int verbose_level);
553 void unrank_recursion(long int rk, int *subspace, int verbose_level);
554 long int rank(int *subspace, int verbose_level);
555 long int rank_recursion(int *subspace, int *big_space, int verbose_level);
556};
557
558
559// #############################################################################
560// geometric_object_create.cpp
561// #############################################################################
562
563
565
566
567
569
570public:
572
573 //std::string fname;
575 long int *Pts;
576
577 std::string label_txt;
578 std::string label_tex;
579
580
584 projective_space *P, int verbose_level);
585};
586
587
588
589// #############################################################################
590// geometric_object_description.cpp
591// #############################################################################
592
593
595
596
597
599
600public:
601
603
608
616
618 int BLT_k;
620
621#if 0
622 int f_BLT_Linear;
623 int f_BLT_Fisher;
624 int f_BLT_Mondello;
625 int f_BLT_FTWKB;
626#endif
627
630
632
635
637
638 int f_cuspidal_cubic; // twisted cubic in PG(2,q)
639 int f_twisted_cubic; // twisted cubic in PG(3,q)
640
644
645 //int f_Hill_cap_56;
646
651
653
656
659 int f_Uab;
662
665 int pt;
666
670
672
674 std::string variety_label_txt;
675 std::string variety_label_tex;
678 std::string variety_coeffs;
680
682 std::vector<std::string> Variety_coeffs;
683
686
687
689 std::string curve_label_txt;
690 std::string curve_label_tex;
693 std::string curve_coeffs;
694
695 int f_set;
696 std::string set_text;
697
698
701 int read_arguments(int argc, std::string *argv,
702 int verbose_level);
703 void print();
704
705};
706
707
708
709
710
711
712// #############################################################################
713// geometry_global.cpp
714// #############################################################################
715
716
718
719
720
722public:
723
726 long int nb_PG_elements(int n, int q);
727 // $\frac{q^{n+1} - 1}{q-1} = \sum_{i=0}^{n} q^i $
728 long int nb_PG_elements_not_in_subspace(int n, int m, int q);
729 long int nb_AG_elements(int n, int q);
730 long int nb_affine_lines(int n, int q);
731 long int AG_element_rank(int q, int *v, int stride, int len);
732 void AG_element_unrank(int q, int *v, int stride, int len, long int a);
733 int AG_element_next(int q, int *v, int stride, int len);
734 void AG_element_rank_longinteger(int q, int *v, int stride, int len,
736 void AG_element_unrank_longinteger(int q, int *v, int stride, int len,
738 int PG_element_modified_is_in_subspace(int n, int m, int *v);
739 void test_PG(int n, int q);
740 void create_Fisher_BLT_set(long int *Fisher_BLT, int *ABC,
742 field_theory::finite_field *Fq, int verbose_level);
743 void create_Linear_BLT_set(long int *BLT, int *ABC,
745 field_theory::finite_field *Fq, int verbose_level);
746 void create_Mondello_BLT_set(long int *BLT, int *ABC,
748 field_theory::finite_field *Fq, int verbose_level);
749 void print_quadratic_form_list_coded(int form_nb_terms,
750 int *form_i, int *form_j, int *form_coeff);
753 int nb_terms, int *form_i, int *form_j,
754 int *form_coeff, int *Gram);
755 void add_term(int n, field_theory::finite_field &F, int &nb_terms,
756 int *form_i, int *form_j, int *form_coeff, int *Gram,
757 int i, int j, int coeff);
759 int *pt_coords, int *set,
760 int set_sz, int k, int verbose_level);
764 int f_classical, int f_Uab, int parameter_a, int parameter_b,
765 std::string &fname, int &nb_pts, long int *&Pts,
766 int verbose_level);
767 long int count_Sbar(int n, int q);
768 long int count_S(int n, int q);
769 long int count_N1(int n, int q);
770 long int count_T1(int epsilon, int n, int q);
771 long int count_T2(int n, int q);
772 long int nb_pts_Qepsilon(int epsilon, int k, int q);
773 // number of singular points on Q^epsilon(k,q)
774 int dimension_given_Witt_index(int epsilon, int n);
775 int Witt_index(int epsilon, int k);
776 long int nb_pts_Q(int k, int q);
777 // number of singular points on Q(k,q)
778 long int nb_pts_Qplus(int k, int q);
779 // number of singular points on Q^+(k,q)
780 long int nb_pts_Qminus(int k, int q);
781 // number of singular points on Q^-(k,q)
782 long int nb_pts_S(int n, int q);
783 long int nb_pts_N(int n, int q);
784 long int nb_pts_N1(int n, int q);
785 long int nb_pts_Sbar(int n, int q);
786 long int nb_pts_Nbar(int n, int q);
787 void test_Orthogonal(int epsilon, int k, int q);
788 void test_orthogonal(int n, int q);
789 int &TDO_upper_bound(int i, int j);
790 int &TDO_upper_bound_internal(int i, int j);
791 int &TDO_upper_bound_source(int i, int j);
792 int braun_test_single_type(int v, int k, int ak);
793 int braun_test_upper_bound(int v, int k);
794 void TDO_refine_init_upper_bounds(int v_max);
795 void TDO_refine_extend_upper_bounds(int new_v_max);
796 int braun_test_on_line_type(int v, int *type);
797 int &maxfit(int i, int j);
798 int &maxfit_internal(int i, int j);
799 void maxfit_table_init(int v_max);
800 void maxfit_table_reallocate(int v_max);
802 int packing_number_via_maxfit(int n, int k);
804 std::string &inverse_isomorphism_klein_quadric_matrix_A6,
805 int verbose_level);
808 std::string &label,
809 int verbose_level);
811 std::string &line_1_basis,
812 std::string &line_2_basis,
813 int f_normalize_from_the_left, int f_normalize_from_the_right,
814 int verbose_level);
816 std::string &line_1_basis,
817 std::string &line_2_basis,
818 std::string &point,
819 int f_normalize_from_the_left, int f_normalize_from_the_right,
820 int verbose_level);
823 int n,
824 int verbose_level);
826 int n, int k,
827 int verbose_level);
829 int projective_dimension,
830 int verbose_level);
833 int m,
834 int verbose_level);
835 void create_decomposition_of_projective_plane(std::string &fname_base,
837 long int *points, int nb_points,
838 long int *lines, int nb_lines,
839 int verbose_level);
840 void latex_homogeneous_equation(field_theory::finite_field *F, int degree, int nb_vars,
841 std::string &equation_text,
842 std::string &symbol_txt,
843 std::string &symbol_tex,
844 int verbose_level);
846 int *v5, int a, int b, int c, int verbose_level);
847 // creates the point (-b/2,-c,a,-(b^2/4-ac),1)
848 // check if it satisfies x_0^2 + x_1x_2 + x_3x_4:
849 // b^2/4 + (-c)*a + -(b^2/4-ac)
850 // = b^2/4 -ac -b^2/4 + ac = 0
853 long int *arc6,
854 int verbose_level);
857 long int *S, int len, int pt, int nb_E, int verbose_level);
859 long int *Arc6,
860 long int P1, long int P2, int partition_rk, long int *arc,
861 int verbose_level);
864 long int P1, long int P2, long int &line1, long int &line2,
865 int verbose_level);
868 int *A3, int f_semilinear, int frobenius,
869 long int line1, long int line2,
870 int *A4,
871 int verbose_level);
874 long int line1_from, long int line1_to,
875 long int line2_from, long int line2_to,
876 int *A4,
877 int verbose_level);
878 void andre_preimage(
880 long int *set2, int sz2, long int *set4, int &sz4, int verbose_level);
881
882};
883
884
885// #############################################################################
886// grassmann.cpp
887// #############################################################################
888
890
891
893public:
894 int n, k, q;
895 ring_theory::longinteger_object *nCkq; // n choose k q-analog
898 int *coset;
899 int *M; // [n * n], this used to be [k * n]
900 // but now we allow for embedded subspaces.
901 int *M2; // [n * n], used in dual_spread
902 int *v; // [n], for points_covered
903 int *w; // [n], for points_covered
905
906 grassmann();
907 ~grassmann();
908 void init(int n, int k, field_theory::finite_field *F, int verbose_level);
909 long int nb_of_subspaces(int verbose_level);
910 void print_single_generator_matrix_tex(std::ostream &ost, long int a);
912 std::ostream &ost, long int a);
913 void print_set(long int *v, int len);
914 void print_set_tex(std::ostream &ost, long int *v, int len);
915 void print_set_tex_with_perp(std::ostream &ost, long int *v, int len);
916 int nb_points_covered(int verbose_level);
917 void points_covered(long int *the_points, int verbose_level);
918 void unrank_lint_here(int *Mtx, long int rk, int verbose_level);
919 long int rank_lint_here(int *Mtx, int verbose_level);
920 void unrank_embedded_subspace_lint(long int rk, int verbose_level);
921 long int rank_embedded_subspace_lint(int verbose_level);
922 void unrank_embedded_subspace_lint_here(int *Basis, long int rk, int verbose_level);
923 void unrank_lint(long int rk, int verbose_level);
924 long int rank_lint(int verbose_level);
926 int verbose_level);
928 int verbose_level);
929 void unrank_longinteger(ring_theory::longinteger_object &rk, int verbose_level);
930 void rank_longinteger(ring_theory::longinteger_object &r, int verbose_level);
931 void print();
932 int dimension_of_join(long int rk1, long int rk2, int verbose_level);
933 void unrank_lint_here_and_extend_basis(int *Mtx, long int rk,
934 int verbose_level);
935 // Mtx must be n x n
936 void unrank_lint_here_and_compute_perp(int *Mtx, long int rk,
937 int verbose_level);
938 // Mtx must be n x n
939 void line_regulus_in_PG_3_q(long int *&regulus,
940 int &regulus_size, int f_opposite, int verbose_level);
941 // the equation of the hyperboloid is x_0x_3-x_1x_2 = 0
942 void compute_dual_line_idx(int *&dual_line_idx,
943 int *&self_dual_lines, int &nb_self_dual_lines,
944 int verbose_level);
945 void compute_dual_spread(int *spread, int *dual_spread,
946 int spread_size, int verbose_level);
947 void latex_matrix(std::ostream &ost, int *p);
948 void latex_matrix_numerical(std::ostream &ost, int *p);
949 void create_Schlaefli_graph(int *&Adj, int &sz, int verbose_level);
950 long int make_special_element_zero(int verbose_level);
951 long int make_special_element_one(int verbose_level);
952 long int make_special_element_infinity(int verbose_level);
953
954};
955
956
957// #############################################################################
958// grassmann_embedded.cpp
959// #############################################################################
960
962
963
965public:
966 int big_n, n, k, q;
968 grassmann *G; // only a reference, not freed
969 int *M; // [n * big_n] the original matrix
970 int *M_Gauss; // [n * big_n] the echelon form (RREF)
971 int *transform; // [n * n] the transformation matrix
972 int *base_cols; // [n] base_cols for the matrix M_Gauss
974 // [big_n - n], the columns which are not
975 // base_cols in increasing order
976 int *Tmp1; // [big_n]
977 int *Tmp2; // [big_n]
978 int *Tmp3; // [big_n]
979 int *tmp_M1; // [n * n]
980 int *tmp_M2; // [n * n]
981 long int degree; // q_binomial n choose k
982
983
986 void init(int big_n, int n, grassmann *G, int *M, int verbose_level);
987 // M is n x big_n
988 void unrank_embedded_lint(int *subspace_basis_with_embedding,
989 long int rk, int verbose_level);
990 // subspace_basis_with_embedding is n x big_n
991 long int rank_embedded_lint(int *subspace_basis, int verbose_level);
992 // subspace_basis is n x big_n,
993 // only the first k x big_n entries are used
994 void unrank_lint(int *subspace_basis, long int rk, int verbose_level);
995 // subspace_basis is k x big_n
996 long int rank_lint(int *subspace_basis, int verbose_level);
997 // subspace_basis is k x big_n
998};
999
1000// #############################################################################
1001// hermitian.cpp
1002// #############################################################################
1003
1005
1006
1008
1009public:
1010
1011 // The hermitian form is \sum_{i=0}^{k-1} X_i^{q+1}
1012
1013 field_theory::finite_field *F; // only a reference, not to be freed
1014 int Q;
1015 int q;
1016 int k; // nb_vars
1017
1018 int *cnt_N; // [k + 1]
1019 int *cnt_N1; // [k + 1]
1020 int *cnt_S; // [k + 1]
1021 int *cnt_Sbar; // [k + 1]
1022
1023 int *norm_one_elements; // [q + 1]
1025 int alpha; // a primitive element for GF(Q), namely F->p
1026 int beta; // alpha^(q+1), a primitive element for GF(q)
1027 int *log_beta; // [Q]
1028 int *beta_power; // [q - 1]
1029 // beta_power[i] = beta to the power i = j
1030 // log_beta[j] = i
1031
1032 hermitian();
1033 ~hermitian();
1034 void null();
1035 void init(field_theory::finite_field *F, int nb_vars, int verbose_level);
1036 int nb_points();
1037 void unrank_point(int *v, int rk);
1038 int rank_point(int *v);
1039 void list_of_points_embedded_in_PG(long int *&Pts, int &nb_pts,
1040 int verbose_level);
1041 void list_all_N(int verbose_level);
1042 void list_all_N1(int verbose_level);
1043 void list_all_S(int verbose_level);
1044 void list_all_Sbar(int verbose_level);
1045 int evaluate_hermitian_form(int *v, int len);
1046 void N_unrank(int *v, int len, int rk, int verbose_level);
1047 int N_rank(int *v, int len, int verbose_level);
1048 void N1_unrank(int *v, int len, int rk, int verbose_level);
1049 int N1_rank(int *v, int len, int verbose_level);
1050 void S_unrank(int *v, int len, int rk, int verbose_level);
1051 int S_rank(int *v, int len, int verbose_level);
1052 void Sbar_unrank(int *v, int len, int rk, int verbose_level);
1053 int Sbar_rank(int *v, int len, int verbose_level);
1054 void create_latex_report(int verbose_level);
1055 void report(std::ostream &ost, int verbose_level);
1056 void report_points(std::ostream &ost, int verbose_level);
1057
1058};
1059
1060// #############################################################################
1061// hjelmslev.cpp
1062// #############################################################################
1063
1065
1066
1068public:
1069 int n, k, q;
1073 int *v;
1074 int *Mtx;
1076
1077 hjelmslev();
1078 ~hjelmslev();
1079 void null();
1080 void freeself();
1081 void init(ring_theory::finite_ring *R, int n, int k, int verbose_level);
1082 long int number_of_submodules();
1083 void unrank_lint(int *M, long int rk, int verbose_level);
1084 long int rank_lint(int *M, int verbose_level);
1085};
1086
1087// #############################################################################
1088// incidence_structure.cpp
1089// #############################################################################
1090
1091#define INCIDENCE_STRUCTURE_REALIZATION_BY_MATRIX 1
1092#define INCIDENCE_STRUCTURE_REALIZATION_BY_ORTHOGONAL 2
1093#define INCIDENCE_STRUCTURE_REALIZATION_BY_HJELMSLEV 3
1094#define INCIDENCE_STRUCTURE_REALIZATION_BY_PROJECTIVE_SPACE 4
1095
1097
1098
1100 public:
1101
1102 std::string label;
1103
1104
1107
1108
1111 int r;
1112 int k;
1119 int *lines_on_point; // [nb_rows * max_r]
1120 int *points_on_line; // [nb_cols * max_k]
1121
1123 // INCIDENCE_STRUCTURE_REALIZATION_BY_MATRIX
1124 // INCIDENCE_STRUCTURE_REALIZATION_BY_ORTHOGONAL
1125
1126 int *M;
1130
1131
1134 void null();
1135 void freeself();
1136 void check_point_pairs(int verbose_level);
1137 int lines_through_two_points(int *lines, int p1, int p2,
1138 int verbose_level);
1139 void init_projective_space(projective_space *P, int verbose_level);
1140 void init_hjelmslev(hjelmslev *H, int verbose_level);
1141 void init_orthogonal(orthogonal_geometry::orthogonal *O, int verbose_level);
1142 void init_by_incidences(int m, int n, int nb_inc, int *X,
1143 int verbose_level);
1144 void init_by_R_and_X(int m, int n, int *R, int *X, int max_r,
1145 int verbose_level);
1146 void init_by_set_of_sets(data_structures::set_of_sets *SoS, int verbose_level);
1147 void init_by_matrix(int m, int n, int *M, int verbose_level);
1149 int m, int n, data_structures::bitmatrix *Bitmatrix,
1150 int verbose_level);
1151 void init_by_matrix2(int verbose_level);
1152 int nb_points();
1153 int nb_lines();
1154 int get_ij(int i, int j);
1155 int get_lines_on_point(int *data, int i, int verbose_level);
1156 int get_points_on_line(int *data, int j, int verbose_level);
1157 int get_nb_inc();
1158 void save_inc_file(char *fname);
1159 void save_row_by_row_file(char *fname);
1160 void print(std::ostream &ost);
1162 int depth, int &step, int &f_refine,
1163 int &f_refine_prev, int verbose_level);
1165 int depth, int &step, int &f_refine,
1166 int &f_refine_prev, int verbose_level);
1167 // returns TRUE when we are done, FALSE otherwise
1169 int depth, int verbose_level);
1170 int compute_TDO(data_structures::partitionstack &PStack, int ht0, int depth,
1171 int verbose_level);
1173 int verbose_level);
1175 int *row_classes, int *row_class_idx, int &nb_row_classes,
1176 int *col_classes, int *col_class_idx, int &nb_col_classes);
1178 int verbose_level);
1180 int verbose_level);
1182 int verbose_level);
1184 int verbose_level);
1187 std::ostream &ost, int f_enter_math_mode,
1188 int *row_classes, int *row_class_inv, int nb_row_classes,
1189 int *col_classes, int *col_class_inv, int nb_col_classes,
1190 int f_local_coordinates, int verbose_level);
1193 std::ostream &ost, int f_enter_math_mode,
1194 int *row_classes, int *row_class_inv, int nb_row_classes,
1195 int *col_classes, int *col_class_inv, int nb_col_classes,
1196 int f_local_coordinates, int verbose_level);
1198 int *row_classes, int *row_class_inv, int nb_row_classes,
1199 int *col_classes, int *col_class_inv, int nb_col_classes,
1200 int row_class_idx, int col_class_idx,
1201 int rij, int *&incidences, int verbose_level);
1203 int *row_classes, int *row_class_inv, int nb_row_classes,
1204 int *col_classes, int *col_class_inv, int nb_col_classes,
1205 int row_class_idx, int col_class_idx,
1206 int kij, int *&incidences, int verbose_level);
1208 int *row_classes, int *row_class_inv, int nb_row_classes,
1209 int *col_classes, int *col_class_inv, int nb_col_classes,
1210 int *row_scheme, int verbose_level);
1212 int *row_classes, int *row_class_inv, int nb_row_classes,
1213 int *col_classes, int *col_class_inv, int nb_col_classes,
1214 int *row_scheme, int verbose_level);
1216 int *row_classes, int *row_class_inv, int nb_row_classes,
1217 int *col_classes, int *col_class_inv, int nb_col_classes,
1218 int *col_scheme, int verbose_level);
1219
1221 int *row_classes, int *row_class_inv, int nb_row_classes,
1222 int *col_classes, int *col_class_inv, int nb_col_classes,
1223 int *row_scheme, int *col_scheme, int verbose_level);
1225 int f_list_incidences, int f_local_coordinates, int verbose_level);
1228 int f_list_incidences, int f_local_coordinates, int verbose_level);
1232 std::ostream &ost, int f_enter_math, data_structures::partitionstack &PStack);
1233 void get_scheme(
1234 int *&row_classes, int *&row_class_inv, int &nb_row_classes,
1235 int *&col_classes, int *&col_class_inv, int &nb_col_classes,
1236 int *&scheme, int f_row_scheme, data_structures::partitionstack &PStack);
1237 void free_scheme(
1238 int *row_classes, int *row_class_inv,
1239 int *col_classes, int *col_class_inv,
1240 int *scheme);
1242 std::ostream &ost, int f_enter_math, int f_print_subscripts,
1245 std::ostream &ost, int f_enter_math, int f_print_subscripts,
1248 std::ostream &ost, int f_enter_math, data_structures::partitionstack &PStack);
1249 void print_line(std::ostream &ost, data_structures::partitionstack &P,
1250 int row_cell, int i, int *col_classes, int nb_col_classes,
1251 int width, int f_labeled);
1252 void print_column_labels(std::ostream &ost, data_structures::partitionstack &P,
1253 int *col_classes, int nb_col_classes, int width);
1254 void print_hline(std::ostream &ost, data_structures::partitionstack &P,
1255 int *col_classes, int nb_col_classes,
1256 int width, int f_labeled);
1257 void print_partitioned(std::ostream &ost,
1258 data_structures::partitionstack &P, int f_labeled);
1259 void point_collinearity_graph(int *Adj, int verbose_level);
1260 // G[nb_points() * nb_points()]
1261 void line_intersection_graph(int *Adj, int verbose_level);
1262 // G[nb_lines() * nb_lines()]
1263 void latex_it(std::ostream &ost, data_structures::partitionstack &P);
1264 void rearrange(int *&Vi, int &nb_V,
1265 int *&Bj, int &nb_B, int *&R, int *&X, data_structures::partitionstack &P);
1266 void decomposition_print_tex(std::ostream &ost,
1267 data_structures::partitionstack &PStack, int f_row_tactical, int f_col_tactical,
1268 int f_detailed, int f_local_coordinates, int verbose_level);
1270 int f_tdo_steps, int f_tdo_depth, int tdo_depth,
1271 int f_write_tdo_files, int f_pic,
1272 int f_include_tdo_scheme, int f_include_tdo_extra,
1273 int f_write_tdo_class_files,
1274 int verbose_level);
1276 int f_write_tdo_files,
1277 int f_pic,
1278 int f_include_tdo_scheme,
1279 int verbose_level);
1281 int TDO_depth,
1282 int f_write_tdo_files,
1283 int f_pic,
1284 int f_include_tdo_scheme,
1285 int f_include_extra,
1286 int verbose_level);
1288 int verbose_level);
1290 int f_row_part, int nb_row_parts, int *row_parts,
1291 int f_col_part, int nb_col_parts, int *col_parts,
1292 int nb_distinguished_point_sets,
1293 int **distinguished_point_sets,
1294 int *distinguished_point_set_size,
1295 int nb_distinguished_line_sets,
1296 int **distinguished_line_sets,
1297 int *distinguished_line_set_size,
1298 int verbose_level);
1300 int nb_distinguished_point_sets,
1301 int nb_distinguished_line_sets,
1302 int Aut_counter, int *Aut, int *Base, int Base_length,
1303 int verbose_level);
1304 void print_aut_generators(int Aut_counter, int *Aut,
1305 int Base_length, int *Base, int *Transversal_length);
1307 int *&Adj, int &v, int *&partition,
1308 int f_row_part, int nb_row_parts, int *row_parts,
1309 int f_col_part, int nb_col_parts, int *col_parts,
1310 int nb_distinguished_point_sets,
1311 int **distinguished_point_sets,
1312 int *distinguished_point_set_size,
1313 int nb_distinguished_line_sets,
1314 int **distinguished_line_sets,
1315 int *distinguished_line_set_size,
1316 int verbose_level);
1317 // side effect: the distinguished sets
1318 // will be sorted afterwards
1320 int *&M, int &nb_rows, int &nb_cols,
1321 int &total, int *&partition,
1322 int f_row_part, int nb_row_parts, int *row_parts,
1323 int f_col_part, int nb_col_parts, int *col_parts,
1324 int nb_distinguished_point_sets,
1325 int **distinguished_point_sets,
1326 int *distinguished_point_set_size,
1327 int nb_distinguished_line_sets,
1328 int **distinguished_line_sets,
1329 int *distinguished_line_set_size,
1330 int verbose_level);
1333 long int *canonical_labeling, int verbose_level);
1334 void save_as_csv(std::string &fname_csv, int verbose_level);
1335 void init_large_set(
1336 long int *blocks,
1337 int N_points, int design_b, int design_k, int partition_class_size,
1338 int *&partition, int verbose_level);
1339};
1340
1341
1342
1343
1344
1345// #############################################################################
1346// klein_correspondence.cpp
1347// #############################################################################
1348
1349
1351
1352
1354public:
1355
1356 // Pluecker coordinates of a line in PG(3,q) are:
1357 // (p_1,p_2,p_3,p_4,p_5,p_6) =
1358 // (Pluecker_12, Pluecker_34, Pluecker_13,
1359 // Pluecker_42, Pluecker_14, Pluecker_23)
1360 // satisfying the quadratic form p_1p_2 + p_3p_4 + p_5p_6 = 0
1361 // Here, the line is given as the rowspan of the matrix
1362 // x_1 x_2 x_3 x_4
1363 // y_1 y_2 y_3 y_4
1364 // and
1365 // Pluecker_ij is the determinant of the 2 x 2 submatrix
1366 // formed by restricting the generator matrix to columns i and j.
1367
1372 int q;
1373 long int nb_Pts; // number of points on the Klein quadric
1374 long int nb_pts_PG; // number of points in PG(5,q)
1375
1378
1380
1381 int *Form; // [d * d]
1382
1383 //long int *Line_to_point_on_quadric; // [P3->N_lines]
1384 //long int *Point_on_quadric_to_line; // [P3->N_lines]
1385
1386 // too much storage:
1387 //long int *Point_on_quadric_embedded_in_P5; // [P3->N_lines]
1388 //int *coordinates_of_quadric_points; // [P3->N_lines * d]
1389 //int *Pt_rk; // [P3->N_lines]
1390
1391 //int *Pt_idx; // [nb_pts_PG] too memory intense
1392
1395 void null();
1396 void freeself();
1397 void init(
1400 int verbose_level);
1401 void plane_intersections(long int *lines_in_PG3, int nb_lines,
1403 long int **&Pts_on_plane,
1404 int *&nb_pts_on_plane,
1405 int &nb_planes,
1406 int verbose_level);
1407 long int point_on_quadric_embedded_in_P5(long int pt);
1408 long int line_to_point_on_quadric(long int line_rk, int verbose_level);
1409 void line_to_Pluecker(long int line_rk, int *v6, int verbose_level);
1410 long int point_on_quadric_to_line(long int point_rk, int verbose_level);
1411 void Pluecker_to_line(int *v6, int *basis_line, int verbose_level);
1412 long int Pluecker_to_line_rk(int *v6, int verbose_level);
1413 void exterior_square_to_line(int *v, int *basis_line, int verbose_level);
1414 void compute_external_lines(std::vector<long int> &External_lines, int verbose_level);
1416 spread_tables *T,
1417 std::vector<long int> &External_lines,
1418 long int *&spread_to_external_line_idx,
1419 long int *&external_line_to_spread,
1420 int verbose_level);
1421 // spread_to_external_line_idx[i] is index into External_lines
1422 // corresponding to regular spread i
1423 // external_line_to_spread[i] is the index of the
1424 // regular spread of PG(3,q) in table T associated with
1425 // External_lines[i]
1426 void reverse_isomorphism(int *A6, int *A4, int verbose_level);
1427
1428};
1429
1430
1431// #############################################################################
1432// knarr.cpp
1433// #############################################################################
1434
1436
1437
1438
1439class knarr {
1440public:
1441 int q;
1443
1448 long int *BLT;
1450 int *Basis;
1462 int q2;
1463 int q5;
1464 int v5[5];
1465 int v6[6];
1466
1467 knarr();
1468 ~knarr();
1469 void freeself();
1470 void init(field_theory::finite_field *F, int BLT_no, int verbose_level);
1471 void points_and_lines(int verbose_level);
1472 void incidence_matrix(int *&Inc, int &nb_points,
1473 int &nb_lines, int verbose_level);
1474
1475};
1476
1477
1478// #############################################################################
1479// object_with_canonical_form.cpp
1480// #############################################################################
1481
1482
1484
1485
1486
1488public:
1490
1492 // t_PTS = a multiset of points
1493 // t_LNS = a set of lines
1494 // t_PNL = a set of points and a set of lines
1495 // t_PAC = a packing (i.e. q^2+q+1 sets of lines of size q^2+1)
1496 // t_INC = incidence geometry
1497 // t_LS = large set
1498
1499 std::string input_fname;
1502 long int known_ago;
1503
1504 std::string set_as_string;
1505
1506 long int *set;
1507 int sz;
1508 // set[sz] is used by t_PTS, t_LNS, t_INC
1509
1510 // for t_PNL:
1511 long int *set2;
1512 int sz2;
1513
1514
1515 // if t_INC or t_LS
1516 int v;
1517 int b;
1519 int *partition; // [v + b], do not free !
1520
1521 // if t_LS
1524
1525 // t_PAC = packing, uses SoS
1527 // SoS is used by t_PAC
1528
1530 // used to determine multiplicities in the set of points
1531
1534 void print(std::ostream &ost);
1535 void print_rows(std::ostream &ost,
1536 int f_show_incma, int verbose_level);
1537 void print_tex_detailed(std::ostream &ost,
1538 int f_show_incma, int verbose_level);
1539 void print_tex(std::ostream &ost);
1540 void get_packing_as_set_system(long int *&Sets,
1541 int &nb_sets, int &set_size, int verbose_level);
1542 void init_point_set(
1543 long int *set, int sz,
1544 int verbose_level);
1546 std::string &set_text,
1547 int verbose_level);
1548 void init_line_set(
1549 long int *set, int sz,
1550 int verbose_level);
1552 std::string &set_text,
1553 int verbose_level);
1555 long int *set, int sz,
1556 long int *set2, int sz2,
1557 int verbose_level);
1559 std::string &set_text,
1560 std::string &set2_text,
1561 int verbose_level);
1563 long int *packing, int sz,
1564 int verbose_level);
1566 std::string &packing_text,
1567 int q,
1568 int verbose_level);
1570 data_structures::set_of_sets *SoS, int verbose_level);
1572 long int *data,
1573 long int *Spread_table, int nb_spreads, int spread_size,
1574 int q,
1575 int verbose_level);
1577 long int *data, int data_sz, int v, int b, int nb_flags,
1578 int verbose_level);
1580 std::vector<int> &Flags, int v, int b, int nb_flags,
1581 int verbose_level);
1583 std::string &data,
1584 int v, int b, int nb_flags,
1585 int verbose_level);
1587 std::string &data,
1588 int v, int b, int r,
1589 int verbose_level);
1590 void init_large_set(
1591 long int *data, int data_sz, int v, int b, int k, int design_sz,
1592 int verbose_level);
1594 std::string &data_text, int v, int k, int design_sz,
1595 int verbose_level);
1596 void encoding_size(
1597 int &nb_rows, int &nb_cols,
1598 int verbose_level);
1600 int &nb_rows, int &nb_cols,
1601 int verbose_level);
1603 int &nb_rows, int &nb_cols,
1604 int verbose_level);
1606 int &nb_rows, int &nb_cols,
1607 int verbose_level);
1609 int &nb_rows, int &nb_cols,
1610 int verbose_level);
1612 int &nb_rows, int &nb_cols,
1613 int verbose_level);
1615 int &nb_rows, int &nb_cols,
1616 int verbose_level);
1618 int *canonical_labeling,
1620 int verbose_level);
1621 void encode_incma(
1623 int verbose_level);
1624 void encode_point_set(
1626 int verbose_level);
1627 void encode_line_set(
1629 int verbose_level);
1632 int verbose_level);
1633 void encode_packing(
1635 int verbose_level);
1636 void encode_large_set(
1638 int verbose_level);
1641 int verbose_level);
1644 incidence_structure *&Inc,
1646 int verbose_level);
1647 void encode_object(long int *&encoding, int &encoding_sz,
1648 int verbose_level);
1649 void encode_object_points(long int *&encoding, int &encoding_sz,
1650 int verbose_level);
1651 void encode_object_lines(long int *&encoding, int &encoding_sz,
1652 int verbose_level);
1654 long int *&encoding, int &encoding_sz,
1655 int verbose_level);
1657 long int *&encoding, int &encoding_sz,
1658 int verbose_level);
1660 long int *&encoding, int &encoding_sz, int verbose_level);
1662 long int *&encoding, int &encoding_sz, int verbose_level);
1663 //void klein(int verbose_level);
1664 void run_nauty(
1665 int f_compute_canonical_form,
1666 data_structures::bitvector *&Canonical_form,
1668 int verbose_level);
1669 void canonical_labeling(
1671 int verbose_level);
1672 void run_nauty_basic(
1674 int verbose_level);
1675
1676};
1677
1678
1679
1680// #############################################################################
1681// point_line.cpp
1682// #############################################################################
1683
1685
1686
1688 int *points_on_lines; // [nb_pts * (plane_order + 1)]
1689 int *line_through_two_points; // [nb_pts * nb_pts]
1690};
1691
1692
1694
1695
1697
1698public:
1700
1701 int m, n;
1702 int *a; // the same as in PB
1703#if 0
1704 int f_joining;
1705 int f_point_pair_joining_allocated;
1706 int m2; // m choose 2
1707 int *point_pair_to_idx; // [m * m]
1708 int *idx_to_point_i; // [m choose 2]
1709 int *idx_to_point_j; // [m choose 2]
1710 int max_point_pair_joining;
1711 int *nb_point_pair_joining; // [m choose 2]
1712 int *point_pair_joining; // [(m choose 2) * max_point_pair_joining]
1713
1714 int f_block_pair_joining_allocated;
1715 int n2; // n choose 2
1716 int *block_pair_to_idx; // [n * n]
1717 int *idx_to_block_i; // [n choose 2]
1718 int *idx_to_block_j; // [n choose 2]
1719 int max_block_pair_joining;
1720 int *nb_block_pair_joining; // [n choose 2]z
1721 int *block_pair_joining; // [(n choose 2) * max_block_pair_joining]
1722#endif
1723
1724 // plane_data:
1726 int plane_order; // order = prime ^ exponent
1731 // indicates whether or not plane and dual_plane
1732 // have been computed by init_plane_data()
1733
1736
1737 // data for the coordinatization:
1742
1744 int *pt_labels; // [m]
1745 int *points; // [m]
1746 // pt_labels and points are mutually
1747 // inverse permutations of {0,1,...,m-1}
1748 // the affine point (x,y) is labeled as x * plane_order + y
1749
1750 int *pts_on_line_x_eq_y; // [plane_order + 1];
1751 int *pts_on_line_x_eq_y_labels; // [plane_order + 1];
1752 int *lines_through_X; // [plane_order + 1];
1753 int *lines_through_Y; // [plane_order + 1];
1754 int *pts_on_line; // [plane_order + 1];
1755 int *MOLS; // [(plane_order + 1) * plane_order * plane_order]
1756 int *field_element; // [plane_order]
1757 int *field_element_inv; // [plane_order]
1758
1759
1760 int is_desarguesian_plane(int verbose_level);
1761 int identify_field_not_of_prime_order(int verbose_level);
1762 void init_projective_plane(int order, int verbose_level);
1763 void free_projective_plane();
1764 void plane_report(std::ostream &ost);
1765 int plane_line_through_two_points(int pt1, int pt2);
1766 int plane_line_intersection(int line1, int line2);
1767 void plane_get_points_on_line(int line, int *pts);
1768 void plane_get_lines_through_point(int pt, int *lines);
1769 int plane_points_collinear(int pt1, int pt2, int pt3);
1770 int plane_lines_concurrent(int line1, int line2, int line3);
1771 int plane_first_quadrangle(int &pt1, int &pt2, int &pt3, int &pt4);
1772 int plane_next_quadrangle(int &pt1, int &pt2, int &pt3, int &pt4);
1773 int plane_quadrangle_first_i(int *pt, int i);
1774 int plane_quadrangle_next_i(int *pt, int i);
1775 void coordinatize_plane(int O, int I, int X, int Y, int *MOLS, int verbose_level);
1776 // needs pt_labels, points, pts_on_line_x_eq_y, pts_on_line_x_eq_y_labels,
1777 // lines_through_X, lines_through_Y, pts_on_line, MOLS to be allocated
1778 int &MOLSsxb(int s, int x, int b);
1779 int &MOLSaddition(int a, int b);
1780 int &MOLSmultiplication(int a, int b);
1781 int ternary_field_is_linear(int *MOLS, int verbose_level);
1782 void print_MOLS(std::ostream &ost);
1783
1784 int is_projective_plane(data_structures::partitionstack &P, int &order, int verbose_level);
1785 // if it is a projective plane, the order is returned.
1786 // otherwise, 0 is returned.
1787 int count_RC(data_structures::partitionstack &P, int row_cell, int col_cell);
1788 int count_CR(data_structures::partitionstack &P, int col_cell, int row_cell);
1790 int row_cell, int row_cell_pt, int col_cell);
1792 int col_cell, int col_cell_pt, int row_cell);
1794 int row_cell1, int row_cell2, int col_cell);
1796 int col_cell1, int col_cell2, int row_cell);
1798 int row_cell1, int row_cell_pt, int row_cell2, int col_cell);
1799 // returns the number of joinings from a point of
1800 // row_cell1 to elements of row_cell2 within col_cell
1801 // if that number exists, -1 otherwise
1803 int col_cell1, int col_cell_pt, int col_cell2, int row_cell);
1804 // returns the number of joinings from a point of
1805 // col_cell1 to elements of col_cell2 within row_cell
1806 // if that number exists, -1 otherwise
1807 void get_MOLm(int *MOLS, int order, int m, int *&M);
1808
1809};
1810
1811
1812
1813
1814// #############################################################################
1815// points_and_lines.cpp
1816// #############################################################################
1817
1819
1820
1821
1823
1824public:
1825
1827
1828 long int *Pts;
1830
1831
1832 long int *Lines;
1834
1835
1838 void init(projective_space *P, std::vector<long int> &Points, int verbose_level);
1839 void unrank_point(int *v, long int rk);
1840 long int rank_point(int *v);
1841 void print_all_points(std::ostream &ost);
1842 void print_all_lines(std::ostream &ost);
1843 void print_lines_tex(std::ostream &ost);
1844 void write_points_to_txt_file(std::string &label, int verbose_level);
1845
1846
1847};
1848
1849
1850// #############################################################################
1851// polarity.cpp
1852// #############################################################################
1853
1855
1856
1858
1859public:
1860
1862
1863 int *Point_to_hyperplane; // [P->N_points]
1864 int *Hyperplane_to_point; // [P->N_points]
1865
1866
1867 polarity();
1868 ~polarity();
1869 void init_standard_polarity(projective_space *P, int verbose_level);
1870 void init_general_polarity(projective_space *P, int *Mtx, int verbose_level);
1871 void init_reversal_polarity(projective_space *P, int verbose_level);
1872 void report(std::ostream &f);
1873
1874};
1875
1876
1877
1878// #############################################################################
1879// projective_space_implementation.cpp
1880// #############################################################################
1881
1883
1884
1886
1887public:
1888
1890
1892
1893 int *Lines; // [N_lines * k]
1894 int *Lines_on_point; // [N_points * r]
1895 int *Line_through_two_points; // [N_points * N_points]
1896 int *Line_intersection; // [N_lines * N_lines]
1897
1898 int *v; // [n + 1]
1899 int *w; // [n + 1]
1900
1901
1904 void init(projective_space *P, int verbose_level);
1905
1906};
1907
1908
1909// #############################################################################
1910// projective_space.cpp
1911// #############################################################################
1912
1914
1915
1917
1918public:
1919
1922 grassmann *Grass_hyperplanes; // if n > 2 (for n=3, planes and hyperplanes are the same thing)
1923
1925
1928
1929 int n; // projective dimension
1930 int q;
1932 long int *Nb_subspaces; // [n + 1]
1933 // Nb_subspaces[i] = generalized_binomial(n + 1, i + 1, q);
1934 // N_points = Nb_subspaces[0]
1935 // N_lines = Nb_subspaces[1];
1936
1937 int r; // number of lines on a point
1938 int k; // number of points on a line
1939
1941
1942
1945
1947
1948 int *v; // [n + 1]
1949 int *w; // [n + 1]
1950 int *Mtx; // [3 * (n + 1)]
1951 int *Mtx2; // [3 * (n + 1)]
1952
1955 void freeself();
1957 int f_init_incidence_structure,
1958 int verbose_level);
1959 void init_incidence_structure(int verbose_level);
1960 void init_polarity(int verbose_level);
1961 void intersect_with_line(long int *set, int set_sz,
1962 int line_rk, long int *intersection, int &sz, int verbose_level);
1963 void create_points_on_line(long int line_rk, long int *line,
1964 int verbose_level);
1965 // needs line[k]
1967 long int point_rk, long int *line_pencil, int verbose_level);
1969 long int point_rk, long int plane_rk,
1970 long int *line_pencil, int verbose_level);
1972 long int line_rk, int pt_rk, int verbose_level);
1973 // pt_rk is between 0 and q-1.
1974 void make_incidence_matrix(int &m, int &n,
1975 int *&Inc, int verbose_level);
1977 std::vector<int> &Pts, std::vector<int> &Lines,
1978 int *&Inc, int verbose_level);
1979 int is_incident(int pt, int line);
1980 void incidence_m_ii(int pt, int line, int a);
1982 incidence_structure *&Inc,
1983 data_structures::partitionstack *&Stack, int verbose_level);
1984 void incma_for_type_ij(
1985 int row_type, int col_type,
1986 int *&Incma, int &nb_rows, int &nb_cols,
1987 int verbose_level);
1988 // row_type, col_type are the vector space dimensions of the objects
1989 // indexing rows and columns.
1991 int row_type, int col_type,
1992 incidence_structure *&Inc,
1994 int verbose_level);
1995 long int nb_rk_k_subspaces_as_lint(int k);
1996 void print_set_of_points(std::ostream &ost, long int *Pts, int nb_pts);
1997 void print_all_points();
1998 long int rank_point(int *v);
1999 void unrank_point(int *v, long int rk);
2000 void unrank_points(int *v, long int *Rk, int sz);
2001 long int rank_line(int *basis);
2002 void unrank_line(int *basis, long int rk);
2003 void unrank_lines(int *v, long int *Rk, int nb);
2004 long int rank_plane(int *basis);
2005 void unrank_plane(int *basis, long int rk);
2006 long int line_through_two_points(long int p1, long int p2);
2007 int test_if_lines_are_disjoint(long int l1, long int l2);
2008 int test_if_lines_are_disjoint_from_scratch(long int l1, long int l2);
2009 int intersection_of_two_lines(long int l1, long int l2);
2010
2011 int determine_line_in_plane(long int *two_input_pts,
2012 int *three_coeffs,
2013 int verbose_level);
2014 int nonconical_six_arc_get_nb_Eckardt_points(long int *Arc6, int verbose_level);
2015 int conic_test(long int *S, int len, int pt, int verbose_level);
2016 int test_if_conic_contains_point(int *six_coeffs, int pt);
2018 long int *input_pts, int nb_pts,
2019 int *six_coeffs,
2020 int verbose_level);
2021 // returns FALSE is the rank of the
2022 // coefficient matrix is not 5.
2023 // TRUE otherwise.
2026 int nb_pts, long int *Pts, int *coeff10,
2027 int verbose_level);
2028
2029 void determine_quadric_in_solid(long int *nine_pts_or_more, int nb_pts,
2030 int *ten_coeffs, int verbose_level);
2031 void conic_points_brute_force(int *six_coeffs,
2032 long int *points, int &nb_points, int verbose_level);
2033 void quadric_points_brute_force(int *ten_coeffs,
2034 long int *points, int &nb_points, int verbose_level);
2035 void conic_points(long int *five_pts, int *six_coeffs,
2036 long int *points, int &nb_points, int verbose_level);
2037 void find_tangent_lines_to_conic(int *six_coeffs,
2038 long int *points, int nb_points,
2039 long int *tangents, int verbose_level);
2040
2041
2042 void line_intersection_type(long int *set, int set_size, int *type,
2043 int verbose_level);
2044 void line_intersection_type_basic(long int *set, int set_size, int *type,
2045 int verbose_level);
2046 // type[N_lines]
2048 long int *lines_by_rank, int nb_lines,
2049 long int *set, int set_size, int *type, int verbose_level);
2050 // type[nb_lines]
2052 long int *set, int set_size,
2053 int *type, int verbose_level);
2054 // type[N_lines]
2055 void find_secant_lines(
2056 long int *set, int set_size,
2057 long int *lines, int &nb_lines, int max_lines,
2058 int verbose_level);
2060 std::vector<long int> &Points,
2061 std::vector<long int> &Lines,
2062 int verbose_level);
2064 long int *point_rks, int nb_points,
2065 long int *plane_rks, int nb_planes,
2066 int *&M, int verbose_level);
2067 void plane_intersection_type_basic(long int *set, int set_size,
2068 int *type, int verbose_level);
2069 // type[N_planes]
2070 void hyperplane_intersection_type_basic(long int *set, int set_size,
2071 int *type, int verbose_level);
2072 // type[N_hyperplanes]
2073 void line_intersection_type_collected(long int *set, int set_size,
2074 int *type_collected, int verbose_level);
2075 // type[set_size + 1]
2076 void point_types_of_line_set(long int *set_of_lines, int set_size,
2077 int *type, int verbose_level);
2079 int *set_of_lines, int set_size,
2080 int *type, int verbose_level);
2081 void find_external_lines(long int *set, int set_size,
2082 long int *external_lines, int &nb_external_lines,
2083 int verbose_level);
2084 void find_tangent_lines(long int *set, int set_size,
2085 long int *tangent_lines, int &nb_tangent_lines,
2086 int verbose_level);
2087 void find_secant_lines(
2088 long int *set, int set_size,
2089 long int *secant_lines, int &nb_secant_lines,
2090 int verbose_level);
2091 void find_k_secant_lines(long int *set, int set_size, int k,
2092 long int *secant_lines, int &nb_secant_lines,
2093 int verbose_level);
2094 void Baer_subline(long int *pts3, long int *&pts, int &nb_pts,
2095 int verbose_level);
2096 int is_contained_in_Baer_subline(long int *pts, int nb_pts,
2097 int verbose_level);
2098 void report_summary(std::ostream &ost);
2099 void report(std::ostream &ost,
2101 int verbose_level);
2102 void export_incidence_matrix_to_csv(int verbose_level);
2103 void make_fname_incidence_matrix_csv(std::string &fname);
2106 int verbose_level);
2107 void create_latex_report_for_Grassmannian(int k, int verbose_level);
2110 incidence_structure *&Inc,
2111 data_structures::partitionstack *&Stack, int verbose_level);
2115 incidence_structure *&Inc,
2117 int verbose_level);
2118 void polarity_rank_k_subspace(int k,
2119 long int rk_in, long int &rk_out, int verbose_level);
2120
2121 // projective_space2.cpp:
2122 void print_set_numerical(std::ostream &ost, long int *set, int set_size);
2123 void print_set(long int *set, int set_size);
2124 void print_line_set_numerical(long int *set, int set_size);
2125 int determine_hermitian_form_in_plane(int *pts, int nb_pts,
2126 int *six_coeffs, int verbose_level);
2127 void circle_type_of_line_subset(int *pts, int nb_pts,
2128 int *circle_type, int verbose_level);
2129 // circle_type[nb_pts]
2130 void create_unital_XXq_YZq_ZYq_brute_force(long int *U, int &sz, int verbose_level);
2132 grassmann *G, int rk, long int *set, int set_size,
2133 long int *&intersection_set, int &intersection_set_size,
2134 int verbose_level);
2136 grassmann *G, ring_theory::longinteger_object &rk, long int *set, int set_size,
2137 long int *&intersection_set, int &intersection_set_size,
2138 int verbose_level);
2140 long int *set, int set_size,
2141 int *&intersection_type, int &highest_intersection_number,
2142 int *&intersection_matrix, int &nb_planes,
2143 int verbose_level);
2145 long int *set, int set_size,
2146 int *&intersection_type, int &highest_intersection_number,
2147 int verbose_level);
2149 long int *set, int set_size,
2151 int verbose_level);
2153 long int *set, int set_size,
2154 ring_theory::longinteger_object *&R, long int **&Pts_on_plane,
2155 int *&nb_pts_on_plane, int &len,
2156 int verbose_level);
2158 long int *set, int set_size,
2159 ring_theory::longinteger_object *&R, long int **&Pts_on_plane,
2160 int *&nb_pts_on_plane, int &len,
2161 int verbose_level);
2163 long int *set, int set_size,
2164 int s,
2165 std::vector<int> &plane_ranks,
2166 int verbose_level);
2167 void plane_intersection(int plane_rank,
2168 long int *set, int set_size,
2169 std::vector<int> &point_indices,
2170 std::vector<int> &point_local_coordinates,
2171 int verbose_level);
2172 void line_intersection(int line_rank,
2173 long int *set, int set_size,
2174 std::vector<int> &point_indices,
2175 int verbose_level);
2177 long int *set_in, int set_size, long int *set_out, int verbose_level);
2178 // Computes the Pluecker coordinates for a line in PG(3,q)
2179 // in the following order:
2180 // (x_1,x_2,x_3,x_4,x_5,x_6) =
2181 // (Pluecker_12, Pluecker_34, Pluecker_13, Pluecker_42,
2182 // Pluecker_14, Pluecker_23)
2183 // satisfying the quadratic form
2184 // x_1x_2 + x_3x_4 + x_5x_6 = 0
2185 void Pluecker_coordinates(int line_rk, int *v6, int verbose_level);
2187 int *table, int verbose_level);
2188 void cheat_sheet_points(std::ostream &f, int verbose_level);
2189 void cheat_polarity(std::ostream &f, int verbose_level);
2190 void cheat_sheet_point_table(std::ostream &f, int verbose_level);
2191 void cheat_sheet_points_on_lines(std::ostream &f, int verbose_level);
2192 void cheat_sheet_lines_on_points(std::ostream &f, int verbose_level);
2193 void cheat_sheet_subspaces(std::ostream &f, int k, int verbose_level);
2194 void do_pluecker_reverse(std::ostream &ost, grassmann *Gr,
2195 int k, int nb_k_subspaces, int verbose_level);
2196 void cheat_sheet_line_intersection(std::ostream &f, int verbose_level);
2197 void cheat_sheet_line_through_pairs_of_points(std::ostream &f,
2198 int verbose_level);
2199 void conic_type_randomized(int nb_times,
2200 long int *set, int set_size,
2201 long int **&Pts_on_conic, int *&nb_pts_on_conic, int &len,
2202 int verbose_level);
2203 void conic_intersection_type(int f_randomized, int nb_times,
2204 long int *set, int set_size,
2205 int threshold,
2206 int *&intersection_type, int &highest_intersection_number,
2207 int f_save_largest_sets, data_structures::set_of_sets *&largest_sets,
2208 int verbose_level);
2210 long int *set, int set_size,
2211 std::vector<int> &Rk,
2212 int verbose_level);
2213 void conic_type(
2214 long int *set, int set_size,
2215 int threshold,
2216 long int **&Pts_on_conic, int **&Conic_eqn, int *&nb_pts_on_conic, int &nb_conics,
2217 int verbose_level);
2218 void find_nucleus(int *set, int set_size, int &nucleus,
2219 int verbose_level);
2220 void points_on_projective_triangle(long int *&set, int &set_size,
2221 long int *three_points, int verbose_level);
2222 void elliptic_curve_addition_table(int *A6, int *Pts, int nb_pts,
2223 int *&Table, int verbose_level);
2224 int elliptic_curve_addition(int *A6, int p1_rk, int p2_rk,
2225 int verbose_level);
2226 void line_plane_incidence_matrix_restricted(long int *Lines, int nb_lines,
2227 int *&M, int &nb_planes, int verbose_level);
2228 int test_if_lines_are_skew(int line1, int line2, int verbose_level);
2230 long int line1,
2231 long int line2, int verbose_level);
2233 long int line,
2234 int plane, int verbose_level);
2236 long int plane1, long int plane2, int verbose_level);
2238 long int line1, long int line2, int pt, int verbose_level);
2239 long int
2241 long int plane1, long int plane2, int verbose_level);
2243 long int *Planes,
2244 int nb_planes, int *&Intersection_matrix,
2245 int verbose_level);
2247 int *eqn3, int verbose_level);
2249 long int line_rank, int verbose_level);
2251 int *eqn4, int verbose_level);
2252 long int dual_rank_of_plane_in_three_space(long int plane_rank,
2253 int verbose_level);
2255 long int *three_lines,
2256 int *plane_eqn4, int verbose_level);
2258 int nb_subsets, int *sz, int **subsets,
2259 incidence_structure *&Inc,
2261 int verbose_level);
2262
2263
2265 long int line_rk, std::vector<long int> &plane_ranks,
2266 int verbose_level);
2268 long int line1_from, long int line2_from,
2269 long int line1_to, long int line2_to, int verbose_level);
2271 std::string line1_from_text, std::string line2_from_text,
2272 std::string line1_to_text, std::string line2_to_text,
2273 int verbose_level);
2274
2275
2276
2277 // projective_space3.cpp:
2279 int *Elt, int *Mtx, int &frobenius,
2280 int verbose_level);
2281 void create_ovoid(
2282 std::string &label_txt,
2283 std::string &label_tex,
2284 int &nb_pts, long int *&Pts,
2285 int verbose_level);
2286 void create_ovoid_ST(
2287 std::string &label_txt,
2288 std::string &label_tex,
2289 int &nb_pts, long int *&Pts,
2290 int verbose_level);
2292 std::string &label_txt,
2293 std::string &label_tex,
2294 int &nb_pts, long int *&Pts,
2295 int verbose_level);
2297 std::string &label_txt,
2298 std::string &label_tex,
2299 int &nb_pts, long int *&Pts,
2300 int verbose_level);
2302 int elliptic_curve_b, int elliptic_curve_c,
2303 std::string &label_txt,
2304 std::string &label_tex,
2305 int &nb_pts, long int *&Pts,
2306 int verbose_level);
2308 std::string &label_txt,
2309 std::string &label_tex,
2310 int &nb_pts, long int *&Pts,
2311 int verbose_level);
2312 void create_whole_space(
2313 std::string &label_txt,
2314 std::string &label_tex,
2315 int &nb_pts, long int *&Pts,
2316 int verbose_level);
2317 void create_hyperplane(
2318 int pt,
2319 std::string &label_txt,
2320 std::string &label_tex,
2321 int &nb_pts, long int *&Pts,
2322 int verbose_level);
2323
2324
2325};
2326
2327
2328// #############################################################################
2329// spread_tables.cpp
2330// #############################################################################
2331
2333
2334
2336
2337public:
2338 int q;
2339 int d; // = 4
2341 projective_space *P; // PG(3,q)
2342 grassmann *Gr; // Gr_{4,2}
2343 long int nb_lines;
2346
2347 std::string prefix;
2348
2351 std::string fname_spreads;
2356
2357 int *dual_line_idx; // [nb_lines]
2358 int *self_dual_lines; // [nb_self_dual_lines]
2360
2362 long int *spread_table; // [nb_spreads * spread_size]
2363 int *spread_iso_type; // [nb_spreads]
2364 long int *dual_spread_idx; // [nb_spreads]
2365 long int *self_dual_spreads; // [nb_self_dual_spreads]
2367
2368 int *schreier_table; // [nb_spreads * 4]
2369
2370 spread_tables();
2372 void init(projective_space *P,
2373 int f_load,
2375 std::string &path_to_spread_tables,
2376 int verbose_level);
2377 void create_file_names(int verbose_level);
2379 long int *spread_table, int *spread_iso_type,
2380 int verbose_level);
2381 void init_tables(int nb_spreads,
2382 long int *spread_table, int *spread_iso_type,
2383 long int *dual_spread_idx,
2385 int verbose_level);
2387 int verbose_level);
2388 void init_reduced(
2389 int nb_select, int *select,
2390 spread_tables *old_spread_table,
2391 std::string &path_to_spread_tables,
2392 int verbose_level);
2393 long int *get_spread(int spread_idx);
2394 void find_spreads_containing_two_lines(std::vector<int> &v,
2395 int line1, int line2, int verbose_level);
2396
2397 void classify_self_dual_spreads(int *&type,
2399 int verbose_level);
2400 int files_exist(int verbose_level);
2401 void save(int verbose_level);
2402 void load(int verbose_level);
2405 int verbose_level);
2406 int test_if_spreads_are_disjoint(int a, int b);
2407 void compute_dual_spreads(long int **Sets,
2408 long int *&Dual_spread_idx,
2409 long int *&self_dual_spread_idx,
2411 int verbose_level);
2413 long int *set1, int sz1,
2414 long int *set2, int sz2,
2415 int verbose_level);
2416 int test_if_set_of_spreads_is_line_disjoint(long int *set, int len);
2419 long int *live_point_index, int nb_live_points,
2420 long int *live_blocks, int nb_live_blocks,
2421 int nb_needed,
2422 int verbose_level);
2424 long int *list_of_lines, long int *packing, int sz_of_packing,
2425 int verbose_level);
2426 // list_of_lines[sz_of_packing * spread_size]
2428 int *Partial_packings, int nb_pp, int sz,
2429 int *&Iso_type_invariant,
2430 int verbose_level);
2431 void report_one_spread(std::ostream &ost, int a);
2432
2433};
2434
2435
2436
2437
2438// #############################################################################
2439// W3q.cpp
2440// #############################################################################
2441
2443
2444
2445class W3q {
2446public:
2447 int q;
2448
2452 int *Basis; // [2 * 4]
2453
2455 // number of absolute lines of W(3,q)
2456 // = number of points on Q(4,q)
2457 int *Lines; // [nb_lines]
2458 // Lines[] is a list of all absolute lines of the symplectic polarity
2459 // as lines in PG(3,q)
2460
2461 int *Q4_rk; // [nb_lines]
2462 int *Line_idx; // [nb_lines]
2463 // Q4_rk[] and Line_idx[] are inverse permutations
2464 // for a line a, Q4_rk[a] is the point b on the quadric corresponding to it.
2465 // For a quadric point b, Line_idx[b] is the line index a corresponding to it
2466
2467 int v5[5];
2468
2469 W3q();
2470 ~W3q();
2471 void null();
2472 void freeself();
2473 void init(field_theory::finite_field *F, int verbose_level);
2474 void find_lines(int verbose_level);
2475 void print_lines();
2476 int evaluate_symplectic_form(int *x4, int *y4);
2477 void isomorphism_Q4q(int *x4, int *y4, int *v);
2478 void print_by_lines();
2479 void print_by_points();
2480 int find_line(int line);
2481};
2482
2483
2484
2485}}}
2486
2487
2488#endif /* ORBITER_SRC_LIB_FOUNDATIONS_GEOMETRY_GEOMETRY_H_ */
2489
2490
2491
2492
2493
2494
information about the Eckardt points of a surface derived from a six-arc
encoding of combinatorial object for use with nauty
matrices over GF(2) stored as bitvectors
compact storage of 0/1-data as bitvectors
data structure for set partitions following Jeffrey Leon
a statistical analysis of data consisting of single integers
a finite field as a vector space over a subfield
isomorphism between the W(3,q) and the Q(4,q) generalized quadrangles
Definition: geometry.h:2445
void init(field_theory::finite_field *F, int verbose_level)
Definition: w3q.cpp:67
orthogonal_geometry::orthogonal * Q4
Definition: geometry.h:2450
void isomorphism_Q4q(int *x4, int *y4, int *v)
Definition: w3q.cpp:199
void find_lines(int verbose_level)
Definition: w3q.cpp:148
field_theory::finite_field * F
Definition: geometry.h:2451
int evaluate_symplectic_form(int *x4, int *y4)
Definition: w3q.cpp:187
a line in the projective plane created using the Andre construction
Definition: geometry.h:104
a point in the projective plane created using the Andre construction
Definition: geometry.h:75
Andre / Bruck / Bose construction of a translation plane from a spread.
Definition: geometry.h:28
void init(field_theory::finite_field *F, int k, long int *spread_elements_numeric, int verbose_level)
void report(std::ostream &ost, int verbose_level)
void points_on_line(andre_construction_line_element *Line, int *pts_on_line, int verbose_level)
arcs, ovals, hyperovals etc. in projective planes
Definition: geometry.h:138
void GlynnI_hyperoval(long int *&Pts, int &nb_pts, int verbose_level)
Definition: arc_basic.cpp:97
void LunelliSce(int *pts18, int verbose_level)
Definition: arc_basic.cpp:549
void GlynnII_hyperoval(long int *&Pts, int &nb_pts, int verbose_level)
Definition: arc_basic.cpp:166
void Subiaco_hyperoval(long int *&Pts, int &nb_pts, int verbose_level)
Definition: arc_basic.cpp:324
void init(field_theory::finite_field *F, int verbose_level)
Definition: arc_basic.cpp:34
void Segre_hyperoval(long int *&Pts, int &nb_pts, int verbose_level)
Definition: arc_basic.cpp:49
void Subiaco_oval(long int *&Pts, int &nb_pts, int f_short, int verbose_level)
Definition: arc_basic.cpp:237
arcs, ovals, hyperovals etc. in projective planes
Definition: geometry.h:182
void arc_lifting_diophant(long int *arc, int arc_sz, int target_sz, int target_d, solvers::diophant *&D, int verbose_level)
int arc_test(long int *input_pts, int nb_pts, int verbose_level)
void create_subiaco_hyperoval(std::string &label_txt, std::string &label_tex, int &nb_pts, long int *&Pts, int verbose_level)
void arc_lifting3(int arc_size, int arc_d, int arc_d_low, int arc_s, std::string arc_input_set, std::string arc_label, int arc_t, std::string t_lines_string, int arc_u, std::string u_lines_string, int verbose_level)
void create_pasch_arc(long int *the_arc, int &size, int verbose_level)
void create_Payne_hyperoval(long int *the_arc, int &size, int verbose_level)
void create_subiaco_oval(int f_short, std::string &label_txt, std::string &label_tex, int &nb_pts, long int *&Pts, int verbose_level)
void create_regular_hyperoval(long int *the_arc, int &size, int verbose_level)
void arc_lifting2(int arc_size, int arc_d, int arc_d_low, int arc_s, std::string arc_input_set, std::string arc_label, int arc_t, std::string t_lines_string, int verbose_level)
void PG_2_8_create_conic_plus_nucleus_arc_2(long int *the_arc, int &size, int verbose_level)
void create_OKeefe_Penttila_hyperoval_32(long int *the_arc, int &size, int verbose_level)
void create_Segre_hyperoval(long int *the_arc, int &size, int verbose_level)
void create_Cherowitzo_hyperoval(long int *the_arc, int &size, int verbose_level)
void maximal_arc_by_diophant(int arc_sz, int arc_d, std::string &secant_lines_text, std::string &external_lines_as_subset_of_secants_text, solvers::diophant *&D, int verbose_level)
void compute_bisecants_and_conics(long int *arc6, int *&bisecants, int *&conics, int verbose_level)
void PG_2_8_create_conic_plus_nucleus_arc_1(long int *the_arc, int &size, int verbose_level)
void create_Maruta_Hamada_arc(long int *the_arc, int &size, int verbose_level)
void create_translation_hyperoval(long int *the_arc, int &size, int exponent, int verbose_level)
void arc_with_two_given_line_sets_diophant(long int *s_lines, int nb_s_lines, int arc_s, long int *t_lines, int nb_t_lines, int arc_t, int target_sz, int arc_d, int arc_d_low, int f_dualize, solvers::diophant *&D, int verbose_level)
void arc_with_three_given_line_sets_diophant(long int *s_lines, int nb_s_lines, int arc_s, long int *t_lines, int nb_t_lines, int arc_t, long int *u_lines, int nb_u_lines, int arc_u, int target_sz, int arc_d, int arc_d_low, int f_dualize, solvers::diophant *&D, int verbose_level)
void create_Cheon_arc(long int *the_arc, int &size, int verbose_level)
void create_hyperoval(int f_translation, int translation_exponent, int f_Segre, int f_Payne, int f_Cherowitzo, int f_OKeefe_Penttila, std::string &label_txt, std::string &label_tex, int &nb_pts, long int *&Pts, int verbose_level)
void create_Maruta_Hamada_arc2(long int *the_arc, int &size, int verbose_level)
void arc_lifting1(int arc_size, int arc_d, int arc_d_low, int arc_s, std::string arc_input_set, std::string arc_label, int verbose_level)
void arc_with_given_set_of_s_lines_diophant(long int *s_lines, int nb_s_lines, int target_sz, int arc_d, int arc_d_low, int arc_s, int f_dualize, solvers::diophant *&D, int verbose_level)
void init_ovoid_Uab_even(int a, int b, int verbose_level)
void init(field_theory::finite_field *Fq, field_theory::finite_field *FQ, int f_Uab, int a, int b, int f_classical, int verbose_level)
decomposition of an incidence matrix
Definition: geometry.h:400
data_structures::partitionstack * Stack
Definition: geometry.h:408
void print_row_decomposition_tex(std::ostream &ost, int f_enter_math, int f_print_subscripts, int verbose_level)
void compute_TDO(int max_depth, int verbose_level)
void init_incidence_matrix(int m, int n, int *M, int verbose_level)
void init_inc_and_stack(incidence_structure *Inc, data_structures::partitionstack *Stack, int verbose_level)
void print_column_decomposition_tex(std::ostream &ost, int f_enter_math, int f_print_subscripts, int verbose_level)
void compute_shadow(int *Basis, int basis_sz, int *is_in_shadow, int verbose_level)
void init(int n, int m, int s, field_theory::subfield_structure *SubS, int verbose_level)
void compute_linear_set(int *Basis, int basis_sz, long int *&the_linear_set, int &the_linear_set_sz, int verbose_level)
void compute_intersection_type(int k, int *subspace, int *intersection_dimensions, int verbose_level)
a maximal chain of subspaces
Definition: geometry.h:522
void unrank(long int rk, int *subspace, int verbose_level)
Definition: flag.cpp:168
void unrank_recursion(long int rk, int *subspace, int verbose_level)
Definition: flag.cpp:201
void init_recursion(int n, int *type, int type_len, int idx, field_theory::finite_field *F, int verbose_level)
Definition: flag.cpp:92
void init(int n, int *type, int type_len, field_theory::finite_field *F, int verbose_level)
Definition: flag.cpp:76
field_theory::finite_field * F
Definition: geometry.h:524
long int rank(int *subspace, int verbose_level)
Definition: flag.cpp:252
long int rank_recursion(int *subspace, int *big_space, int verbose_level)
Definition: flag.cpp:296
to create a geometric object from a description using class geometric_object_description
Definition: geometry.h:568
void init(geometric_object_description *Descr, projective_space *P, int verbose_level)
to create a geometric object encoded as a set using a description from the command line
Definition: geometry.h:598
various functions related to geometries
Definition: geometry.h:721
void do_create_desarguesian_spread(field_theory::finite_field *FQ, field_theory::finite_field *Fq, int m, int verbose_level)
void create_BLT_point(field_theory::finite_field *F, int *v5, int a, int b, int c, int verbose_level)
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)
int test_nb_Eckardt_points(projective_space *P2, long int *S, int len, int pt, int nb_E, int verbose_level)
void do_cheat_sheet_hermitian(field_theory::finite_field *F, int projective_dimension, int verbose_level)
void AG_element_unrank(int q, int *v, int stride, int len, long int a)
void create_Fisher_BLT_set(long int *Fisher_BLT, int *ABC, field_theory::finite_field *FQ, field_theory::finite_field *Fq, int verbose_level)
void do_transversal(field_theory::finite_field *F, std::string &line_1_basis, std::string &line_2_basis, std::string &point, int f_normalize_from_the_left, int f_normalize_from_the_right, int verbose_level)
void latex_homogeneous_equation(field_theory::finite_field *F, int degree, int nb_vars, std::string &equation_text, std::string &symbol_txt, std::string &symbol_tex, int verbose_level)
int test_if_arc(field_theory::finite_field *Fq, int *pt_coords, int *set, int set_sz, int k, int verbose_level)
algebraic_geometry::eckardt_point_info * compute_eckardt_point_info(projective_space *P2, long int *arc6, int verbose_level)
void do_intersection_of_two_lines(field_theory::finite_field *F, std::string &line_1_basis, std::string &line_2_basis, int f_normalize_from_the_left, int f_normalize_from_the_right, int verbose_level)
void AG_element_rank_longinteger(int q, int *v, int stride, int len, ring_theory::longinteger_object &a)
void do_inverse_isomorphism_klein_quadric(field_theory::finite_field *F, std::string &inverse_isomorphism_klein_quadric_matrix_A6, int verbose_level)
void andre_preimage(projective_space *P2, projective_space *P4, long int *set2, int sz2, long int *set4, int &sz4, int verbose_level)
void find_two_lines_for_arc_lifting(projective_space *P, long int P1, long int P2, long int &line1, long int &line2, int verbose_level)
void AG_element_unrank_longinteger(int q, int *v, int stride, int len, ring_theory::longinteger_object &a)
void add_term(int n, field_theory::finite_field &F, int &nb_terms, int *form_i, int *form_j, int *form_coeff, int *Gram, int i, int j, int coeff)
void print_quadratic_form_list_coded(int form_nb_terms, int *form_i, int *form_j, int *form_coeff)
void create_decomposition_of_projective_plane(std::string &fname_base, projective_space *P, long int *points, int nb_points, long int *lines, int nb_lines, int verbose_level)
void do_rank_points_in_PG(field_theory::finite_field *F, std::string &label, int verbose_level)
long int nb_PG_elements_not_in_subspace(int n, int m, int q)
void rearrange_arc_for_lifting(long int *Arc6, long int P1, long int P2, int partition_rk, long int *arc, int verbose_level)
int AG_element_next(int q, int *v, int stride, int len)
void do_cheat_sheet_Gr(field_theory::finite_field *F, int n, int k, int verbose_level)
void do_cheat_sheet_PG(field_theory::finite_field *F, graphics::layered_graph_draw_options *O, int n, int verbose_level)
long int nb_pts_Qepsilon(int epsilon, int k, int q)
void create_Mondello_BLT_set(long int *BLT, int *ABC, field_theory::finite_field *FQ, field_theory::finite_field *Fq, int verbose_level)
void make_Gram_matrix_from_list_coded_quadratic_form(int n, field_theory::finite_field &F, int nb_terms, int *form_i, int *form_j, int *form_coeff, int *Gram)
long int AG_element_rank(int q, int *v, int stride, int len)
void create_Linear_BLT_set(long int *BLT, int *ABC, field_theory::finite_field *FQ, field_theory::finite_field *Fq, int verbose_level)
void hyperplane_lifting_with_two_lines_fixed(projective_space *P, int *A3, int f_semilinear, int frobenius, long int line1, long int line2, int *A4, int verbose_level)
void create_Buekenhout_Metz(field_theory::finite_field *Fq, field_theory::finite_field *FQ, int f_classical, int f_Uab, int parameter_a, int parameter_b, std::string &fname, int &nb_pts, long int *&Pts, int verbose_level)
long int rank_embedded_lint(int *subspace_basis, int verbose_level)
void unrank_lint(int *subspace_basis, long int rk, int verbose_level)
void init(int big_n, int n, grassmann *G, int *M, int verbose_level)
void unrank_embedded_lint(int *subspace_basis_with_embedding, long int rk, int verbose_level)
long int rank_lint(int *subspace_basis, int verbose_level)
to rank and unrank subspaces of a fixed dimension in F_q^n
Definition: geometry.h:892
void print_set_tex_with_perp(std::ostream &ost, long int *v, int len)
Definition: grassmann.cpp:202
void create_Schlaefli_graph(int *&Adj, int &sz, int verbose_level)
Definition: grassmann.cpp:1214
long int make_special_element_infinity(int verbose_level)
Definition: grassmann.cpp:1351
void unrank_longinteger(ring_theory::longinteger_object &rk, int verbose_level)
Definition: grassmann.cpp:627
void unrank_longinteger_here(int *Mtx, ring_theory::longinteger_object &rk, int verbose_level)
Definition: grassmann.cpp:613
long int nb_of_subspaces(int verbose_level)
Definition: grassmann.cpp:113
long int make_special_element_one(int verbose_level)
Definition: grassmann.cpp:1321
void unrank_lint(long int rk, int verbose_level)
Definition: grassmann.cpp:343
void unrank_embedded_subspace_lint_here(int *Basis, long int rk, int verbose_level)
Definition: grassmann.cpp:318
void unrank_lint_here_and_compute_perp(int *Mtx, long int rk, int verbose_level)
Definition: grassmann.cpp:979
ring_theory::longinteger_object * nCkq
Definition: geometry.h:895
void latex_matrix_numerical(std::ostream &ost, int *p)
Definition: grassmann.cpp:1207
void rank_longinteger(ring_theory::longinteger_object &r, int verbose_level)
Definition: grassmann.cpp:764
void line_regulus_in_PG_3_q(long int *&regulus, int &regulus_size, int f_opposite, int verbose_level)
Definition: grassmann.cpp:1007
long int rank_embedded_subspace_lint(int verbose_level)
Definition: grassmann.cpp:305
void latex_matrix(std::ostream &ost, int *p)
Definition: grassmann.cpp:1200
void compute_dual_line_idx(int *&dual_line_idx, int *&self_dual_lines, int &nb_self_dual_lines, int verbose_level)
Definition: grassmann.cpp:1091
void print_set_tex(std::ostream &ost, long int *v, int len)
Definition: grassmann.cpp:157
long int rank_lint_here(int *Mtx, int verbose_level)
Definition: grassmann.cpp:275
void rank_longinteger_here(int *Mtx, ring_theory::longinteger_object &rk, int verbose_level)
Definition: grassmann.cpp:620
int dimension_of_join(long int rk1, long int rk2, int verbose_level)
Definition: grassmann.cpp:928
void print_single_generator_matrix_tex_numerical(std::ostream &ost, long int a)
Definition: grassmann.cpp:135
void compute_dual_spread(int *spread, int *dual_spread, int spread_size, int verbose_level)
Definition: grassmann.cpp:1143
void unrank_embedded_subspace_lint(long int rk, int verbose_level)
Definition: grassmann.cpp:281
void unrank_lint_here(int *Mtx, long int rk, int verbose_level)
Definition: grassmann.cpp:269
void init(int n, int k, field_theory::finite_field *F, int verbose_level)
Definition: grassmann.cpp:70
long int make_special_element_zero(int verbose_level)
Definition: grassmann.cpp:1292
void unrank_lint_here_and_extend_basis(int *Mtx, long int rk, int verbose_level)
Definition: grassmann.cpp:946
void points_covered(long int *the_points, int verbose_level)
Definition: grassmann.cpp:255
void print_single_generator_matrix_tex(std::ostream &ost, long int a)
Definition: grassmann.cpp:122
void init(field_theory::finite_field *F, int nb_vars, int verbose_level)
Definition: hermitian.cpp:73
int N_rank(int *v, int len, int verbose_level)
Definition: hermitian.cpp:423
void report(std::ostream &ost, int verbose_level)
Definition: hermitian.cpp:1032
int N1_rank(int *v, int len, int verbose_level)
Definition: hermitian.cpp:626
void N1_unrank(int *v, int len, int rk, int verbose_level)
Definition: hermitian.cpp:509
void Sbar_unrank(int *v, int len, int rk, int verbose_level)
Definition: hermitian.cpp:859
void N_unrank(int *v, int len, int rk, int verbose_level)
Definition: hermitian.cpp:333
void report_points(std::ostream &ost, int verbose_level)
Definition: hermitian.cpp:1053
void S_unrank(int *v, int len, int rk, int verbose_level)
Definition: hermitian.cpp:736
int S_rank(int *v, int len, int verbose_level)
Definition: hermitian.cpp:797
int Sbar_rank(int *v, int len, int verbose_level)
Definition: hermitian.cpp:915
void list_of_points_embedded_in_PG(long int *&Pts, int &nb_pts, int verbose_level)
Definition: hermitian.cpp:170
void unrank_lint(int *M, long int rk, int verbose_level)
Definition: hjelmslev.cpp:90
void init(ring_theory::finite_ring *R, int n, int k, int verbose_level)
Definition: hjelmslev.cpp:59
long int rank_lint(int *M, int verbose_level)
Definition: hjelmslev.cpp:131
interface for various incidence geometries
Definition: geometry.h:1099
void get_col_decomposition_scheme(data_structures::partitionstack &PStack, int *row_classes, int *row_class_inv, int nb_row_classes, int *col_classes, int *col_class_inv, int nb_col_classes, int *col_scheme, int verbose_level)
void free_scheme(int *row_classes, int *row_class_inv, int *col_classes, int *col_class_inv, int *scheme)
void get_and_print_row_tactical_decomposition_scheme_tex(std::ostream &ost, int f_enter_math, int f_print_subscripts, data_structures::partitionstack &PStack)
void print_line(std::ostream &ost, data_structures::partitionstack &P, int row_cell, int i, int *col_classes, int nb_col_classes, int width, int f_labeled)
void init_by_incidences(int m, int n, int nb_inc, int *X, int verbose_level)
void compute_extended_collinearity_graph(int *&Adj, int &v, int *&partition, int f_row_part, int nb_row_parts, int *row_parts, int f_col_part, int nb_col_parts, int *col_parts, int nb_distinguished_point_sets, int **distinguished_point_sets, int *distinguished_point_set_size, int nb_distinguished_line_sets, int **distinguished_line_sets, int *distinguished_line_set_size, int verbose_level)
void compute_TDO_safe_first(data_structures::partitionstack &PStack, int depth, int &step, int &f_refine, int &f_refine_prev, int verbose_level)
int refine_row_partition_safe(data_structures::partitionstack &PStack, int verbose_level)
void get_scheme(int *&row_classes, int *&row_class_inv, int &nb_row_classes, int *&col_classes, int *&col_class_inv, int &nb_col_classes, int *&scheme, int f_row_scheme, data_structures::partitionstack &PStack)
void get_row_decomposition_scheme(data_structures::partitionstack &PStack, int *row_classes, int *row_class_inv, int nb_row_classes, int *col_classes, int *col_class_inv, int nb_col_classes, int *row_scheme, int verbose_level)
incidence_structure * apply_canonical_labeling(long int *canonical_labeling, int verbose_level)
void get_and_print_decomposition_schemes_tex(data_structures::partitionstack &PStack)
void init_partitionstack(data_structures::partitionstack *S, int f_row_part, int nb_row_parts, int *row_parts, int f_col_part, int nb_col_parts, int *col_parts, int nb_distinguished_point_sets, int **distinguished_point_sets, int *distinguished_point_set_size, int nb_distinguished_line_sets, int **distinguished_line_sets, int *distinguished_line_set_size, int verbose_level)
void get_partition(data_structures::partitionstack &PStack, int *row_classes, int *row_class_idx, int &nb_row_classes, int *col_classes, int *col_class_idx, int &nb_col_classes)
int lines_through_two_points(int *lines, int p1, int p2, int verbose_level)
void get_and_print_decomposition_schemes(data_structures::partitionstack &PStack)
void rearrange(int *&Vi, int &nb_V, int *&Bj, int &nb_B, int *&R, int *&X, data_structures::partitionstack &P)
int compute_TDO_safe_next(data_structures::partitionstack &PStack, int depth, int &step, int &f_refine, int &f_refine_prev, int verbose_level)
void compute_tdo(data_structures::partitionstack &S, int f_write_tdo_files, int f_pic, int f_include_tdo_scheme, int verbose_level)
void compute_extended_matrix(int *&M, int &nb_rows, int &nb_cols, int &total, int *&partition, int f_row_part, int nb_row_parts, int *row_parts, int f_col_part, int nb_col_parts, int *col_parts, int nb_distinguished_point_sets, int **distinguished_point_sets, int *distinguished_point_set_size, int nb_distinguished_line_sets, int **distinguished_line_sets, int *distinguished_line_set_size, int verbose_level)
void init_by_R_and_X(int m, int n, int *R, int *X, int max_r, int verbose_level)
void print_column_labels(std::ostream &ost, data_structures::partitionstack &P, int *col_classes, int nb_col_classes, int width)
void init_by_set_of_sets(data_structures::set_of_sets *SoS, int verbose_level)
void print_aut_generators(int Aut_counter, int *Aut, int Base_length, int *Base, int *Transversal_length)
int compute_TDO(data_structures::partitionstack &PStack, int ht0, int depth, int verbose_level)
void init_large_set(long int *blocks, int N_points, int design_b, int design_k, int partition_class_size, int *&partition, int verbose_level)
void get_and_print_col_decomposition_scheme(data_structures::partitionstack &PStack, int f_list_incidences, int f_local_coordinates, int verbose_level)
void init_by_matrix_as_bitmatrix(int m, int n, data_structures::bitmatrix *Bitmatrix, int verbose_level)
void decomposition_print_tex(std::ostream &ost, data_structures::partitionstack &PStack, int f_row_tactical, int f_col_tactical, int f_detailed, int f_local_coordinates, int verbose_level)
void init_orthogonal(orthogonal_geometry::orthogonal *O, int verbose_level)
void get_and_print_tactical_decomposition_scheme_tex(std::ostream &ost, int f_enter_math, data_structures::partitionstack &PStack)
int refine_column_partition_safe(data_structures::partitionstack &PStack, int verbose_level)
int get_lines_on_point(int *data, int i, int verbose_level)
void shrink_aut_generators(int nb_distinguished_point_sets, int nb_distinguished_line_sets, int Aut_counter, int *Aut, int *Base, int Base_length, int verbose_level)
void compute_tdo_stepwise(data_structures::partitionstack &S, int TDO_depth, int f_write_tdo_files, int f_pic, int f_include_tdo_scheme, int f_include_extra, int verbose_level)
void init_projective_space(projective_space *P, int verbose_level)
void save_as_csv(std::string &fname_csv, int verbose_level)
int refine_column_partition(data_structures::partitionstack &PStack, int ht0, int verbose_level)
void get_incidences_by_row_scheme(data_structures::partitionstack &PStack, int *row_classes, int *row_class_inv, int nb_row_classes, int *col_classes, int *col_class_inv, int nb_col_classes, int row_class_idx, int col_class_idx, int rij, int *&incidences, int verbose_level)
int compute_TDO_step(data_structures::partitionstack &PStack, int ht0, int verbose_level)
void get_and_print_column_tactical_decomposition_scheme_tex(std::ostream &ost, int f_enter_math, int f_print_subscripts, data_structures::partitionstack &PStack)
void print_non_tactical_decomposition_scheme_tex(std::ostream &ost, int f_enter_math, data_structures::partitionstack &PStack)
void row_scheme_to_col_scheme(data_structures::partitionstack &PStack, int *row_classes, int *row_class_inv, int nb_row_classes, int *col_classes, int *col_class_inv, int nb_col_classes, int *row_scheme, int *col_scheme, int verbose_level)
void print_partitioned(std::ostream &ost, data_structures::partitionstack &P, int f_labeled)
void do_tdo_high_level(data_structures::partitionstack &S, int f_tdo_steps, int f_tdo_depth, int tdo_depth, int f_write_tdo_files, int f_pic, int f_include_tdo_scheme, int f_include_tdo_extra, int f_write_tdo_class_files, int verbose_level)
int get_points_on_line(int *data, int j, int verbose_level)
void print_row_tactical_decomposition_scheme_incidences_tex(data_structures::partitionstack &PStack, std::ostream &ost, int f_enter_math_mode, int *row_classes, int *row_class_inv, int nb_row_classes, int *col_classes, int *col_class_inv, int nb_col_classes, int f_local_coordinates, int verbose_level)
void init_by_matrix(int m, int n, int *M, int verbose_level)
void print_hline(std::ostream &ost, data_structures::partitionstack &P, int *col_classes, int nb_col_classes, int width, int f_labeled)
void get_and_print_row_decomposition_scheme(data_structures::partitionstack &PStack, int f_list_incidences, int f_local_coordinates, int verbose_level)
void init_partitionstack_trivial(data_structures::partitionstack *S, int verbose_level)
void get_incidences_by_col_scheme(data_structures::partitionstack &PStack, int *row_classes, int *row_class_inv, int nb_row_classes, int *col_classes, int *col_class_inv, int nb_col_classes, int row_class_idx, int col_class_idx, int kij, int *&incidences, int verbose_level)
void get_row_decomposition_scheme_if_possible(data_structures::partitionstack &PStack, int *row_classes, int *row_class_inv, int nb_row_classes, int *col_classes, int *col_class_inv, int nb_col_classes, int *row_scheme, int verbose_level)
void compute_TDO_safe(data_structures::partitionstack &PStack, int depth, int verbose_level)
void latex_it(std::ostream &ost, data_structures::partitionstack &P)
void print_col_tactical_decomposition_scheme_incidences_tex(data_structures::partitionstack &PStack, std::ostream &ost, int f_enter_math_mode, int *row_classes, int *row_class_inv, int nb_row_classes, int *col_classes, int *col_class_inv, int nb_col_classes, int f_local_coordinates, int verbose_level)
int refine_row_partition(data_structures::partitionstack &PStack, int ht0, int verbose_level)
the Klein correspondence between lines in PG(3,q) and points on the Klein quadric
Definition: geometry.h:1353
void Pluecker_to_line(int *v6, int *basis_line, int verbose_level)
void init(field_theory::finite_field *F, orthogonal_geometry::orthogonal *O, int verbose_level)
void identify_external_lines_and_spreads(spread_tables *T, std::vector< long int > &External_lines, long int *&spread_to_external_line_idx, long int *&external_line_to_spread, int verbose_level)
void plane_intersections(long int *lines_in_PG3, int nb_lines, ring_theory::longinteger_object *&R, long int **&Pts_on_plane, int *&nb_pts_on_plane, int &nb_planes, int verbose_level)
void exterior_square_to_line(int *v, int *basis_line, int verbose_level)
long int line_to_point_on_quadric(long int line_rk, int verbose_level)
void reverse_isomorphism(int *A6, int *A4, int verbose_level)
long int point_on_quadric_to_line(long int point_rk, int verbose_level)
void compute_external_lines(std::vector< long int > &External_lines, int verbose_level)
void line_to_Pluecker(long int line_rk, int *v6, int verbose_level)
the Knarr construction of a GQ from a BLT-set
Definition: geometry.h:1439
data_structures::fancy_set * type_ii_points
Definition: geometry.h:1459
data_structures::fancy_set * type_a_lines
Definition: geometry.h:1460
ring_theory::longinteger_object * six_choose_three_q
Definition: geometry.h:1454
data_structures::fancy_set * type_i_points
Definition: geometry.h:1459
data_structures::fancy_set * type_b_lines
Definition: geometry.h:1460
void init(field_theory::finite_field *F, int BLT_no, int verbose_level)
Definition: knarr.cpp:146
void points_and_lines(int verbose_level)
Definition: knarr.cpp:221
field_theory::finite_field * F
Definition: geometry.h:1447
data_structures::fancy_set * type_iii_points
Definition: geometry.h:1459
void incidence_matrix(int *&Inc, int &nb_points, int &nb_lines, int verbose_level)
Definition: knarr.cpp:545
a combinatorial object for which a canonical form can be computed using Nauty
Definition: geometry.h:1487
void init_large_set_from_string(std::string &data_text, int v, int k, int design_sz, int verbose_level)
void encode_object(long int *&encoding, int &encoding_sz, int verbose_level)
void encode_incma(combinatorics::encoded_combinatorial_object *&Enc, int verbose_level)
void encoding_size_points_and_lines(int &nb_rows, int &nb_cols, int verbose_level)
void init_packing_from_string(std::string &packing_text, int q, int verbose_level)
void init_packing_from_set(long int *packing, int sz, int verbose_level)
void encode_incidence_geometry(combinatorics::encoded_combinatorial_object *&Enc, int verbose_level)
void encode_incma_and_make_decomposition(combinatorics::encoded_combinatorial_object *&Enc, incidence_structure *&Inc, data_structures::partitionstack *&Stack, int verbose_level)
void init_point_set_from_string(std::string &set_text, int verbose_level)
void encoding_size_incidence_geometry(int &nb_rows, int &nb_cols, int verbose_level)
void encoding_size_point_set(int &nb_rows, int &nb_cols, int verbose_level)
void encoding_size_line_set(int &nb_rows, int &nb_cols, int verbose_level)
void init_points_and_lines(long int *set, int sz, long int *set2, int sz2, int verbose_level)
void encode_object_large_set(long int *&encoding, int &encoding_sz, int verbose_level)
void encoding_size(int &nb_rows, int &nb_cols, int verbose_level)
void run_nauty(int f_compute_canonical_form, data_structures::bitvector *&Canonical_form, data_structures::nauty_output *&NO, int verbose_level)
void encode_points_and_lines(combinatorics::encoded_combinatorial_object *&Enc, int verbose_level)
void init_incidence_geometry_from_vector(std::vector< int > &Flags, int v, int b, int nb_flags, int verbose_level)
void get_packing_as_set_system(long int *&Sets, int &nb_sets, int &set_size, int verbose_level)
void encoding_size_large_set(int &nb_rows, int &nb_cols, int verbose_level)
void print_tex_detailed(std::ostream &ost, int f_show_incma, int verbose_level)
void canonical_labeling(data_structures::nauty_output *NO, int verbose_level)
void encode_line_set(combinatorics::encoded_combinatorial_object *&Enc, int verbose_level)
void init_line_set_from_string(std::string &set_text, int verbose_level)
void init_incidence_geometry(long int *data, int data_sz, int v, int b, int nb_flags, int verbose_level)
void init_points_and_lines_from_string(std::string &set_text, std::string &set2_text, int verbose_level)
void encode_point_set(combinatorics::encoded_combinatorial_object *&Enc, int verbose_level)
void encoding_size_packing(int &nb_rows, int &nb_cols, int verbose_level)
void init_large_set(long int *data, int data_sz, int v, int b, int k, int design_sz, int verbose_level)
void init_packing_from_set_of_sets(data_structures::set_of_sets *SoS, int verbose_level)
void init_incidence_geometry_from_string_of_row_ranks(std::string &data, int v, int b, int r, int verbose_level)
void encode_object_packing(long int *&encoding, int &encoding_sz, int verbose_level)
void run_nauty_basic(data_structures::nauty_output *&NO, int verbose_level)
void init_incidence_geometry_from_string(std::string &data, int v, int b, int nb_flags, int verbose_level)
void canonical_form_given_canonical_labeling(int *canonical_labeling, data_structures::bitvector *&B, int verbose_level)
void encode_object_points(long int *&encoding, int &encoding_sz, int verbose_level)
void encode_object_lines(long int *&encoding, int &encoding_sz, int verbose_level)
void init_packing_from_spread_table(long int *data, long int *Spread_table, int nb_spreads, int spread_size, int q, int verbose_level)
void encode_packing(combinatorics::encoded_combinatorial_object *&Enc, int verbose_level)
void encode_object_points_and_lines(long int *&encoding, int &encoding_sz, int verbose_level)
void encode_object_incidence_geometry(long int *&encoding, int &encoding_sz, int verbose_level)
void print_rows(std::ostream &ost, int f_show_incma, int verbose_level)
void encode_large_set(combinatorics::encoded_combinatorial_object *&Enc, int verbose_level)
a data structure for general projective planes, including non-desarguesian ones
Definition: geometry.h:1696
int count_pairs_CCR(data_structures::partitionstack &P, int col_cell1, int col_cell2, int row_cell)
void init_projective_plane(int order, int verbose_level)
Definition: point_line.cpp:382
void plane_get_lines_through_point(int pt, int *lines)
Definition: point_line.cpp:587
int count_pairs_CCR_representative(data_structures::partitionstack &P, int col_cell1, int col_cell_pt, int col_cell2, int row_cell)
int ternary_field_is_linear(int *MOLS, int verbose_level)
Definition: point_line.cpp:964
data_structures::partitionstack * P
Definition: geometry.h:1699
int count_CR_representative(data_structures::partitionstack &P, int col_cell, int col_cell_pt, int row_cell)
int count_CR(data_structures::partitionstack &P, int col_cell, int row_cell)
int plane_next_quadrangle(int &pt1, int &pt2, int &pt3, int &pt4)
Definition: point_line.cpp:656
int count_RC_representative(data_structures::partitionstack &P, int row_cell, int row_cell_pt, int col_cell)
int plane_first_quadrangle(int &pt1, int &pt2, int &pt3, int &pt4)
Definition: point_line.cpp:633
int count_pairs_RRC(data_structures::partitionstack &P, int row_cell1, int row_cell2, int col_cell)
void coordinatize_plane(int O, int I, int X, int Y, int *MOLS, int verbose_level)
Definition: point_line.cpp:745
int plane_lines_concurrent(int line1, int line2, int line3)
Definition: point_line.cpp:623
int is_projective_plane(data_structures::partitionstack &P, int &order, int verbose_level)
void get_MOLm(int *MOLS, int order, int m, int *&M)
int count_RC(data_structures::partitionstack &P, int row_cell, int col_cell)
int count_pairs_RRC_representative(data_structures::partitionstack &P, int row_cell1, int row_cell_pt, int row_cell2, int col_cell)
int identify_field_not_of_prime_order(int verbose_level)
Definition: point_line.cpp:164
int plane_points_collinear(int pt1, int pt2, int pt3)
Definition: point_line.cpp:613
points and lines in projective space, for instance on a surface
Definition: geometry.h:1822
void init(projective_space *P, std::vector< long int > &Points, int verbose_level)
void write_points_to_txt_file(std::string &label, int verbose_level)
a polarity between points and hyperplanes in PG(n,q)
Definition: geometry.h:1857
void init_general_polarity(projective_space *P, int *Mtx, int verbose_level)
Definition: polarity.cpp:102
void init_standard_polarity(projective_space *P, int verbose_level)
Definition: polarity.cpp:39
void init_reversal_polarity(projective_space *P, int verbose_level)
Definition: polarity.cpp:172
internal representation of a projective space PG(n,q)
Definition: geometry.h:1885
projective space PG(n,q) of dimension n over Fq
Definition: geometry.h:1916
void find_nucleus(int *set, int set_size, int &nucleus, int verbose_level)
void cheat_sheet_line_intersection(std::ostream &f, int verbose_level)
long int line_of_intersection_of_two_planes_in_three_space_using_dual_coordinates(long int plane1, long int plane2, int verbose_level)
void create_elliptic_curve(int elliptic_curve_b, int elliptic_curve_c, std::string &label_txt, std::string &label_tex, int &nb_pts, long int *&Pts, int verbose_level)
void do_move_two_lines_in_hyperplane_stabilizer_text(std::string line1_from_text, std::string line2_from_text, std::string line1_to_text, std::string line2_to_text, int verbose_level)
void conic_points(long int *five_pts, int *six_coeffs, long int *points, int &nb_points, int verbose_level)
void plane_intersection(int plane_rank, long int *set, int set_size, std::vector< int > &point_indices, std::vector< int > &point_local_coordinates, int verbose_level)
void point_types_of_line_set(long int *set_of_lines, int set_size, int *type, int verbose_level)
void plane_intersection_type_fast(grassmann *G, long int *set, int set_size, ring_theory::longinteger_object *&R, long int **&Pts_on_plane, int *&nb_pts_on_plane, int &len, int verbose_level)
int point_of_intersection_of_a_line_and_a_plane_in_three_space(long int line, int plane, int verbose_level)
long int transversal_to_two_skew_lines_through_a_point(long int line1, long int line2, int pt, int verbose_level)
void compute_decomposition_based_on_tally(data_structures::tally *T1, data_structures::tally *T2, incidence_structure *&Inc, data_structures::partitionstack *&Stack, int verbose_level)
void plane_equation_from_three_lines_in_three_space(long int *three_lines, int *plane_eqn4, int verbose_level)
void print_set_numerical(std::ostream &ost, long int *set, int set_size)
void conic_type(long int *set, int set_size, int threshold, long int **&Pts_on_conic, int **&Conic_eqn, int *&nb_pts_on_conic, int &nb_conics, int verbose_level)
void hyperplane_intersection_type_basic(long int *set, int set_size, int *type, int verbose_level)
void find_k_secant_lines(long int *set, int set_size, int k, long int *secant_lines, int &nb_secant_lines, int verbose_level)
void line_intersection(int line_rank, long int *set, int set_size, std::vector< int > &point_indices, int verbose_level)
void elliptic_curve_addition_table(int *A6, int *Pts, int nb_pts, int *&Table, int verbose_level)
void compute_decomposition(data_structures::partitionstack *S1, data_structures::partitionstack *S2, incidence_structure *&Inc, data_structures::partitionstack *&Stack, int verbose_level)
void plane_intersection_invariant(grassmann *G, long int *set, int set_size, int *&intersection_type, int &highest_intersection_number, int *&intersection_matrix, int &nb_planes, int verbose_level)
int determine_conic_in_plane(long int *input_pts, int nb_pts, int *six_coeffs, int verbose_level)
void polarity_rank_k_subspace(int k, long int rk_in, long int &rk_out, int verbose_level)
int is_contained_in_Baer_subline(long int *pts, int nb_pts, int verbose_level)
void do_move_two_lines_in_hyperplane_stabilizer(long int line1_from, long int line2_from, long int line1_to, long int line2_to, int verbose_level)
void create_ovoid_ST(std::string &label_txt, std::string &label_tex, int &nb_pts, long int *&Pts, int verbose_level)
int test_if_lines_are_disjoint_from_scratch(long int l1, long int l2)
void create_whole_space(std::string &label_txt, std::string &label_tex, int &nb_pts, long int *&Pts, int verbose_level)
void klein_correspondence(projective_space *P5, long int *set_in, int set_size, long int *set_out, int verbose_level)
void find_planes_which_intersect_in_at_least_s_points(long int *set, int set_size, int s, std::vector< int > &plane_ranks, int verbose_level)
void find_external_lines(long int *set, int set_size, long int *external_lines, int &nb_external_lines, int verbose_level)
long int dual_rank_of_line_in_plane(long int line_rank, int verbose_level)
void create_points_on_line(long int line_rk, long int *line, int verbose_level)
void point_types_of_line_set_int(int *set_of_lines, int set_size, int *type, int verbose_level)
projective_space_implementation * Implementation
Definition: geometry.h:1940
void intersect_with_line(long int *set, int set_sz, int line_rk, long int *intersection, int &sz, int verbose_level)
long int line_rank_using_dual_coordinates_in_plane(int *eqn3, int verbose_level)
void plane_intersection_type_basic(long int *set, int set_size, int *type, int verbose_level)
void planes_through_a_line(long int line_rk, std::vector< long int > &plane_ranks, int verbose_level)
void point_plane_incidence_matrix(long int *point_rks, int nb_points, long int *plane_rks, int nb_planes, int *&M, int verbose_level)
void intersection_of_subspace_with_point_set(grassmann *G, int rk, long int *set, int set_size, long int *&intersection_set, int &intersection_set_size, int verbose_level)
void points_on_projective_triangle(long int *&set, int &set_size, long int *three_points, int verbose_level)
void incma_for_type_ij(int row_type, int col_type, int *&Incma, int &nb_rows, int &nb_cols, int verbose_level)
void quadric_points_brute_force(int *ten_coeffs, long int *points, int &nb_points, int verbose_level)
void Pluecker_coordinates(int line_rk, int *v6, int verbose_level)
void report(std::ostream &ost, graphics::layered_graph_draw_options *O, int verbose_level)
void cheat_sheet_point_table(std::ostream &f, int verbose_level)
long int plane_rank_using_dual_coordinates_in_three_space(int *eqn4, int verbose_level)
void plane_intersections(grassmann *G, long int *set, int set_size, ring_theory::longinteger_object *&R, data_structures::set_of_sets &SoS, int verbose_level)
void cheat_sheet_points_on_lines(std::ostream &f, int verbose_level)
void line_intersection_type_basic(long int *set, int set_size, int *type, int verbose_level)
void create_latex_report_for_Grassmannian(int k, int verbose_level)
void determine_nonconical_six_subsets(long int *set, int set_size, std::vector< int > &Rk, int verbose_level)
void print_line_set_numerical(long int *set, int set_size)
int determine_line_in_plane(long int *two_input_pts, int *three_coeffs, int verbose_level)
int nonconical_six_arc_get_nb_Eckardt_points(long int *Arc6, int verbose_level)
void find_secant_lines(long int *set, int set_size, long int *lines, int &nb_lines, int max_lines, int verbose_level)
int test_if_lines_are_skew(int line1, int line2, int verbose_level)
void cheat_sheet_lines_on_points(std::ostream &f, int verbose_level)
void line_intersection_type_through_hyperplane(long int *set, int set_size, int *type, int verbose_level)
void find_tangent_lines(long int *set, int set_size, long int *tangent_lines, int &nb_tangent_lines, int verbose_level)
void circle_type_of_line_subset(int *pts, int nb_pts, int *circle_type, int verbose_level)
int point_of_intersection_of_a_line_and_a_line_in_three_space(long int line1, long int line2, int verbose_level)
void find_tangent_lines_to_conic(int *six_coeffs, long int *points, int nb_points, long int *tangents, int verbose_level)
void print_set_of_points(std::ostream &ost, long int *Pts, int nb_pts)
void cheat_polarity(std::ostream &f, int verbose_level)
int determine_cubic_in_plane(ring_theory::homogeneous_polynomial_domain *Poly_3_3, int nb_pts, long int *Pts, int *coeff10, int verbose_level)
void line_plane_incidence_matrix_restricted(long int *Lines, int nb_lines, int *&M, int &nb_planes, int verbose_level)
void do_pluecker_reverse(std::ostream &ost, grassmann *Gr, int k, int nb_k_subspaces, int verbose_level)
void create_lines_on_point(long int point_rk, long int *line_pencil, int verbose_level)
void decomposition_from_set_partition(int nb_subsets, int *sz, int **subsets, incidence_structure *&Inc, data_structures::partitionstack *&Stack, int verbose_level)
int determine_hermitian_form_in_plane(int *pts, int nb_pts, int *six_coeffs, int verbose_level)
void create_unital_XXq_YZq_ZYq_brute_force(long int *U, int &sz, int verbose_level)
void klein_correspondence_special_model(projective_space *P5, int *table, int verbose_level)
void plane_intersection_matrix_in_three_space(long int *Planes, int nb_planes, int *&Intersection_matrix, int verbose_level)
int conic_test(long int *S, int len, int pt, int verbose_level)
void create_hyperplane(int pt, std::string &label_txt, std::string &label_tex, int &nb_pts, long int *&Pts, int verbose_level)
void cheat_sheet_subspaces(std::ostream &f, int k, int verbose_level)
void cheat_sheet_points(std::ostream &f, int verbose_level)
void Baer_subline(long int *pts3, long int *&pts, int &nb_pts, int verbose_level)
void cheat_sheet_line_through_pairs_of_points(std::ostream &f, int verbose_level)
void conic_type_randomized(int nb_times, long int *set, int set_size, long int **&Pts_on_conic, int *&nb_pts_on_conic, int &len, int verbose_level)
void create_lines_on_point_but_inside_a_plane(long int point_rk, long int plane_rk, long int *line_pencil, int verbose_level)
void create_ovoid(std::string &label_txt, std::string &label_tex, int &nb_pts, long int *&Pts, int verbose_level)
void determine_quadric_in_solid(long int *nine_pts_or_more, int nb_pts, int *ten_coeffs, int verbose_level)
void find_lines_which_are_contained(std::vector< long int > &Points, std::vector< long int > &Lines, int verbose_level)
void plane_intersection_type(grassmann *G, long int *set, int set_size, int *&intersection_type, int &highest_intersection_number, int verbose_level)
void conic_intersection_type(int f_randomized, int nb_times, long int *set, int set_size, int threshold, int *&intersection_type, int &highest_intersection_number, int f_save_largest_sets, data_structures::set_of_sets *&largest_sets, int verbose_level)
int elliptic_curve_addition(int *A6, int p1_rk, int p2_rk, int verbose_level)
void conic_points_brute_force(int *six_coeffs, long int *points, int &nb_points, int verbose_level)
void line_intersection_type(long int *set, int set_size, int *type, int verbose_level)
void plane_intersection_type_slow(grassmann *G, long int *set, int set_size, ring_theory::longinteger_object *&R, long int **&Pts_on_plane, int *&nb_pts_on_plane, int &len, int verbose_level)
void create_cuspidal_cubic(std::string &label_txt, std::string &label_tex, int &nb_pts, long int *&Pts, int verbose_level)
void line_intersection_type_basic_given_a_set_of_lines(long int *lines_by_rank, int nb_lines, long int *set, int set_size, int *type, int verbose_level)
void projective_space_init(int n, field_theory::finite_field *F, int f_init_incidence_structure, int verbose_level)
long int line_of_intersection_of_two_planes_in_three_space(long int plane1, long int plane2, int verbose_level)
void create_twisted_cubic(std::string &label_txt, std::string &label_tex, int &nb_pts, long int *&Pts, int verbose_level)
void create_latex_report(graphics::layered_graph_draw_options *O, int verbose_level)
void intersection_of_subspace_with_point_set_rank_is_longinteger(grassmann *G, ring_theory::longinteger_object &rk, long int *set, int set_size, long int *&intersection_set, int &intersection_set_size, int verbose_level)
void make_incidence_structure_and_partition(incidence_structure *&Inc, data_structures::partitionstack *&Stack, int verbose_level)
void line_intersection_type_collected(long int *set, int set_size, int *type_collected, int verbose_level)
long int dual_rank_of_plane_in_three_space(long int plane_rank, int verbose_level)
long int line_through_two_points(long int p1, long int p2)
int create_point_on_line(long int line_rk, int pt_rk, int verbose_level)
int reverse_engineer_semilinear_map(int *Elt, int *Mtx, int &frobenius, int verbose_level)
void make_incidence_matrix(int &m, int &n, int *&Inc, int verbose_level)
void incidence_and_stack_for_type_ij(int row_type, int col_type, incidence_structure *&Inc, data_structures::partitionstack *&Stack, int verbose_level)
void create_unital_XXq_YZq_ZYq(std::string &label_txt, std::string &label_tex, int &nb_pts, long int *&Pts, int verbose_level)
tables with line-spreads in PG(3,q)
Definition: geometry.h:2335
int test_if_set_of_spreads_is_line_disjoint(long int *set, int len)
void compute_list_of_lines_from_packing(long int *list_of_lines, long int *packing, int sz_of_packing, int verbose_level)
void compute_adjacency_matrix(data_structures::bitvector *&Bitvec, int verbose_level)
void classify_self_dual_spreads(int *&type, data_structures::set_of_sets *&SoS, int verbose_level)
void find_spreads_containing_two_lines(std::vector< int > &v, int line1, int line2, int verbose_level)
void init(projective_space *P, int f_load, int nb_iso_types_of_spreads, std::string &path_to_spread_tables, int verbose_level)
int test_if_set_of_spreads_is_line_disjoint_and_complain_if_not(long int *set, int len)
void compute_iso_type_invariant(int *Partial_packings, int nb_pp, int sz, int *&Iso_type_invariant, int verbose_level)
void init_tables(int nb_spreads, long int *spread_table, int *spread_iso_type, long int *dual_spread_idx, long int *self_dual_spreads, int nb_self_dual_spreads, int verbose_level)
void compute_dual_spreads(long int **Sets, long int *&Dual_spread_idx, long int *&self_dual_spread_idx, int &nb_self_dual_spreads, int verbose_level)
void init_reduced(int nb_select, int *select, spread_tables *old_spread_table, std::string &path_to_spread_tables, int verbose_level)
void init_schreier_table(int *schreier_table, int verbose_level)
int test_if_pair_of_sets_are_adjacent(long int *set1, int sz1, long int *set2, int sz2, int verbose_level)
void init_spread_table(int nb_spreads, long int *spread_table, int *spread_iso_type, int verbose_level)
void make_exact_cover_problem(solvers::diophant *&Dio, long int *live_point_index, int nb_live_points, long int *live_blocks, int nb_live_blocks, int nb_needed, int verbose_level)
options for drawing an object of type layered_graph
Definition: graphics.h:457
homogeneous polynomials of a given degree in a given number of variables over a finite field GF(q)
Definition: ring_theory.h:88
a class to represent arbitrary precision integers
Definition: ring_theory.h:366
diophantine systems of equations (i.e., linear systems over the integers)
Definition: solvers.h:209
the orbiter library for the classification of combinatorial objects
auxiliary class for the class point_line
Definition: geometry.h:1687