Orbiter 2022
Combinatorial Objects
permutation_group_create.cpp
Go to the documentation of this file.
1/*
2 * permutation_group_create.cpp
3 *
4 * Created on: Sep 26, 2021
5 * Author: betten
6 */
7
8
9
10
11
13#include "group_actions.h"
14
15using namespace std;
16
17
18
19namespace orbiter {
20namespace layer3_group_actions {
21namespace groups {
22
24{
25 Descr = NULL;
26
27 //std::string label;
28 //std::string label_tex;
29
30 //initial_strong_gens = NULL;
31 A_initial = NULL;
32
34 Strong_gens = NULL;
35 A2 = NULL;
36
38 nice_gens = NULL;
39}
40
42{
43 Descr = NULL;
44}
45
46
49 int verbose_level)
50{
51 int f_v = (verbose_level >= 1);
52
53 if (f_v) {
54 cout << "permutation_group_create::permutation_group_init" << endl;
55 }
57 int f_OK = FALSE;
58
59 if (f_v) {
60 cout << "permutation_group_create::permutation_group_init initializing group" << endl;
61 }
62
63
65
66 if (f_v) {
67 cout << "permutation_group_create::permutation_group_init initializing symmetric_group_t" << endl;
68 }
69
71 int f_no_base = FALSE;
72
73 A_initial->init_symmetric_group(Descr->degree, f_no_base, verbose_level);
74
79
80 label.assign(A_initial->label);
82
83 if (f_v) {
84 cout << "permutation_group_create::permutation_group_init initializing symmetric_group_t done" << endl;
85 }
86 }
87
88 else if (Descr->type == bsgs_t) {
89
91
93 long int *given_base;
94 int given_base_length;
95
96#if 0
97 int *gens;
98 int *gens_i;
99 int sz;
100 int h;
101
103 for (h = 0; h < Descr->bsgs_nb_generators; h++) {
104
105 Orbiter->Int_vec.scan(Descr->bsgs_generators[h], gens_i, sz);
106 if (sz != Descr->degree) {
107 cout << "permutation_group_create::permutation_group_init generator "
108 << h << " does not have the right length" << endl;
109 exit(1);
110 }
111 Orbiter->Int_vec.copy(gens_i, gens + h * Descr->degree, Descr->degree);
112
113 FREE_int(gens_i);
114
115 }
116#else
117 int *gens;
118 int sz;
119
121#endif
122
123 int f_no_base = FALSE;
124
126
127 Lint_vec_scan(Descr->bsgs_base, given_base, given_base_length);
128
129
131 TRUE /* f_target_go */, target_go,
133 given_base_length, given_base,
134 f_no_base,
135 verbose_level);
136
141
142 label.assign(Descr->bsgs_label);
144
145 FREE_int(gens);
146
147 }
148
149
151 if (f_v) {
152 cout << "permutation_group_create::permutation_group_init "
153 "before init_subgroup_by_generators" << endl;
154 }
156 description->subgroup_label,
157 description->subgroup_order_text,
158 description->nb_subgroup_generators,
159 description->subgroup_generators_label,
160 verbose_level);
161 if (f_v) {
162 cout << "permutation_group_create::permutation_group_init "
163 "after init_subgroup_by_generators" << endl;
164 }
165 f_OK = TRUE;
166
167 }
168
169#if 0
170 else {
171 cout << "permutation_group_create::permutation_group_init unknown group type" << endl;
172
173 }
174#endif
175
176 if (!f_OK) {
177 if (f_v) {
178 cout << "permutation_group_create::permutation_group_init !f_OK, A2 = A_initial" << endl;
179 }
180 A2 = A_initial;
183
184 }
185
186
187 if (f_v) {
188 cout << "permutation_group_create::permutation_group_init done" << endl;
189 }
190}
191
193 std::string &subgroup_label,
194 std::string &subgroup_order_text,
195 int nb_subgroup_generators,
196 std::string &subgroup_generators_label,
197 int verbose_level)
198{
199 int f_v = (verbose_level >= 1);
200 //int f_vv = (verbose_level >= 2);
201
202 if (f_v) {
203 cout << "permutation_group_create::init_subgroup_by_generators" << endl;
204 cout << "label=" << subgroup_label << endl;
205 }
206
208
209 int *gens;
210 int sz;
211
212 orbiter_kernel_system::Orbiter->get_vector_from_label(subgroup_generators_label, gens, sz, verbose_level);
213
214 if (sz != nb_subgroup_generators * A_initial->degree) {
215 cout << "permutation_group_create::init_subgroup_by_generators "
216 "sz != nb_subgroup_generators * A_initial->degree" << endl;
217 exit(1);
218 }
219 if (f_v) {
220 cout << "permutation_group_create::init_subgroup_by_generators before "
221 "Strong_gens->init_subgroup_by_generators" << endl;
222 }
224 nb_subgroup_generators, gens,
225 subgroup_order_text,
226 nice_gens,
227 verbose_level - 1);
228 if (f_v) {
229 cout << "permutation_group_create::init_subgroup_by_generators after "
230 "Strong_gens->init_subgroup_by_generators" << endl;
231 }
232
234
235 if (f_v) {
236 cout << "permutation_group_create::init_subgroup_by_generators after "
237 "Strong_gens->init_subgroup_by_generators" << endl;
238 }
239
241
242 A2 = A_initial;
243
244 stringstream str;
246 int max_len = 80;
247 int line_skip = 0;
248
249
250 L.latexable_string(str, subgroup_label.c_str(), max_len, line_skip);
251
252
253
254 label.append("_Subgroup_");
255 label.append(subgroup_label);
256 label.append("_");
257 label.append(subgroup_order_text);
258
259
260 label_tex.append("{\\rm Subgroup ");
261 label_tex.append(str.str());
262 label_tex.append(" order ");
263 label_tex.append(subgroup_order_text);
264 label_tex.append("}");
265
266 if (f_v) {
267 cout << "permutation_group_create::init_subgroup_by_generators "
268 "created group " << label << endl;
269 }
270}
271
272
273
274}}}
275
276
void copy(int *from, int *to, long int len)
Definition: int_vec.cpp:167
void scan(std::string &s, int *&v, int &len)
Definition: int_vec.cpp:608
void latexable_string(std::stringstream &str, const char *p, int max_len, int line_skip)
void get_vector_from_label(std::string &label, int *&v, int &sz, int verbose_level)
a class to represent arbitrary precision integers
Definition: ring_theory.h:366
void create_from_base_10_string(const char *str, int verbose_level)
a permutation group in a fixed action.
Definition: actions.h:99
void init_symmetric_group(int degree, int f_no_base, int verbose_level)
groups::strong_generators * Strong_gens
Definition: actions.h:130
void init_permutation_group_from_generators(int degree, int f_target_go, ring_theory::longinteger_object &target_go, int nb_gens, int *gens, int given_base_length, long int *given_base, int f_no_base, int verbose_level)
void permutation_group_init(permutation_group_description *description, int verbose_level)
void init_subgroup_by_generators(std::string &subgroup_label, std::string &subgroup_order_text, int nb_subgroup_generators, std::string &subgroup_generators_label, int verbose_level)
a domain for permutation groups whose elements are given in the permutation representation
Definition: groups.h:677
a strong generating set for a permutation group with respect to a fixed action
Definition: groups.h:1703
void init_subgroup_by_generators(actions::action *A, int nb_subgroup_gens, int *subgroup_gens, std::string &subgroup_order_text, data_structures_groups::vector_ge *&nice_gens, int verbose_level)
#define FREE_int(p)
Definition: foundations.h:640
#define Lint_vec_scan(A, B, C)
Definition: foundations.h:717
#define NEW_OBJECT(type)
Definition: foundations.h:638
#define NEW_int(n)
Definition: foundations.h:625
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
orbiter_kernel_system::orbiter_session * Orbiter
global Orbiter session
the orbiter library for the classification of combinatorial objects