8#ifndef SRC_LIB_FOUNDATIONS_LINEAR_ALGEBRA_LINEAR_ALGEBRA_H_
9#define SRC_LIB_FOUNDATIONS_LINEAR_ALGEBRA_LINEAR_ALGEBRA_H_
13namespace layer1_foundations {
14namespace linear_algebra {
29 std::string &Berlekamp_matrix_coeffs,
33 int d,
int verbose_level);
37 int f_normalize_from_the_left,
int f_normalize_from_the_right,
42 int f_normalize_from_the_left,
int f_normalize_from_the_right,
46 int *A,
int m,
int n,
int verbose_level);
49 std::ostream &ost,
int *A,
int m,
int n,
int verbose_level);
83 int *B,
int n,
int f,
int l);
87 int *vA,
int m,
int n);
90 int *Av,
int m,
int n);
94 int *C,
int m,
int n,
int o,
int verbose_level);
100 int *AB,
int *tmp_B,
int n,
int verbose_level);
103 int n,
int verbose_level);
108 int *Tmp_basecols,
int *Ainv,
int n,
int verbose_level);
112 int *Tmp_basecols,
int *Ainv,
int n,
int verbose_level);
116 int *Tmp_basecols,
int *Ainv,
int n,
int verbose_level);
120 int *Ainv,
int n,
int verbose_level);
124 int *v,
int *A,
int *vA,
int n,
int verbose_level);
128 int *v,
int *A,
int *vA,
int n,
int verbose_level);
130 int *A,
int *vA,
int n);
133 int *v,
int *Av,
int n);
136 int *v,
int *A,
int *vA,
int n);
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);
155 void invert_matrix(
int *A,
int *A_inv,
int n,
int verbose_level);
157 int *tmp_A,
int *tmp_basecols,
int verbose_level);
159 int *new_Gram,
int d,
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,
170 int *base_cols,
int verbose_level);
172 int idx,
int verbose_level);
177 int len,
int idx,
int verbose_level);
180 void extend_basis(
int m,
int n,
int *Basis,
int verbose_level);
182 int *base_cols,
int *embedding,
int verbose_level);
190 int *base_cols,
int verbose_level);
194 int *base_cols,
int *kernel_cols);
196 int *base_cols,
int nb_base_cols,
199 int *base_cols,
int nb_base_cols,
200 int &kernel_m,
int &kernel_n,
int *kernel,
int verbose_level);
202 int perp(
int n,
int k,
int *A,
int *Gram,
int verbose_level);
206 int *B,
int *K,
int *base_cols,
209 int &k3,
int *intersection,
int verbose_level);
216 int *M,
int m,
int n,
int *perm,
int verbose_level);
221 int *i,
int *j,
int *coeff,
int *x);
223 int *form_i,
int *form_j,
int *form_coeff,
int *Gram,
224 int *vec,
int verbose_level);
226 int *form_i,
int *form_j,
int *form_coeff,
int *Gram,
227 int *vec,
int verbose_level);
229 int *form_i,
int *form_j,
int *form_coeff,
int *Gram,
230 int *vec1,
int *vec2,
int verbose_level);
232 int *form_i,
int *form_j,
int *form_coeff,
int *Gram,
233 int *vec1,
int *vec2,
int verbose_level);
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,
243 int *C,
int *D,
int verbose_level);
245 int vector_space_dimension,
int verbose_level);
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,
257 int vector_space_dimension,
int verbose_level);
263 int vector_space_dimension,
int verbose_level);
277 int k,
int n,
int *basis_of_subspace,
278 int *input_vector,
int *coefficients,
int verbose_level);
285 int k,
int len,
int *basis,
int *base_cols,
286 int *v,
int *coefficients,
int verbose_level);
288 int len,
int *basis,
int *base_cols,
289 int *v,
int verbose_level);
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);
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,
305 int *A,
int *Frobenius,
318 int *v,
int verbose_level);
341 int *pivots,
int verbose_level);
343 int *Transform,
int verbose_level);
350 int *perm,
int *B,
int *Transform,
int verbose_level);
352 int *A,
int *B,
int *Transform,
353 int &nb_maps,
int verbose_level);
358 int *U,
int k,
int sz_U,
359 int *T,
int verbose_level);
362 int *&gens,
int &nb_gens,
int &data_size,
363 int &group_order,
int verbose_level);
366 int *&gens,
int &nb_gens,
int &data_size,
367 int &group_order,
int verbose_level);
370 int *&gens,
int &nb_gens,
int &data_size,
371 int &group_order,
int verbose_level);
374 int omega,
int k,
int *N,
int **A,
int **Av,
375 int *Omega,
int verbose_level);
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);
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,
400 int form_c1,
int form_c2,
int form_c3,
401 int *M,
int *v,
int *u,
int verbose_level);
408 int epsilon,
int algebraic_dimension,
409 int form_c1,
int form_c2,
int form_c3,
int *
Gram_matrix,
412 int &c1,
int &c2,
int &c3,
int verbose_level);
445 int f_complete,
int *base_cols,
446 int f_P,
int *P,
int m,
int n,
447 int Pn,
int verbose_level);
453 int f_special,
int f_complete,
int *pivot_perm,
455 int (*find_pivot_function)(
int *A,
int m,
int n,
int r,
456 int *pivot_perm,
void *data),
457 void *find_pivot_data,
462 int f_special,
int f_complete,
int *pivots,
int nb_pivots,
468 int &i,
int &j,
int *base_cols,
int verbose_level);
470 int &i,
int &j,
int *base_cols,
int verbose_level);
472 int &i,
int &j,
int *base_cols,
int verbose_level);
474 int i,
int *base_cols,
int verbose_level);
496 int q,
int a,
int b,
int c,
int d);
498 int q,
int a,
int b,
int c,
int d);
500 int a,
int b,
int c,
int d,
int beta);
502 int a,
int b,
int c,
int d,
int beta);
506 int a,
int b,
int c,
int d,
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,
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,
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);
525 int add(
int a,
int b);
526 int add3(
int a,
int b,
int c);
529 int mult(
int a,
int b);
531 int power(
int a,
int n);
catch all class for linear algebra functions
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)
linear algebra over a finite field
void vector_add_apply(int *v, int *w, int c, int n)
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)
int Pluecker_34(int *x4, int *y4)
void reduce_mod_subspace_and_get_coefficient_vector(int k, int len, int *basis, int *base_cols, int *v, int *coefficients, int verbose_level)
field_theory::finite_field * F
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)
int is_totally_isotropic_wrt_symplectic_form(int k, int n, int *Basis)
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 reverse_matrix(int *A, int *B, int ma, int na)
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 Pluecker_13(int *x4, int *y4)
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 Kronecker_product(int *A, int *B, int n, int *AB)
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 is_zero_vector(int *A, int m)
void scalar_multiply_vector_in_place(int c, int *A, int m)
void diagonal_matrix(int *A, int n, int alpha)
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)
int is_identity_matrix(int *A, int n)
int evaluate_symplectic_form(int len, int *x, int *y)
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 identity_matrix(int *A, int n)
void unrank_point_in_PG(int *v, int len, int rk)
int rank_point_in_PG(int *v, int len)
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 negate_vector(int *A, int *B, int m)
int Pluecker_24(int *x4, int *y4)
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)
int evaluate_quadric_form_in_PG_three(int *ten_coeffs, int *v4)
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)
int Pluecker_21(int *x4, int *y4)
void RREF_elimination_below(int *A, int m, int n, int &i, int &j, int *base_cols, int verbose_level)
int Gauss_easy(int *A, int m, int n)
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)
int Pluecker_14(int *x4, int *y4)
void map_points_to_points_projectively(int d, int k, int *A, int *B, int *Transform, int &nb_maps, int verbose_level)
int evaluate_hyperbolic_bilinear_form(int *u, int *v, int n)
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 Pluecker_32(int *x4, int *y4)
void transpose_matrix_in_place(int *A, int m)
int nb_points_in_PG(int n)
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 is_unit_vector(int *v, int len, int k)
void solve_y2py(int a, int *Y2, int &nb_sol)
int evaluate_symmetric_form(int len, int *x, int *y)
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)
int Pluecker_ij(int i, int j, int *x4, int *y4)
int Pluecker_31(int *x4, int *y4)
void vector_frobenius_power_in_place(int *A, int m, int f)
void matrix_minor(int f_semilinear, int *A, int *B, int n, int f, int l)
int Pluecker_12(int *x4, int *y4)
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 evaluate_quadratic_form_x0x3mx1x2(int *x)
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)
int Pluecker_42(int *x4, int *y4)
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 all_one_vector(int *A, int m)
int Pluecker_23(int *x4, int *y4)
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)
void Dickson_polynomial(int *map, int *coeffs)
int evaluate_conic_form(int *six_coeffs, int *v3)
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 add_vector(int *A, int *B, int *C, int m)
void copy_matrix(int *A, int *B, int ma, int na)
void Gram_matrix(int epsilon, int k, int form_c1, int form_c2, int form_c3, int *&Gram, int verbose_level)
int dot_product(int len, int *v, int *w)
void affine_action_from_the_right(int f_semilinear, int *v, int *A, int *vA, int n)
int Pluecker_41(int *x4, int *y4)
int Pluecker_43(int *x4, int *y4)
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)
int is_diagonal_matrix(int *A, int n)
int evaluate_hyperbolic_quadratic_form(int *v, int stride, int n)
void negate_vector_in_place(int *A, int m)
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 zero_vector(int *A, int m)
int n_choose_k_mod_p(int n, int k, 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)
int evaluate_standard_hyperbolic_bilinear_form(int n, int *v1, int *v2)
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)
int rank_of_matrix(int *A, int m, 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)
catch all class for representation theory
void representing_matrix8_U(int *A, int a, int b, int c, int d, int beta)
int term1(int a1, int e1)
void representing_matrix8a(int *A, int a, int b, int c, int d, int beta)
int Term1(int a1, int e1)
int Term2(int a1, int a2, int e1, int e2)
int beta_trinomial(int q, int beta, int a1, int a2, int a3)
int term4(int a1, int a2, int a3, int a4, int e1, int e2, int e3, int e4)
void representing_matrix8_R(int *A, int q, int a, int b, int c, int d)
void representing_matrix9_U(int *A, int a, int b, int c, int d, int beta)
int term2(int a1, int a2, int e1, int e2)
int Term5(int a1, int a2, int a3, int a4, int a5, int e1, int e2, int e3, int e4, int e5)
int Term3(int a1, int a2, int a3, int e1, int e2, int e3)
int add3(int a, int b, int c)
field_theory::finite_field * F
void representing_matrix9b(int *A, int beta)
int term5(int a1, int a2, int a3, int a4, int a5, int e1, int e2, int e3, int e4, int e5)
int m_term(int q, int a1, int a2, int a3)
representation_theory_domain()
void init(field_theory::finite_field *F, int verbose_level)
int Term4(int a1, int a2, int a3, int a4, int e1, int e2, int e3, int e4)
int T3product2(int a1, int a2)
int term3(int a1, int a2, int a3, int e1, int e2, int e3)
void representing_matrix8_V(int *A, int beta)
~representation_theory_domain()
void representing_matrix8b(int *A, int beta)
void representing_matrix9_R(int *A, int q, int a, int b, int c, int d)
the orbiter library for the classification of combinatorial objects