Orbiter 2022
Combinatorial Objects
group_container.cpp
Go to the documentation of this file.
1// group_container.cpp
2//
3// Anton Betten
4// December 24, 2003
5
7#include "group_actions.h"
8
9using namespace std;
10
11
12namespace orbiter {
13namespace layer3_group_actions {
14namespace data_structures_groups {
15
16
18{
19 null();
20}
21
23{
24 freeself();
25}
26
28{
29 A = NULL;
31 ascii_coding = NULL;
32
34 SG = NULL;
35 tl = NULL;
36
38 S = NULL;
39}
40
42{
46}
47
49{
50 null();
51 init(A, verbose_level);
52};
53
54group_container::group_container(actions::action *A, const char *ascii_coding, int verbose_level)
55{
56 null();
57 init(A, verbose_level);
58 init_ascii_coding(ascii_coding, verbose_level);
59};
60
62{
63 null();
64 init(A, verbose_level);
65 init_strong_generators(SG, tl, verbose_level - 1);
66};
67
68void group_container::init(actions::action *A, int verbose_level)
69{
70 null();
72}
73
74void group_container::init_ascii_coding_to_sims(const char *ascii_coding, int verbose_level)
75{
76 if (strlen(ascii_coding)) {
77 init_ascii_coding(ascii_coding, verbose_level);
78
79 decode_ascii(0);
80
81 // now strong generators are available
82
83 }
84 else {
85 //cout << "trivial group" << endl;
87 }
88
90}
91
92void group_container::init_ascii_coding(const char *ascii_coding, int verbose_level)
93{
95
99}
100
102{
103 if (f_has_ascii_coding) {
106 ascii_coding = NULL;
107 }
108}
109
111{
112 int i;
113
115
117 group_container::SG->init(A, verbose_level - 2);
118 group_container::SG->allocate(0, verbose_level - 2);
120 for (i = 0; i < A->base_len(); i++) {
121 group_container::tl[i] = 1;
122 }
124}
125
126void group_container::init_strong_generators(vector_ge &SG, int *tl, int verbose_level)
127{
128 int i;
129
131
133 group_container::SG->init(A, verbose_level - 2);
134 group_container::SG->allocate(SG.len, verbose_level - 2);
135 for (i = 0; i < SG.len; i++) {
137 }
139 for (i = 0; i < A->base_len(); i++) {
140 group_container::tl[i] = tl[i];
141 }
143}
144
146 std::vector<int> &tl, int verbose_level)
147{
148 int f_v = (verbose_level >= 1);
149 int i;
150 int *Gen_hdl;
151 int *Tl;
152
153 if (f_v) {
154 cout << "group_container::init_strong_generators_by_handle" << endl;
155 }
156 Gen_hdl = NEW_int(gen_handle.size());
157 for (i = 0; i < gen_handle.size(); i++) {
158 Gen_hdl[i] = gen_handle[i];
159 }
160
161 Tl = NEW_int(A->base_len());
162 for (i = 0; i < A->base_len(); i++) {
163 Tl[i] = tl[i];
164 }
165
166 init_strong_generators_by_hdl(gen_handle.size(),
167 Gen_hdl, Tl, verbose_level);
168
169 FREE_int(Gen_hdl);
170 FREE_int(Tl);
171
172 if (f_v) {
173 cout << "group_container::init_strong_generators_by_handle done" << endl;
174 }
175}
176
178 int *gen_hdl, int *tl, int verbose_level)
179{
180 int f_v = (verbose_level >= 1);
181 int i;
182
183 if (f_v) {
184 cout << "group::init_strong_generators_by_hdl" << endl;
185 }
186 if (f_v) {
187 cout << "gen_hdl=";
188 Int_vec_print(cout, gen_hdl, nb_gen);
189 cout << endl;
190 if (nb_gen) {
191 cout << "tl=";
192 Int_vec_print(cout, tl, A->base_len());
193 cout << endl;
194 }
195 }
196 if (f_v) {
197 cout << "group::init_strong_generators_by_hdl "
198 "before delete_strong_generators" << endl;
199 }
201 if (f_v) {
202 cout << "group::init_strong_generators_by_hdl "
203 "after delete_strong_generators" << endl;
204 }
205
207 SG->init(A, verbose_level - 2);
208 SG->allocate(nb_gen, verbose_level - 2);
209 if (f_v) {
210 cout << "group::init_strong_generators_by_hdl "
211 "before A->element_retrieve" << endl;
212 }
213 for (i = 0; i < nb_gen; i++) {
214 A->element_retrieve(gen_hdl[i], SG->ith(i), 0/*verbose_level*/);
215 }
216 if (f_v) {
217 cout << "group::init_strong_generators_by_hdl "
218 "after A->element_retrieve" << endl;
219 }
220 if (f_v) {
221 cout << "group::init_strong_generators_by_hdl "
222 "before allocating tl of size " << A->base_len() << endl;
223 }
225 if (nb_gen) {
226 for (i = 0; i < A->base_len(); i++) {
227 group_container::tl[i] = tl[i];
228 }
229 }
230 else {
231 for (i = 0; i < A->base_len(); i++) {
232 group_container::tl[i] = 1;
233 }
234 }
236 if (f_v) {
237 cout << "group::init_strong_generators_by_hdl done" << endl;
238 }
239}
240
242{
245 FREE_int(tl);
246 SG = NULL;
247 tl = NULL;
249 }
250}
251
253{
254 if (f_has_sims) {
255 if (S) {
256 FREE_OBJECT(S);
257 S = NULL;
258 }
260 }
261}
262
264{
265 if (!f_has_ascii_coding) {
266 cout << "group_container::require_ascii_coding !f_has_ascii_coding" << endl;
267 exit(1);
268 }
269}
270
272{
274 cout << "group_container::require_strong_generators !f_has_strong_generators" << endl;
275 exit(1);
276 }
277}
278
280{
281 if (!f_has_sims) {
282 cout << "group_container::require_sims !f_has_sims" << endl;
283 exit(1);
284 }
285}
286
288{
290
291 if (f_has_sims) {
292 S->group_order(go);
293 //D.multiply_up(go, S->orbit_len, A->base_len());
294 }
295 else if (f_has_strong_generators) {
296 D.multiply_up(go, tl, A->base_len(), 0 /* verbose_level */);
297 }
298 else {
299 cout << "group::group_order need sims or strong_generators" << endl;
300 exit(1);
301 }
302}
303
305{
307 group_order(go);
308 ost << go;
309}
310
312{
313 int i;
314
316 for (i = 0; i < A->base_len(); i++) {
317 cout << tl[i] << " ";
318 }
319 cout << endl;
320 }
321}
322
323void group_container::code_ascii(int verbose_level)
324{
325 int f_v = (verbose_level >= 1);
326 int sz, i, j;
327 char *p;
329
330 if (f_v) {
331 cout << "group_container::code_ascii action " << A->label
332 << " base_len=" << A->base_len() << endl;
333 }
335 sz = 2 * ((2 + A->base_len() + A->base_len()) * sizeof(int_4)
336 + A->coded_elt_size_in_char * SG->len) + 1;
338 p = ascii_coding;
339
340 //cout << "group::code_ascii action A->base_len=" << A->base_len << endl;
341 Os.code_int4(p, (int_4) A->base_len());
342
343 //cout << "group::code_ascii action SG->len=" << SG->len << endl;
344 Os.code_int4(p, (int_4) SG->len);
345 for (i = 0; i < A->base_len(); i++) {
346 Os.code_int4(p, (int_4) A->base_i(i));
347 }
348 for (i = 0; i < A->base_len(); i++) {
349 Os.code_int4(p, (int_4) tl[i]);
350 }
351 for (i = 0; i < SG->len; i++) {
352 A->element_pack(SG->ith(i), A->elt1, FALSE);
353 for (j = 0; j < A->coded_elt_size_in_char; j++) {
354 Os.code_uchar(p, A->elt1[j]);
355 }
356 }
357 *p++ = 0;
358 if (p - ascii_coding != sz) {
359 cout << "group_container::code_ascii p - ascii_coding != sz" << endl;
360 exit(1);
361 }
363 if (f_v) {
364 cout << "group_container::code_ascii " << ascii_coding << endl;
365 }
366}
367
368void group_container::decode_ascii(int verbose_level)
369{
370 int f_v = (verbose_level >= 1);
371 int i, j;
372 int len, nbsg;
373 int *base1;
374 char *p, *p0;
375 int str_len;
377
379 //cout << "group_container::decode_ascii ascii_coding=" << ascii_coding << endl;
380 p = ascii_coding;
381 p0 = p;
382 str_len = strlen(ascii_coding);
383 len = Os.decode_int4(p);
384 nbsg = Os.decode_int4(p);
385 if (len != A->base_len()) {
386 cout << "group_container::decode_ascii len != A->base_len" << endl;
387 cout << "len=" << len << " (from file)" << endl;
388 cout << "A->base_len=" << A->base_len() << endl;
389 cout << "action A is " << A->label << endl;
390 exit(1);
391 }
394 SG->init(A, verbose_level - 2);
395 SG->allocate(nbsg, verbose_level - 2);
396 base1 = NEW_int(A->base_len());
397 tl = NEW_int(A->base_len());
398 for (i = 0; i < A->base_len(); i++) {
399 base1[i] = Os.decode_int4(p);
400 }
401 for (i = 0; i < A->base_len(); i++) {
402 if (base1[i] != A->base_i(i)) {
403 cout << "group_container::decode_ascii base mismatch" << endl;
404 exit(1);
405 }
406 }
407 for (i = 0; i < A->base_len(); i++) {
408 tl[i] = Os.decode_int4(p);
409 }
410 for (i = 0; i < nbsg; i++) {
411 for (j = 0; j < A->coded_elt_size_in_char; j++) {
412 Os.decode_uchar(p, A->elt1[j]);
413 }
414 A->element_unpack(A->elt1, SG->ith(i), FALSE);
415 }
416 FREE_int(base1);
417 if (p - p0 != str_len) {
418 cout << "group_container::decode_ascii p - p0 != str_len" << endl;
419 cout << "p - p0 = " << p - p0 << endl;
420 cout << "str_len = " << str_len << endl;
421 exit(1);
422 }
424 if (f_v) {
425 if (SG->len < 10) {
426 SG->print(cout);
427 }
428 cout << "found a group with " << SG->len
429 << " strong generators" << endl;
430 }
431}
432
433void group_container::schreier_sims(int verbose_level)
434{
435 int f_v = (verbose_level >= 1);
436 //int f_vv = (verbose_level >= 2);
437 //int f_vvv = (verbose_level >= 3);
438
439 if (f_v) {
440 cout << "group_container::schreier_sims" << endl;
441 cout << "verbose_level = " << verbose_level << endl;
442 }
444 if (f_v) {
445 cout << "group_container::schreier_sims before delete_sims" << endl;
446 }
447 delete_sims();
448 if (f_v) {
449 cout << "group_container::schreier_sims after delete_sims" << endl;
450 }
452 if (FALSE) {
453 cout << "group_container::schreier_sims calling S->init(A)" << endl;
454 }
455 S->init(A, verbose_level - 2);
456 if (FALSE) {
457 cout << "group_container::schreier_sims calling S->init_generators" << endl;
458 }
459 if (FALSE) {
460 cout << "generators" << endl;
461 SG->print(cout);
462 }
463 S->init_generators(*SG, verbose_level - 2);
464 if (f_v) {
465 cout << "group_container::schreier_sims after S->init_generators" << endl;
466 cout << "tl: ";
467 Int_vec_print(cout, tl, A->base_len());
468 cout << endl;
469 }
470 if (f_v) {
471 cout << "group_container::schreier_sims before "
472 "compute_base_orbits_known_length" << endl;
473 }
474 S->compute_base_orbits_known_length(tl, verbose_level - 2);
475 if (f_v) {
476 cout << "group_container::schreier_sims after "
477 "compute_base_orbits_known_length" << endl;
478 }
479
480 if (f_v) {
481 cout << "group_container::schreier_sims done. Found a group of order ";
482 S->print_group_order(cout);
483 cout << endl;
484 }
486}
487
489{
490 require_sims();
493 SG->init(A, verbose_level - 2);
494 tl = NEW_int(A->base_len());
495 S->extract_strong_generators_in_order(*SG, tl, verbose_level - 1);
496}
497
498void group_container::point_stabilizer(group_container &stab, int pt, int verbose_level)
499{
500 int f_v = (verbose_level >= 1);
501 int f_vv = (verbose_level >= 2);
502 require_sims();
503
504 vector_ge stab_gens;
505 int *tl;
506
507 if (f_v) {
508 cout << "group_container::point_stabilizer "
509 "computing stabilizer of point " << pt << endl;
510 }
511
512
513 tl = NEW_int(A->base_len());
514 S->point_stabilizer(stab_gens, tl, pt, verbose_level - 1);
515
516#if 0
517 if (f_v) {
518 if (f_vv) {
519 stab_gens.print(cout);
520 }
521 cout << stab_gens.len << " strong generators computed" << endl;
522 }
523#endif
524 stab.freeself();
525 stab.init(A, verbose_level - 2);
526 stab.init_strong_generators(stab_gens, tl, verbose_level - 2);
527 FREE_int(tl);
528 if (f_v) {
529 cout << "stabilizer of point " << pt << " has order ";
530 stab.print_group_order(cout);
531 cout << " ";
532 Int_vec_print(cout, stab.tl, A->base_len());
533 cout << " with " << stab_gens.len << " strong generators" << endl;
534 if (f_vv) {
535 stab_gens.print(cout);
536 }
537 }
538}
539
541 group_container &stab, int pt, int verbose_level)
542{
543 int f_v = (verbose_level >= 1);
544 int f_vv = (verbose_level >= 2);
545 require_sims();
546
547 vector_ge stab_gens;
548 int *tl;
549
550 if (f_v) {
551 cout << "group_container::point_stabilizer_with_action ";
552 cout << "computing stabilizer of point " << pt
553 << " in action " << A2->label
554 << " internal action is " << stab.A->label << endl;
555 cout << "verbose_level = " << verbose_level << endl;
556 }
557
558
559 tl = NEW_int(A->base_len());
560 if (f_v) {
561 cout << "group_container::point_stabilizer_with_action "
562 "calling S->point_stabilizer_with_action" << endl;
563 }
564 S->point_stabilizer_with_action(A2, stab_gens, tl, pt, verbose_level - 1);
565 if (f_v) {
566 cout << "group_container::point_stabilizer_with_action "
567 "after S->point_stabilizer_with_action" << endl;
568 }
569
570#if 0
571 if (f_v) {
572 if (f_vv) {
573 stab_gens.print(cout);
574 }
575 cout << stab_gens.len << " strong generators computed" << endl;
576 }
577#endif
578 stab.freeself();
579 stab.init(A, verbose_level - 2);
580 if (f_v) {
581 cout << "group_container::point_stabilizer_with_action "
582 "before stab.init_strong_generators" << endl;
583 }
584 stab.init_strong_generators(stab_gens, tl, verbose_level - 2);
585 if (f_v) {
586 cout << "group_container::point_stabilizer_with_action "
587 "after stab.init_strong_generators" << endl;
588 }
589 FREE_int(tl);
590 if (f_v) {
591 cout << "stabilizer of point " << pt << " has order ";
592 stab.print_group_order(cout);
593 cout << " ";
594 Int_vec_print(cout, stab.tl, A->base_len());
595 cout << " with " << stab_gens.len << " strong generators" << endl;
596 if (f_vv) {
597 stab_gens.print(cout);
598 }
599 }
600}
601
603 group_container &H, group_container &K, int verbose_level)
604{
605 int f_v = (verbose_level >= 1);
606 int f_vv = (verbose_level >= 2);
607
608 if (f_v) {
609 cout << "group_container::induced_action" << endl;
610 }
611 {
612 vector_ge H_SG, K_SG;
613 int *H_tl, *K_tl;
614 int n = 0;
615 {
616 groups::sims HH, KK;
617 ring_theory::longinteger_object go, H_order, K_order, HK_order, quo, rem;
618 int drop_out_level, image;
620
621 require_sims();
622
623 group_order(go);
624
625 HH.init(&induced_action, verbose_level - 2);
626 HH.init_trivial_group(verbose_level - 1);
627 HH.group_order(H_order);
628
629 KK.init(A, verbose_level - 2);
630 KK.init_trivial_group(verbose_level - 1);
631 KK.group_order(K_order);
632
633 D.mult(H_order, K_order, HK_order);
634 if (f_v) {
635 cout << "step " << n << " H_order " << H_order
636 << " K_order = " << K_order
637 << " HK_order " << HK_order << " of " << go << endl;
638 }
639
640 while (D.compare_unsigned(HK_order, go) != 0) {
641
642 if (f_v) {
643 cout << "step " << n << ":" << endl;
644 }
645 S->random_element(A->Elt1, verbose_level - 1);
646 if (f_v) {
647 cout << "random group element:" << endl;
648 A->element_print(A->Elt1, cout);
649 }
650
651 if (HH.strip(A->Elt1, A->Elt2 /* residue */,
652 drop_out_level, image, verbose_level - 1)) {
653 if (f_vv) {
654 cout << "element strips through H" << endl;
655 }
656 if (KK.strip(A->Elt2, A->Elt3 /* residue */,
657 drop_out_level, image, verbose_level - 1)) {
658 if (f_vv) {
659 cout << "element strips through K" << endl;
660 }
661 }
662 else {
664 drop_out_level, verbose_level - 1);
665 }
666 }
667 else {
669 drop_out_level, verbose_level - 1);
670 }
671
672 HH.group_order(H_order);
673 KK.group_order(K_order);
674 D.mult(H_order, K_order, HK_order);
675
676 if (f_v) {
677 cout << "step " << n << " H_order " << H_order
678 << " K_order = " << K_order
679 << " HK_order " << HK_order << " of " << go << endl;
680 D.integral_division(go, HK_order, quo, rem, 0);
681 cout << "remaining factor: " << quo
682 << " remainder " << rem << endl;
683 }
684 n++;
685 }
686
687#if 0
688 if (f_v) {
689 cout << "group::induced_action "
690 "finished after " << n << " steps" << endl;
691 cout << "H_order " << H_order << " K_order = " << K_order << endl;
692 cout << "# generators for H = " << HH.gens.len
693 << ", # generators for K = " << KK.gens.len << endl;
694 cout << "H:" << endl;
695 HH.print(f_vv);
696 cout << "K:" << endl;
697 KK.print(f_vv);
698 }
699#endif
700
701 H_tl = NEW_int(induced_action.base_len());
702 K_tl = NEW_int(A->base_len());
703
704 HH.extract_strong_generators_in_order(H_SG, H_tl, verbose_level - 2);
705 KK.extract_strong_generators_in_order(K_SG, K_tl, verbose_level - 2);
706
707
708 //cout << "group::induced_action deleting HH,KK" << endl;
709 }
710
711 H.init(&induced_action, verbose_level - 2);
712 K.init(A, verbose_level - 2);
713 H.init_strong_generators(H_SG, H_tl, verbose_level - 2);
714 K.init_strong_generators(K_SG, K_tl, verbose_level - 2);
715 if (f_v) {
716 cout << "group_container::induced_action finished after "
717 << n << " iterations" << endl;
718 cout << "order of the induced group = ";
719 H.print_group_order(cout);
720 cout << endl;
721 cout << "order of the kernel = ";
722 K.print_group_order(cout);
723 cout << endl;
724 }
725#if 0
726 if (f_vv) {
727 cout << "induced group:" << endl;
728 HH.print(FALSE);
729 cout << endl;
730 cout << "kernel:" << endl;
731 KK.print(FALSE);
732 cout << endl;
733 cout << H.SG->len << " strong generators for induced group:" << endl;
734 H.SG->print(cout);
735 cout << endl;
736 cout << K.SG->len << " strong generators for kernel:" << endl;
737 K.SG->print(cout);
738 cout << endl;
739 }
740#endif
741 FREE_int(H_tl);
742 FREE_int(K_tl);
743 //cout << "group::induced_action deleting SG" << endl;
744 }
745 if (f_v) {
746 cout << "group_container::induced_action finished" << endl;
747 }
748}
749
751 // N needs to have strong generators,
752 // H needs to have sims
753 // N and H may have different actions,
754 // the action of N is taken for the extension.
755{
756 int f_v = (verbose_level >= 1);
757 int f_vv = (verbose_level >= 2);
758 //int f_vvv = (verbose_level >= 3);
759 actions::action *A = N.A;
760 groups::sims G;
761 ring_theory::longinteger_object go_N, go_H, go_G, cur_go, quo, rem;
763 int n = 0, drop_out_level, image;
764 int *p_gen;
765 int *Elt;
766
767 if (f_v) {
768 cout << "group_container::extension" << endl;
769 }
771 N.group_order(go_N);
772 H.group_order(go_H);
773 D.mult(go_N, go_H, go_G);
774
775 Elt = NEW_int(A->elt_size_in_int);
776
777 if (f_v) {
778 cout << "group_container::extension |N| = " << go_N << " |H| = "
779 << go_H << " |G| = |N|*|H| = " << go_G << endl;
780 }
781 H.require_sims();
782
783 init(N.A, verbose_level - 2);
784 G.init(N.A, verbose_level - 2);
785 G.init_generators(*N.SG, f_v);
786 G.compute_base_orbits(verbose_level - 1);
787 G.group_order(cur_go);
788
789 while (D.compare_unsigned(go_G, cur_go) != 0) {
790
791 if (f_v) {
792 cout << "step " << n << ":" << endl;
793 }
794 if (n % 2 || G.nb_gen[0] == 0) {
795 H.S->random_element(A->Elt1, verbose_level - 1);
796 p_gen = A->Elt1;
797 if (f_v) {
798 cout << "random group element:" << endl;
799 A->element_print(p_gen, cout);
800 }
801 }
802 else {
803 G.random_schreier_generator(Elt, verbose_level - 1);
804 //p_gen = G.schreier_gen;
805 if (f_v) {
806 cout << "random schreier generator:" << endl;
807 A->element_print(Elt, cout);
808 }
809 }
810
811
812 if (G.strip(Elt, A->Elt2 /* residue */, drop_out_level, image, verbose_level - 1)) {
813 if (f_vv) {
814 cout << "element strips through" << endl;
815 }
816 }
817 else {
819 drop_out_level, verbose_level - 1);
820 }
821
822 G.group_order(cur_go);
823
824 if (f_v) {
825 cout << "step " << n
826 << " cur_go " << cur_go << " of " << go_G << endl;
827 D.integral_division(go_G, cur_go, quo, rem, 0);
828 cout << "remaining factor: " << quo
829 << " remainder " << rem << endl;
830 }
831 n++;
832 }
833
835 int *tl;
836
837 tl = NEW_int(A->base_len());
838
839 G.extract_strong_generators_in_order(SG, tl, verbose_level - 2);
840
841 init(A, verbose_level - 2);
842 init_strong_generators(SG, tl, verbose_level - 2);
843
844 if (f_v) {
845 cout << "group_container::extension finished after "
846 << n << " iterations" << endl;
847 cout << "order of the extension = ";
848 print_group_order(cout);
849 cout << endl;
850 }
851 FREE_int(Elt);
852 FREE_int(tl);
853}
854
856 int f_print_as_permutation)
857{
858 int i, l;
859
861 cout << "group_container::print_strong_generators "
862 "no strong generators" << endl;
863 exit(1);
864 }
865 ost << "group::print_strong_generators a group with tl=";
866 Int_vec_print(ost, tl, A->base_len());
867 l = SG->len;
868 ost << " and with " << l << " strong generators" << endl;
869 for (i = 0; i < l; i++) {
870 ost << "generator " << i << ":" << endl;
871 A->element_print_quick(SG->ith(i), ost);
872 ost << endl;
873 if (f_print_as_permutation) {
875 ost << endl;
876 }
877 }
878}
879
881 ostream &ost, actions::action *A2)
882{
884 ost, A2, 0);
885}
886
888 ostream &ost, actions::action *A2, int verbose_level)
889{
890 int f_v = (verbose_level >= 1);
891 int f_vv = (verbose_level >= 2);
892 int i, l;
893 int *Elt;
894
895 if (f_v) {
896 cout << "group_container::print_strong_generators_with_different_"
897 "action_verbose" << endl;
898 }
900 cout << "group_container::print_strong_generators_with_different_"
901 "action no strong generators" << endl;
902 exit(1);
903 }
904 ost << "group_container::print_strong_generators_with_different_"
905 "action_verbose a group with tl=";
906 Int_vec_print(ost, tl, A->base_len());
907 l = SG->len;
908 ost << " and with " << l << " strong generators" << endl;
909 for (i = 0; i < l; i++) {
910 ost << "generator " << i << ":" << endl;
911 A->element_print_quick(SG->ith(i), ost);
912 ost << endl;
913 Elt = SG->ith(i);
914 if (f_vv) {
915 if (f_v) {
916 cout << "group_container::print_strong_generators_with_"
917 "different_action_verbose computing images "
918 "individually" << endl;
919 }
920 int j; //, k;
921 for (j = 0; j < A2->degree; j++) {
922 //cout << "group::print_strong_generators_with_"
923 //"different_action_verbose computing image of "
924 // << j << endl;
925 /*k =*/ A2->element_image_of(j, Elt,
926 0 /*verbose_level - 2*/);
927 //cout << "group::print_strong_generators_with_"
928 //"different_action_verbose image of "
929 // << j << " is " << k << endl;
930 }
931 }
932 ost << "as permutation in action " << A2->label
933 << " of degree " << A2->degree << ":" << endl;
935 ost, 0/*verbose_level - 2*/);
936 ost << endl;
937 }
938}
939
940}}}
941
domain to compute with objects of type longinteger
Definition: ring_theory.h:240
void multiply_up(longinteger_object &a, int *x, int len, int verbose_level)
void mult(longinteger_object &a, longinteger_object &b, longinteger_object &c)
void integral_division(longinteger_object &a, longinteger_object &b, longinteger_object &q, longinteger_object &r, int verbose_level)
int compare_unsigned(longinteger_object &a, longinteger_object &b)
a class to represent arbitrary precision integers
Definition: ring_theory.h:366
a permutation group in a fixed action.
Definition: actions.h:99
void element_unpack(void *elt, void *Elt, int verbose_level)
Definition: action_cb.cpp:287
void element_print_quick(void *elt, std::ostream &ost)
Definition: action_cb.cpp:353
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_retrieve(int hdl, void *elt, int verbose_level)
Definition: action_cb.cpp:301
void element_print_as_permutation_verbose(void *elt, std::ostream &ost, int verbose_level)
Definition: action_cb.cpp:428
void element_print_as_permutation(void *elt, std::ostream &ost)
Definition: action_cb.cpp:421
long int element_image_of(long int a, void *elt, int verbose_level)
Definition: action_cb.cpp:198
void extension(group_container &N, group_container &H, int verbose_level)
void point_stabilizer(group_container &stab, int pt, int verbose_level)
void init_strong_generators(vector_ge &SG, int *tl, int verbose_level)
void print_strong_generators(std::ostream &ost, int f_print_as_permutation)
void init_ascii_coding(const char *ascii_coding, int verbose_level)
void print_strong_generators_with_different_action_verbose(std::ostream &ost, actions::action *A2, int verbose_level)
void init_strong_generators_by_handle_and_with_tl(std::vector< int > &gen_handle, std::vector< int > &tl, int verbose_level)
void point_stabilizer_with_action(actions::action *A2, group_container &stab, int pt, int verbose_level)
void induced_action(actions::action &induced_action, group_container &H, group_container &K, int verbose_level)
void init_ascii_coding_to_sims(const char *ascii_coding, int verbose_level)
void print_strong_generators_with_different_action(std::ostream &ost, actions::action *A2)
void init_strong_generators_by_hdl(int nb_gen, int *gen_hdl, int *tl, int verbose_level)
void init(actions::action *A, int verbose_level)
Definition: vector_ge.cpp:55
a permutation group represented via a stabilizer chain
Definition: groups.h:1273
void point_stabilizer(data_structures_groups::vector_ge &SG, int *tl, int pt, int verbose_level)
void random_element(int *elt, int verbose_level)
void init(actions::action *A, int verbose_level)
Definition: sims.cpp:289
void extract_strong_generators_in_order(data_structures_groups::vector_ge &SG, int *tl, int verbose_level)
Definition: sims.cpp:1704
void group_order(ring_theory::longinteger_object &go)
Definition: sims.cpp:951
void init_trivial_group(int verbose_level)
Definition: sims.cpp:584
void compute_base_orbits_known_length(int *tl, int verbose_level)
Definition: sims_main.cpp:57
void add_generator_at_level(int *elt, int lvl, int verbose_level)
Definition: sims_main.cpp:543
data_structures_groups::vector_ge gens
Definition: groups.h:1280
void random_schreier_generator(int *Elt, int verbose_level)
Definition: sims.cpp:1803
int strip(int *elt, int *residue, int &drop_out_level, int &image, int verbose_level)
Definition: sims_main.cpp:433
void init_generators(data_structures_groups::vector_ge &generators, int verbose_level)
Definition: sims.cpp:660
void compute_base_orbits(int verbose_level)
Definition: sims_main.cpp:25
void print_group_order(std::ostream &ost)
Definition: sims_io.cpp:357
void point_stabilizer_with_action(actions::action *A2, data_structures_groups::vector_ge &SG, int *tl, int pt, int verbose_level)
#define FREE_int(p)
Definition: foundations.h:640
#define NEW_char(n)
Definition: foundations.h:632
#define NEW_OBJECT(type)
Definition: foundations.h:638
#define FREE_OBJECT(p)
Definition: foundations.h:651
#define NEW_int(n)
Definition: foundations.h:625
int int_4
Definition: foundations.h:181
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define FREE_char(p)
Definition: foundations.h:646
#define Int_vec_print(A, B, C)
Definition: foundations.h:685
the orbiter library for the classification of combinatorial objects