Orbiter 2022
Combinatorial Objects
algebra.h
Go to the documentation of this file.
1// algebra.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#ifndef ORBITER_SRC_LIB_FOUNDATIONS_ALGEBRA_AND_NUMBER_THEORY_H_
12#define ORBITER_SRC_LIB_FOUNDATIONS_ALGEBRA_AND_NUMBER_THEORY_H_
13
14
15
16namespace orbiter {
17namespace layer1_foundations {
18namespace algebra {
19
20// #############################################################################
21// a_domain.cpp
22// #############################################################################
23
26};
27
28
30
31
32class a_domain {
33public:
36
37 a_domain();
38 ~a_domain();
39 void null();
40 void freeself();
41
42 void init_integers(int verbose_level);
43 void init_integer_fractions(int verbose_level);
44 int as_int(int *elt, int verbose_level);
45 void make_integer(int *elt, int n, int verbose_level);
46 void make_zero(int *elt, int verbose_level);
47 void make_zero_vector(int *elt, int len, int verbose_level);
48 int is_zero_vector(int *elt, int len, int verbose_level);
49 int is_zero(int *elt, int verbose_level);
50 void make_one(int *elt, int verbose_level);
51 int is_one(int *elt, int verbose_level);
52 void copy(int *elt_from, int *elt_to, int verbose_level);
53 void copy_vector(int *elt_from, int *elt_to,
54 int len, int verbose_level);
55 void swap_vector(int *elt1, int *elt2, int n, int verbose_level);
56 void swap(int *elt1, int *elt2, int verbose_level);
57 void add(int *elt_a, int *elt_b, int *elt_c, int verbose_level);
58 void add_apply(int *elt_a, int *elt_b, int verbose_level);
59 void subtract(int *elt_a, int *elt_b, int *elt_c, int verbose_level);
60 void negate(int *elt, int verbose_level);
61 void negate_vector(int *elt, int len, int verbose_level);
62 void mult(int *elt_a, int *elt_b, int *elt_c, int verbose_level);
63 void mult_apply(int *elt_a, int *elt_b, int verbose_level);
64 void power(int *elt_a, int *elt_b, int n, int verbose_level);
65 void divide(int *elt_a, int *elt_b, int *elt_c, int verbose_level);
66 void inverse(int *elt_a, int *elt_b, int verbose_level);
67 void print(int *elt);
68 void print_vector(int *elt, int n);
69 void print_matrix(int *A, int m, int n);
70 void print_matrix_for_maple(int *A, int m, int n);
71 void make_element_from_integer(int *elt, int n, int verbose_level);
72 void mult_by_integer(int *elt, int n, int verbose_level);
73 void divide_by_integer(int *elt, int n, int verbose_level);
74 int *offset(int *A, int i);
75 int Gauss_echelon_form(int *A, int f_special, int f_complete,
76 int *base_cols,
77 int f_P, int *P, int m, int n, int Pn, int verbose_level);
78 // returns the rank which is the number
79 // of entries in base_cols
80 // A is a m x n matrix,
81 // P is a m x Pn matrix (if f_P is TRUE)
82 void Gauss_step(int *v1, int *v2, int len, int idx, int verbose_level);
83 // afterwards: v2[idx] = 0 and v1,v2 span the same space as before
84 // v1 is not changed if v1[idx] is nonzero
85 void matrix_get_kernel(int *M, int m, int n, int *base_cols,
86 int nb_base_cols,
87 int &kernel_m, int &kernel_n, int *kernel, int verbose_level);
88 // kernel must point to the appropriate amount of memory!
89 // (at least n * (n - nb_base_cols) int's)
90 // kernel is stored as column vectors,
91 // i.e. kernel_m = n and kernel_n = n - nb_base_cols.
92 void matrix_get_kernel_as_row_vectors(int *M, int m, int n,
93 int *base_cols, int nb_base_cols,
94 int &kernel_m, int &kernel_n, int *kernel, int verbose_level);
95 // kernel must point to the appropriate amount of memory!
96 // (at least n * (n - nb_base_cols) int's)
97 // kernel is stored as row vectors,
98 // i.e. kernel_m = n - nb_base_cols and kernel_n = n.
99 void get_image_and_kernel(int *M, int n, int &rk, int verbose_level);
100 void complete_basis(int *M, int m, int n, int verbose_level);
101 void mult_matrix(int *A, int *B, int *C, int ma, int na, int nb,
102 int verbose_level);
103 void mult_matrix3(int *A, int *B, int *C, int *D, int n,
104 int verbose_level);
105 void add_apply_matrix(int *A, int *B, int m, int n,
106 int verbose_level);
107 void matrix_mult_apply_scalar(int *A, int *s, int m, int n,
108 int verbose_level);
109 void make_block_matrix_2x2(int *Mtx, int n, int k,
110 int *A, int *B, int *C, int *D, int verbose_level);
111 // A is k x k,
112 // B is k x (n - k),
113 // C is (n - k) x k,
114 // D is (n - k) x (n - k),
115 // Mtx is n x n
116 void make_identity_matrix(int *A, int n, int verbose_level);
117 void matrix_inverse(int *A, int *Ainv, int n, int verbose_level);
118 void matrix_invert(int *A, int *T, int *basecols, int *Ainv, int n,
119 int verbose_level);
120
121};
122
123
124// #############################################################################
125// algebra_global.cpp
126// #############################################################################
127
129
131public:
132 void count_subprimitive(int Q_max, int H_max);
133 void formula_subprimitive(int d, int q,
134 ring_theory::longinteger_object &Rdq, int &g, int verbose_level);
135 void formula(int d, int q, ring_theory::longinteger_object &Rdq, int verbose_level);
136 int subprimitive(int q, int h);
137 int period_of_sequence(int *v, int l);
138 void subexponent(int q, int Q, int h, int f, int j, int k, int &s, int &c);
139 const char *plus_minus_string(int epsilon);
140 const char *plus_minus_letter(int epsilon);
141 void display_all_PHG_elements(int n, int q);
142 void test_unipoly();
143 void test_unipoly2();
144 int is_diagonal_matrix(int *A, int n);
145 void test_longinteger();
146 void test_longinteger2();
147 void test_longinteger3();
148 void test_longinteger4();
149 void test_longinteger5();
150 void test_longinteger6();
151 void test_longinteger7();
152 void test_longinteger8();
153 void longinteger_collect_setup(int &nb_agos,
154 ring_theory::longinteger_object *&agos, int *&multiplicities);
155 void longinteger_collect_free(int &nb_agos,
156 ring_theory::longinteger_object *&agos, int *&multiplicities);
157 void longinteger_collect_add(int &nb_agos,
158 ring_theory::longinteger_object *&agos, int *&multiplicities,
160 void longinteger_collect_print(std::ostream &ost,
161 int &nb_agos, ring_theory::longinteger_object *&agos, int *&multiplicities);
162 void do_equivalence_class_of_fractions(int N, int verbose_level);
163
164
165
166
167
168 void order_of_q_mod_n(int q, int n_min, int n_max, int verbose_level);
169 void power_function_mod_n(int k, int n, int verbose_level);
170
171 void do_trace(field_theory::finite_field *F, int verbose_level);
172 void do_norm(field_theory::finite_field *F, int verbose_level);
173 void do_cheat_sheet_GF(field_theory::finite_field *F, int verbose_level);
174 void gl_random_matrix(field_theory::finite_field *F, int k, int verbose_level);
175
176 // functions with file based input:
177 void apply_Walsh_Hadamard_transform(field_theory::finite_field *F, std::string &fname_csv_in, int n, int verbose_level);
178 void algebraic_normal_form(field_theory::finite_field *F, std::string &fname_csv_in, int n, int verbose_level);
179 void apply_trace_function(field_theory::finite_field *F, std::string &fname_csv_in, int verbose_level);
180 void apply_power_function(field_theory::finite_field *F, std::string &fname_csv_in, long int d, int verbose_level);
181 void identity_function(field_theory::finite_field *F, std::string &fname_csv_out, int verbose_level);
182 void Walsh_matrix(field_theory::finite_field *F, int n, int *&W, int verbose_level);
183 void Vandermonde_matrix(field_theory::finite_field *F, int *&W, int *&W_inv, int verbose_level);
184 void search_APN(field_theory::finite_field *F, int verbose_level);
186 int *f, int depth, int &delta_min, int &nb_times,
187 std::vector<std::vector<int> > &Solutions, int verbose_level);
188 int non_linearity(field_theory::finite_field *F, int *f, int verbose_level);
189
191 int *At, int *As, int &f_switch, int *B,
192 int verbose_level);
194 int *At, int *As, int f_switch, int *B);
196 int x1, int x2, int x3, int x4,
197 int &grid_x, int &grid_y, int verbose_level);
199 int &x1, int &x2, int &x3, int &x4, int grid_x,
200 int grid_y, int verbose_level);
202 int pt_x1, int pt_x2, int pt_x3, int pt_x4,
203 int *tangent_plane, int verbose_level);
204
205};
206
207
208
209// #############################################################################
210// generators_symplectic_group.cpp
211// #############################################################################
212
213
215
216
218public:
219
220 field_theory::finite_field *F; // no ownership, do not destroy
221 int n; // must be even
222 int n_half; // n / 2
223 int q;
224 int qn; // = q^n
225
226 int *nb_candidates; // [n + 1]
227 int *cur_candidate; // [n]
228 int **candidates; // [n + 1][q^n]
229
230 int *Mtx; // [n * n]
231 int *v; // [n]
232 int *v2; // [n]
233 int *w; // [n]
234 int *Points; // [qn * n]
235
237 int *Data;
239
242 void null();
243 void freeself();
244 void init(field_theory::finite_field *F, int n, int verbose_level);
246 int &first_moved, int depth, int verbose_level);
247 int get_strong_generators(int *Data, int &nb, int &first_moved,
248 int depth, int verbose_level);
249 void create_first_candidate_set(int verbose_level);
250 void create_next_candidate_set(int level, int verbose_level);
251 int dot_product(int *u1, int *u2);
252};
253
254// #############################################################################
255// gl_class_rep.cpp
256// #############################################################################
257
259
261public:
265
266 gl_class_rep();
268 void init(int nb_irred, int *Select_polynomial,
269 int *Select_partition, int verbose_level);
270 void print(int nb_irred, int *Select_polynomial,
271 int *Select_partition, int verbose_level);
272 void compute_vector_coding(gl_classes *C, int &nb_irred,
273 int *&Poly_degree, int *&Poly_mult, int *&Partition_idx,
274 int verbose_level);
277 int verbose_level);
278};
279
280// #############################################################################
281// group_generators_domain.cpp
282// #############################################################################
283
285
287public:
290 void generators_symmetric_group(int deg,
291 int &nb_perms, int *&perms, int verbose_level);
292 void generators_cyclic_group(int deg,
293 int &nb_perms, int *&perms, int verbose_level);
294 void generators_dihedral_group(int deg,
295 int &nb_perms, int *&perms, int verbose_level);
297 int &nb_perms, int *&perms, int verbose_level);
298 void generators_identity_group(int deg,
299 int &nb_perms, int *&perms, int verbose_level);
300 void generators_Hall_reflection(int nb_pairs,
301 int &nb_perms, int *&perms, int &degree,
302 int verbose_level);
304 int &nb_perms, int *&perms, int &degree,
305 int verbose_level);
307 int *&factors, int &nb_factors);
308 void order_Bn_group_factorized(int n,
309 int *&factors, int &nb_factors);
310 void generators_Bn_group(int n, int &deg,
311 int &nb_perms, int *&perms, int verbose_level);
312 void generators_direct_product(int deg1, int nb_perms1, int *perms1,
313 int deg2, int nb_perms2, int *perms2,
314 int &deg3, int &nb_perms3, int *&perms3,
315 int verbose_levels);
316 void generators_concatenate(int deg1, int nb_perms1, int *perms1,
317 int deg2, int nb_perms2, int *perms2,
318 int &deg3, int &nb_perms3, int *&perms3,
319 int verbose_level);
321 int f_semilinear, int verbose_level);
322 int matrix_group_base_len_affine_group(int n, int q,
323 int f_semilinear, int verbose_level);
325 int f_semilinear, int verbose_level);
326 void order_POmega_epsilon(int epsilon, int m, int q,
327 ring_theory::longinteger_object &o, int verbose_level);
328 void order_PO_epsilon(int f_semilinear, int epsilon, int k, int q,
329 ring_theory::longinteger_object &go, int verbose_level);
330 // k is projective dimension
331 void order_PO(int epsilon, int m, int q,
333 int verbose_level);
334 void order_Pomega(int epsilon, int k, int q,
336 int verbose_level);
337 void order_PO_plus(int m, int q,
338 ring_theory::longinteger_object &o, int verbose_level);
339 void order_PO_minus(int m, int q,
340 ring_theory::longinteger_object &o, int verbose_level);
341 // m = Witt index, the dimension is n = 2m+2
342 void order_PO_parabolic(int m, int q,
343 ring_theory::longinteger_object &o, int verbose_level);
344 void order_Pomega_plus(int m, int q,
345 ring_theory::longinteger_object &o, int verbose_level);
346 // m = Witt index, the dimension is n = 2m
347 void order_Pomega_minus(int m, int q,
348 ring_theory::longinteger_object &o, int verbose_level);
349 // m = half the dimension,
350 // the dimension is n = 2m, the Witt index is m - 1
352 int verbose_level);
353 // m = Witt index, the dimension is n = 2m + 1
354 int index_POmega_in_PO(int epsilon, int m, int q, int verbose_level);
355
356
358 long int *orbit, long int *orbit_inv, int verbose_level);
360 long int *orbit, long int *orbit_inv,
361 int verbose_level);
363 int f_semilinear,
364 int base_len, int degree,
365 long int *base, int *transversal_length,
366 long int **orbit, long int **orbit_inv,
367 int verbose_level);
369 int f_semilinear,
370 int base_len, int degree,
371 long int *base, int *transversal_length,
372 int verbose_level);
374 int f_semilinear,
375 int base_len, int degree,
376 long int *base, int *transversal_length,
377 int verbose_level);
379 int f_semilinear,
380 int base_len, int degree,
381 long int *base, int *transversal_length,
382 int verbose_level);
385 int f_semilinear,
386 int *&data, int &size, int &nb_gens,
387 int verbose_level);
390 int f_semilinear,
391 int *&data, int &size, int &nb_gens,
392 int verbose_level);
395 int f_semilinear,
396 int *&data, int &size, int &nb_gens,
397 int verbose_level);
400 int f_semilinear, int k,
401 int *&data, int &size, int &nb_gens,
402 int verbose_level);
404 int f_semilinear, field_theory::finite_field *F,
405 int *&data, int &size, int &nb_gens,
406 int verbose_level);
408 int f_semilinear, field_theory::finite_field *F,
409 int *&data, int &size, int &nb_gens,
410 int verbose_level);
412 int f_semilinear, int i, int j, int verbose_level);
414 int coordinate_idx,
415 int field_base_idx, int *perm, int verbose_level);
416 // perm points to q^n int's
417 // field_base_idx is the base element whose
418 // translation we compute, 0 \le field_base_idx < e
419 // coordinate_idx is the coordinate in which we shift,
420 // 0 \le coordinate_idx < n
422 int multiplication_order, int *perm, int verbose_level);
423 // perm points to q^n int's
424 // compute the diagonal multiplication by alpha, i.e.
425 // the multiplication by alpha of each component
427 int k, int *perm, int verbose_level);
428 // perm points to q^n int's
429 // compute the diagonal action of the Frobenius
430 // automorphism to the power k, i.e.,
431 // raises each component to the p^k-th power
433 void all_affine_translations(int n, field_theory::finite_field *F, int *gens);
435 int f_translations,
436 int f_semilinear, int frobenius_power,
437 int f_multiplication, int multiplication_order,
438 int &nb_gens, int &degree, int *&gens,
439 int &base_len, long int *&the_base, int verbose_level);
441 int n, int m,
442 long int *orbit, long int *orbit_inv,
443 int verbose_level);
444
445
446};
447
448
449// #############################################################################
450// gl_classes.cpp
451// #############################################################################
452
454
456public:
457 int k;
458 int q;
463 int *v, *w; // [k], used in choose_basis_for_rational_normal_form_block
464
465 gl_classes();
466 ~gl_classes();
467 void null();
468 void freeself();
469 void init(int k, field_theory::finite_field *F, int verbose_level);
470 int select_partition_first(int *Select, int *Select_partition,
471 int verbose_level);
472 int select_partition_next(int *Select, int *Select_partition,
473 int verbose_level);
474 int first(int *Select, int *Select_partition, int verbose_level);
475 int next(int *Select, int *Select_partition, int verbose_level);
477 int verbose_level);
479 int *Mtx, int *Select, int *Select_Partition,
480 int verbose_level);
481 void centralizer_order_Kung_basic(int nb_irreds,
482 int *poly_degree, int *poly_mult, int *partition_idx,
484 int verbose_level);
485 void centralizer_order_Kung(int *Select_polynomial,
486 int *Select_partition, ring_theory::longinteger_object &co,
487 int verbose_level);
488 // Computes the centralizer order of a matrix in GL(k,q)
489 // according to Kung's formula~\cite{Kung81}.
490 void make_classes(gl_class_rep *&R, int &nb_classes,
491 int f_no_eigenvalue_one, int verbose_level);
492 void identify_matrix(int *Mtx, gl_class_rep *R, int *Basis,
493 int verbose_level);
494 void identify2(int *Mtx, ring_theory::unipoly_object &poly, int *Mult,
495 int *Select_partition, int *Basis, int verbose_level);
497 int *Mtx, int *Irreds, int nb_irreds,
498 int *Degree, int *Mult, matrix_block_data *Data,
499 int verbose_level);
501 int d, int b0, int m, int *poly_coeffs, int verbose_level);
502 int identify_partition(int *part, int m, int verbose_level);
504 matrix_block_data *Data, int nb_irreds,
505 int *Basis,
506 int verbose_level);
508 matrix_block_data *Data,
509 int *Basis, int &b,
510 int verbose_level);
512 int *Basis, int **&Gens, int &nb_gens, int &nb_alloc,
513 int verbose_level);
515 int *Mult, int *Select_partition,
516 int *Basis, int **&Gens, int &nb_gens, int &nb_alloc,
517 int verbose_level);
519 int nb_irreds, int h,
520 int **&Gens, int &nb_gens, int &nb_alloc,
521 int verbose_level);
523 int level2, int &coset,
524 int *Mtx, matrix_block_data *Data, int &b, int *Basis,
525 int verbose_level);
526 int find_class_rep(gl_class_rep *Reps, int nb_reps,
527 gl_class_rep *R, int verbose_level);
528 void report(std::ostream &ost, int verbose_level);
529 void print_matrix_and_centralizer_order_latex(std::ostream &ost,
530 gl_class_rep *R);
531};
532
533
534
535// #############################################################################
536// heisenberg.cpp
537// #############################################################################
538
540
541
543
544public:
545 int q;
547 int n;
548 int len; // 2 * n + 1
549 int group_order; // q^len
550
551 int *Elt1;
552 int *Elt2;
553 int *Elt3;
554 int *Elt4;
555
556 heisenberg();
557 ~heisenberg();
558 void null();
559 void freeself();
560 void init(field_theory::finite_field *F, int n, int verbose_level);
561 void unrank_element(int *Elt, long int rk);
562 long int rank_element(int *Elt);
563 void element_add(int *Elt1, int *Elt2, int *Elt3, int verbose_level);
564 void element_negate(int *Elt1, int *Elt2, int verbose_level);
565 int element_add_by_rank(int rk_a, int rk_b, int verbose_level);
566 int element_negate_by_rank(int rk_a, int verbose_level);
567 void group_table(int *&Table, int verbose_level);
568 void group_table_abv(int *&Table_abv, int verbose_level);
569 void generating_set(int *&gens, int &nb_gens, int verbose_level);
570
571
572};
573
574
575
576
577// #############################################################################
578// matrix_block_data.cpp
579// #############################################################################
580
582
584public:
585 int d;
586 int m;
588 int b0;
589 int b1;
590
592 int cnt;
594 int *part;
597
600 void null();
601 void freeself();
602 void allocate(int k);
603};
604
605// #############################################################################
606// null_polarity_generator.cpp:
607// #############################################################################
608
610
612public:
613
614 field_theory::finite_field *F; // no ownership, do not destroy
615 int n, q;
616 int qn; // = q^n
617
618 int *nb_candidates; // [n + 1]
619 int *cur_candidate; // [n]
620 int **candidates; // [n + 1][q^n]
621
622 int *Mtx; // [n * n]
623 int *v; // [n]
624 int *w; // [n]
625 int *Points; // [qn * n]
626
628 int *Data;
630
633 void null();
634 void freeself();
635 void init(field_theory::finite_field *F, int n, int verbose_level);
637 int &first_moved, int depth, int verbose_level);
638 int get_strong_generators(int *Data, int &nb, int &first_moved,
639 int depth, int verbose_level);
640 void backtrack_search(int &nb_sol, int depth, int verbose_level);
641 void create_first_candidate_set(int verbose_level);
642 void create_next_candidate_set(int level, int verbose_level);
643 int dot_product(int *u1, int *u2);
644};
645
646
647// #############################################################################
648// rank_checker.cpp:
649// #############################################################################
650
651
653
654
656
657public:
659 int m, n, d;
660
661 int *M1; // [m * n]
662 int *M2; // [m * n]
663 int *base_cols; // [n]
664 int *set; // [n] used in check_mindist
665
666 rank_checker();
668 void init(field_theory::finite_field *GFq, int m, int n, int d);
669 int check_rank(int len, long int *S, int verbose_level);
670 int check_rank_matrix_input(int len, long int *S, int dim_S,
671 int verbose_level);
672 int check_rank_last_two_are_fixed(int len, long int *S, int verbose_level);
673 int compute_rank(int len, long int *S, int f_projective, int verbose_level);
675 int len, long int *S, int f_projective, int verbose_level);
676};
677
678
679
680// #############################################################################
681// vector_space.cpp:
682// #############################################################################
683
684
686
687
689public:
690
693
694 long int (*rank_point_func)(int *v, void *data);
695 void (*unrank_point_func)(int *v, long int rk, void *data);
697 int *v1; // [dimension]
698 int *base_cols; // [dimension]
699 int *base_cols2; // [dimension]
700 int *M1; // [dimension * dimension]
701 int *M2; // [dimension * dimension]
702
703
704 vector_space();
706 void null();
707 void freeself();
709 int verbose_level);
711 long int (*rank_point_func)(int *v, void *data),
712 void (*unrank_point_func)(int *v, long int rk, void *data),
713 void *data,
714 int verbose_level);
715 void unrank_basis(int *Mtx, long int *set, int len);
716 void rank_basis(int *Mtx, long int *set, int len);
717 void unrank_point(int *v, long int rk);
718 long int rank_point(int *v);
719 int RREF_and_rank(int *basis, int k);
720 int is_contained_in_subspace(int *v, int *basis, int k);
722 long int *set1, long int *set2, int k, int verbose_level);
723 // equality test for subspaces given by ranks of basis elements
724};
725
726
727
728}}}
729
730
731#endif /* ORBITER_SRC_LIB_FOUNDATIONS_ALGEBRA_AND_NUMBER_THEORY_H_ */
732
733
734
related to the computation of Young representations
Definition: algebra.h:32
void Gauss_step(int *v1, int *v2, int len, int idx, int verbose_level)
Definition: a_domain.cpp:1129
void copy(int *elt_from, int *elt_to, int verbose_level)
Definition: a_domain.cpp:275
int Gauss_echelon_form(int *A, int f_special, int f_complete, int *base_cols, int f_P, int *P, int m, int n, int Pn, int verbose_level)
Definition: a_domain.cpp:842
void add_apply_matrix(int *A, int *B, int m, int n, int verbose_level)
Definition: a_domain.cpp:1454
void divide_by_integer(int *elt, int n, int verbose_level)
Definition: a_domain.cpp:603
void make_element_from_integer(int *elt, int n, int verbose_level)
Definition: a_domain.cpp:812
void add(int *elt_a, int *elt_b, int *elt_c, int verbose_level)
Definition: a_domain.cpp:353
void mult_matrix(int *A, int *B, int *C, int ma, int na, int nb, int verbose_level)
Definition: a_domain.cpp:1395
void matrix_get_kernel(int *M, int m, int n, int *base_cols, int nb_base_cols, int &kernel_m, int &kernel_n, int *kernel, int verbose_level)
Definition: a_domain.cpp:1177
void matrix_invert(int *A, int *T, int *basecols, int *Ainv, int n, int verbose_level)
Definition: a_domain.cpp:1566
void make_one(int *elt, int verbose_level)
Definition: a_domain.cpp:207
void print_matrix_for_maple(int *A, int m, int n)
Definition: a_domain.cpp:789
void make_zero_vector(int *elt, int len, int verbose_level)
Definition: a_domain.cpp:142
void subtract(int *elt_a, int *elt_b, int *elt_c, int verbose_level)
Definition: a_domain.cpp:413
void init_integer_fractions(int verbose_level)
Definition: a_domain.cpp:53
void swap_vector(int *elt1, int *elt2, int n, int verbose_level)
Definition: a_domain.cpp:310
void complete_basis(int *M, int m, int n, int verbose_level)
Definition: a_domain.cpp:1339
void make_integer(int *elt, int n, int verbose_level)
Definition: a_domain.cpp:102
void add_apply(int *elt_a, int *elt_b, int verbose_level)
Definition: a_domain.cpp:383
void matrix_mult_apply_scalar(int *A, int *s, int m, int n, int verbose_level)
Definition: a_domain.cpp:1473
int is_zero(int *elt, int verbose_level)
Definition: a_domain.cpp:176
void mult_apply(int *elt_a, int *elt_b, int verbose_level)
Definition: a_domain.cpp:508
void negate(int *elt, int verbose_level)
Definition: a_domain.cpp:445
void make_identity_matrix(int *A, int n, int verbose_level)
Definition: a_domain.cpp:1534
void make_zero(int *elt, int verbose_level)
Definition: a_domain.cpp:122
void mult(int *elt_a, int *elt_b, int *elt_c, int verbose_level)
Definition: a_domain.cpp:477
void inverse(int *elt_a, int *elt_b, int verbose_level)
Definition: a_domain.cpp:682
void mult_by_integer(int *elt, int n, int verbose_level)
Definition: a_domain.cpp:584
void get_image_and_kernel(int *M, int n, int &rk, int verbose_level)
Definition: a_domain.cpp:1307
void copy_vector(int *elt_from, int *elt_to, int len, int verbose_level)
Definition: a_domain.cpp:295
void make_block_matrix_2x2(int *Mtx, int n, int k, int *A, int *B, int *C, int *D, int verbose_level)
Definition: a_domain.cpp:1492
int as_int(int *elt, int verbose_level)
Definition: a_domain.cpp:65
void matrix_inverse(int *A, int *Ainv, int n, int verbose_level)
Definition: a_domain.cpp:1552
void mult_matrix3(int *A, int *B, int *C, int *D, int n, int verbose_level)
Definition: a_domain.cpp:1436
void divide(int *elt_a, int *elt_b, int *elt_c, int verbose_level)
Definition: a_domain.cpp:640
int is_one(int *elt, int verbose_level)
Definition: a_domain.cpp:227
int is_zero_vector(int *elt, int len, int verbose_level)
Definition: a_domain.cpp:155
void matrix_get_kernel_as_row_vectors(int *M, int m, int n, int *base_cols, int nb_base_cols, int &kernel_m, int &kernel_n, int *kernel, int verbose_level)
Definition: a_domain.cpp:1242
void power(int *elt_a, int *elt_b, int n, int verbose_level)
Definition: a_domain.cpp:542
void negate_vector(int *elt, int len, int verbose_level)
Definition: a_domain.cpp:464
void swap(int *elt1, int *elt2, int verbose_level)
Definition: a_domain.cpp:325
void print_matrix(int *A, int m, int n)
Definition: a_domain.cpp:774
global functions related to finite fields, irreducible polynomials and such
Definition: algebra.h:130
void O4_isomorphism_4to2(field_theory::finite_field *F, int *At, int *As, int &f_switch, int *B, int verbose_level)
void search_APN_recursion(field_theory::finite_field *F, int *f, int depth, int &delta_min, int &nb_times, std::vector< std::vector< int > > &Solutions, int verbose_level)
void O4_grid_coordinates_rank(field_theory::finite_field *F, int x1, int x2, int x3, int x4, int &grid_x, int &grid_y, int verbose_level)
void do_equivalence_class_of_fractions(int N, int verbose_level)
void O4_isomorphism_2to4(field_theory::finite_field *F, int *At, int *As, int f_switch, int *B)
void apply_power_function(field_theory::finite_field *F, std::string &fname_csv_in, long int d, int verbose_level)
void Walsh_matrix(field_theory::finite_field *F, int n, int *&W, int verbose_level)
void longinteger_collect_print(std::ostream &ost, int &nb_agos, ring_theory::longinteger_object *&agos, int *&multiplicities)
void O4_grid_coordinates_unrank(field_theory::finite_field *F, int &x1, int &x2, int &x3, int &x4, int grid_x, int grid_y, int verbose_level)
void do_norm(field_theory::finite_field *F, int verbose_level)
void algebraic_normal_form(field_theory::finite_field *F, std::string &fname_csv_in, int n, int verbose_level)
void longinteger_collect_setup(int &nb_agos, ring_theory::longinteger_object *&agos, int *&multiplicities)
void search_APN(field_theory::finite_field *F, int verbose_level)
void formula_subprimitive(int d, int q, ring_theory::longinteger_object &Rdq, int &g, int verbose_level)
void longinteger_collect_add(int &nb_agos, ring_theory::longinteger_object *&agos, int *&multiplicities, ring_theory::longinteger_object &ago)
void O4_find_tangent_plane(field_theory::finite_field *F, int pt_x1, int pt_x2, int pt_x3, int pt_x4, int *tangent_plane, int verbose_level)
void power_function_mod_n(int k, int n, int verbose_level)
void do_cheat_sheet_GF(field_theory::finite_field *F, int verbose_level)
void apply_trace_function(field_theory::finite_field *F, std::string &fname_csv_in, int verbose_level)
void gl_random_matrix(field_theory::finite_field *F, int k, int verbose_level)
void subexponent(int q, int Q, int h, int f, int j, int k, int &s, int &c)
void apply_Walsh_Hadamard_transform(field_theory::finite_field *F, std::string &fname_csv_in, int n, int verbose_level)
void longinteger_collect_free(int &nb_agos, ring_theory::longinteger_object *&agos, int *&multiplicities)
void Vandermonde_matrix(field_theory::finite_field *F, int *&W, int *&W_inv, int verbose_level)
void formula(int d, int q, ring_theory::longinteger_object &Rdq, int verbose_level)
void do_trace(field_theory::finite_field *F, int verbose_level)
int non_linearity(field_theory::finite_field *F, int *f, int verbose_level)
void order_of_q_mod_n(int q, int n_min, int n_max, int verbose_level)
void identity_function(field_theory::finite_field *F, std::string &fname_csv_out, int verbose_level)
int get_strong_generators(int *Data, int &nb, int &first_moved, int depth, int verbose_level)
void init(field_theory::finite_field *F, int n, int verbose_level)
int count_strong_generators(int &nb, int *transversal_length, int &first_moved, int depth, int verbose_level)
conjugacy class in GL(n,q) described using rational normal form
Definition: algebra.h:260
data_structures::int_matrix * type_coding
Definition: algebra.h:262
void init(int nb_irred, int *Select_polynomial, int *Select_partition, int verbose_level)
ring_theory::longinteger_object * class_length
Definition: algebra.h:264
ring_theory::longinteger_object * centralizer_order
Definition: algebra.h:263
void print(int nb_irred, int *Select_polynomial, int *Select_partition, int verbose_level)
void compute_vector_coding(gl_classes *C, int &nb_irred, int *&Poly_degree, int *&Poly_mult, int *&Partition_idx, int verbose_level)
void centralizer_order_Kung(gl_classes *C, ring_theory::longinteger_object &co, int verbose_level)
to list all conjugacy classes in GL(n,q)
Definition: algebra.h:455
void generators_for_centralizer(int *Mtx, gl_class_rep *R, int *Basis, int **&Gens, int &nb_gens, int &nb_alloc, int verbose_level)
void centralizer_generators(int *Mtx, ring_theory::unipoly_object &poly, int *Mult, int *Select_partition, int *Basis, int **&Gens, int &nb_gens, int &nb_alloc, int verbose_level)
void make_matrix_in_rational_normal_form(int *Mtx, int *Select, int *Select_Partition, int verbose_level)
Definition: gl_classes.cpp:244
void print_matrix_and_centralizer_order_latex(std::ostream &ost, gl_class_rep *R)
void centralizer_order_Kung_basic(int nb_irreds, int *poly_degree, int *poly_mult, int *partition_idx, ring_theory::longinteger_object &co, int verbose_level)
Definition: gl_classes.cpp:346
void compute_generalized_kernels(matrix_block_data *Data, int *M2, int d, int b0, int m, int *poly_coeffs, int verbose_level)
void choose_basis_for_rational_normal_form(int *Mtx, matrix_block_data *Data, int nb_irreds, int *Basis, int verbose_level)
void centralizer_generators_block(int *Mtx, matrix_block_data *Data, int nb_irreds, int h, int **&Gens, int &nb_gens, int &nb_alloc, int verbose_level)
void compute_generalized_kernels_for_each_block(int *Mtx, int *Irreds, int nb_irreds, int *Degree, int *Mult, matrix_block_data *Data, int verbose_level)
Definition: gl_classes.cpp:940
int first(int *Select, int *Select_partition, int verbose_level)
Definition: gl_classes.cpp:157
void init(int k, field_theory::finite_field *F, int verbose_level)
Definition: gl_classes.cpp:67
int choose_basis_for_rational_normal_form_coset(int level1, int level2, int &coset, int *Mtx, matrix_block_data *Data, int &b, int *Basis, int verbose_level)
void centralizer_order_Kung(int *Select_polynomial, int *Select_partition, ring_theory::longinteger_object &co, int verbose_level)
Definition: gl_classes.cpp:414
void make_classes(gl_class_rep *&R, int &nb_classes, int f_no_eigenvalue_one, int verbose_level)
Definition: gl_classes.cpp:471
int next(int *Select, int *Select_partition, int verbose_level)
Definition: gl_classes.cpp:181
void choose_basis_for_rational_normal_form_block(int *Mtx, matrix_block_data *Data, int *Basis, int &b, int verbose_level)
void report(std::ostream &ost, int verbose_level)
ring_theory::table_of_irreducible_polynomials * Table_of_polynomials
Definition: algebra.h:460
void make_matrix_from_class_rep(int *Mtx, gl_class_rep *R, int verbose_level)
Definition: gl_classes.cpp:205
int select_partition_first(int *Select, int *Select_partition, int verbose_level)
Definition: gl_classes.cpp:123
void identify2(int *Mtx, ring_theory::unipoly_object &poly, int *Mult, int *Select_partition, int *Basis, int verbose_level)
Definition: gl_classes.cpp:832
int find_class_rep(gl_class_rep *Reps, int nb_reps, gl_class_rep *R, int verbose_level)
void identify_matrix(int *Mtx, gl_class_rep *R, int *Basis, int verbose_level)
Definition: gl_classes.cpp:704
int select_partition_next(int *Select, int *Select_partition, int verbose_level)
Definition: gl_classes.cpp:135
int identify_partition(int *part, int m, int verbose_level)
generators for various classes of groups
Definition: algebra.h:286
void all_affine_translations(int n, field_theory::finite_field *F, int *gens)
void general_linear_matrix_group_base_and_transversal_length(int n, field_theory::finite_field *F, int f_semilinear, int base_len, int degree, long int *base, int *transversal_length, int verbose_level)
int matrix_group_base_len_projective_group(int n, int q, int f_semilinear, int verbose_level)
void generators_for_stabilizer_of_triangle_in_PGL4(int f_semilinear, field_theory::finite_field *F, int *&data, int &size, int &nb_gens, int verbose_level)
void generators_concatenate(int deg1, int nb_perms1, int *perms1, int deg2, int nb_perms2, int *perms2, int &deg3, int &nb_perms3, int *&perms3, int verbose_level)
void order_Pomega_plus(int m, int q, ring_theory::longinteger_object &o, int verbose_level)
void generators_dihedral_involution(int deg, int &nb_perms, int *&perms, int verbose_level)
void order_Pomega_parabolic(int m, int q, ring_theory::longinteger_object &o, int verbose_level)
void generators_symmetric_group(int deg, int &nb_perms, int *&perms, int verbose_level)
int all_affine_translations_nb_gens(int n, field_theory::finite_field *F)
int matrix_group_base_len_general_linear_group(int n, int q, int f_semilinear, int verbose_level)
void builtin_transversal_rep_GLnq(int *A, int n, field_theory::finite_field *F, int f_semilinear, int i, int j, int verbose_level)
void generators_dihedral_group(int deg, int &nb_perms, int *&perms, int verbose_level)
void generators_Hall_reflection(int nb_pairs, int &nb_perms, int *&perms, int &degree, int verbose_level)
void order_PO_plus(int m, int q, ring_theory::longinteger_object &o, int verbose_level)
void generators_Bn_group(int n, int &deg, int &nb_perms, int *&perms, int verbose_level)
void order_Hall_reflection_normalizer_factorized(int nb_pairs, int *&factors, int &nb_factors)
void order_Pomega(int epsilon, int k, int q, ring_theory::longinteger_object &go, int verbose_level)
void frobenius_orbit_perm(int n, field_theory::finite_field *F, long int *orbit, long int *orbit_inv, int verbose_level)
void order_Bn_group_factorized(int n, int *&factors, int &nb_factors)
void affine_translation(int n, field_theory::finite_field *F, int coordinate_idx, int field_base_idx, int *perm, int verbose_level)
void generators_direct_product(int deg1, int nb_perms1, int *perms1, int deg2, int nb_perms2, int *perms2, int &deg3, int &nb_perms3, int *&perms3, int verbose_levels)
int matrix_group_base_len_affine_group(int n, int q, int f_semilinear, int verbose_level)
void generators_identity_group(int deg, int &nb_perms, int *&perms, int verbose_level)
void strong_generators_for_affine_linear_group(int n, field_theory::finite_field *F, int f_semilinear, int *&data, int &size, int &nb_gens, int verbose_level)
void projective_matrix_group_base_and_orbits(int n, field_theory::finite_field *F, int f_semilinear, int base_len, int degree, long int *base, int *transversal_length, long int **orbit, long int **orbit_inv, int verbose_level)
void generators_cyclic_group(int deg, int &nb_perms, int *&perms, int verbose_level)
void order_PO_epsilon(int f_semilinear, int epsilon, int k, int q, ring_theory::longinteger_object &go, int verbose_level)
void generators_for_parabolic_subgroup(int n, field_theory::finite_field *F, int f_semilinear, int k, int *&data, int &size, int &nb_gens, int verbose_level)
void affine_multiplication(int n, field_theory::finite_field *F, int multiplication_order, int *perm, int verbose_level)
void order_PO_minus(int m, int q, ring_theory::longinteger_object &o, int verbose_level)
void projective_matrix_group_base_and_transversal_length(int n, field_theory::finite_field *F, int f_semilinear, int base_len, int degree, long int *base, int *transversal_length, int verbose_level)
void diagonal_orbit_perm(int n, field_theory::finite_field *F, long int *orbit, long int *orbit_inv, int verbose_level)
void affine_frobenius(int n, field_theory::finite_field *F, int k, int *perm, int verbose_level)
void affine_matrix_group_base_and_transversal_length(int n, field_theory::finite_field *F, int f_semilinear, int base_len, int degree, long int *base, int *transversal_length, int verbose_level)
void generators_for_stabilizer_of_three_collinear_points_in_PGL4(int f_semilinear, field_theory::finite_field *F, int *&data, int &size, int &nb_gens, int verbose_level)
void affine_generators(int n, field_theory::finite_field *F, int f_translations, int f_semilinear, int frobenius_power, int f_multiplication, int multiplication_order, int &nb_gens, int &degree, int *&gens, int &base_len, long int *&the_base, int verbose_level)
void order_POmega_epsilon(int epsilon, int m, int q, ring_theory::longinteger_object &o, int verbose_level)
int index_POmega_in_PO(int epsilon, int m, int q, int verbose_level)
void order_Pomega_minus(int m, int q, ring_theory::longinteger_object &o, int verbose_level)
void generators_Hall_reflection_normalizer_group(int nb_pairs, int &nb_perms, int *&perms, int &degree, int verbose_level)
void strong_generators_for_projective_linear_group(int n, field_theory::finite_field *F, int f_semilinear, int *&data, int &size, int &nb_gens, int verbose_level)
void order_PO(int epsilon, int m, int q, ring_theory::longinteger_object &o, int verbose_level)
void PG_element_modified_not_in_subspace_perm(field_theory::finite_field *F, int n, int m, long int *orbit, long int *orbit_inv, int verbose_level)
void order_PO_parabolic(int m, int q, ring_theory::longinteger_object &o, int verbose_level)
void strong_generators_for_general_linear_group(int n, field_theory::finite_field *F, int f_semilinear, int *&data, int &size, int &nb_gens, int verbose_level)
Heisenberg group of n x n matrices.
Definition: algebra.h:542
void element_negate(int *Elt1, int *Elt2, int verbose_level)
Definition: heisenberg.cpp:100
void element_add(int *Elt1, int *Elt2, int *Elt3, int verbose_level)
Definition: heisenberg.cpp:91
void generating_set(int *&gens, int &nb_gens, int verbose_level)
Definition: heisenberg.cpp:180
void init(field_theory::finite_field *F, int n, int verbose_level)
Definition: heisenberg.cpp:52
int element_negate_by_rank(int rk_a, int verbose_level)
Definition: heisenberg.cpp:121
void group_table_abv(int *&Table_abv, int verbose_level)
Definition: heisenberg.cpp:155
int element_add_by_rank(int rk_a, int rk_b, int verbose_level)
Definition: heisenberg.cpp:110
void group_table(int *&Table, int verbose_level)
Definition: heisenberg.cpp:131
void unrank_element(int *Elt, long int rk)
Definition: heisenberg.cpp:76
rational normal form of a matrix in GL(n,q) for gl_class_rep
Definition: algebra.h:583
void backtrack_search(int &nb_sol, int depth, int verbose_level)
int count_strong_generators(int &nb, int *transversal_length, int &first_moved, int depth, int verbose_level)
void init(field_theory::finite_field *F, int n, int verbose_level)
int get_strong_generators(int *Data, int &nb, int &first_moved, int depth, int verbose_level)
to check whether any d - 1 elements of a given set are linearly independent
Definition: algebra.h:655
int check_rank_matrix_input(int len, long int *S, int dim_S, int verbose_level)
int check_rank_last_two_are_fixed(int len, long int *S, int verbose_level)
int check_rank(int len, long int *S, int verbose_level)
int compute_rank_row_vectors(int len, long int *S, int f_projective, int verbose_level)
void init(field_theory::finite_field *GFq, int m, int n, int d)
int compute_rank(int len, long int *S, int f_projective, int verbose_level)
finite dimensional vector space over a finite field
Definition: algebra.h:688
void init(field_theory::finite_field *F, int dimension, int verbose_level)
int compare_subspaces_ranked(long int *set1, long int *set2, int k, int verbose_level)
void rank_basis(int *Mtx, long int *set, int len)
void unrank_basis(int *Mtx, long int *set, int len)
void(* unrank_point_func)(int *v, long int rk, void *data)
Definition: algebra.h:695
int is_contained_in_subspace(int *v, int *basis, int k)
void init_rank_functions(long int(*rank_point_func)(int *v, void *data), void(*unrank_point_func)(int *v, long int rk, void *data), void *data, int verbose_level)
long int(* rank_point_func)(int *v, void *data)
Definition: algebra.h:694
a class to represent arbitrary precision integers
Definition: ring_theory.h:366
a table of all irreducible polynomials over GF(q) of degree less than a certain value
Definition: ring_theory.h:659
the orbiter library for the classification of combinatorial objects