Orbiter 2022
Combinatorial Objects
linear_algebra.h
Go to the documentation of this file.
1/*
2 * linear_algebra.h
3 *
4 * Created on: Jan 10, 2022
5 * Author: betten
6 */
7
8#ifndef SRC_LIB_FOUNDATIONS_LINEAR_ALGEBRA_LINEAR_ALGEBRA_H_
9#define SRC_LIB_FOUNDATIONS_LINEAR_ALGEBRA_LINEAR_ALGEBRA_H_
10
11
12namespace orbiter {
13namespace layer1_foundations {
14namespace linear_algebra {
15
16
17// #############################################################################
18// linear_algebra_global.cpp:
19// #############################################################################
20
22
24public:
29 std::string &Berlekamp_matrix_coeffs,
30 int verbose_level);
33 int d, int verbose_level);
34 void do_nullspace(
36 int *M, int m, int n,
37 int f_normalize_from_the_left, int f_normalize_from_the_right,
38 int verbose_level);
39 void do_RREF(
41 int *M, int m, int n,
42 int f_normalize_from_the_left, int f_normalize_from_the_right,
43 int verbose_level);
44 void RREF_demo(
46 int *A, int m, int n, int verbose_level);
49 std::ostream &ost, int *A, int m, int n, int verbose_level);
50
51};
52
53
54
55// #############################################################################
56// linear_algebra.cpp:
57// #############################################################################
58
60
62public:
64
65 // #########################################################################
66 // linear_algebra.cpp
67 // #########################################################################
68
71 void init(field_theory::finite_field *F, int verbose_level);
72
73
74 void copy_matrix(int *A, int *B, int ma, int na);
75 void reverse_matrix(int *A, int *B, int ma, int na);
76 void identity_matrix(int *A, int n);
77 int is_identity_matrix(int *A, int n);
78 int is_diagonal_matrix(int *A, int n);
80 int n, int &scalar);
81 void diagonal_matrix(int *A, int n, int alpha);
82 void matrix_minor(int f_semilinear, int *A,
83 int *B, int n, int f, int l);
84 // initializes B as the l x l minor of A
85 // (which is n x n) starting from row f.
86 void mult_vector_from_the_left(int *v, int *A,
87 int *vA, int m, int n);
88 // v[m], A[m][n], vA[n]
89 void mult_vector_from_the_right(int *A, int *v,
90 int *Av, int m, int n);
91 // A[m][n], v[n], Av[m]
92
93 void mult_matrix_matrix(int *A, int *B,
94 int *C, int m, int n, int o, int verbose_level);
95 // matrix multiplication C := A * B,
96 // where A is m x n and B is n x o, so that C is m by o
97 void semilinear_matrix_mult(int *A, int *B, int *AB, int n);
98 // (A,f1) * (B,f2) = (A*B^{\varphi^{-f1}},f1+f2)
99 void semilinear_matrix_mult_memory_given(int *A, int *B,
100 int *AB, int *tmp_B, int n, int verbose_level);
101 // (A,f1) * (B,f2) = (A*B^{\varphi^{-f1}},f1+f2)
102 void matrix_mult_affine(int *A, int *B, int *AB,
103 int n, int verbose_level);
104 void semilinear_matrix_mult_affine(int *A, int *B, int *AB, int n);
105 int matrix_determinant(int *A, int n, int verbose_level);
106 void matrix_inverse(int *A, int *Ainv, int n, int verbose_level);
107 void matrix_invert(int *A, int *Tmp,
108 int *Tmp_basecols, int *Ainv, int n, int verbose_level);
109 // Tmp points to n * n + 1 int's
110 // Tmp_basecols points to n int's
111 void semilinear_matrix_invert(int *A, int *Tmp,
112 int *Tmp_basecols, int *Ainv, int n, int verbose_level);
113 // Tmp points to n * n + 1 int's
114 // Tmp_basecols points to n int's
115 void semilinear_matrix_invert_affine(int *A, int *Tmp,
116 int *Tmp_basecols, int *Ainv, int n, int verbose_level);
117 // Tmp points to n * n + 1 int's
118 // Tmp_basecols points to n int's
119 void matrix_invert_affine(int *A, int *Tmp, int *Tmp_basecols,
120 int *Ainv, int n, int verbose_level);
121 // Tmp points to n * n + 1 int's
122 // Tmp_basecols points to n int's
123 void projective_action_from_the_right(int f_semilinear,
124 int *v, int *A, int *vA, int n, int verbose_level);
125 // vA = (v * A)^{p^f} if f_semilinear (where f = A[n * n]),
126 // vA = v * A otherwise
127 void general_linear_action_from_the_right(int f_semilinear,
128 int *v, int *A, int *vA, int n, int verbose_level);
130 int *A, int *vA, int n);
131 // vA = (v * A)^{p^f} (where f = A[n * n])
133 int *v, int *Av, int n);
134 // Av = A * v^{p^f}
135 void affine_action_from_the_right(int f_semilinear,
136 int *v, int *A, int *vA, int n);
137 // vA = (v * A)^{p^f} + b
138 void zero_vector(int *A, int m);
139 void all_one_vector(int *A, int m);
140 void support(int *A, int m, int *&support, int &size);
141 void characteristic_vector(int *A, int m, int *set, int size);
142 int is_zero_vector(int *A, int m);
143 void add_vector(int *A, int *B, int *C, int m);
145 int a, int *A, int b, int *B, int *C, int len);
147 int a, int *A, int b, int *B, int c, int *C, int *D, int len);
148 void negate_vector(int *A, int *B, int m);
149 void negate_vector_in_place(int *A, int m);
150 void scalar_multiply_vector_in_place(int c, int *A, int m);
151 void vector_frobenius_power_in_place(int *A, int m, int f);
152 int dot_product(int len, int *v, int *w);
153 void transpose_matrix(int *A, int *At, int ma, int na);
154 void transpose_matrix_in_place(int *A, int m);
155 void invert_matrix(int *A, int *A_inv, int n, int verbose_level);
156 void invert_matrix_memory_given(int *A, int *A_inv, int n,
157 int *tmp_A, int *tmp_basecols, int verbose_level);
158 void transform_form_matrix(int *A, int *Gram,
159 int *new_Gram, int d, int verbose_level);
160 // computes new_Gram = A * Gram * A^\top
161 int rank_of_matrix(int *A, int m, int verbose_level);
163 int m, int *B, int *base_cols, int verbose_level);
165 int m, int n, int verbose_level);
167 int m, int n, int *B, int *base_cols,
168 int verbose_level);
169 int rank_and_basecols(int *A, int m,
170 int *base_cols, int verbose_level);
171 void Gauss_step(int *v1, int *v2, int len,
172 int idx, int verbose_level);
173 // afterwards: v2[idx] = 0
174 // and v1,v2 span the same space as before
175 // v1 is not changed if v1[idx] is nonzero
176 void Gauss_step_make_pivot_one(int *v1, int *v2,
177 int len, int idx, int verbose_level);
178 // afterwards: v1,v2 span the same space as before
179 // v2[idx] = 0, v1[idx] = 1,
180 void extend_basis(int m, int n, int *Basis, int verbose_level);
181 int base_cols_and_embedding(int m, int n, int *A,
182 int *base_cols, int *embedding, int verbose_level);
183 // returns the rank rk of the matrix.
184 // It also computes base_cols[rk] and embedding[m - rk]
185 // It leaves A unchanged
186 int Gauss_easy(int *A, int m, int n);
187 // returns the rank
188 int Gauss_easy_memory_given(int *A, int m, int n, int *base_cols);
189 int Gauss_simple(int *A, int m, int n,
190 int *base_cols, int verbose_level);
191 // returns the rank which is the
192 // number of entries in base_cols
193 void kernel_columns(int n, int nb_base_cols,
194 int *base_cols, int *kernel_cols);
195 void matrix_get_kernel_as_int_matrix(int *M, int m, int n,
196 int *base_cols, int nb_base_cols,
197 data_structures::int_matrix *kernel, int verbose_level);
198 void matrix_get_kernel(int *M, int m, int n,
199 int *base_cols, int nb_base_cols,
200 int &kernel_m, int &kernel_n, int *kernel, int verbose_level);
201 // kernel[n * (n - nb_base_cols)]
202 int perp(int n, int k, int *A, int *Gram, int verbose_level);
203 int RREF_and_kernel(int n, int k, int *A, int verbose_level);
204 int perp_standard(int n, int k, int *A, int verbose_level);
205 int perp_standard_with_temporary_data(int n, int k, int *A,
206 int *B, int *K, int *base_cols,
207 int verbose_level);
208 int intersect_subspaces(int n, int k1, int *A, int k2, int *B,
209 int &k3, int *intersection, int verbose_level);
210 int n_choose_k_mod_p(int n, int k, int verbose_level);
211 void Dickson_polynomial(int *map, int *coeffs);
212 // compute the coefficients of a degree q-1 polynomial
213 // which interpolates a given map
214 // from F_q to F_q
216 int *M, int m, int n, int *perm, int verbose_level);
217 int evaluate_bilinear_form(int n, int *v1, int *v2, int *Gram);
219 int *v1, int *v2);
220 int evaluate_quadratic_form(int n, int nb_terms,
221 int *i, int *j, int *coeff, int *x);
222 void find_singular_vector_brute_force(int n, int form_nb_terms,
223 int *form_i, int *form_j, int *form_coeff, int *Gram,
224 int *vec, int verbose_level);
225 void find_singular_vector(int n, int form_nb_terms,
226 int *form_i, int *form_j, int *form_coeff, int *Gram,
227 int *vec, int verbose_level);
228 void complete_hyperbolic_pair(int n, int form_nb_terms,
229 int *form_i, int *form_j, int *form_coeff, int *Gram,
230 int *vec1, int *vec2, int verbose_level);
231 void find_hyperbolic_pair(int n, int form_nb_terms,
232 int *form_i, int *form_j, int *form_coeff, int *Gram,
233 int *vec1, int *vec2, int verbose_level);
235 int n, int *basis,
236 int form_nb_terms,
237 int *form_i, int *form_j, int *form_coeff,
238 int &restricted_form_nb_terms,
239 int *&restricted_form_i, int *&restricted_form_j,
240 int *&restricted_form_coeff,
241 int verbose_level);
242 void restrict_quadratic_form(int k, int n, int *basis,
243 int *C, int *D, int verbose_level);
244 int compare_subspaces_ranked(int *set1, int *set2, int size,
245 int vector_space_dimension, int verbose_level);
246 // Compares the span of two sets of vectors.
247 // returns 0 if equal, 1 if not
248 // (this is so that it matches to the result
249 // of a compare function)
251 int *set1, int *set2, int size,
252 int vector_space_dimension,
253 void (*unrank_point_func)(int *v, int rk, void *data),
254 void *rank_point_data,
255 int verbose_level);
256 int Gauss_canonical_form_ranked(int *set1, int *set2, int size,
257 int vector_space_dimension, int verbose_level);
258 // Computes the Gauss canonical form
259 // for the generating set in set1.
260 // The result is written to set2.
261 // Returns the rank of the span of the elements in set1.
262 int lexleast_canonical_form_ranked(int *set1, int *set2, int size,
263 int vector_space_dimension, int verbose_level);
264 // Computes the lexleast generating set the subspace
265 // spanned by the elements in set1.
266 // The result is written to set2.
267 // Returns the rank of the span of the elements in set1.
268 void exterior_square(int *An, int *An2, int n, int verbose_level);
269 void lift_to_Klein_quadric(int *A4, int *A6, int verbose_level);
270
271
272 // #########################################################################
273 // linear_algebra2.cpp
274 // #########################################################################
275
277 int k, int n, int *basis_of_subspace,
278 int *input_vector, int *coefficients, int verbose_level);
279 // basis[k * n]
280 // coefficients[k]
281 // input_vector[n] is the input vector.
282 // At the end, coefficients[k] are the coefficients of the linear combination
283 // which expresses input_vector[n] in terms of the given basis of the subspace.
285 int k, int len, int *basis, int *base_cols,
286 int *v, int *coefficients, int verbose_level);
287 void reduce_mod_subspace(int k,
288 int len, int *basis, int *base_cols,
289 int *v, int verbose_level);
290 int is_contained_in_subspace(int k,
291 int len, int *basis, int *base_cols,
292 int *v, int verbose_level);
293 int is_subspace(int d, int dim_U, int *Basis_U, int dim_V,
294 int *Basis_V, int verbose_level);
295 void Kronecker_product(int *A, int *B, int n, int *AB);
296 void Kronecker_product_square_but_arbitrary(int *A, int *B,
297 int na, int nb, int *AB, int &N, int verbose_level);
298 int dependency(int d, int *v, int *A, int m, int *rho,
299 int verbose_level);
300 // Lueneburg~\cite{Lueneburg87a} p. 104.
301 // A is a matrix of size d + 1 times d
302 // v[d]
303 // rho is a column permutation of degree d
304 void order_ideal_generator(int d, int idx, int *mue, int &mue_deg,
305 int *A, int *Frobenius,
306 int verbose_level);
307 // Lueneburg~\cite{Lueneburg87a} p. 105.
308 // Frobenius is a matrix of size d x d
309 // A is (d + 1) x d
310 // mue[d + 1]
311 void span_cyclic_module(int *A, int *v, int n, int *Mtx,
312 int verbose_level);
313 void random_invertible_matrix(int *M, int k, int verbose_level);
314 void adjust_basis(int *V, int *U, int n, int k, int d,
315 int verbose_level);
318 int *v, int verbose_level);
321 data_structures::int_matrix *W2, int *v,
322 int verbose_level);
323 int
325 int &coset,
328 data_structures::int_matrix *W2, int *v,
329 int verbose_level);
330 void vector_add_apply(int *v, int *w, int c, int n);
331 void vector_add_apply_with_stride(int *v, int *w, int stride,
332 int c, int n);
333 int test_if_commute(int *A, int *B, int k, int verbose_level);
334 void unrank_point_in_PG(int *v, int len, int rk);
335 // len is the length of the vector,
336 // not the projective dimension
337 int rank_point_in_PG(int *v, int len);
338 int nb_points_in_PG(int n);
339 // n is projective dimension
340 void Borel_decomposition(int n, int *M, int *B1, int *B2,
341 int *pivots, int verbose_level);
342 void map_to_standard_frame(int d, int *A,
343 int *Transform, int verbose_level);
344 // d = vector space dimension
345 // maps d + 1 points to the frame
346 // e_1, e_2, ..., e_d, e_1+e_2+..+e_d
347 // A is (d + 1) x d
348 // Transform is d x d
349 void map_frame_to_frame_with_permutation(int d, int *A,
350 int *perm, int *B, int *Transform, int verbose_level);
351 void map_points_to_points_projectively(int d, int k,
352 int *A, int *B, int *Transform,
353 int &nb_maps, int verbose_level);
354 // A and B are (d + k + 1) x d
355 // Transform is d x d
356 // returns TRUE if a map exists
357 int BallChowdhury_matrix_entry(int *Coord, int *C,
358 int *U, int k, int sz_U,
359 int *T, int verbose_level);
360 void cubic_surface_family_24_generators(int f_with_normalizer,
361 int f_semilinear,
362 int *&gens, int &nb_gens, int &data_size,
363 int &group_order, int verbose_level);
365 int a,
366 int *&gens, int &nb_gens, int &data_size,
367 int &group_order, int verbose_level);
369 int a,
370 int *&gens, int &nb_gens, int &data_size,
371 int &group_order, int verbose_level);
372 int is_unit_vector(int *v, int len, int k);
374 int omega, int k, int *N, int **A, int **Av,
375 int *Omega, int verbose_level);
376
377 // #########################################################################
378 // linear_algebra3.cpp
379 // #########################################################################
380
381 void Gram_matrix(int epsilon, int k,
382 int form_c1, int form_c2, int form_c3,
383 int *&Gram, int verbose_level);
385 int *u, int *v, int d, int *Gram);
386 int evaluate_quadratic_form(int *v, int stride,
387 int epsilon, int k, int form_c1, int form_c2, int form_c3);
389 int *v, int stride, int n);
391 int *u, int *v, int n);
393 long int rk_from, long int rk_to, long int root,
394 int epsilon, int algebraic_dimension,
395 int form_c1, int form_c2, int form_c3, int *Gram_matrix,
396 int verbose_level);
397 // root is not perp to from and to.
399 int epsilon, int k,
400 int form_c1, int form_c2, int form_c3,
401 int *M, int *v, int *u, int verbose_level);
402 // if u is singular and v \in \la u \ra^\perp, then
403 // \pho_{u,v}(x) := x + \beta(x,v) u - \beta(x,u) v - Q(v) \beta(x,u) u
404 // is called the Siegel transform (see Taylor p. 148)
405 // Here Q is the quadratic form
406 // and \beta is the corresponding bilinear form
407 long int orthogonal_find_root(int rk2,
408 int epsilon, int algebraic_dimension,
409 int form_c1, int form_c2, int form_c3, int *Gram_matrix,
410 int verbose_level);
412 int &c1, int &c2, int &c3, int verbose_level);
413
414 int evaluate_conic_form(int *six_coeffs, int *v3);
415 int evaluate_quadric_form_in_PG_three(int *ten_coeffs, int *v4);
416 int Pluecker_12(int *x4, int *y4);
417 int Pluecker_21(int *x4, int *y4);
418 int Pluecker_13(int *x4, int *y4);
419 int Pluecker_31(int *x4, int *y4);
420 int Pluecker_14(int *x4, int *y4);
421 int Pluecker_41(int *x4, int *y4);
422 int Pluecker_23(int *x4, int *y4);
423 int Pluecker_32(int *x4, int *y4);
424 int Pluecker_24(int *x4, int *y4);
425 int Pluecker_42(int *x4, int *y4);
426 int Pluecker_34(int *x4, int *y4);
427 int Pluecker_43(int *x4, int *y4);
428 int Pluecker_ij(int i, int j, int *x4, int *y4);
429 int evaluate_symplectic_form(int len, int *x, int *y);
430 int evaluate_symmetric_form(int len, int *x, int *y);
432 void solve_y2py(int a, int *Y2, int &nb_sol);
433 void find_secant_points_wrt_x0x3mx1x2(int *Basis_line, int *Pts4, int &nb_pts, int verbose_level);
435 int n, int *Basis);
436 int evaluate_monomial(int *monomial, int *variables, int nb_vars);
437
438
439
440 // #########################################################################
441 // linear_algebra_RREF.cpp
442 // #########################################################################
443
444 int Gauss_int(int *A, int f_special,
445 int f_complete, int *base_cols,
446 int f_P, int *P, int m, int n,
447 int Pn, int verbose_level);
448 // returns the rank which is the
449 // number of entries in base_cols
450 // A is m x n,
451 // P is m x Pn (provided f_P is TRUE)
453 int f_special, int f_complete, int *pivot_perm,
454 int m, int n,
455 int (*find_pivot_function)(int *A, int m, int n, int r,
456 int *pivot_perm, void *data),
457 void *find_pivot_data,
458 int verbose_level);
459 // returns the rank which is the number of entries in pivots
460 // A is a m x n matrix
462 int f_special, int f_complete, int *pivots, int nb_pivots,
463 int m, int n,
464 int verbose_level);
465 // A is a m x n matrix
466 // returns FALSE if pivot cannot be found at one of the steps
467 int RREF_search_pivot(int *A, int m, int n,
468 int &i, int &j, int *base_cols, int verbose_level);
469 void RREF_make_pivot_one(int *A, int m, int n,
470 int &i, int &j, int *base_cols, int verbose_level);
471 void RREF_elimination_below(int *A, int m, int n,
472 int &i, int &j, int *base_cols, int verbose_level);
473 void RREF_elimination_above(int *A, int m, int n,
474 int i, int *base_cols, int verbose_level);
475
476
477};
478
479
480
481// #############################################################################
482// representation_theory_domain.cpp:
483// #############################################################################
484
486
488public:
489
491
494 void init(field_theory::finite_field *F, int verbose_level);
495 void representing_matrix8_R(int *A,
496 int q, int a, int b, int c, int d);
497 void representing_matrix9_R(int *A,
498 int q, int a, int b, int c, int d);
499 void representing_matrix9_U(int *A,
500 int a, int b, int c, int d, int beta);
501 void representing_matrix8_U(int *A,
502 int a, int b, int c, int d, int beta);
503 void representing_matrix8_V(int *A, int beta);
504 void representing_matrix9b(int *A, int beta);
505 void representing_matrix8a(int *A,
506 int a, int b, int c, int d, int beta);
507 void representing_matrix8b(int *A, int beta);
508 int Term1(int a1, int e1);
509 int Term2(int a1, int a2, int e1, int e2);
510 int Term3(int a1, int a2, int a3, int e1, int e2, int e3);
511 int Term4(int a1, int a2, int a3, int a4, int e1, int e2, int e3,
512 int e4);
513 int Term5(int a1, int a2, int a3, int a4, int a5, int e1, int e2,
514 int e3, int e4, int e5);
515 int term1(int a1, int e1);
516 int term2(int a1, int a2, int e1, int e2);
517 int term3(int a1, int a2, int a3, int e1, int e2, int e3);
518 int term4(int a1, int a2, int a3, int a4, int e1, int e2, int e3,
519 int e4);
520 int term5(int a1, int a2, int a3, int a4, int a5, int e1, int e2,
521 int e3, int e4, int e5);
522 int m_term(int q, int a1, int a2, int a3);
523 int beta_trinomial(int q, int beta, int a1, int a2, int a3);
524 int T3product2(int a1, int a2);
525 int add(int a, int b);
526 int add3(int a, int b, int c);
527 int negate(int a);
528 int twice(int a);
529 int mult(int a, int b);
530 int inverse(int a);
531 int power(int a, int n);
532 int T2(int a);
533 int T3(int a);
534 int N2(int a);
535 int N3(int a);
536
537};
538
539
540
541}}}
542
543
544
545#endif /* SRC_LIB_FOUNDATIONS_LINEAR_ALGEBRA_LINEAR_ALGEBRA_H_ */
void do_nullspace(field_theory::finite_field *F, int *M, int m, int n, int f_normalize_from_the_left, int f_normalize_from_the_right, int verbose_level)
void compute_normal_basis(field_theory::finite_field *F, int d, int verbose_level)
void Berlekamp_matrix(field_theory::finite_field *F, std::string &Berlekamp_matrix_coeffs, int verbose_level)
void RREF_demo(field_theory::finite_field *F, int *A, int m, int n, int verbose_level)
void RREF_with_steps_latex(field_theory::finite_field *F, std::ostream &ost, int *A, int m, int n, int verbose_level)
void do_RREF(field_theory::finite_field *F, int *M, int m, int n, int f_normalize_from_the_left, int f_normalize_from_the_right, int verbose_level)
void RREF_elimination_above(int *A, int m, int n, int i, int *base_cols, int verbose_level)
void mult_vector_from_the_left(int *v, int *A, int *vA, int m, int n)
void linear_combination_of_three_vectors(int a, int *A, int b, int *B, int c, int *C, int *D, int len)
int is_contained_in_subspace(int k, int len, int *basis, int *base_cols, int *v, int verbose_level)
void find_singular_vector_brute_force(int n, int form_nb_terms, int *form_i, int *form_j, int *form_coeff, int *Gram, int *vec, int verbose_level)
void semilinear_matrix_mult_affine(int *A, int *B, int *AB, int n)
void reduce_mod_subspace_and_get_coefficient_vector(int k, int len, int *basis, int *base_cols, int *v, int *coefficients, int verbose_level)
void Siegel_Transformation(int epsilon, int k, int form_c1, int form_c2, int form_c3, int *M, int *v, int *u, int verbose_level)
void make_Fourier_matrices(int omega, int k, int *N, int **A, int **Av, int *Omega, int verbose_level)
void matrix_invert_affine(int *A, int *Tmp, int *Tmp_basecols, int *Ainv, int n, int verbose_level)
void projective_action_on_columns_from_the_left(int *A, int *M, int m, int n, int *perm, int verbose_level)
void lift_to_Klein_quadric(int *A4, int *A6, int verbose_level)
void init(field_theory::finite_field *F, int verbose_level)
void map_to_standard_frame(int d, int *A, int *Transform, int verbose_level)
int BallChowdhury_matrix_entry(int *Coord, int *C, int *U, int k, int sz_U, int *T, int verbose_level)
void find_singular_vector(int n, int form_nb_terms, int *form_i, int *form_j, int *form_coeff, int *Gram, int *vec, int verbose_level)
void general_linear_action_from_the_right(int f_semilinear, int *v, int *A, int *vA, int n, int verbose_level)
int rank_of_rectangular_matrix_memory_given(int *A, int m, int n, int *B, int *base_cols, int verbose_level)
void matrix_mult_affine(int *A, int *B, int *AB, int n, int verbose_level)
int compare_subspaces_ranked(int *set1, int *set2, int size, int vector_space_dimension, int verbose_level)
int is_subspace(int d, int dim_U, int *Basis_U, int dim_V, int *Basis_V, int verbose_level)
void exterior_square(int *An, int *An2, int n, int verbose_level)
void vector_add_apply_with_stride(int *v, int *w, int stride, int c, int n)
int rank_of_matrix_memory_given(int *A, int m, int *B, int *base_cols, int verbose_level)
int Gauss_int_with_pivot_strategy(int *A, int f_special, int f_complete, int *pivot_perm, int m, int n, int(*find_pivot_function)(int *A, int m, int n, int r, int *pivot_perm, void *data), void *find_pivot_data, int verbose_level)
int RREF_search_pivot(int *A, int m, int n, int &i, int &j, int *base_cols, int verbose_level)
void transform_form_matrix(int *A, int *Gram, int *new_Gram, int d, int verbose_level)
int Gauss_int(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)
void support(int *A, int m, int *&support, int &size)
int matrix_determinant(int *A, int n, int verbose_level)
int is_scalar_multiple_of_identity_matrix(int *A, int n, int &scalar)
void order_ideal_generator(int d, int idx, int *mue, int &mue_deg, int *A, int *Frobenius, int verbose_level)
void complete_hyperbolic_pair(int n, int form_nb_terms, int *form_i, int *form_j, int *form_coeff, int *Gram, int *vec1, int *vec2, int verbose_level)
int evaluate_monomial(int *monomial, int *variables, int nb_vars)
void projective_action_from_the_right(int f_semilinear, int *v, int *A, int *vA, int n, int verbose_level)
void semilinear_action_from_the_left(int *A, int *v, int *Av, int n)
void random_invertible_matrix(int *M, int k, int verbose_level)
int base_cols_and_embedding(int m, int n, int *A, int *base_cols, int *embedding, int verbose_level)
void transpose_matrix(int *A, int *At, int ma, int na)
int choose_vector_in_here_but_not_in_here_or_here_column_spaces_coset(int &coset, data_structures::int_matrix *V, data_structures::int_matrix *W1, data_structures::int_matrix *W2, int *v, int verbose_level)
void invert_matrix(int *A, int *A_inv, int n, int verbose_level)
void kernel_columns(int n, int nb_base_cols, int *base_cols, int *kernel_cols)
void mult_matrix_matrix(int *A, int *B, int *C, int m, int n, int o, int verbose_level)
void choose_vector_in_here_but_not_in_here_or_here_column_spaces(data_structures::int_matrix *V, data_structures::int_matrix *W1, data_structures::int_matrix *W2, int *v, int verbose_level)
void restrict_quadratic_form_list_coding(int k, int n, int *basis, int form_nb_terms, int *form_i, int *form_j, int *form_coeff, int &restricted_form_nb_terms, int *&restricted_form_i, int *&restricted_form_j, int *&restricted_form_coeff, int verbose_level)
void RREF_elimination_below(int *A, int m, int n, int &i, int &j, int *base_cols, int verbose_level)
long int orthogonal_find_root(int rk2, int epsilon, int algebraic_dimension, int form_c1, int form_c2, int form_c3, int *Gram_matrix, int verbose_level)
void mult_vector_from_the_right(int *A, int *v, int *Av, int m, int n)
int dependency(int d, int *v, int *A, int m, int *rho, int verbose_level)
void linear_combination_of_vectors(int a, int *A, int b, int *B, int *C, int len)
void map_points_to_points_projectively(int d, int k, int *A, int *B, int *Transform, int &nb_maps, int verbose_level)
void invert_matrix_memory_given(int *A, int *A_inv, int n, int *tmp_A, int *tmp_basecols, int verbose_level)
void find_secant_points_wrt_x0x3mx1x2(int *Basis_line, int *Pts4, int &nb_pts, int verbose_level)
void cubic_surface_family_G13_generators(int a, int *&gens, int &nb_gens, int &data_size, int &group_order, int verbose_level)
int lexleast_canonical_form_ranked(int *set1, int *set2, int size, int vector_space_dimension, int verbose_level)
void extend_basis(int m, int n, int *Basis, int verbose_level)
int perp_standard_with_temporary_data(int n, int k, int *A, int *B, int *K, int *base_cols, int verbose_level)
int perp(int n, int k, int *A, int *Gram, int verbose_level)
int Gauss_canonical_form_ranked(int *set1, int *set2, int size, int vector_space_dimension, int verbose_level)
int evaluate_quadratic_form(int n, int nb_terms, int *i, int *j, int *coeff, int *x)
void Gauss_step(int *v1, int *v2, int len, int idx, int verbose_level)
void matrix_minor(int f_semilinear, int *A, int *B, int n, int f, int l)
void reduce_mod_subspace(int k, int len, int *basis, int *base_cols, int *v, int verbose_level)
void semilinear_action_from_the_right(int *v, int *A, int *vA, int n)
int RREF_and_kernel(int n, int k, int *A, int verbose_level)
int evaluate_bilinear_form(int n, int *v1, int *v2, int *Gram)
void Siegel_map_between_singular_points(int *T, long int rk_from, long int rk_to, long int root, int epsilon, int algebraic_dimension, int form_c1, int form_c2, int form_c3, int *Gram_matrix, int verbose_level)
void RREF_make_pivot_one(int *A, int m, int n, int &i, int &j, int *base_cols, int verbose_level)
void choose_anisotropic_form(int &c1, int &c2, int &c3, int verbose_level)
void semilinear_matrix_mult_memory_given(int *A, int *B, int *AB, int *tmp_B, int n, int verbose_level)
int test_if_commute(int *A, int *B, int k, int verbose_level)
void semilinear_matrix_mult(int *A, int *B, int *AB, int n)
int rank_of_rectangular_matrix(int *A, int m, int n, int verbose_level)
int perp_standard(int n, int k, int *A, int verbose_level)
void Borel_decomposition(int n, int *M, int *B1, int *B2, int *pivots, int verbose_level)
void characteristic_vector(int *A, int m, int *set, int size)
int Gauss_int_with_given_pivots(int *A, int f_special, int f_complete, int *pivots, int nb_pivots, int m, int n, int verbose_level)
void map_frame_to_frame_with_permutation(int d, int *A, int *perm, int *B, int *Transform, int verbose_level)
void choose_vector_in_here_but_not_in_here_column_spaces(data_structures::int_matrix *V, data_structures::int_matrix *W, int *v, int verbose_level)
void span_cyclic_module(int *A, int *v, int n, int *Mtx, int verbose_level)
void Kronecker_product_square_but_arbitrary(int *A, int *B, int na, int nb, int *AB, int &N, int verbose_level)
void restrict_quadratic_form(int k, int n, int *basis, int *C, int *D, int verbose_level)
void adjust_basis(int *V, int *U, int n, int k, int d, int verbose_level)
int Gauss_simple(int *A, int m, int n, int *base_cols, int verbose_level)
void matrix_inverse(int *A, int *Ainv, int n, int verbose_level)
int compare_subspaces_ranked_with_unrank_function(int *set1, int *set2, int size, int vector_space_dimension, void(*unrank_point_func)(int *v, int rk, void *data), void *rank_point_data, int verbose_level)
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)
void Gram_matrix(int epsilon, int k, int form_c1, int form_c2, int form_c3, int *&Gram, int verbose_level)
void affine_action_from_the_right(int f_semilinear, int *v, int *A, int *vA, int n)
void matrix_get_kernel_as_int_matrix(int *M, int m, int n, int *base_cols, int nb_base_cols, data_structures::int_matrix *kernel, int verbose_level)
void find_hyperbolic_pair(int n, int form_nb_terms, int *form_i, int *form_j, int *form_coeff, int *Gram, int *vec1, int *vec2, int verbose_level)
void get_coefficients_in_linear_combination(int k, int n, int *basis_of_subspace, int *input_vector, int *coefficients, int verbose_level)
void cubic_surface_family_F13_generators(int a, int *&gens, int &nb_gens, int &data_size, int &group_order, int verbose_level)
void semilinear_matrix_invert(int *A, int *Tmp, int *Tmp_basecols, int *Ainv, int n, int verbose_level)
int rank_and_basecols(int *A, int m, int *base_cols, int verbose_level)
void semilinear_matrix_invert_affine(int *A, int *Tmp, int *Tmp_basecols, int *Ainv, int n, int verbose_level)
int intersect_subspaces(int n, int k1, int *A, int k2, int *B, int &k3, int *intersection, int verbose_level)
void cubic_surface_family_24_generators(int f_with_normalizer, int f_semilinear, int *&gens, int &nb_gens, int &data_size, int &group_order, int verbose_level)
void Gauss_step_make_pivot_one(int *v1, int *v2, int len, int idx, int verbose_level)
int Gauss_easy_memory_given(int *A, int m, int n, int *base_cols)
void matrix_invert(int *A, int *Tmp, int *Tmp_basecols, int *Ainv, int n, int verbose_level)
int term4(int a1, int a2, int a3, int a4, int e1, int e2, int e3, int e4)
int Term5(int a1, int a2, int a3, int a4, int a5, int e1, int e2, int e3, int e4, int e5)
int term5(int a1, int a2, int a3, int a4, int a5, int e1, int e2, int e3, int e4, int e5)
int Term4(int a1, int a2, int a3, int a4, int e1, int e2, int e3, int e4)
the orbiter library for the classification of combinatorial objects