Orbiter 2022
Combinatorial Objects
grassmann_embedded.cpp
Go to the documentation of this file.
1// grassmann_embedded.cpp
2//
3// Anton Betten
4// Jan 24, 2010
5//
6//
7//
8//
9//
10
11#include "foundations.h"
12
13using namespace std;
14
15
16namespace orbiter {
17namespace layer1_foundations {
18namespace geometry {
19
20
22{
23 big_n = n = k = q = 0;
24 F = NULL;
25 G = NULL;
26 M = NULL;
27 M_Gauss = NULL;
28 transform = NULL;
29 base_cols = NULL;
30 embedding = NULL;
31 Tmp1 = NULL;
32 Tmp2 = NULL;
33 Tmp3 = NULL;
34 tmp_M1 = NULL;
35 tmp_M2 = NULL;
36 degree = 0;
37}
38
40{
41 //if (G) {
42 //delete G;
43 //}
44 if (M) {
45 FREE_int(M);
46 }
47 if (M_Gauss) {
49 }
50 if (transform) {
52 }
53 if (base_cols) {
55 }
56 if (embedding) {
58 }
59 if (Tmp1) {
61 }
62 if (Tmp2) {
64 }
65 if (Tmp3) {
67 }
68 if (tmp_M1) {
70 }
71 if (tmp_M2) {
73 }
74}
75
76void grassmann_embedded::init(int big_n, int n,
77 grassmann *G, int *M, int verbose_level)
78// M is n x big_n
79// G is for k-dimensional subspaces of an n-space.
80{
81 int f_v = (verbose_level >= 1);
82 int f_vv = (verbose_level >= 2);
83 int i, j, rk, idx;
85 //longinteger_domain D;
88
92
93 if (G->n != n) {
94 cout << "grassmann_embedded::init n != G->n" << endl;
95 exit(1);
96 }
100
101
102 if (f_v) {
103 cout << "grassmann_embedded::init big_n = " << big_n
104 << " n=" << n << " k=" << k << " q=" << q << endl;
105 }
106
107
111 M_Gauss = NEW_int(n * big_n);
112 transform = NEW_int(n * n);
113 tmp_M1 = NEW_int(n * n);
114 tmp_M2 = NEW_int(n * n);
115 Tmp1 = NEW_int(big_n);
116 Tmp2 = NEW_int(big_n);
117 Tmp3 = NEW_int(big_n);
118 for (i = 0; i < n * big_n; i++) {
119 grassmann_embedded::M[i] = M[i];
120 M_Gauss[i] = M[i];
121 }
122 // we initialize transform as the identity matrix:
124
125
126 if (f_vv) {
127 cout << "grassmann_embedded::init subspace basis "
128 "before Gauss reduction:" << endl;
131 F->log10_of_q);
132 }
133 //rk = F->Gauss_simple(M_Gauss, n, big_n,
134 //base_cols, verbose_level - 1);
136 FALSE /*f_special*/,
137 TRUE/* f_complete*/,
138 base_cols,
139 TRUE /* f_P */, transform, n, big_n, n /* Pn */,
140 0/*int verbose_level*/);
141 if (f_vv) {
142 cout << "grassmann_embedded::init subspace "
143 "basis after reduction:" << endl;
146 cout << "grassmann_embedded::init transform:" << endl;
148 transform, n, n, n, F->log10_of_q);
149 }
150 if (f_v) {
151 cout << "base_cols:" << endl;
152 Int_vec_print(cout, base_cols, rk);
153 cout << endl;
154 }
155 if (rk != n) {
156 cout << "grassmann_embedded::init rk != n" << endl;
157 cout << "rk=" << rk << endl;
158 cout << "n=" << n << endl;
159 exit(1);
160 }
161 j = 0;
162 for (i = 0; i < big_n; i++) {
163 if (!Sorting.int_vec_search(base_cols, n, i, idx)) {
164 embedding[j++] = i;
165 }
166 }
167 if (j != big_n - n) {
168 cout << "j != big_n - n" << endl;
169 cout << "j=" << j << endl;
170 cout << "big_n - n=" << big_n - n << endl;
171 exit(1);
172 }
173 if (f_v) {
174 cout << "embedding: ";
175 Int_vec_print(cout, embedding, big_n - n);
176 cout << endl;
177 }
178 C.q_binomial(deg, n, k, q, 0);
179 degree = deg.as_lint();
180}
181
183 int *subspace_basis_with_embedding, long int rk,
184 int verbose_level)
185// subspace_basis_with_embedding is n x big_n
186{
187 int f_v = (verbose_level >= 1);
188
189 if (f_v) {
190 cout << "grassmann_embedded::unrank_embedded_int" << endl;
191 cout << "rk=" << rk << endl;
192 cout << "calling G->unrank_int" << endl;
193 }
194 G->unrank_embedded_subspace_lint(rk, verbose_level);
195 if (f_v) {
196 cout << "grassmann_embedded::unrank_embedded_int "
197 "coefficient matrix:" << endl;
199 G->M, n /* not k */, n, n, F->log10_of_q);
200 }
201 if (f_v) {
202 cout << "grassmann_embedded::unrank_embedded_int "
203 "subspace_basis:" << endl;
205 M, n, big_n, big_n, F->log10_of_q);
206 }
208 subspace_basis_with_embedding, n /* not k */, n, big_n,
209 0 /* verbose_level */);
210 if (f_v) {
211 cout << "grassmann_embedded::unrank_embedded_int "
212 "subspace_basis:" << endl;
214 subspace_basis_with_embedding, n /* not k */,
216 }
217}
218
220 int *subspace_basis, int verbose_level)
221// subspace_basis is n x big_n, only the
222// first k x big_n entries are used
223{
224 int f_v = (verbose_level >= 1);
225 long int rk;
226
227 if (f_v) {
228 cout << "grassmann_embedded::rank_embedded_int" << endl;
229 //print_integer_matrix_width(cout,
230 // subspace_basis, n, big_n, big_n, F->log10_of_q);
231 }
232 rk = rank_lint(subspace_basis, verbose_level);
233 if (f_v) {
234 cout << "grassmann_embedded::rank_embedded_int done" << endl;
235 }
236 return rk;
237}
238
240 int *subspace_basis, long int rk, int verbose_level)
241// subspace_basis is k x big_n
242{
243 int f_v = (verbose_level >= 1);
244
245 if (f_v) {
246 cout << "grassmann_embedded::unrank_lint" << endl;
247 cout << "rk=" << rk << endl;
248 cout << "calling G->unrank_int" << endl;
249 }
250 G->unrank_lint(rk, verbose_level);
251 if (f_v) {
252 cout << "grassmann_embedded::unrank_lint "
253 "coefficient matrix:" << endl;
255 G->M, k, n, n, F->log10_of_q);
256 }
257 if (f_v) {
258 cout << "grassmann_embedded::rank_lint "
259 "subspace_basis:" << endl;
261 M, n, big_n, big_n, F->log10_of_q);
262 }
264 subspace_basis, k, n, big_n,
265 0 /* verbose_level */);
266 if (f_v) {
267 cout << "grassmann_embedded::unrank_lint "
268 "subspace_basis:" << endl;
270 subspace_basis, k, big_n, big_n,
271 F->log10_of_q);
272 }
273}
274
276 int *subspace_basis, int verbose_level)
277// subspace_basis is k x big_n
278{
279 int f_v = (verbose_level >= 1);
280 long int rk, i, j, a;
282
283
284 if (f_v) {
285 cout << "grassmann_embedded::rank_lint" << endl;
287 subspace_basis, k, big_n, big_n, F->log10_of_q);
288 }
289 for (i = 0; i < k; i++) {
290 for (j = 0; j < n; j++) {
291 a = subspace_basis[i * big_n + base_cols[j]];
292 tmp_M1[i * n + j] = a;
293 }
294 }
295 // now tmp_M1 is k x n
296
297 if (f_v) {
298 cout << "grassmann_embedded::rank_lint tmp_M1:" << endl;
300 tmp_M1, k, n, n, F->log10_of_q);
301 }
303 0 /* verbose_level */);
304
305 // now tmp_M2 is k x n
306 // tmp_M2 is the coefficient matrix that defines
307 // the given subspace in terms of the big space M
308 // this means: tmp_M2 * M = subspace_basis
309
310 if (f_v) {
311 cout << "grassmann_embedded::rank_lint tmp_M2:" << endl;
313 tmp_M2, k, n, n, F->log10_of_q);
314 }
315
316 for (i = 0; i < k; i++) {
318 M, Tmp2, n, big_n);
319
320 // recall that M is n x big_n
321
322 // now Tmp2 is of length big_n
323
324 if (f_v) {
325 cout << "grassmann_embedded::rank_lint i=" << i
326 << " Tmp2=" << endl;
328 Tmp2, 1, big_n, big_n, F->log10_of_q);
329 }
330 if (Sorting.int_vec_compare(subspace_basis + i * big_n, Tmp2, big_n)) {
331 cout << "grassmann_embedded::rank_lint fatal: "
332 "the i-th vector is not in the space" << endl;
333 cout << "i=" << i << endl;
334 cout << "subspace:" << endl;
336 subspace_basis, k, big_n, big_n, F->log10_of_q);
337 cout << "space:" << endl;
339 M, n, big_n, big_n, F->log10_of_q);
340 cout << "Tmp1:" << endl;
341 Int_vec_print(cout, Tmp1, n);
342 cout << endl;
343 cout << "Tmp2:" << endl;
344 Int_vec_print(cout, Tmp2, big_n);
345 cout << endl;
346 exit(1);
347 }
348 for (j = 0; j < n; j++) {
349 G->M[i * n + j] = tmp_M2[i * n + j];
350 }
351 }
352 if (f_v) {
353 cout << "grassmann_embedded::rank_lint "
354 "coefficient matrix:" << endl;
356 G->M, k, n, n, F->log10_of_q);
357 }
358 rk = G->rank_lint(verbose_level);
359 if (f_v) {
360 cout << "rk=" << rk << endl;
361 }
362 return rk;
363}
364
365}}}
void q_binomial(ring_theory::longinteger_object &a, int n, int k, int q, int verbose_level)
a collection of functions related to sorted vectors
int int_vec_search(int *v, int len, int a, int &idx)
Definition: sorting.cpp:1094
long int rank_embedded_lint(int *subspace_basis, int verbose_level)
void unrank_lint(int *subspace_basis, long int rk, int verbose_level)
void init(int big_n, int n, grassmann *G, int *M, int verbose_level)
void unrank_embedded_lint(int *subspace_basis_with_embedding, long int rk, int verbose_level)
long int rank_lint(int *subspace_basis, int verbose_level)
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 unrank_embedded_subspace_lint(long int rk, int verbose_level)
Definition: grassmann.cpp:281
void mult_vector_from_the_left(int *v, int *A, int *vA, int m, int n)
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 mult_matrix_matrix(int *A, int *B, int *C, int m, int n, int o, int verbose_level)
a class to represent arbitrary precision integers
Definition: ring_theory.h:366
#define FREE_int(p)
Definition: foundations.h:640
#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
the orbiter library for the classification of combinatorial objects