Orbiter 2022
Combinatorial Objects
interface_algebra.cpp
Go to the documentation of this file.
1/*
2 * interface_algebra.cpp
3 *
4 * Created on: Apr 26, 2020
5 * Author: betten
6 */
7
8
9
10
11#include "orbiter.h"
12
13using namespace std;
14
15
16namespace orbiter {
17namespace layer5_applications {
18namespace user_interface {
19
20
22{
23 f_count_subprimitive = FALSE;
24 count_subprimitive_Q_max = 0;
25 count_subprimitive_H_max = 0;
26 f_equivalence_class_of_fractions = FALSE;
27 equivalence_class_of_fractions_N = 0;
28
29
30 f_character_table_symmetric_group = FALSE;
31 character_table_symmetric_group_n = 0;
32
33 f_make_A5_in_PSL_2_q = FALSE;
34 make_A5_in_PSL_2_q_q = 0;
35
36
37 f_search_for_primitive_polynomial_in_range = FALSE;
38 p_min = 0;
39 p_max = 0;
40 deg_min = 0;
41 deg_max = 0;
42
43 f_order_of_q_mod_n = FALSE;
44 order_of_q_mod_n_q = 0;
45 order_of_q_mod_n_n_min = 0;
46 order_of_q_mod_n_n_max = 0;
47
48 f_eulerfunction_interval = FALSE;
49 eulerfunction_interval_n_min = 0;
50 eulerfunction_interval_n_max = 0;
51
52 f_young_symmetrizer = FALSE;
53 young_symmetrizer_n = 0;
54
55 f_young_symmetrizer_sym_4 = FALSE;
56
57
58 f_draw_mod_n = FALSE;
59 Draw_mod_n_description = NULL;
60
61 f_power_function_mod_n = FALSE;
62 power_function_mod_n_k = 0;
63 power_function_mod_n_n = 0;
64
65
66 f_all_rational_normal_forms = FALSE;
67 //std::string all_rational_normal_forms_finite_field_label;
68 all_rational_normal_forms_d = 0;
69
70 f_eigenstuff = FALSE;
71 f_eigenstuff_from_file = FALSE;
72 //std::string eigenstuff_finite_field_label;
73 eigenstuff_n = 0;
74 //eigenstuff_coeffs = NULL;
75 //eigenstuff_fname = NULL;
76
77
78}
79
80
82 std::string *argv, int i, int verbose_level)
83{
85
86 if (ST.stringcmp(argv[i], "-count_subprimitive") == 0) {
87 cout << "-count_subprimitive <int : Q_max> <int : H_max>" << endl;
88 }
89 else if (ST.stringcmp(argv[i], "-equivalence_class_of_fractions") == 0) {
90 cout << "-equivalence_class_of_fractions <int : N> " << endl;
91 }
92 else if (ST.stringcmp(argv[i], "-character_table_symmetric_group") == 0) {
93 cout << "-character_table_symmetric_group <int : deg> " << endl;
94 }
95 else if (ST.stringcmp(argv[i], "-make_A5_in_PSL_2_q") == 0) {
96 cout << "-make_A5_in_PSL_2_q <int : q> " << endl;
97 }
98 else if (ST.stringcmp(argv[i], "-search_for_primitive_polynomial_in_range") == 0) {
99 cout << "-search_for_primitive_polynomial_in_range " << endl;
100 }
101 else if (ST.stringcmp(argv[i], "-order_of_q_mod_n") == 0) {
102 cout << "-order_of_q_mod_n <int : q> <int : n_min> <int : n_max> " << endl;
103 }
104 else if (ST.stringcmp(argv[i], "-eulerfunction_interval") == 0) {
105 cout << "-eulerfunction_interval <int : n_min> <int : n_max> " << endl;
106 }
107 else if (ST.stringcmp(argv[i], "-young_symmetrizer") == 0) {
108 cout << "-young_symmetrizer " << endl;
109 }
110 else if (ST.stringcmp(argv[i], "-young_symmetrizer_sym_4") == 0) {
111 cout << "-young_symmetrizer_sym_4 " << endl;
112 }
113 else if (ST.stringcmp(argv[i], "-draw_mod_n") == 0) {
114 cout << "-draw_mod_n descr -end" << endl;
115 }
116 else if (ST.stringcmp(argv[i], "-power_function_mod_n") == 0) {
117 cout << "-power_function_mod_n <int : a> <int : n>" << endl;
118 }
119 else if (ST.stringcmp(argv[i], "-all_rational_normal_forms") == 0) {
120 cout << "-all_rational_normal_forms <string : finite_field_label> <int : degree>" << endl;
121 }
122 else if (ST.stringcmp(argv[i], "-eigenstuff") == 0) {
123 cout << "-eigenstuff <string : finite_field_label> <int : n> <intvec : coeffs>" << endl;
124 }
125 else if (ST.stringcmp(argv[i], "-eigenstuff_from_file") == 0) {
126 cout << "-eigenstuff_from_file <string : finite_field_label> <int : n> <string : fname>" << endl;
127 }
128}
129
130
132 std::string *argv, int i, int verbose_level)
133{
134 int f_v = (verbose_level >= 1);
136
137 if (f_v) {
138 cout << "interface_algebra::recognize_keyword" << endl;
139 }
140 if (i >= argc) {
141 return false;
142 }
143 if (ST.stringcmp(argv[i], "-count_subprimitive") == 0) {
144 return true;
145 }
146 else if (ST.stringcmp(argv[i], "-equivalence_class_of_fractions") == 0) {
147 return true;
148 }
149 else if (ST.stringcmp(argv[i], "-character_table_symmetric_group") == 0) {
150 return true;
151 }
152 else if (ST.stringcmp(argv[i], "-make_A5_in_PSL_2_q") == 0) {
153 return true;
154 }
155 else if (ST.stringcmp(argv[i], "-search_for_primitive_polynomial_in_range") == 0) {
156 return true;
157 }
158 else if (ST.stringcmp(argv[i], "-order_of_q_mod_n") == 0) {
159 return true;
160 }
161 else if (ST.stringcmp(argv[i], "-eulerfunction_interval") == 0) {
162 return true;
163 }
164 else if (ST.stringcmp(argv[i], "-young_symmetrizer") == 0) {
165 return true;
166 }
167 else if (ST.stringcmp(argv[i], "-young_symmetrizer_sym_4") == 0) {
168 return true;
169 }
170 else if (ST.stringcmp(argv[i], "-draw_mod_n") == 0) {
171 return true;
172 }
173 else if (ST.stringcmp(argv[i], "-power_function_mod_n") == 0) {
174 return true;
175 }
176 else if (ST.stringcmp(argv[i], "-all_rational_normal_forms") == 0) {
177 return true;
178 }
179 else if (ST.stringcmp(argv[i], "-eigenstuff") == 0) {
180 return true;
181 }
182 else if (ST.stringcmp(argv[i], "-eigenstuff_from_file") == 0) {
183 return true;
184 }
185 if (f_v) {
186 cout << "interface_algebra::recognize_keyword not recognizing" << endl;
187 }
188 return false;
189}
190
191
193 std::string *argv, int &i, int verbose_level)
194{
195 int f_v = (verbose_level >= 1);
197
198 if (f_v) {
199 cout << "interface_algebra::read_arguments" << endl;
200 }
201
202
203 if (f_v) {
204 cout << "interface_algebra::read_arguments the next argument is " << argv[i] << endl;
205 }
206
207 if (ST.stringcmp(argv[i], "-count_subprimitive") == 0) {
208 f_count_subprimitive = TRUE;
209 count_subprimitive_Q_max = ST.strtoi(argv[++i]);
210 count_subprimitive_H_max = ST.strtoi(argv[++i]);
211 cout << "-count_subprimitive "
212 << count_subprimitive_Q_max
213 << " " << count_subprimitive_H_max
214 << endl;
215 }
216 else if (ST.stringcmp(argv[i], "-equivalence_class_of_fractions") == 0) {
217 f_equivalence_class_of_fractions = TRUE;
218 equivalence_class_of_fractions_N = ST.strtoi(argv[++i]);
219 cout << "-equivalence_class_of_fractions " << equivalence_class_of_fractions_N
220 << endl;
221 }
222 else if (ST.stringcmp(argv[i], "-character_table_symmetric_group") == 0) {
223 f_character_table_symmetric_group = TRUE;
224 character_table_symmetric_group_n = ST.strtoi(argv[++i]);
225 cout << "-character_table_symmetric_group " << character_table_symmetric_group_n << endl;
226 }
227 else if (ST.stringcmp(argv[i], "-make_A5_in_PSL_2_q") == 0) {
228 f_make_A5_in_PSL_2_q = TRUE;
229 make_A5_in_PSL_2_q_q = ST.strtoi(argv[++i]);
230 cout << "-make_A5_in_PSL_2_q " << make_A5_in_PSL_2_q_q << endl;
231 }
232 else if (ST.stringcmp(argv[i], "-search_for_primitive_polynomial_in_range") == 0) {
233 f_search_for_primitive_polynomial_in_range = TRUE;
234 p_min = ST.strtoi(argv[++i]);
235 p_max = ST.strtoi(argv[++i]);
236 deg_min = ST.strtoi(argv[++i]);
237 deg_max = ST.strtoi(argv[++i]);
238 cout << "-search_for_primitive_polynomial_in_range " << p_min
239 << " " << p_max
240 << " " << deg_min
241 << " " << deg_max << " " << endl;
242 }
243
244 else if (ST.stringcmp(argv[i], "-order_of_q_mod_n") == 0) {
245 f_order_of_q_mod_n = TRUE;
246 order_of_q_mod_n_q = ST.strtoi(argv[++i]);
247 order_of_q_mod_n_n_min = ST.strtoi(argv[++i]);
248 order_of_q_mod_n_n_max = ST.strtoi(argv[++i]);
249 cout << "-order_of_q_mod_n " << order_of_q_mod_n_q
250 << " " << order_of_q_mod_n_n_min
251 << " " << order_of_q_mod_n_n_max << " " << endl;
252 }
253
254 else if (ST.stringcmp(argv[i], "-eulerfunction_interval") == 0) {
255 f_eulerfunction_interval = TRUE;
256 eulerfunction_interval_n_min = ST.strtoi(argv[++i]);
257 eulerfunction_interval_n_max = ST.strtoi(argv[++i]);
258 cout << "-eulerfunction_interval "
259 << " " << eulerfunction_interval_n_min
260 << " " << eulerfunction_interval_n_max << " " << endl;
261 }
262
263
264
265 else if (ST.stringcmp(argv[i], "-young_symmetrizer") == 0) {
266 f_young_symmetrizer = TRUE;
267 young_symmetrizer_n = ST.strtoi(argv[++i]);
268 cout << "-young_symmetrizer " << " " << young_symmetrizer_n << endl;
269 }
270 else if (ST.stringcmp(argv[i], "-young_symmetrizer_sym_4") == 0) {
271 f_young_symmetrizer_sym_4 = TRUE;
272 cout << "-young_symmetrizer_sym_4 " << endl;
273 }
274 else if (ST.stringcmp(argv[i], "-draw_mod_n") == 0) {
275 f_draw_mod_n = TRUE;
276 cout << "-draw_mod_n " << endl;
277 Draw_mod_n_description = NEW_OBJECT(graphics::draw_mod_n_description);
278 i += Draw_mod_n_description->read_arguments(argc - (i + 1),
279 argv + i + 1, verbose_level);
280
281 cout << "interface_algebra::read_arguments finished "
282 "reading -draw_mod_n" << endl;
283 cout << "i = " << i << endl;
284 cout << "argc = " << argc << endl;
285 if (i < argc) {
286 cout << "next argument is " << argv[i] << endl;
287 }
288 cout << "-draw_mod_n " << endl;
289 }
290 else if (ST.stringcmp(argv[i], "-power_function_mod_n") == 0) {
291 f_power_function_mod_n = TRUE;
292 power_function_mod_n_k = ST.strtoi(argv[++i]);
293 power_function_mod_n_n = ST.strtoi(argv[++i]);
294 cout << "-power_mod_n " << " "
295 << power_function_mod_n_k << " "
296 << power_function_mod_n_n << endl;
297 }
298 else if (ST.stringcmp(argv[i], "-all_rational_normal_forms") == 0) {
299 f_all_rational_normal_forms = TRUE;
300 all_rational_normal_forms_finite_field_label.assign(argv[++i]);
301 all_rational_normal_forms_d = ST.strtoi(argv[++i]);
302 if (f_v) {
303 cout << "-f_all_rational_normal_forms "
304 << all_rational_normal_forms_finite_field_label
305 << " " << all_rational_normal_forms_d << endl;
306 }
307 }
308 else if (ST.stringcmp(argv[i], "-eigenstuff") == 0) {
309 f_eigenstuff = TRUE;
310 eigenstuff_finite_field_label.assign(argv[++i]);
311 eigenstuff_n = ST.strtoi(argv[++i]);
312 eigenstuff_coeffs.assign(argv[++i]);
313 if (f_v) {
314 cout << "-eigenstuff "
315 << eigenstuff_finite_field_label
316 << " " << eigenstuff_n
317 << " " << eigenstuff_coeffs << endl;
318 }
319 }
320 else if (ST.stringcmp(argv[i], "-eigenstuff_matrix_from_file") == 0) {
321 f_eigenstuff_from_file = TRUE;
322 eigenstuff_finite_field_label.assign(argv[++i]);
323 eigenstuff_n = ST.strtoi(argv[++i]);
324 eigenstuff_fname.assign(argv[++i]);
325 if (f_v) {
326 cout << "-eigenstuff_from_file "
327 << eigenstuff_finite_field_label
328 << " " << eigenstuff_n
329 << " " << eigenstuff_fname << endl;
330 }
331 }
332
333}
334
335
337{
338 if (f_count_subprimitive) {
339 cout << "-count_subprimitive "
340 << count_subprimitive_Q_max
341 << " " << count_subprimitive_H_max
342 << endl;
343 }
344 if (f_equivalence_class_of_fractions) {
345 cout << "-equivalence_class_of_fractions "
346 << equivalence_class_of_fractions_N
347 << endl;
348 }
349 if (f_character_table_symmetric_group) {
350 cout << "-character_table_symmetric_group " << character_table_symmetric_group_n << endl;
351 }
352 if (f_make_A5_in_PSL_2_q) {
353 cout << "-make_A5_in_PSL_2_q " << make_A5_in_PSL_2_q_q << endl;
354 }
355 if (f_search_for_primitive_polynomial_in_range) {
356 cout << "-search_for_primitive_polynomial_in_range " << p_min
357 << " " << p_max
358 << " " << deg_min
359 << " " << deg_max << " " << endl;
360 }
361
362 if (f_order_of_q_mod_n) {
363 cout << "-order_of_q_mod_n " << order_of_q_mod_n_q
364 << " " << order_of_q_mod_n_n_min
365 << " " << order_of_q_mod_n_n_max << " " << endl;
366 }
367
368 if (f_eulerfunction_interval) {
369 cout << "-eulerfunction_interval "
370 << " " << eulerfunction_interval_n_min
371 << " " << eulerfunction_interval_n_max << " " << endl;
372 }
373
374 if (f_young_symmetrizer) {
375 cout << "-young_symmetrizer " << " " << young_symmetrizer_n << endl;
376 }
377 if (f_young_symmetrizer_sym_4) {
378 cout << "-young_symmetrizer_sym_4 " << endl;
379 }
380 if (f_draw_mod_n) {
381 cout << "-draw_mod_n " << endl;
382 Draw_mod_n_description->print();
383 }
384 if (f_power_function_mod_n) {
385 cout << "-power_function_mod_n " << " " << power_function_mod_n_k << " " << power_function_mod_n_n << endl;
386 }
387
388 if (f_all_rational_normal_forms) {
389 cout << "-all_rational_normal_forms "
390 << all_rational_normal_forms_finite_field_label
391 << " " << all_rational_normal_forms_d << endl;
392 }
393 if (f_eigenstuff) {
394 cout << "-eigenstuff "
395 << eigenstuff_finite_field_label << " "
396 << eigenstuff_n << " "
397 << eigenstuff_coeffs << endl;
398 }
399 if (f_eigenstuff_from_file) {
400 cout << "-eigenstuff_from_file "
401 << eigenstuff_finite_field_label << " " << eigenstuff_n
402 << " " << eigenstuff_fname << endl;
403 }
404
405}
406
407
408void interface_algebra::worker(int verbose_level)
409{
410 int f_v = (verbose_level >= 1);
411
412 if (f_v) {
413 cout << "interface_algebra::worker" << endl;
414 }
415
416 if (f_character_table_symmetric_group) {
417 do_character_table_symmetric_group(character_table_symmetric_group_n, verbose_level);
418 }
419
420 else if (f_make_A5_in_PSL_2_q) {
421
423
424 A.A5_in_PSL_(make_A5_in_PSL_2_q_q, verbose_level);
425
426 }
427
428 else if (f_count_subprimitive) {
429
431
432 Algebra.count_subprimitive(count_subprimitive_Q_max,
433 count_subprimitive_H_max);
434 }
435
436 else if (f_equivalence_class_of_fractions) {
437
439
440 Algebra.do_equivalence_class_of_fractions(equivalence_class_of_fractions_N,
441 verbose_level);
442 }
443
444 else if (f_search_for_primitive_polynomial_in_range) {
445
447
449 p_min, p_max, deg_min, deg_max,
450 verbose_level);
451 }
452
453 else if (f_order_of_q_mod_n) {
454
456
457 Algebra.order_of_q_mod_n(
458 order_of_q_mod_n_q, order_of_q_mod_n_n_min, order_of_q_mod_n_n_max,
459 verbose_level);
460
461 }
462
463 else if (f_eulerfunction_interval) {
464
466
468 eulerfunction_interval_n_min, eulerfunction_interval_n_max,
469 verbose_level);
470
471 }
472
473
474 else if (f_young_symmetrizer) {
476
477 Algebra.young_symmetrizer(young_symmetrizer_n, verbose_level);
478 }
479
480 else if (f_young_symmetrizer_sym_4) {
482
483 Algebra.young_symmetrizer_sym_4(verbose_level);
484 }
485
486 else if (f_draw_mod_n) {
489
490
491 if (!orbiter_kernel_system::Orbiter->f_draw_options) {
492 cout << "please use option -draw_options .. -end" << endl;
493 exit(1);
494 }
496 PT.draw_mod_n(Draw_mod_n_description,
497 O,
498 verbose_level);
499 }
500
501 else if (f_power_function_mod_n) {
502
504
505 Algebra.power_function_mod_n(
506 power_function_mod_n_k, power_function_mod_n_n,
507 verbose_level);
508
509 }
510
511 else if (f_all_rational_normal_forms) {
512
514
516 int idx;
517
518
519 idx = The_Orbiter_top_level_session->find_symbol(all_rational_normal_forms_finite_field_label);
520
522
523 Algebra.classes_GL(F, all_rational_normal_forms_d,
524 FALSE /* f_no_eigenvalue_one */, verbose_level);
525
526
527
528 }
529
530 else if (f_eigenstuff) {
531
532
534 int *data;
535 int sz;
537 int idx;
538
539
540 idx = The_Orbiter_top_level_session->find_symbol(eigenstuff_finite_field_label);
541
543
544 Int_vec_scan(eigenstuff_coeffs, data, sz);
545
546 if (sz != eigenstuff_n * eigenstuff_n) {
547 cout << "sz != eigenstuff_n * eigenstuff_n" << endl;
548 exit(1);
549 }
550
551 Algebra.do_eigenstuff(F, eigenstuff_n, data, verbose_level);
552
553 }
554
555 else if (f_eigenstuff_from_file) {
556
557
558#if 0
559 eigenstuff_n = strtoi(argv[++i]);
560 eigenstuff_fname.assign(argv[++i]);
561 algebra_global Algebra;
562
563 Algebra.power_mod_n(
564 power_mod_n_a, power_mod_n_n,
565 verbose_level);
566#endif
567
568 }
569
570
571
572 if (f_v) {
573 cout << "interface_algebra::worker done" << endl;
574 }
575
576}
577
578
579
581{
582 int f_v = (verbose_level >= 1);
583
584 if (f_v) {
585 cout << "interface_algebra::do_character_table_symmetric_group" << endl;
586 cout << "deg=" << deg << endl;
587 }
588
590
592
593 CTB->do_it(deg, verbose_level);
594
595 FREE_OBJECT(CTB);
596
597 if (f_v) {
598 cout << "interface_algebra::do_character_table_symmetric_group done" << endl;
599 }
600}
601
602
603
604
605}}}
606
607
global functions related to finite fields, irreducible polynomials and such
Definition: algebra.h:130
void do_equivalence_class_of_fractions(int N, int verbose_level)
void power_function_mod_n(int k, int n, int verbose_level)
void order_of_q_mod_n(int q, int n_min, int n_max, int verbose_level)
functions related to strings and character arrays
int read_arguments(int argc, std::string *argv, int verbose_level)
options for drawing an object of type layered_graph
Definition: graphics.h:457
utility functions for plotting (graphing)
Definition: graphics.h:972
void draw_mod_n(draw_mod_n_description *Descr, layered_graph_draw_options *O, int verbose_level)
Definition: plot_tools.cpp:425
void do_eulerfunction_interval(long int n_min, long int n_max, int verbose_level)
void do_search_for_primitive_polynomial_in_range(int p_min, int p_max, int deg_min, int deg_max, int verbose_level)
void do_eigenstuff(field_theory::finite_field *F, int size, int *Data, int verbose_level)
void classes_GL(field_theory::finite_field *F, int d, int f_no_eigenvalue_one, int verbose_level)
character table of a finite group using the algorithm of Burnside
int recognize_keyword(int argc, std::string *argv, int i, int verbose_level)
void print_help(int argc, std::string *argv, int i, int verbose_level)
void read_arguments(int argc, std::string *argv, int &i, int verbose_level)
#define Int_vec_scan(A, B, C)
Definition: foundations.h:716
#define NEW_OBJECT(type)
Definition: foundations.h:638
#define FREE_OBJECT(p)
Definition: foundations.h:651
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
orbiter_kernel_system::orbiter_session * Orbiter
global Orbiter session
user_interface::orbiter_top_level_session * The_Orbiter_top_level_session
the orbiter library for the classification of combinatorial objects