Orbiter 2022
Combinatorial Objects
hjelmslev.cpp
Go to the documentation of this file.
1// hjelmslev.cpp
2//
3// Anton Betten
4//
5//
6// June 22, 2010
7//
8//
9//
10//
11//
12
13#include "foundations.h"
14
15using namespace std;
16
17
18namespace orbiter {
19namespace layer1_foundations {
20namespace geometry {
21
22
24{
25 null();
26}
27
29{
30 freeself();
31}
32
34{
35 R = NULL;
36 G = NULL;
37 Mtx = NULL;
38 base_cols = NULL;
39 v = NULL;
40}
41
43{
44 if (G) {
46 }
47 if (Mtx) {
49 }
50 if (base_cols) {
52 }
53 if (v) {
54 FREE_int(v);
55 }
56 null();
57}
58
60 int n, int k, int verbose_level)
61{
62 int f_v = (verbose_level >= 1);
64
65 if (f_v) {
66 cout << "hjelmslev::init n=" << n << " k=" << k
67 << " q=" << R->q << endl;
68 }
73 if (f_v) {
74 cout << "hjelmslev::init n_choose_k_p = "
75 << n_choose_k_p << endl;
76 }
78 G->init(n, k, R->get_Fp(), verbose_level);
79 Mtx = NEW_int(k * n);
81 v = NEW_int(k * (n - k));
82}
83
85{
87 return n_choose_k_p * NT.i_power_j_lint(R->get_p(), (R->get_e() - 1) * k * (n - k));
88}
89
90void hjelmslev::unrank_lint(int *M, long int rk, int verbose_level)
91{
92 int f_v = (verbose_level >= 1);
93 int f_vv = (verbose_level >= 2);
94 long int a, b, c, i, j, h;
96
97 if (f_v) {
98 cout << "hjelmslev::unrank_lint " << rk << endl;
99 cout << "verbose_level=" << verbose_level << endl;
100 }
101 if (k == 0) {
102 return;
103 }
104 a = rk % n_choose_k_p;
105 b = (rk - a) / n_choose_k_p;
106 if (f_vv) {
107 cout << "rk=" << rk << " a=" << a << " b=" << b << endl;
108 }
109 G->unrank_lint(a, 0);
110 Gg.AG_element_unrank(R->get_e(), v, 1, k * (n - k), b);
111 if (f_vv) {
113 Int_vec_print(cout, v, k * (n - k));
114 cout << endl;
115 }
116 for (i = 0; i < k * n; i++) {
117 Mtx[i] = G->M[i];
118 }
119 for (j = 0; j < n - k; j++) {
120 h = G->base_cols[k + j];
121 for (i = 0; i < k; i++) {
122 c = v[i * (n - k) + j];
123 Mtx[i * n + h] += c * R->get_p();
124 }
125 }
126 for (i = 0; i < k * n; i++) {
127 M[i] = Mtx[i];
128 }
129}
130
131long int hjelmslev::rank_lint(int *M, int verbose_level)
132{
133 int f_v = (verbose_level >= 1);
134 int f_vv = (verbose_level >= 2);
135 long int c, i, j, h, rk_mtx;
136 long int a, b, rk;
137 int f_special = FALSE;
138 int f_complete = TRUE;
140
141 if (f_v) {
142 cout << "hjelmslev::rank_lint " << endl;
144 cout << "verbose_level=" << verbose_level << endl;
145 }
146 for (i = 0; i < k * n; i++) {
147 Mtx[i] = M[i];
148 }
149 rk_mtx = R->Gauss_int(Mtx,
150 f_special, f_complete,
151 base_cols, FALSE, NULL, k, n, n, 0);
152 if (f_v) {
153 cout << "hjelmslev::rank_lint after Gauss, "
154 "rk_mtx=" << rk_mtx << endl;
156 cout << "base_cols=";
157 Int_vec_print(cout, base_cols, rk_mtx);
158 cout << endl;
159 }
161 if (rk_mtx != k) {
162 cout << "hjelmslev::rank_lint fatal: rk_mtx != k" << endl;
163 exit(1);
164 }
165 if (f_v) {
166 cout << "complement:";
167 Int_vec_print(cout, base_cols + k, n - k);
168 cout << endl;
169 }
170 for (j = 0; j < n - k; j++) {
171 h = G->base_cols[k + j];
172 for (i = 0; i < k; i++) {
173 c = Mtx[i * n + h] / R->get_p();
174 v[i * (n - k) + j] = c;
175 Mtx[i * n + h] -= c * R->get_p();
176 }
177 }
178
179 for (i = 0; i < k * n; i++) {
180 G->M[i] = Mtx[i];
181 }
182 if (f_vv) {
183 Int_vec_print(cout, v, k * (n - k));
184 cout << endl;
185 }
186 b = Gg.AG_element_rank(R->get_e(), v, 1, k * (n - k));
187 a = G->rank_lint(0);
188 rk = b * n_choose_k_p + a;
189 if (f_v) {
190 cout << "hjelmslev::rank_lint rk=" << rk
191 << " a=" << a << " b=" << b << endl;
192 }
193 return rk;
194}
195
196}}}
197
various functions related to geometries
Definition: geometry.h:721
void AG_element_unrank(int q, int *v, int stride, int len, long int a)
long int AG_element_rank(int q, int *v, int stride, int len)
to rank and unrank subspaces of a fixed dimension in F_q^n
Definition: geometry.h:892
void unrank_lint(long int rk, int verbose_level)
Definition: grassmann.cpp:343
void init(int n, int k, field_theory::finite_field *F, int verbose_level)
Definition: grassmann.cpp:70
void unrank_lint(int *M, long int rk, int verbose_level)
Definition: hjelmslev.cpp:90
void init(ring_theory::finite_ring *R, int n, int k, int verbose_level)
Definition: hjelmslev.cpp:59
long int rank_lint(int *M, int verbose_level)
Definition: hjelmslev.cpp:131
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)
#define FREE_int(p)
Definition: foundations.h:640
#define NEW_OBJECT(type)
Definition: foundations.h:638
#define FREE_OBJECT(p)
Definition: foundations.h:651
#define NEW_int(n)
Definition: foundations.h:625
#define Int_vec_print_integer_matrix_width(A, B, C, D, E, F)
Definition: foundations.h:691
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define Int_vec_print(A, B, C)
Definition: foundations.h:685
orbiter_kernel_system::orbiter_session * Orbiter
global Orbiter session
the orbiter library for the classification of combinatorial objects