Orbiter 2022
Combinatorial Objects
product_action.cpp
Go to the documentation of this file.
1// product_action.cpp
2//
3// Anton Betten
4// December 19, 2007
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 A1 = NULL;
30 A2 = NULL;
31 Elt1 = NULL;
32 Elt2 = NULL;
33 Elt3 = NULL;
34 elt1 = NULL;
35 elt2 = NULL;
36 elt3 = NULL;
37 offset = 0;
38}
39
41{
42 if (A1) {
44 }
45 if (A2) {
47 }
48 if (Elt1)
50 if (Elt2)
52 if (Elt3)
54 if (elt1)
56 if (elt2)
58 if (elt3)
60 null();
61}
62
63
65 int f_use_projections, int verbose_level)
66{
67 int f_v = (verbose_level >= 1);
68 int f_vv = (verbose_level >= 2);
69
70 if (f_v) {
71 cout << "product_action::init" << endl;
72 }
77 offset = A1->degree + A2->degree;
78 else
79 offset = 0;
84
91
92
94 if (f_vv) {
95 cout << "matrix_group::init_linear calling Elts->init" << endl;
96 }
97 Elts->init(
98 coded_elt_size_in_char /* entry_size */,
99 PAGE_LENGTH_LOG, f_vv);
100 //Elts->add_elt_print_function(elt_print, (void *) this);
101}
102
104 int *Elt, long int i, int verbose_level)
105{
106 //verbose_level = 1;
107 long int x, y, xx, yy, j;
108 int f_v = (verbose_level >= 1);
109 int f_vv = (verbose_level >= 2);
110
111 if (f_vv) {
112 cout << "product_action::compute_image i = " << i << endl;
113 }
114 if (f_use_projections) {
115 if (i < offset) {
116 if (i < A1->degree) {
117 j = A1->element_image_of(i, Elt, FALSE);
118 }
119 else {
120 i -= A1->degree;
121 j = A2->element_image_of(i, Elt + A1->elt_size_in_int, FALSE);
122 j += A1->degree;
123 }
124 }
125 else {
126 i -= offset;
127 x = i / A2->degree;
128 y = i % A2->degree;
129 xx = A1->element_image_of(x, Elt, FALSE);
130 yy = A2->element_image_of(y, Elt + A1->elt_size_in_int, FALSE);
131 j = xx * A2->degree + yy;
132 j += offset;
133 }
134 }
135 else {
136 x = i / A2->degree;
137 y = i % A2->degree;
138 xx = A1->element_image_of(x, Elt, FALSE);
139 yy = A2->element_image_of(y, Elt + A1->elt_size_in_int, FALSE);
140 j = xx * A2->degree + yy;
141 }
142 if (f_v) {
143 cout << "product_action::compute_image "
144 "image of " << i << " is " << j << endl;
145 }
146 return j;
147}
148
149void product_action::element_one(actions::action *A, int *Elt, int verbose_level)
150{
151 A1->element_one(Elt, verbose_level);
152 A2->element_one(Elt + A1->elt_size_in_int, verbose_level);
153}
154
155int product_action::element_is_one(actions::action *A, int *Elt, int verbose_level)
156{
157 if (!A1->element_is_one(Elt, verbose_level)) {
158 return FALSE;
159 }
160 if (!A2->element_is_one(Elt + A1->elt_size_in_int, verbose_level)) {
161 return FALSE;
162 }
163 return TRUE;
164}
165
166void product_action::element_unpack(uchar *elt, int *Elt, int verbose_level)
167{
168 A1->element_unpack(elt, Elt, verbose_level);
170 Elt + A1->elt_size_in_int, verbose_level);
171}
172
173void product_action::element_pack(int *Elt, uchar *elt, int verbose_level)
174{
175 A1->element_pack(Elt, elt, verbose_level);
177 elt + A1->coded_elt_size_in_char, verbose_level);
178}
179
181 int hdl, int *Elt, int verbose_level)
182{
183 int f_v = (verbose_level >= 1);
184 uchar *p_elt;
185
186 if (f_v) {
187 cout << "product_action::element_retrieve() hdl = " << hdl << endl;
188 }
189 p_elt = Elts->s_i(hdl);
190 A1->element_unpack(p_elt, Elt, verbose_level);
192 Elt + A1->elt_size_in_int, verbose_level);
193}
194
195int product_action::element_store(actions::action *A, int *Elt, int verbose_level)
196{
197 int f_v = (verbose_level >= 1);
198 int hdl;
199
200 A1->element_pack(Elt, elt1, verbose_level);
201 A2->element_pack(Elt + A1->elt_size_in_int, elt1 + A1->coded_elt_size_in_char, verbose_level);
202 hdl = Elts->store(elt1);
203 if (f_v) {
204 cout << "product_action::element_store() hdl = " << hdl << endl;
205 }
206 return hdl;
207}
208
209void product_action::element_mult(int *A, int *B, int *AB, int verbose_level)
210{
211 A1->element_mult(A, B, AB, verbose_level);
213 B + A1->elt_size_in_int,
214 AB + A1->elt_size_in_int, verbose_level);
215}
216
217void product_action::element_invert(int *A, int *Av, int verbose_level)
218{
219 A1->element_invert(A, Av, verbose_level);
221 Av + A1->elt_size_in_int, verbose_level);
222}
223
224void product_action::element_transpose(int *A, int *At, int verbose_level)
225{
226 A1->element_transpose(A, At, verbose_level);
228 At + A1->elt_size_in_int, verbose_level);
229}
230
231void product_action::element_move(int *A, int *B, int verbose_level)
232{
233 A1->element_move(A, B, verbose_level);
235 B + A1->elt_size_in_int, verbose_level);
236}
237
238void product_action::element_print(int *A, ostream &ost)
239{
240 ost << "(" << endl;
241 A1->element_print(A, ost);
242 ost << ", " << endl;
244 ost << ")" << endl;
245}
246
247void product_action::element_print_latex(int *A, ostream &ost)
248{
249 ost << "\\left(" << endl;
250 A1->element_print_latex(A, ost);
251 ost << ", " << endl;
253 ost << "\\\right)" << endl;
254}
255
256void product_action::make_element(int *Elt, int *data, int verbose_level)
257{
258 A1->make_element(Elt, data, verbose_level);
260 data + A1->make_element_size, verbose_level);
261}
262
263}}}
264
265
266
267
bulk storage of group elements in compressed form
void init(int entry_size, int page_length_log, int verbose_level)
a permutation group in a fixed action.
Definition: actions.h:99
void element_print_latex(void *elt, std::ostream &ost)
Definition: action_cb.cpp:364
void element_unpack(void *elt, void *Elt, int verbose_level)
Definition: action_cb.cpp:287
void element_print(void *elt, std::ostream &ost)
Definition: action_cb.cpp:347
void element_pack(void *Elt, void *elt, int verbose_level)
Definition: action_cb.cpp:294
void element_mult(void *a, void *b, void *ab, int verbose_level)
Definition: action_cb.cpp:315
int element_is_one(void *elt, int verbose_level)
Definition: action_cb.cpp:248
void element_invert(void *a, void *av, int verbose_level)
Definition: action_cb.cpp:322
void element_one(void *elt, int verbose_level)
Definition: action_cb.cpp:224
void make_element(int *Elt, int *data, int verbose_level)
Definition: action.cpp:1875
void element_move(void *a, void *b, int verbose_level)
Definition: action_cb.cpp:335
void element_transpose(void *a, void *at, int verbose_level)
Definition: action_cb.cpp:329
long int element_image_of(long int a, void *elt, int verbose_level)
Definition: action_cb.cpp:198
void element_pack(int *Elt, uchar *elt, int verbose_level)
void element_retrieve(actions::action *A, int hdl, int *Elt, int verbose_level)
void init(actions::action *A1, actions::action *A2, int f_use_projections, int verbose_level)
void element_unpack(uchar *elt, int *Elt, int verbose_level)
void element_mult(int *A, int *B, int *AB, int verbose_level)
void make_element(int *Elt, int *data, int verbose_level)
long int compute_image(actions::action *A, int *Elt, long int i, int verbose_level)
void element_invert(int *A, int *Av, int verbose_level)
void element_transpose(int *A, int *At, int verbose_level)
int element_store(actions::action *A, int *Elt, int verbose_level)
int element_is_one(actions::action *A, int *Elt, int verbose_level)
void element_one(actions::action *A, int *Elt, int verbose_level)
#define PAGE_LENGTH_LOG
Definition: foundations.h:210
#define NEW_uchar(n)
Definition: foundations.h:634
#define FREE_uchar(p)
Definition: foundations.h:647
#define FREE_int(p)
Definition: foundations.h:640
unsigned char uchar
Definition: foundations.h:204
#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 TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
the orbiter library for the classification of combinatorial objects