15namespace layer1_foundations {
16namespace ring_theory {
33 f_is_unit_table = NULL;
47 if (f_is_unit_table) {
64 int f_v = (verbose_level >= 1);
69 cout <<
"finite_ring::init q=" <<
q << endl;
89 for (i = 0; i <
q; i++) {
90 f_is_unit_table[i] =
FALSE;
94 for (i = 0; i <
q; i++) {
95 for (j = 0; j <
q; j++) {
96 add_table[i *
q + j] = a = (i + j) %
q;
100 mult_table[i *
q + j] = a = (i * j) %
q;
102 f_is_unit_table[i] =
TRUE;
152 return f_is_unit_table[i];
158 if (i < 0 || i >=
q) {
159 cout <<
"finite_ring::add() i = " << i << endl;
162 if (j < 0 || j >=
q) {
163 cout <<
"finite_ring::add() j = " << j << endl;
166 return add_table[i *
q + j];
172 if (i < 0 || i >=
q) {
173 cout <<
"finite_ring::mult() i = " << i << endl;
176 if (j < 0 || j >=
q) {
177 cout <<
"finite_ring::mult() j = " << j << endl;
180 return mult_table[i *
q + j];
185 if (i < 0 || i >=
q) {
186 cout <<
"finite_ring::negate() i = " << i << endl;
189 return negate_table[i];
194 if (i <= 0 || i >=
q) {
195 cout <<
"finite_ring::inverse() i = " << i << endl;
198 if (!f_is_unit_table[i]) {
199 cout <<
"finite_ring::inverse() i = " << i
200 <<
" is not a unit" << endl;
207 int f_complete,
int *base_cols,
208 int f_P,
int *P,
int m,
int n,
int Pn,
int verbose_level)
213 int f_v = (verbose_level >= 1);
214 int f_vv = (verbose_level >= 2);
215 int f_vvv = (verbose_level >= 3);
216 int rank, i, j, k, jj;
217 int pivot, pivot_inv = 0, a, b, c, z, f;
221 cout <<
"finite_ring::Gauss_int Gauss algorithm for matrix:" << endl;
226 for (j = 0; j < n; j++) {
228 cout <<
"j=" << j << endl;
231 for (k = i; k < m; k++) {
234 cout <<
"pivot found in " << k <<
"," << j << endl;
238 for (jj = 0; jj < n; jj++) {
239 Algo.
int_swap(A[i * n + jj], A[k * n + jj]);
242 for (jj = 0; jj < Pn; jj++) {
243 Algo.
int_swap(P[i * Pn + jj], P[k * Pn + jj]);
253 cout <<
"no pivot found" << endl;
259 cout <<
"row " << i <<
" pivot in row " << k
260 <<
" colum " << j << endl;
268 pivot = A[i * n + j];
272 cout <<
"pivot=" << pivot <<
" pivot_inv=" << pivot_inv << endl;
276 for (jj = 0; jj < n; jj++) {
277 A[i * n + jj] =
mult(A[i * n + jj], pivot_inv);
280 for (jj = 0; jj < Pn; jj++) {
281 P[i * Pn + jj] =
mult(P[i * Pn + jj], pivot_inv);
285 cout <<
"pivot=" << pivot <<
" pivot_inv=" << pivot_inv
286 <<
" made to one: " << A[i * n + j] << endl;
292 cout <<
"made pivot to one:" << endl;
299 for (k = i + 1; k < m; k++) {
301 cout <<
"k=" << k << endl;
307 f =
mult(z, pivot_inv);
315 cout <<
"eliminating row " << k << endl;
317 for (jj = 0; jj < n; jj++) {
327 cout << A[k * n + jj] <<
" ";
331 cout <<
"after eliminating row " << k <<
":" << endl;
336 for (jj = 0; jj < Pn; jj++) {
349 cout <<
"A=" << endl;
355 cout <<
"A=" << endl;
359 cout <<
"P=" << endl;
369 for (i = rank - 1; i >= 0; i--) {
378 pivot = A[i * n + j];
382 for (k = i - 1; k >= 0; k--) {
387 for (jj = 0; jj < n; jj++) {
391 a =
mult(a, pivot_inv);
399 for (jj = 0; jj < Pn; jj++) {
403 a =
mult(a, pivot_inv);
418 cout <<
"the rank is " << rank << endl;
426 int *v,
int stride,
int len)
432 cout <<
"finite_ring::PHG_element_normalize not a chain ring" << endl;
435 for (i = len - 1; i >= 0; i--) {
441 for (j = len - 1; j >= 0; j--) {
442 v[j * stride] =
mult(v[j * stride], a);
447 cout <<
"finite_ring::PHG_element_normalize "
448 "vector is not free" << endl;
454 int *v,
int stride,
int len)
460 cout <<
"finite_ring::PHG_element_normalize_from_front not a chain ring" << endl;
463 for (i = 0; i < len; i++) {
470 for (j = 0; j < len; j++) {
471 v[j * stride] =
mult(v[j * stride], a);
476 cout <<
"finite_ring::PHG_element_normalize_from_front "
477 "vector is not free" << endl;
482 int *v,
int stride,
int len)
484 long int i, j, idx, a, b, r1, r2, rk, N;
491 cout <<
"finite_ring::PHG_element_rank not a chain ring" << endl;
495 cout <<
"finite_ring::PHG_element_rank len <= 0" << endl;
499 cout <<
"the vector before normalization is ";
500 for (i = 0; i < len; i++) {
501 cout << v[i * stride] <<
" ";
507 cout <<
"the vector after normalization is ";
508 for (i = 0; i < len; i++) {
509 cout << v[i * stride] <<
" ";
515 for (i = 0, j = 0; i < len - 1; i++, j++) {
521 for (i = 0; i < len - 1; i++) {
522 w[i] = v[embedding[i] * stride];
524 for (i = 0; i < len - 1; i++) {
527 v[embedding[i] * stride] = b;
528 w[i] = (a - b) /
get_p();
548 int *v,
int stride,
int len,
int rk)
550 int i, j, idx, r1, r2, N;
557 cout <<
"finite_ring::PHG_element_unrank not a chain ring" << endl;
561 cout <<
"finite_ring::PHG_element_unrank len <= 0" << endl;
582 for (i = 0, j = 0; i < len - 1; i++, j++) {
589 for (i = 0; i < len - 1; i++) {
590 v[embedding[i] * stride] += w[i] *
get_p();
606 cout <<
"finite_ring::nb_PHG_elements not a chain ring" << endl;
catch all class for algorithms
void int_swap(int &x, int &y)
void PG_element_unrank_modified(int *v, int stride, int len, int a)
void finite_field_init(int q, int f_without_tables, int verbose_level)
void PG_element_rank_modified_lint(int *v, int stride, int len, long int &a)
various functions related to geometries
void AG_element_unrank(int q, int *v, int stride, int len, long int a)
long int nb_PG_elements(int n, int q)
long int nb_AG_elements(int n, int q)
long int AG_element_rank(int q, int *v, int stride, int len)
basic number theoretic functions
int is_prime_power(int q)
void factor_prime_power(int q, int &p, int &e)
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)
int PHG_element_normalize(int *v, int stride, int len)
field_theory::finite_field * get_Fp()
int PHG_element_rank(int *v, int stride, int len)
void init(int q, int verbose_level)
void PHG_element_unrank(int *v, int stride, int len, int rk)
int nb_PHG_elements(int n)
int PHG_element_normalize_from_front(int *v, int stride, int len)
#define Int_vec_print_integer_matrix(A, B, C, D)
#define Int_vec_print_integer_matrix_width(A, B, C, D, E, F)
#define Int_vec_print(A, B, C)
the orbiter library for the classification of combinatorial objects