Orbiter 2022
Combinatorial Objects
action_on_wedge_product.cpp
Go to the documentation of this file.
1// action_on_wedge_product.cpp
2//
3// Anton Betten
4// Jan 26, 2010
5
7#include "group_actions.h"
8
9using namespace std;
10
11
12namespace orbiter {
13namespace layer3_group_actions {
14namespace induced_actions {
15
16
18{
19 null();
20}
21
23{
24 free();
25}
26
28{
29 M = NULL;
30 F = NULL;
31 wedge_v1 = NULL;
32 wedge_v2 = NULL;
33 wedge_v3 = NULL;
35}
36
38{
39 if (wedge_v1) {
41 }
42 if (wedge_v2) {
44 }
45 if (wedge_v3) {
47 }
48 null();
49}
50
52{
53 int f_v = (verbose_level >= 1);
55
56 if (f_v) {
57 cout << "action_on_wedge_product::init" << endl;
58 cout << "starting with action " << A.label << endl;
59 }
60 if (A.type_G != matrix_group_t) {
61 cout << "action_on_wedge_product::init "
62 "fatal: A.type_G != matrix_group_t" << endl;
63 exit(1);
64 }
65 M = A.G.matrix_grp;
66 F = M->GFq;
67 n = M->n;
68 q = F->q;
69 wedge_dimension = (n * (n - 1)) >> 1;
70 //degree = i_power_j(q, wedge_dimension);
76}
77
79{
81}
82
84{
85 long int rk;
86
88 return rk;
89}
90
92 actions::action &A, int *Elt, long int a, int verbose_level)
93{
94 int f_v = (verbose_level >= 1);
95 int f_vv = (verbose_level >= 2);
96 long int b;
97
98 if (f_v) {
99 cout << "action_on_wedge_product::compute_image_int" << endl;
100 }
101 //AG_element_unrank(q, wedge_v1, 1, wedge_dimension, a);
103 if (f_vv) {
104 cout << "action_on_wedge_product::compute_image_int "
105 "a = " << a << " wedge_v1 = ";
107 cout << endl;
108 }
109
110 compute_image_int_low_level(A, Elt, wedge_v1, wedge_v2, verbose_level);
111 if (f_vv) {
112 cout << " v2=v1 * A=";
114 cout << endl;
115 }
116
117 //AG_element_rank(q, wedge_v2, 1, wedge_dimension, b);
119 if (f_v) {
120 cout << "action_on_wedge_product::compute_image_int "
121 "done " << a << "->" << b << endl;
122 }
123 return b;
124}
125
127 actions::action &A, int *Elt, int verbose_level)
128{
129 int f;
130
131 f = A.element_linear_entry_frobenius(Elt, verbose_level);
132 return f;
133}
134
136 actions::action &A, int *Elt, int I, int J, int verbose_level)
137{
138 int i, j, k, l, w;
140
141 Combi.k2ij(I, i, j, n);
142 Combi.k2ij(J, k, l, n);
143 w = element_entry_ijkl(A, Elt, i, j, k, l, verbose_level);
144 return w;
145}
146
149 int *Elt, int i, int j, int k, int l, int verbose_level)
150{
151 int aki, alj, akj, ali, u, v, w;
152
153 aki = A.element_linear_entry_ij(Elt, k, i, verbose_level); //Elt[k * n + i];
154 alj = A.element_linear_entry_ij(Elt, l, j, verbose_level); //Elt[l * n + j];
155 akj = A.element_linear_entry_ij(Elt, k, j, verbose_level); //Elt[k * n + j];
156 ali = A.element_linear_entry_ij(Elt, l, i, verbose_level); //Elt[l * n + i];
157 u = F->mult(aki, alj);
158 v = F->mult(akj, ali);
159 w = F->add(u, F->negate(v));
160 return w;
161}
162
164 actions::action &A, int *Elt, int *input, int *output, int verbose_level)
165// \sum_{i < j} x_{i,j} e_i \wedge e_j * A =
166// \sum_{k < l} \sum_{i < j} x_{i,j} (a_{i,k}a_{j,l} - a_{i,l}a_{j,k}) e_k \wedge e_l
167// or (after a change of indices)
168// \sum_{i<j} x_{i,j} e_i \wedge e_j * A =
169// \sum_{i < j} \sum_{k < l} x_{k,l} (a_{k,i}a_{l,j} - a_{k,j}a_{l,i}) e_i \wedge e_j
170//
171// so, the image of e_i \wedge e_j is
172// \sum_{k < l} x_{k,l} (a_{k,i}a_{l,j} - a_{k,j}a_{l,i}) e_k \wedge e_l,
173// = \sum_{k < l} x_{k,l} w_{ij,kl} e_k \wedge e_l,
174// The w_{ij,kl} are the entries in the row indexed by (i,j).
175// w_{ij,kl} is the entry in row ij and column kl.
176{
177 int *x = input;
178 int *xA = output;
179 int f_v = (verbose_level >= 1);
180 int f_vv = (verbose_level >= 2);
181 int i, j, ij, k, l, kl, c, w, z, xkl;
183
184 if (f_v) {
185 cout << "action_on_wedge_product::compute_image_int_low_level" << endl;
186 }
187 if (f_vv) {
188 cout << "wedge action: x=";
190 cout << endl;
191 }
192 // (i,j) = row index
193 for (i = 0; i < n; i++) {
194 for (j = i + 1; j < n; j++) {
195 ij = Combi.ij2k(i, j, n);
196 c = 0;
197
198 // (k,l) = column index
199 for (k = 0; k < n; k++) {
200 for (l = k + 1; l < n; l++) {
201 kl = Combi.ij2k(k, l, n);
202 xkl = x[kl];
203
204
205 // a_{k,i}a_{l,j} - a_{k,j}a_{l,i} = matrix entry
206#if 0
207
208 aki = Elt[k * n + i];
209 alj = Elt[l * n + j];
210 akj = Elt[k * n + j];
211 ali = Elt[l * n + i];
212 u = F->mult(aki, alj);
213 v = F->mult(akj, ali);
214 w = F->add(u, F->negate(v));
215#endif
216
217
218 w = element_entry_ijkl(A, Elt, i, j, k, l, verbose_level - 3);
219 // now w is the matrix entry
220
221 z = F->mult(xkl, w);
222 c = F->add(c, z);
223
224 if (z && f_v) {
225 cout << "i=" << i << " j=" << j << " ij=" << ij << " k=" << k << " l=" << l << " kl=" << kl << " xkl=" << xkl << " w=" << w << " z=xkl*w=" << z << " c=" << c << endl;
226 }
227 } // next l
228 } // next k
229 if (c && f_v) {
230 cout << "i=" << i << " j=" << j << " ij=" << ij << " xA[" << ij << "]=" << c << endl;
231 }
232 xA[ij] = c;
233 } // next j
234 } // next i
235 if (f_vv) {
236 cout << "xA=";
238 cout << endl;
239 }
240 if (M->f_semilinear) {
241 int f = A.linear_entry_frobenius(Elt); //Elt[n * n];
242 for (i = 0; i < wedge_dimension; i++) {
243 xA[i] = F->frobenius_power(xA[i], f);
244 }
245 if (f_vv) {
246 cout << "after " << f << " field automorphisms: xA=";
248 cout << endl;
249 }
250 }
251 if (f_v) {
252 cout << "action_on_wedge_product::compute_image_int_low_level done" << endl;
253 }
254}
255
256}}}
257
258
259
void PG_element_unrank_modified_lint(int *v, int stride, int len, long int a)
void PG_element_rank_modified_lint(int *v, int stride, int len, long int &a)
various functions related to geometries
Definition: geometry.h:721
a permutation group in a fixed action.
Definition: actions.h:99
int element_linear_entry_frobenius(void *elt, int verbose_level)
Definition: action_cb.cpp:239
int element_linear_entry_ij(void *elt, int i, int j, int verbose_level)
Definition: action_cb.cpp:230
int element_entry_ijkl(actions::action &A, int *Elt, int i, int j, int k, int l, int verbose_level)
void compute_image_int_low_level(actions::action &A, int *Elt, int *input, int *output, int verbose_level)
int element_entry_frobenius(actions::action &A, int *Elt, int verbose_level)
long int compute_image_int(actions::action &A, int *Elt, long int a, int verbose_level)
int element_entry_ij(actions::action &A, int *Elt, int I, int J, int verbose_level)
#define FREE_int(p)
Definition: foundations.h:640
#define NEW_int(n)
Definition: foundations.h:625
#define Int_vec_print(A, B, C)
Definition: foundations.h:685
the orbiter library for the classification of combinatorial objects