Orbiter 2022
Combinatorial Objects
magma_interface.cpp
Go to the documentation of this file.
1// magma_interface.cpp
2//
3// Anton Betten
4//
5// started: April 27, 2017
6//
7
8#include "foundations.h"
9
10
11using namespace std;
12
13
14namespace orbiter {
15namespace layer1_foundations {
16namespace orbiter_kernel_system {
17
18
20{
21 if (Orbiter == NULL) {
22 cout << "magma_interface::magma_interface The_Orbiter_session == NULL" << endl;
23 exit(1);
24 }
26}
27
29{
30}
31
32void magma_interface::write_permutation_group(std::string &fname_base,
33 int group_order, int *Table, int *gens, int nb_gens,
34 int verbose_level)
35{
36 string fname;
37 int i;
39 file_io Fio;
40
41 fname.assign(fname_base);
42 fname.append(".magma");
43 {
44 ofstream fp(fname);
45
46 fp << "G := PermutationGroup< " << group_order << " | " << endl;
47 for (i = 0; i < nb_gens; i++) {
49 Table + gens[i] * group_order,
50 group_order);
51 if (i < nb_gens - 1) {
52 fp << ", " << endl;
53 }
54 }
55 fp << " >;" << endl;
56 }
57 cout << "Written file " << fname << " of size " << Fio.file_size(fname) << endl;
58}
59
61 std::string &fname_base,
62 int group_order, int *Table, int *gens, int nb_gens,
63 int *&N_gens, int &N_nb_gens, int &N_go,
64 int verbose_level)
65{
66 string fname_magma;
67 string fname_output;
68 int i;
70 file_io Fio;
71
72 fname_magma.assign(fname_base);
73 fname_magma.append(".magma");
74 fname_output.assign(fname_base);
75 fname_output.append(".txt");
76
77
78 {
79 ofstream fp(fname_magma);
80
81 fp << "S := Sym(" << group_order << ");" << endl;
82
83
84 fp << "G := PermutationGroup< " << group_order << " | " << endl;
85 for (i = 0; i < nb_gens; i++) {
87 Table + gens[i] * group_order, group_order);
88 if (i < nb_gens - 1) {
89 fp << ", " << endl;
90 }
91 }
92 fp << " >;" << endl;
93
94 fp << "N := Normalizer(S, G);" << endl;
95 fp << "SetOutputFile(\"" << fname_output << "\");" << endl;
96 fp << "printf \"%o\", #N; printf \"\\n\";" << endl;
97 fp << "printf \"%o\", #Generators(N); printf \"\\n\";" << endl;
98 fp << "for h := 1 to #Generators(N) do for i := 1 to "
99 << group_order << " do printf \"%o\", i^N.h; printf \" \"; "
100 "if i mod 25 eq 0 then printf \"\n\"; end if; end for; "
101 "printf \"\\n\"; end for;" << endl;
102 fp << "UnsetOutputFile();" << endl;
103 }
104
105
106 if (Fio.file_size(fname_output) == 0) {
107
108 run_magma_file(fname_magma, verbose_level);
109 if (Fio.file_size(fname_output) == 0) {
110 cout << "please run magma on the file " << fname_magma << endl;
111 cout << "for instance, try" << endl;
112 cout << Orbiter_session->magma_path << "magma " << fname_magma << endl;
113 exit(1);
114 }
115 }
116
117 cout << "normalizer command in MAGMA has finished, written file "
118 << fname_output << " of size " << Fio.file_size(fname_output) << endl;
119
120
121 read_permutation_group(fname_output,
122 group_order, N_gens, N_nb_gens, N_go, verbose_level);
123
124#if 0
125 {
126 ifstream fp(fname_output);
127
128
129 fp >> N_go;
130 fp >> N_nb_gens;
131 cout << "N_go = " << N_go << " nb_gens = " << N_nb_gens << endl;
132 N_gens = NEW_int(N_nb_gens * group_order);
133 for (i = 0; i < N_nb_gens; i++) {
134 for (j = 0; j < group_order; j++) {
135 fp >> a;
136 a--;
137 N_gens[i * group_order + j] = a;
138 }
139 }
140 }
141#endif
142
143}
144
146 int degree, int *&gens, int &nb_gens, int &go,
147 int verbose_level)
148{
149 {
150 ifstream fp(fname);
151 int i, j, a;
152
153
154 fp >> go;
155 fp >> nb_gens;
156 cout << "go = " << go << " nb_gens = " << nb_gens << endl;
157 gens = NEW_int(nb_gens * degree);
158 for (i = 0; i < nb_gens; i++) {
159 for (j = 0; j < degree; j++) {
160 fp >> a;
161 a--;
162 gens[i * degree + j] = a;
163 }
164 }
165 }
166}
167
169 std::string &fname_base,
170 int d, int q,
171 int *initial_vector, int **gens, int nb_gens,
172 int &orbit_length,
173 int verbose_level)
174{
175 string fname_magma;
176 string fname_output;
177 int i, j;
179 file_io Fio;
180
181 fname_magma.assign(fname_base);
182 fname_magma.append(".magma");
183 fname_output.assign(fname_base);
184 fname_output.append(".txt");
185
186 {
187 ofstream fp(fname_magma);
188
189
190 fp << "G := MatrixGroup< " << d << ", GF(" << q << ") | " << endl;
191 for (i = 0; i < nb_gens; i++) {
192 fp << "[";
193 for (j = 0; j < d * d; j++) {
194 fp << gens[i][j];
195 if (j < d * d - 1) {
196 fp << ",";
197 }
198 }
199 fp << "]";
200 if (i < nb_gens - 1) {
201 fp << ", " << endl;
202 }
203 }
204 fp << " >;" << endl;
205
206 fp << "V := RSpace(G);" << endl;
207 fp << "u := V![";
208 for (j = 0; j < d; j++) {
209 fp << initial_vector[j];
210 if (j < d - 1) {
211 fp << ",";
212 }
213 }
214
215 fp << "];" << endl;
216 fp << "O := Orbit(G,u);" << endl;
217
218
219 fp << "SetOutputFile(\"" << fname_output << "\");" << endl;
220 fp << "printf \"%o\", #O; printf \"\\n\";" << endl;
221 fp << "UnsetOutputFile();" << endl;
222 }
223
224
225 if (Fio.file_size(fname_output) == 0) {
226
227 run_magma_file(fname_magma, verbose_level);
228 if (Fio.file_size(fname_output) == 0) {
229 cout << "please run magma on the file " << fname_magma << endl;
230 cout << "for instance, try" << endl;
231 cout << Orbiter_session->magma_path << "magma " << fname_magma << endl;
232 exit(1);
233 }
234 }
235
236 cout << "orbit command in MAGMA has finished, written file "
237 << fname_output << " of size " << Fio.file_size(fname_output) << endl;
238
239
240
241 {
242 ifstream fp(fname_output);
243
244
245 fp >> orbit_length;
246 }
247
248}
249
250
252 std::string &fname_base,
253 int d, int q, int k,
254 int *initial_subspace, int **gens, int nb_gens,
255 int &orbit_length,
256 int verbose_level)
257{
258 string fname_magma;
259 string fname_output;
260 int i, j;
262 file_io Fio;
263
264 fname_magma.assign(fname_base);
265 fname_magma.append(".magma");
266 fname_output.assign(fname_base);
267 fname_output.append(".txt");
268
269 {
270 ofstream fp(fname_magma);
271
272
273 fp << "G := MatrixGroup< " << d << ", GF(" << q << ") | " << endl;
274 for (i = 0; i < nb_gens; i++) {
275 fp << "[";
276 for (j = 0; j < d * d; j++) {
277 fp << gens[i][j];
278 if (j < d * d - 1) {
279 fp << ",";
280 }
281 }
282 fp << "]";
283 if (i < nb_gens - 1) {
284 fp << ", " << endl;
285 }
286 }
287 fp << " >;" << endl;
288
289 fp << "V := RSpace(G);" << endl;
290 for (i = 0; i < k; i++) {
291 fp << "u" << i << " := V![";
292 for (j = 0; j < d; j++) {
293 fp << initial_subspace[i * d + j];
294 if (j < d - 1) {
295 fp << ",";
296 }
297 }
298 fp << "];" << endl;
299 }
300
301 fp << "W := sub< V | ";
302 for (i = 0; i < k; i++) {
303 fp << "u" << i;
304 if (i < k - 1) {
305 fp << ", ";
306 }
307 }
308 fp << " >;" << endl;
309 fp << "O := Orbit(G,W);" << endl;
310
311
312 fp << "SetOutputFile(\"" << fname_output << "\");" << endl;
313 fp << "printf \"%o\", #O; printf \"\\n\";" << endl;
314 fp << "UnsetOutputFile();" << endl;
315 }
316
317
318 if (Fio.file_size(fname_output) == 0) {
319 run_magma_file(fname_magma, verbose_level);
320 if (Fio.file_size(fname_output) == 0) {
321 cout << "please run magma on the file " << fname_magma << endl;
322 cout << "for instance, try" << endl;
323 cout << Orbiter_session->magma_path << "magma " << fname_magma << endl;
324 exit(1);
325 }
326 }
327
328 cout << "orbit command in MAGMA has finished, written file "
329 << fname_output << " of size " << Fio.file_size(fname_output) << endl;
330
331
332
333 {
334 ifstream fp(fname_output);
335
336
337 fp >> orbit_length;
338 }
339
340}
341
342void magma_interface::run_magma_file(std::string &fname, int verbose_level)
343{
344 int f_v = (verbose_level >= 1);
345 string cmd;
346
347 cmd.assign(Orbiter_session->magma_path);
348 cmd.append("magma ");
349 cmd.append(fname);
350
351 if (f_v) {
352 cout << "executing: " << cmd << endl;
353 }
354 system(cmd.c_str());
355}
356
357
358}}}
359
void orbit_of_matrix_group_on_vector(std::string &fname_base, int d, int q, int *initial_vector, int **gens, int nb_gens, int &orbit_length, int verbose_level)
void read_permutation_group(std::string &fname, int degree, int *&gens, int &nb_gens, int &go, int verbose_level)
void write_permutation_group(std::string &fname_base, int group_order, int *Table, int *gens, int nb_gens, int verbose_level)
void normalizer_in_Sym_n(std::string &fname_base, int group_order, int *Table, int *gens, int nb_gens, int *&N_gens, int &N_nb_gens, int &N_go, int verbose_level)
void orbit_of_matrix_group_on_subspaces(std::string &fname_base, int d, int q, int k, int *initial_subspace, int **gens, int nb_gens, int &orbit_length, int verbose_level)
#define NEW_int(n)
Definition: foundations.h:625
orbiter_kernel_system::orbiter_session * Orbiter
global Orbiter session
the orbiter library for the classification of combinatorial objects