Orbiter 2022
Combinatorial Objects
sims_main.cpp
Go to the documentation of this file.
1/*
2 * sims_main.cpp
3 *
4 * Created on: Sep 1, 2019
5 * Author: betten
6 */
7
8
9
10
11
13#include "group_actions.h"
14
15
16using namespace std;
17
18
19namespace orbiter {
20namespace layer3_group_actions {
21namespace groups {
22
23
24
25void sims::compute_base_orbits(int verbose_level)
26{
27 int f_v = (verbose_level >= 1);
28 int f_vv = (verbose_level >= 2);
29 int i;
30
31 if (f_v) {
32 cout << "sims::compute_base_orbits" << endl;
33 }
34 if (f_vv) {
35 cout << "sims::compute_base_orbits "
36 "base_len=" << A->base_len() << endl;
37 }
38 for (i = A->base_len() - 1; i >= 0; i--) {
39 if (FALSE) {
40 cout << "sims::compute_base_orbits "
41 "level " << i << endl;
42 }
43 compute_base_orbit(i, 0/*verbose_level - 1*/);
44 if (f_vv) {
45 cout << "sims::compute_base_orbits level " << i
46 << " base point " << A->base_i(i)
47 << " orbit length " << orbit_len[i] << endl;
48 }
49 }
50 if (f_v) {
51 cout << "sims::compute_base_orbits done, orbit_len=";
52 Int_vec_print(cout, orbit_len, A->base_len());
53 cout << endl;
54 }
55}
56
58 int verbose_level)
59{
60 int f_v = (verbose_level >= 1);
61 //int f_vv = (verbose_level >= 2);
62 int i;
63
64 if (f_v) {
65 cout << "sims::compute_base_orbits_known_length: ";
66 Int_vec_print(cout, tl, A->base_len());
67 cout << endl;
68 cout << "verbose_level=" << verbose_level << endl;
69 }
70 for (i = A->base_len() - 1; i >= 0; i--) {
71 if (f_v) {
72 cout << "sims::compute_base_orbits_known_length "
73 "computing level " << i << endl;
74 }
75 compute_base_orbit_known_length(i, tl[i], verbose_level);
76 if (f_v) {
77 cout << "sims::compute_base_orbits_known_length "
78 "level " << i
79 << " base point " << A->base_i(i)
80 << " orbit length " << orbit_len[i]
81 << " has been computed" << endl;
82 }
83 if (orbit_len[i] != tl[i]) {
84 cout << "sims::compute_base_orbits_known_length "
85 "orbit_len[i] != tl[i]" << endl;
86 cout << "orbit_len[i]=" << orbit_len[i] << endl;
87 cout << "tl[i]=" << tl[i] << endl;
89 exit(1);
90 }
91 }
92 if (f_v) {
93 cout << "sims::compute_base_orbits_known_length done" << endl;
94 }
95}
96
97void sims::extend_base_orbit(int new_gen_idx, int lvl,
98 int verbose_level)
99{
100 int f_v = (verbose_level >= 1);
101 //int f_vv = (verbose_level >= 2);
102 int f_vvv = (verbose_level >= 3);
103 int i, cur, cur_pt, total, total0;
104 int next_pt, next_pt_loc, gen_idx, nbg;
105
106 if (f_v) {
107 cout << "sims::extend_base_orbit " << lvl << " verbose_level = " << verbose_level << endl;
108 }
109 cur = 0;
110 total = total0 = orbit_len[lvl];
111 if (f_v) {
112 cout << "sims::extend_base_orbit " << lvl << " orbit_len[lvl] = " << orbit_len[lvl] << endl;
113 }
114 nbg = nb_gen[lvl];
115 if (f_v) {
116 cout << "sims::extend_base_orbit " << lvl << " nbg = " << nbg << endl;
117 }
118 if (orbit[lvl] == NULL) {
119 cout << "sims::extend_base_orbit orbit[lvl] == NULL" << endl;
120 exit(1);
121 }
122 while (cur < total) {
123 cur_pt = orbit[lvl][cur];
124 if (f_vvv) {
125 cout << "sims::extend_base_orbit: cur=" << cur << " total = " << total << " cur_pt=" << cur_pt << endl;
126 }
127 for (i = 0; i < nbg; i++) {
128 if (f_vvv) {
129 cout << "sims::extend_base_orbit: applying generator " << i << " / " << nbg << endl;
130 }
131 gen_idx = gen_perm[i];
132 next_pt = get_image(cur_pt, gen_idx);
133 if (f_vvv) {
134 cout << "sims::extend_base_orbit: next_pt = " << next_pt << endl;
135 }
136 next_pt_loc = orbit_inv[lvl][next_pt];
137 if (f_vvv) {
138 cout << "sims::extend_base_orbit: next_pt_loc = " << next_pt_loc << endl;
139 }
140 if (f_vvv) {
141 cout << "sims::extend_base_orbit "
142 "generator " << gen_idx << " maps "
143 << cur_pt << " to " << next_pt << endl;
144 }
145 if (next_pt_loc < total) {
146 continue;
147 }
148 if (f_vvv) {
149 cout << "sims::extend_base_orbit "
150 "additional pt " << next_pt << " reached from "
151 << cur_pt << " under generator "
152 << i << endl;
153 }
154 swap_points(lvl, total, next_pt_loc);
155 prev[lvl][total] = cur_pt;
156 label[lvl][total] = gen_idx;
157 total++;
158 if (f_vvv) {
159 cout << "cur = " << cur << endl;
160 cout << "total = " << total << endl;
161 //print_orbit(cur, total - 1);
162 }
163 }
164 cur++;
165 }
166 orbit_len[lvl] = total;
167 if (f_v) {
168 cout << "sims::extend_base_orbit " << lvl << " finished" << endl;
169 cout << lvl << "-th base point " << A->base_i(lvl)
170 << " orbit extended to length " << orbit_len[lvl];
171 if (FALSE) {
172 cout << " { ";
173 for (i = 0; i < orbit_len[lvl]; i++) {
174 cout << orbit[lvl][i];
175 if (i < orbit_len[lvl] - 1)
176 cout << ", ";
177 }
178 cout << " }" << endl;
179 }
180 else {
181 cout << endl;
182 }
183 }
184 if (f_v) {
185 cout << "sims::extend_base_orbit " << lvl << " done" << endl;
186 }
187}
188
189void sims::compute_base_orbit(int lvl, int verbose_level)
190// applies all generators at the given level to compute
191// the corresponding basic orbit.
192// the generators are the first nb_gen[lvl] in the generator arry
193{
194 int f_v = (verbose_level >= 1);
195 //int f_vv = (verbose_level >= 2);
196 //int f_vvv = (verbose_level >= 3);
197 int pt, pt_loc, cur, cur_pt, i, next_pt, next_pt_loc, gen_idx;
198
199 pt = A->base_i(lvl);
200 pt_loc = orbit_inv[lvl][pt];
201 if (f_v) {
202 cout << "sims::compute_base_orbit: "
203 "computing orbit of " << lvl << "-th base point "
204 << pt << " with " << nb_gen[lvl] << " generators" << endl;
205 }
206 if (pt_loc > 0) {
207 swap_points(lvl, 0, pt_loc);
208 }
209 cur = 0;
210 orbit_len[lvl] = 1;
211 while (cur < orbit_len[lvl]) {
212 cur_pt = orbit[lvl][cur];
213 if (FALSE) {
214 cout << "sims::compute_base_orbit "
215 "applying generator to " << cur_pt << endl;
216 }
217 for (i = 0; i < nb_gen[lvl]; i++) {
218 gen_idx = gen_perm[i];
219 next_pt = get_image(cur_pt, gen_idx);
220 next_pt_loc = orbit_inv[lvl][next_pt];
221 if (FALSE) {
222 cout << "sims::compute_base_orbit "
223 "generator " << i << " maps " << cur_pt
224 << " to " << next_pt << endl;
225 }
226 if (next_pt_loc < orbit_len[lvl]) {
227 continue;
228 }
229 if (FALSE) {
230 cout << "additional pt " << next_pt << " reached from "
231 << cur_pt << " under generator "
232 << i << endl;
233 }
234 swap_points(lvl, orbit_len[lvl], next_pt_loc);
235 prev[lvl][orbit_len[lvl]] = cur_pt;
236 label[lvl][orbit_len[lvl]] = gen_idx;
237 orbit_len[lvl]++;
238 if (FALSE) {
239 cout << "sims::compute_base_orbit "
240 "cur = " << cur << endl;
241 cout << "sims::compute_base_orbit "
242 "orbit_len[lvl] = " << orbit_len[lvl] << endl;
243 //print_orbit(cur, total - 1);
244 }
245 }
246 cur++;
247 }
248 if (f_v) {
249 cout << "sims::compute_base_orbit finished, "
250 << lvl << "-th base orbit of length "
251 << orbit_len[lvl] << endl;
252 }
253 if (FALSE) {
254 cout << "{ ";
255 for (i = 0; i < orbit_len[lvl]; i++) {
256 cout << orbit[lvl][i];
257 if (i < orbit_len[lvl] - 1)
258 cout << ", ";
259 }
260 cout << " }" << endl;
261 }
262 if (f_v) {
263 cout << "sims::compute_base_orbit done" << endl;
264 }
265}
266
268 int target_length, int verbose_level)
269// applies all generators at the given level to compute
270// the corresponding basic orbit.
271// the generators are the first nb_gen[lvl] in the generator arry
272{
273 int f_v = (verbose_level >= 1);
274 int f_vv = FALSE;
275 //int f_vvv = (verbose_level >= 3);
276 //int f_v10 = FALSE; // (verbose_level >= 10);
277 int pt, pt_loc, cur, cur_pt, i, next_pt, next_pt_loc, gen_idx;
278 double progress;
279
280 pt = A->base_i(lvl);
281 pt_loc = orbit_inv[lvl][pt];
282 if (f_v) {
283 cout << "sims::compute_base_orbit_known_length: "
284 "computing orbit of " << lvl
285 << "-th base point " << pt
286 << " target_length = " << target_length
287 << " nb_gens=" << nb_gen[lvl] << endl;
288 }
289 if (target_length > 1000000) {
290 f_vv = TRUE;
291 }
292 if (FALSE) {
293 for (i = 0; i < nb_gen[lvl]; i++) {
294 gen_idx = gen_perm[i];
295 cout << "sims::compute_base_orbit_known_length "
296 "generator " << i << ":" << endl;
297 A->element_print_quick(gens.ith(gen_idx), cout);
298 }
299 }
300 if (pt_loc > 0) {
301 swap_points(lvl, 0, pt_loc);
302 }
303 cur = 0;
304 orbit_len[lvl] = 1;
305 while (cur < orbit_len[lvl] && orbit_len[lvl] < target_length) {
306 cur_pt = orbit[lvl][cur];
307 if (f_vv) {
308 if (target_length) {
309 progress = (double) cur / (double) target_length;
310 }
311 else {
312 progress = 0.;
313 }
314 if (cur % ((1 << 21) - 1) == 0) {
315 cout << "sims::compute_base_orbit_known_length "
316 "lvl=" << lvl << " cur=" << cur
317 << " orbit_len[lvl]=" << orbit_len[lvl]
318 << " target_length=" << target_length
319 << " progress=" << progress * 100 << "%" << endl;
320 }
321 }
322 if (FALSE) {
323 cout << "sims::compute_base_orbit_known_length "
324 "applying " << nb_gen[lvl] << " generators to "
325 << cur_pt << " orbit_len[lvl]=" << orbit_len[lvl]
326 << " target_length=" << target_length << endl;
327 }
328 for (i = 0; i < nb_gen[lvl]; i++) {
329 gen_idx = gen_perm[i];
330 next_pt = get_image(cur_pt, gen_idx);
331 next_pt_loc = orbit_inv[lvl][next_pt];
332 if (FALSE) {
333 cout << "sims::compute_base_orbit_known_length "
334 "generator " << i << " maps " << cur_pt
335 << " to " << next_pt << endl;
336 }
337 if (next_pt_loc < orbit_len[lvl]) {
338 continue;
339 }
340 if (FALSE) {
341 cout << "sims::compute_base_orbit_known_length "
342 "additional pt " << next_pt << " reached from "
343 << cur_pt << " under generator " << i << endl;
344 }
345 swap_points(lvl, orbit_len[lvl], next_pt_loc);
346 prev[lvl][orbit_len[lvl]] = cur_pt;
347 label[lvl][orbit_len[lvl]] = gen_idx;
348 orbit_len[lvl]++;
349 if (FALSE) {
350 cout << "sims::compute_base_orbit_known_length "
351 "cur = " << cur << endl;
352 cout << "sims::compute_base_orbit_known_length "
353 "orbit_len[lvl] = " << orbit_len[lvl] << endl;
354 //print_orbit(cur, total - 1);
355 }
356 }
357 cur++;
358 }
359 if (f_v) {
360 cout << "sims::compute_base_orbit_known_length finished, "
361 << lvl << "-th base orbit of length "
362 << orbit_len[lvl] << endl;
363 }
364 if (FALSE) {
365 cout << "{ ";
366 for (i = 0; i < orbit_len[lvl]; i++) {
367 cout << orbit[lvl][i];
368 if (i < orbit_len[lvl] - 1) {
369 cout << ", ";
370 }
371 }
372 cout << " }" << endl;
373 }
374 if (f_v) {
375 cout << "sims::compute_base_orbit_known_length done" << endl;
376 }
377}
378
379int sims::strip_and_add(int *elt, int *residue, int verbose_level)
380// returns TRUE if something was added,
381// FALSE if element stripped through
382{
383 int drop_out_level, image;
384 int f_v = (verbose_level >= 1);
385 //int f_vv = (verbose_level >= 2);
386 //int f_vvv = (verbose_level >= 3);
387
388 if (f_v) {
389 cout << "sims::strip_and_add" << endl;
390 }
391 if (strip(elt, residue, drop_out_level,
392 image, 0 /*verbose_level*/)) {
393 if (f_v) {
394 cout << "sims::strip_and_add element strips to the identity, finished" << endl;
395 }
396 return FALSE;
397 }
398 if (f_v) {
399 cout << "sims::strip_and_add after strip, drop_out_level = "
400 << drop_out_level << " image = " << image << endl;
401 }
402 if (FALSE) {
403 cout << "sims::strip_and_add residue = " << endl;
404 A->element_print_quick(residue, cout);
405 //A->element_print_as_permutation(residue, cout);
406 cout << endl;
407 }
408
409 if (f_v) {
410 cout << "sims::strip_and_add calling add_generator_at_level "
411 << drop_out_level << endl;
412 }
413 add_generator_at_level(residue, drop_out_level, verbose_level);
414 //add_generator_at_level_only(residue, drop_out_level, verbose_level);
415 // !!! this was add_generator_at_level previously
416
417 if (FALSE) {
418 cout << "sims::strip_and_add increased set of generators:" << endl;
419 gens.print(cout);
421 }
422 if (f_v) {
423 cout << "sims::strip_and_add finished, final group order is ";
424 print_group_order(cout);
425 cout << endl;
426 }
427 if (f_v) {
428 cout << "sims::strip_and_add done" << endl;
429 }
430 return TRUE;
431}
432
433int sims::strip(int *elt, int *residue,
434 int &drop_out_level, int &image, int verbose_level)
435// returns TRUE if the element sifts through
436{
437 int f_v = (verbose_level >= 1);
438 int f_vv = (verbose_level >= 2);
439 int i, bi, j, j_coset;
440
441 if (f_v) {
442 cout << "sims::strip" << endl;
443 cout << "my_base_len=" << my_base_len << endl;
444 }
445 if (A == NULL) {
446 cout << "sims::strip A==NULL" << endl;
447 exit(1);
448 }
449 if (f_v) {
450 cout << "sims::strip A=" << A->label << endl;
451 cout << "A->base_len=" << A->base_len() << endl;
452 }
453 if (f_vv) {
454 A->element_print_quick(elt, cout);
455 cout << endl;
456 }
457 A->element_move(elt, strip1, FALSE);
458 for (i = 0; i < my_base_len; i++) {
459 if (f_v) {
460 cout << "sims::strip level " << i << " / " << my_base_len << endl;
461 //A->element_print(strip1, cout);
462 //cout << endl;
463 }
464 bi = A->base_i(i);
465 if (f_vv) {
466 cout << "computing image of " << i
467 << "-th base element " << bi << endl;
468 }
469 j = A->element_image_of(bi, strip1, verbose_level - 2);
470 if (f_v) {
471 cout << "sims::strip level " << i
472 << " base point " << bi
473 << " gets mapped to " << j << endl;
474 }
475 if (f_v) {
476 cout << "sims::strip level " << i << " / " << A->base_len() << " before get_orbit_inv j=" << j << endl;
477 }
478 j_coset = get_orbit_inv(i, j);
479 if (f_v) {
480 cout << "sims::strip j_coset " << j_coset << endl;
481 }
482 if (j_coset >= orbit_len[i]) {
483 if (f_v) {
484 cout << "sims::strip not in the orbit, "
485 "dropping out" << endl;
486 }
487 image = j;
488 drop_out_level = i;
489 A->element_move(strip1, residue, FALSE);
490 if (f_v) {
491 cout << "sims::strip returns FALSE, "
492 "drop_out_level=" << drop_out_level << endl;
493 }
494 return FALSE;
495 }
496 else {
497 if (f_v) {
498 cout << "sims::strip computing representative "
499 "of coset " << j_coset << endl;
500 }
501 coset_rep_inv(eltrk3, i, j_coset, verbose_level);
502 if (FALSE) {
503 cout << "sims::strip representative "
504 "of coset " << j_coset << " is " << endl;
505 A->element_print(eltrk3, cout);
506 cout << endl;
507 }
508 if (FALSE) {
509 cout << "sims::strip before element_mult, "
510 "strip1=" << endl;
511 A->element_print(strip1, cout);
512 cout << endl;
513 }
514 if (FALSE) {
515 cout << "sims::strip before element_mult, "
516 "cosetrep=" << endl;
517 A->element_print(eltrk3, cout);
518 cout << endl;
519 }
520 A->element_mult(strip1, eltrk3, strip2, 0 /*verboe_level*/);
521 if (FALSE) {
522 cout << "sims::strip before element_move" << endl;
523 }
524 A->element_move(strip2, strip1, FALSE);
525 if (FALSE) {
526 cout << "sims::strip after dividing off, "
527 "we have strip1= " << endl;
528 A->element_print(strip1, cout);
529 cout << endl;
530 }
531 }
532 }
533 if (f_v) {
534 cout << "sims::strip after loop" << endl;
535 }
536 A->element_move(strip1, residue, FALSE);
537 if (f_v) {
538 cout << "sims::strip returns TRUE" << endl;
539 }
540 return TRUE;
541}
542
544 int lvl, int verbose_level)
545// add the generator to the array of generators and then extends the
546// basic orbits 0,..,lvl using extend_base_orbit
547{
548 int f_v = (verbose_level >= 1);
549 int i;
550
551 if (f_v) {
552 cout << "sims::add_generator_at_level adding generator at "
553 "level " << lvl << " verbose_level = " << verbose_level<< endl;
555 if (FALSE) {
556 A->element_print_quick(elt, cout);
557 cout << endl;
558 }
559 }
560 if (f_v) {
561 cout << "sims::add_generator_at_level before add_generator" << endl;
562 }
563 add_generator(elt, verbose_level);
564 if (f_v) {
565 cout << "sims::add_generator_at_level after add_generator" << endl;
567 }
568 for (i = lvl; i >= 0; i--) {
569 if (f_v) {
570 cout << "sims::add_generator_at_level "
571 << lvl << " calling extend_base_orbit " << i << endl;
572 }
573 extend_base_orbit(gens.len - 1, i, verbose_level - 1);
574 }
575 if (f_v) {
576 cout << "sims::add_generator_at_level done" << endl;
577 }
578}
579
581 int lvl, int verbose_level)
582// add the generator to the array of generators and then extends the
583// basic orbit lvl using extend_base_orbit
584{
585 int f_v = (verbose_level >= 1);
586 //int f_vv = (verbose_level >= 2);
587 int f_vvv = (verbose_level >= 3);
588
589 if (f_v) {
590 cout << "sims::add_generator_at_level_only level " << lvl << endl;
591 if (f_vvv) {
592 A->element_print(elt, cout);
593 cout << endl;
594 }
595 }
596 add_generator(elt, verbose_level);
597 if (f_vvv) {
599 }
600 extend_base_orbit(gens.len - 1, lvl, verbose_level - 1);
601 if (f_v) {
602 cout << "sims::add_generator_at_level_only level " << lvl << " done" << endl;
603 }
604}
605
607 sims *old_G, int verbose_level)
608{
609 int f_v = (verbose_level >= 1);
611 sims K;
612
613 if (f_v) {
614 cout << "sims::build_up_group_random_process_no_kernel" << endl;
615 }
616 old_G->group_order(go);
617 if (f_v) {
618 cout << "target group order = " << go << endl;
619 }
620 K.init(A, verbose_level - 2);
621 K.init_trivial_group(verbose_level - 1);
622 K.group_order(go1);
623 if (f_v) {
624 cout << "sims::build_up_group_random_process_no_kernel "
625 "kernel group order " << go1 << endl;
626 }
627 init_trivial_group(verbose_level - 1);
628 if (f_v) {
629 cout << "sims::build_up_group_random_process_no_kernel "
630 "before build_up_group_random_process" << endl;
631 }
632 build_up_group_random_process(&K, old_G, go,
633 FALSE /* f_override_chose_next_base_point */,
634 NULL /* choose_next_base_point_method */,
635 verbose_level - 1);
636 if (f_v) {
637 cout << "sims::build_up_group_random_process_no_kernel "
638 "after build_up_group_random_process" << endl;
639 }
640}
641
643 sims *extending_by_G, ring_theory::longinteger_object &target_go,
644 int verbose_level)
645{
646 int f_v = (verbose_level >= 1);
647 //longinteger_object go, go1, go2;
648 //longinteger_domain D;
649 sims K;
650
651 if (f_v) {
652 cout << "sims::extend_group_random_process_no_kernel" << endl;
653 }
654 //group_order(go);
655 //extending_by_G->group_order(go1);
656 //D.mult(go, go1, go2);
657 if (f_v) {
658 cout << "target group order = " << target_go << endl;
659 }
660
661 K.init(A, verbose_level - 2);
662 K.init_trivial_group(verbose_level - 1);
664 &K,
665 extending_by_G,
666 target_go,
667 FALSE /* f_override_chose_next_base_point */,
668 NULL /* choose_next_base_point_method */,
669 verbose_level + 3);
670 if (f_v) {
671 cout << "sims::extend_group_random_process_no_kernel done" << endl;
672 }
673}
674
676 sims *old_G,
678 int f_override_choose_next_base_point,
679 int (*choose_next_base_point_method)(actions::action *A,
680 int *Elt, int verbose_level),
681 int verbose_level)
682{
683 int f_v = (verbose_level >= 1);
684 //int f_vv = (verbose_level >= 1);
685 //int f_vvv = (verbose_level >= 1);
686 //int f_vvvv = (verbose_level >= 1);
687 int f_vv = (verbose_level >= 2);
688 int f_vvv = (verbose_level >= 6);
689 int f_v4 = (verbose_level >= 7);
691 ring_theory::longinteger_object go, G_order, K_order, KG_order, quo, rem;
692 int drop_out_level, image, cnt, b, c, old_base_len;
693 actions::action *GA;
694 actions::action *KA;
695 int *Elt;
696
697 if (f_v) {
698 cout << "sims::build_up_group_random_process verbose_level=" << verbose_level << endl;
699 }
700 GA = A;
701 KA = K->A;
702 Elt = NEW_int(A->elt_size_in_int);
703
704 group_order(G_order);
705 K->group_order(K_order);
706 D.mult(G_order, K_order, KG_order);
707 if (f_v) {
708 cout << "sims::build_up_group_random_process: "
709 "current group order is " << G_order
710 << " target " << target_go << endl;
711 cout << "the old_G action " << old_G->A->label
712 << " has base_length = " << old_G->A->base_len()
713 << " and degree " << old_G->A->degree << endl;
714 cout << "the kernel action " << KA->label
715 << " has base_length = " << KA->base_len()
716 << " and degree " << KA->degree << endl;
717 cout << "the image action has base_length = " << GA->base_len()
718 << " and degree " << GA->degree << endl;
719 cout << "current action " << GA->label << endl;
720 cout << "current group order = " << G_order << endl;
721 cout << "current kernel order = " << K_order << endl;
722 cout << "together = " << KG_order << endl;
723 cout << "target_go = " << target_go << endl;
724 }
725 cnt = 0;
726 while (TRUE) {
727
728 if (f_vv) {
729 cout << "sims::build_up_group_random_process "
730 "iteration " << cnt << endl;
731 }
732 if (cnt > 1000) {
733 cout << "sims::build_up_group_random_process "
734 "cnt > 1000, something seems to be wrong" << endl;
735 test_if_subgroup(old_G, 2);
736 exit(1);
737 }
738 if (f_v4) {
739 old_G->A->print_base();
740 old_G->print_orbit_len();
741 }
742 if ((cnt % 2) == 0) {
743 if (f_vv) {
744 cout << "sims::build_up_group_random_process: "
745 "choosing random schreier generator" << endl;
746 }
747 random_schreier_generator(Elt, verbose_level - 5);
748 A->element_move(Elt, GA->Elt1, 0);
749 if (f_v4) {
750 cout << "sims::build_up_group_random_process: "
751 "random element chosen:" << endl;
752 A->element_print_quick(GA->Elt1, cout);
753 cout << endl;
754 }
755 }
756 else if ((cnt % 2) == 1){
757 if (f_vv) {
758 cout << "sims::build_up_group_random_process: "
759 "choosing random element in the group by "
760 "which we extend" << endl;
761 }
762 old_G->random_element(GA->Elt1, verbose_level - 5);
763 if (f_vv) {
764 cout << "sims::build_up_group_random_process: "
765 "random element chosen, path = ";
766 Int_vec_print(cout, old_G->path, old_G->A->base_len());
767 cout << endl;
768 }
769 if (f_v4) {
770 GA->element_print_quick(GA->Elt1, cout);
771 cout << endl;
772 }
773 }
774 if (f_v4) {
775 cout << "sims::build_up_group_random_process: "
776 "calling strip:" << endl;
777 }
778 if (strip(GA->Elt1, GA->Elt2, drop_out_level, image,
779 verbose_level - 5)) {
780 if (f_vv) {
781 cout << "sims::build_up_group_random_process: "
782 "element strips through" << endl;
783 if (f_v4) {
784 cout << "sims::build_up_group_random_process: "
785 "residue = " << endl;
786 GA->element_print_quick(GA->Elt2, cout);
787 cout << endl;
788 }
789 }
790 //f_added = FALSE;
791 if (!GA->element_is_one(GA->Elt2, 0)) {
792 if (f_vvv) {
793 cout << "sims::build_up_group_random_process: "
794 "the residue is not trivial, we need to "
795 "choose another base point" << endl;
796 }
797 if (f_override_choose_next_base_point) {
798 b = (*choose_next_base_point_method)(GA,
799 GA->Elt2, verbose_level - 5);
800 }
801 else {
803 GA->Elt2, verbose_level - 5);
804 }
805
806 if (f_vv) {
807 cout << "sims::build_up_group_random_process: "
808 "suggested next base point " << b << endl;
809 }
810 if (b == -1) {
811 if (f_vv) {
812 cout << "sims::build_up_group_random_process: "
813 "cannot find next base point" << endl;
814 }
815 if (K->strip(GA->Elt2, GA->Elt3,
816 drop_out_level, image, 0/*verbose_level - 3*/)) {
817 if (f_vv) {
818 cout << "sims::build_up_group_random_process: "
819 "element strips through kernel" << endl;
820 if (f_v4) {
821 cout << "sims::build_up_group_random_"
822 "process: residue = " << endl;
823 KA->element_print_quick(GA->Elt3, cout);
824 cout << endl;
825 K->print(FALSE);
827 cout << "sims::build_up_group_random_"
828 "process: residue" << endl;
830 GA->Elt3, KA->base_len(), KA->get_base());
831 cout << "sims::build_up_group_random_"
832 "process: Elt2" << endl;
834 GA->Elt2, KA->base_len(), KA->get_base());
835 }
836 }
837 if (!KA->element_is_one(GA->Elt3, FALSE)) {
838 cout << "sims::build_up_group_random_process: "
839 "element strips through kernel, "
840 "residue = " << endl;
841 cout << "but the element is not the identity, "
842 "something is wrong" << endl;
843 GA->element_print(GA->Elt3, cout);
844 cout << endl;
845
846 cout << "sims::build_up_group_random_process: "
847 "current group order is " << G_order
848 << " target " << target_go << endl;
849 cout << "the old_G action " << old_G->A->label
850 << " has base_length = "
851 << old_G->A->base_len()
852 << " and degree " << old_G->A->degree << endl;
853 cout << "the kernel action " << KA->label
854 << " has base_length = " << KA->base_len()
855 << " and degree " << KA->degree << endl;
856 cout << "the image action has base_length = "
857 << GA->base_len()
858 << " and degree " << GA->degree << endl;
859 cout << "current action " << GA->label << endl;
860 cout << "current group order = "
861 << G_order << endl;
862 cout << "current kernel order = "
863 << K_order << endl;
864 cout << "together = " << KG_order << endl;
865 cout << "target_go = " << target_go << endl;
866
867 exit(1);
868 }
869 }
870 else {
871 if (f_vv) {
872 cout << "sims::build_up_group_random_process before K->add_generator_at_level drop_out_level=" << drop_out_level << endl;
873 }
875 drop_out_level, verbose_level - 3);
876 if (f_vvv) {
877 cout << "sims::build_up_group_random_process: "
878 "the residue has been added as kernel "
879 "generator at level " << drop_out_level
880 << endl;
881 }
882 }
883 //f_added = TRUE;
884 }
885 else {
886 if (f_vvv) {
887 cout << "sims::build_up_group_random_process: "
888 "choosing additional base point " << b << endl;
889 }
890 old_base_len = GA->base_len();
892 if (f_v) {
893 cout << "sims::build_up_group_random_process before reallocate_base" << endl;
894 }
895 reallocate_base(old_base_len, verbose_level - 1);
896 if (f_v) {
897 cout << "sims::build_up_group_random_process after reallocate_base" << endl;
898 }
899 if (f_vv) {
900 cout << "sims::build_up_group_random_process: "
901 "additional base point " << b
902 << " chosen, increased base has length "
903 << GA->base_len() << endl;
904 cout << "sims::build_up_group_random_process: "
905 "calling add_generator_at_level" << endl;
906 }
907 if (f_v) {
908 cout << "sims::build_up_group_random_process before add_generator_at_level" << endl;
909 }
911 GA->base_len() - 1, verbose_level - 3);
912 if (f_v) {
913 cout << "sims::build_up_group_random_process after add_generator_at_level" << endl;
914 }
915 if (f_vv) {
916 cout << "sims::build_up_group_random_process: "
917 "the residue has been added at level "
918 << GA->base_len() - 1 << endl;
919 }
920 } // if b
921 } // if ! element is one
922 else {
923 if (f_vv) {
924 cout << "sims::build_up_group_random_process: "
925 "the residue is trivial" << endl;
926 }
927 }
928 if (f_vv) {
929 cout << "sims::build_up_group_random_process: "
930 "before closure_group" << endl;
931 }
932 //closure_group(10, verbose_level);
933 closure_group(10, 0 /*verbose_level - 2*/);
934 if (f_vv) {
935 cout << "sims::build_up_group_random_process: "
936 "after closure_group" << endl;
937 }
938 }
939 else {
940 //f_added = TRUE;
941 if (f_vv) {
942 cout << "sims::build_up_group_random_process: "
943 "element needs to be inserted at level = "
944 << drop_out_level << " with image "
945 << image << endl;
946 if (FALSE) {
947 GA->element_print(GA->Elt2, cout);
948 cout << endl;
949 }
950 }
951 if (f_vv) {
952 cout << "sims::build_up_group_random_process before add_generator_at_level" << endl;
953 }
954 add_generator_at_level(GA->Elt2, drop_out_level,
955 0/*verbose_level - 3*/);
956 if (f_vv) {
957 cout << "sims::build_up_group_random_process after add_generator_at_level" << endl;
958 }
959 }
960
961 if (f_vv) {
962 cout << "sims::build_up_group_random_process: "
963 "computing group order G" << endl;
964 }
965 group_order(G_order);
966 if (f_vv) {
967 cout << "sims::build_up_group_random_process: "
968 "G_order=" << G_order << endl;
969 }
970 K->group_order(K_order);
971 if (f_vv) {
972 cout << "sims::build_up_group_random_process: "
973 "K_order=" << K_order << endl;
974 }
975 //cout << "K tl: ";
976 //int_vec_print(cout, K->orbit_len, K->A->base_len);
977 //cout << endl;
978 //cout << "K action " << K->A->label << endl;
979 D.mult(G_order, K_order, KG_order);
980 if (f_v /* (f_v && f_added) || f_vv */) {
981 cout << "sims::build_up_group_random_process: "
982 "current group order is " << KG_order
983 << " = " << G_order << " * " << K_order << endl;
984 }
985 if (f_vv) {
987 }
988 if (FALSE) {
989 cout << "sims::build_up_group_random_process "
990 "before D.compare" << endl;
991 }
992 c = D.compare(target_go, KG_order);
993 if (FALSE) {
994 cout << "sims::build_up_group_random_process "
995 "after D.compare c=" << c
996 << " cnt=" << cnt << endl;
997 }
998 cnt++;
999 if (c == 0) {
1000 if (f_v) {
1001 cout << "sims::build_up_group_random_process: "
1002 "reached the full group after "
1003 << cnt << " iterations" << endl;
1004 }
1005 break;
1006 }
1007 if (c < 0) {
1008 if (TRUE) {
1009 cout << "sims::build_up_group_random_process "
1010 "overshooting the expected group after "
1011 << cnt << " iterations" << endl;
1012 cout << "current group order is " << KG_order
1013 << " = |G| * |K| = " << G_order << " * " << K_order << ", target_go=" << target_go << endl;
1014 }
1015 //break;
1016 exit(1);
1017 }
1018 } // while TRUE
1019 FREE_int(Elt);
1020 if (f_vv) {
1021 cout << "sims::build_up_group_random_process finished: "
1022 "found a group of order " << KG_order
1023 << " = " << G_order << " * " << K_order << endl;
1024 if (f_vvv) {
1025 cout << "the n e w action has base_length = "
1026 << GA->base_len()
1027 << " and degree " << GA->degree << endl;
1029 if (FALSE) {
1031 }
1032 if (FALSE) {
1033 print(FALSE);
1034 }
1035 }
1036 }
1037 if (f_v) {
1038 cout << "sims::build_up_group_random_process done" << endl;
1039 }
1040}
1041
1044 int f_target_go, ring_theory::longinteger_object *target_go,
1045 int f_override_choose_next_base_point,
1046 int (*choose_next_base_point_method)(actions::action *A,
1047 int *Elt, int verbose_level),
1048 int verbose_level)
1049{
1050 int f_v = (verbose_level >= 1);
1051 int f_vv = (verbose_level >= 2);
1052 int f_vvv = (verbose_level >= 3);
1054 ring_theory::longinteger_object G_order, K_order, KG_order;
1055 int drop_out_level, image, f_added, j;
1056 int level, base_point, b, old_base_len;
1057 actions::action *GA;
1058 actions::action *KA;
1059 data_structures_groups::vector_ge subset_of_gens;
1060
1061 GA = A;
1062 KA = K->A;
1063
1064
1065 if (f_v) {
1066 cout << "sims::build_up_group_from_generators base: ";
1067 Lint_vec_print(cout, GA->get_base(), GA->base_len());
1068 cout << endl;
1069
1070#if 0
1071 cout << "generators:" << endl;
1072 gens->print(cout);
1073 cout << endl;
1074#endif
1075
1076 if (f_target_go) {
1077 cout << "sims::build_up_group_from_generators target group order: " << *target_go << endl;
1078 }
1079 else {
1080 cout << "sims::build_up_group_from_generators no target group order given" << endl;
1081 }
1082 cout << "sims::build_up_group_from_generators verbose_level=" << verbose_level << endl;
1083 }
1084 group_order(G_order);
1085 K->group_order(K_order);
1086 D.mult(G_order, K_order, KG_order);
1087 for (level = GA->base_len() - 1; level >= 0; level--) {
1088 base_point = GA->base_i(level);
1089 if (f_vv) {
1090 cout << "sims::build_up_group_from_generators level " << level << " base point "
1091 << base_point << endl;
1092 }
1094 GA->base_len(), GA->get_base(), level,
1095 *gens, subset_of_gens, verbose_level - 3);
1096
1097 {
1098 schreier O;
1099
1100 if (f_v) {
1101 cout << "sims::build_up_group_from_generators calling O.init" << endl;
1102 }
1103
1104 O.init(GA, verbose_level - 2);
1105
1106 if (f_v) {
1107 cout << "sims::build_up_group_from_generators calling O.init_generators" << endl;
1108 }
1109 O.init_generators(subset_of_gens, verbose_level - 2);
1110
1111 if (f_vvv) {
1112 cout << "sims::build_up_group_from_generators generators in schreier" << endl;
1113 O.print_generators();
1114 }
1115
1116 if (f_vv) {
1117 cout << "sims::build_up_group_from_generators computing orbit of point " << base_point << endl;
1118 }
1119 O.compute_point_orbit(base_point, 0);
1120 if (f_vv) {
1121 cout << "sims::build_up_group_from_generators point " << base_point << " lies in an orbit "
1122 "of size " << O.orbit_len[0] << endl;
1123 if (FALSE) {
1124 O.print(cout);
1125 O.print_tables(cout, FALSE);
1126 }
1127 }
1128 for (j = 0; j < O.orbit_len[0]; j++) {
1129 if (FALSE) {
1130 cout << "sims::build_up_group_from_generators level " << level << " coset rep " << j << endl;
1131 }
1132 O.coset_rep(j, 0 /* verbose_level */);
1133 if (FALSE) {
1134 GA->element_print(O.cosetrep, cout);
1135 cout << endl;
1136 }
1137 if (strip(O.cosetrep, GA->Elt2 /* residue */,
1138 drop_out_level, image, 0 /*verbose_level - 1*/)) {
1139 if (f_vv) {
1140 cout << "sims::build_up_group_from_generators element strips through" << endl;
1141 if (FALSE /*f_vvv */) {
1142 cout << "sims::build_up_group_from_generators residue=" << endl;
1143 GA->element_print_quick(GA->Elt2, cout);
1144 cout << endl;
1145 }
1146 }
1147 if (FALSE) {
1148 cout << "sims::build_up_group_from_generators element strips through." << endl;
1149 cout << "if it is the identity element, that's OK,"
1150 << endl;
1151 cout << "sims::build_up_group_from_generators otherwise please add another base point,"
1152 << endl;
1153 cout << "sims::build_up_group_from_generators a point which is moved by the residue"
1154 << endl;
1155 GA->element_print(GA->Elt2, cout);
1156 }
1157 if (!GA->element_is_one(GA->Elt2, FALSE)) {
1158 if (f_vvv) {
1159 cout << "sims::build_up_group_from_generators the residue is not trivial, "
1160 "we need to chose another base point"
1161 << endl;
1162 }
1163 if (f_override_choose_next_base_point) {
1164 b = (*choose_next_base_point_method)(
1165 GA, GA->Elt2, verbose_level);
1166 }
1167 else {
1169 GA->Elt2, verbose_level);
1170 }
1171 if (b == -1) {
1172 if (f_vv) {
1173 cout << "sims::build_up_group_from_generators: "
1174 "cannot find next base point" << endl;
1175 }
1176 if (K->strip(GA->Elt2, GA->Elt3,
1177 drop_out_level, image, verbose_level - 3)) {
1178 if (f_vv) {
1179 cout << "sims::build_up_group_from_generators element strips through kernel, "
1180 "residue = " << endl;
1181 if (f_vv) {
1182 KA->element_print(GA->Elt3, cout);
1183 cout << endl;
1184 }
1185 K->print(FALSE);
1186 K->print_basic_orbits();
1187 cout << "sims::build_up_group_from_generators residue" << endl;
1189 GA->Elt3, KA->base_len(), KA->get_base());
1190 cout << "sims::build_up_group_from_generators Elt2" << endl;
1192 GA->Elt2, KA->base_len(), KA->get_base());
1193 }
1194 if (!KA->element_is_one(GA->Elt3, FALSE)) {
1195 cout << "sims::build_up_group_from_generators but the element is not the identity, "
1196 "something is wrong" << endl;
1197 GA->element_print(GA->Elt3, cout);
1198 cout << endl;
1199 exit(1);
1200 }
1201 }
1203 drop_out_level, verbose_level - 3);
1204 if (f_vv) {
1205 cout << "sims::build_up_group_from_generators the residue has been added as "
1206 "kernel generator at level "
1207 << drop_out_level << endl;
1208 }
1209 f_added = TRUE;
1210 }
1211 else {
1212 if (f_vv) {
1213 cout << "sims::build_up_group_from_generators: "
1214 "choosing additional base point "
1215 << b << endl;
1216 }
1217 old_base_len = GA->base_len();
1219 if (f_vv) {
1220 //cout << "after reallocate_base 1" << endl;
1221 }
1222 reallocate_base(old_base_len, verbose_level - 1);
1223 if (f_vv) {
1224 //cout << "after reallocate_base 2" << endl;
1225 }
1226 if (f_v) {
1227 cout << "sims::build_up_group_from_generators additional base point " << b
1228 << " chosen, increased base has length "
1229 << GA->base_len() << endl;
1230 cout << "sims::build_up_group_from_generators calling add_generator_at_level" << endl;
1231 }
1233 GA->base_len() - 1, verbose_level - 3);
1234 if (f_vv) {
1235 cout << "sims::build_up_group_from_generators the residue has been added at level "
1236 << GA->base_len() - 1 << endl;
1237 }
1238 } // if b
1239 } // if ! element is one
1240 else {
1241 if (f_vv) {
1242 cout << "sims::build_up_group_from_generators the residue is trivial" << endl;
1243 }
1244 }
1245
1246 f_added = FALSE;
1247 }
1248 else {
1249 f_added = TRUE;
1250 if (f_vv) {
1251 cout << "sims::build_up_group_from_generators before add_generator_at_level" << endl;
1252 }
1254 drop_out_level, 0 /*verbose_level - 1*/);
1255 if (f_vv) {
1256 cout << "sims::build_up_group_from_generators after add_generator_at_level" << endl;
1257 }
1258 }
1259
1260 group_order(G_order);
1261 K->group_order(K_order);
1262 D.mult(G_order, K_order, KG_order);
1263
1264
1265 if (f_v && f_added) {
1266 cout << "sims::build_up_group_from_generators level " << level << " coset " << j
1267 << " group of order increased to " << KG_order
1268 << " = " << G_order << " * " << K_order << endl;
1269 }
1270 if (f_vv) {
1271 cout << "sims::build_up_group_from_generators level " << level << " coset " << j
1272 << " found a group of order " << KG_order
1273 << " = " << G_order << " * " << K_order << endl;
1274 }
1275 }
1276 } // end of schreier
1277
1278 } // next level
1279
1280
1281 if (f_target_go) {
1282 int c, cnt;
1283
1284 cnt = 0;
1285 while (TRUE) {
1286 group_order(G_order);
1287 K->group_order(K_order);
1288 D.mult(G_order, K_order, KG_order);
1289
1290 c = D.compare(*target_go, KG_order);
1291 cnt++;
1292 if (c == 0) {
1293 if (f_v) {
1294 cout << "sims::build_up_group_from_generators reached the full group after "
1295 << cnt << " iterations" << endl;
1296 }
1297 break;
1298 }
1299 if (c < 0) {
1300 if (TRUE) {
1301 cout << "sims::build_up_group_from_generators "
1302 "overshooting the expected group after "
1303 << cnt << " iterations" << endl;
1304 cout << "current group order is " << KG_order
1305 << " = " << G_order << " * " << K_order << endl;
1306 }
1307 //break;
1308 exit(1);
1309 }
1310 if (cnt > 10000) {
1311 cout << "sims::build_up_group_from_generators after "
1312 << cnt << " iterations, we seem to be having "
1313 "problems reaching the target group order" << endl;
1314 cout << "sims::build_up_group_from_generators group order = " << KG_order << endl;
1315 cout << "sims::build_up_group_from_generators target group order = " << *target_go << endl;
1316 exit(1);
1317 }
1318
1319 if (f_vv) {
1320 cout << "sims::build_up_group_from_generators "
1321 "calling closure group" << endl;
1322 }
1323 closure_group(10, verbose_level - 2);
1324
1325 }
1326 }
1327
1328 if (f_v) {
1329 cout << "sims::build_up_group_from_generators finished: "
1330 "found a group of order " << KG_order
1331 << " = " << G_order << " * " << K_order << endl;
1332 cout << "sims::build_up_group_from_generators the n e w action has base_length = " << GA->base_len()
1333 << " and degree " << GA->degree << endl;
1335
1336#if 0
1337 if (f_vv) {
1339 }
1340 if (f_vvv) {
1341 print(FALSE);
1342 }
1343#endif
1344 }
1345 if (f_v) {
1346 cout << "sims::build_up_group_from_generators found a group of order " << G_order << endl;
1347 }
1348 if (f_v) {
1349 cout << "sims::build_up_group_from_generators done" << endl;
1350 }
1351}
1352
1353int sims::closure_group(int nb_times, int verbose_level)
1354{
1355 int f_v = (verbose_level >= 1);
1356 //int f_vv = (verbose_level >= 1);
1357 //int f_vvv = (verbose_level >= 1);
1358 int f_vv = (verbose_level >= 2);
1359 int f_v3 = (verbose_level >= 6);
1360 int i, f_extended = FALSE;
1361 int *Elt1;
1362 int *Elt2;
1363 int *Elt3;
1364 ring_theory::longinteger_object old_go, go, go1;
1365
1366 if (f_v) {
1367 cout << "sims::closure_group" << endl;
1368 }
1369 if (f_vv) {
1371 cout << "verbose_level=" << verbose_level << endl;
1372 }
1373 Elt1 = NEW_int(A->elt_size_in_int);
1374 Elt2 = NEW_int(A->elt_size_in_int);
1375 Elt3 = NEW_int(A->elt_size_in_int);
1376
1377 group_order(old_go);
1378 if (f_vv) {
1379 cout << "sims::closure_group for group of order "
1380 << old_go << endl;
1381 }
1382 if (old_go.is_one()) {
1383 FREE_int(Elt1);
1384 FREE_int(Elt2);
1385 if (f_v) {
1386 cout << "sims::closure_group finishing with FALSE "
1387 "because the old group order is one" << endl;
1388 }
1389 return FALSE;
1390 }
1391 group_order(go);
1392 for (i = 0; i < nb_times; i++) {
1393 if (f_vv) {
1394 cout << "sims::closure_group loop " << i << " / "
1395 << nb_times << " go=" << go << endl;
1396 }
1397 if (f_v3) {
1398 cout << "sims::closure_group "
1399 "before random_schreier_generator" << endl;
1400 }
1401 random_schreier_generator(Elt3, verbose_level /*- 4*/);
1402 if (f_v3) {
1403 cout << "sims::closure_group "
1404 "after random_schreier_generator" << endl;
1405 }
1406 group_order(go);
1407 A->element_move(Elt3, Elt2, 0);
1408 if (strip_and_add(Elt2, Elt1 /* residue */,
1409 verbose_level - 3)) {
1410 group_order(go1);
1411 if (f_vv) {
1412 cout << "closure_group: iteration " << i
1413 << " the group has been extended, old order "
1414 << go << " extended group order " << go1 << endl;
1416 }
1417 if (f_v3) {
1418 cout << "original element:" << endl;
1419 A->element_print_quick(Elt3, cout);
1420 cout << "additional generator:" << endl;
1421 A->element_print_quick(Elt2, cout);
1422 }
1423 f_extended = TRUE;
1424 }
1425 }
1426 FREE_int(Elt1);
1427 FREE_int(Elt2);
1428 FREE_int(Elt3);
1429 if (f_extended) {
1430 if (f_v) {
1431 cout << "sims::closure_group group order extended from "
1432 << old_go << " to " << go1 << endl;
1433 if (f_vv) {
1435 }
1436 }
1437 }
1438 else {
1439 if (f_vv) {
1440 cout << "sims::closure_group group order stays at "
1441 << old_go << endl;
1442 }
1443 }
1444 return f_extended;
1445}
1446
1447
1448
1449}}}
1450
domain to compute with objects of type longinteger
Definition: ring_theory.h:240
int compare(longinteger_object &a, longinteger_object &b)
void mult(longinteger_object &a, longinteger_object &b, longinteger_object &c)
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_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_mult(void *a, void *b, void *ab, int verbose_level)
Definition: action_cb.cpp:315
void find_strong_generators_at_level(int base_len, long int *the_base, int level, data_structures_groups::vector_ge &gens, data_structures_groups::vector_ge &subset_of_gens, int verbose_level)
Definition: action.cpp:1612
int element_is_one(void *elt, int verbose_level)
Definition: action_cb.cpp:248
stabilizer_chain_base_data * Stabilizer_chain
Definition: actions.h:178
void element_print_image_of_set(void *elt, int size, long int *set)
Definition: action_cb.cpp:558
int choose_next_base_point_default_method(int *Elt, int verbose_level)
void element_move(void *a, void *b, int verbose_level)
Definition: action_cb.cpp:335
long int element_image_of(long int a, void *elt, int verbose_level)
Definition: action_cb.cpp:198
Schreier trees for orbits of groups on points.
Definition: groups.h:839
void init_generators(data_structures_groups::vector_ge &generators, int verbose_level)
Definition: schreier.cpp:373
void compute_point_orbit(int pt, int verbose_level)
Definition: schreier.cpp:1256
void init(actions::action *A, int verbose_level)
Definition: schreier.cpp:308
void coset_rep(int j, int verbose_level)
Definition: schreier.cpp:787
void print_tables(std::ostream &ost, int f_with_cosetrep)
a permutation group represented via a stabilizer chain
Definition: groups.h:1273
void coset_rep_inv(int *Elt, int i, int j, int verbose_level_le)
Definition: sims.cpp:1628
void random_element(int *elt, int verbose_level)
void swap_points(int lvl, int i, int j)
Definition: sims.cpp:1069
int test_if_subgroup(sims *old_G, int verbose_level)
void init(actions::action *A, int verbose_level)
Definition: sims.cpp:289
void extend_base_orbit(int new_gen_idx, int lvl, int verbose_level)
Definition: sims_main.cpp:97
void group_order(ring_theory::longinteger_object &go)
Definition: sims.cpp:951
void compute_base_orbit(int lvl, int verbose_level)
Definition: sims_main.cpp:189
void build_up_group_from_generators(sims *K, data_structures_groups::vector_ge *gens, int f_target_go, ring_theory::longinteger_object *target_go, int f_override_choose_next_base_point, int(*choose_next_base_point_method)(actions::action *A, int *Elt, int verbose_level), int verbose_level)
Definition: sims_main.cpp:1042
void init_trivial_group(int verbose_level)
Definition: sims.cpp:584
void add_generator_at_level_only(int *elt, int lvl, int verbose_level)
Definition: sims_main.cpp:580
void extend_group_random_process_no_kernel(sims *extending_by_G, ring_theory::longinteger_object &target_go, int verbose_level)
Definition: sims_main.cpp:642
void compute_base_orbits_known_length(int *tl, int verbose_level)
Definition: sims_main.cpp:57
int get_image(int i, int gen_idx)
Definition: sims.cpp:1037
int closure_group(int nb_times, int verbose_level)
Definition: sims_main.cpp:1353
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 add_generator(int *elt, int verbose_level)
Definition: sims.cpp:803
void random_schreier_generator(int *Elt, int verbose_level)
Definition: sims.cpp:1803
void build_up_group_random_process_no_kernel(sims *old_G, int verbose_level)
Definition: sims_main.cpp:606
void reallocate_base(int old_base_len, int verbose_level)
Definition: sims.cpp:445
int strip(int *elt, int *residue, int &drop_out_level, int &image, int verbose_level)
Definition: sims_main.cpp:433
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 compute_base_orbit_known_length(int lvl, int target_length, int verbose_level)
Definition: sims_main.cpp:267
void build_up_group_random_process(sims *K, sims *old_G, ring_theory::longinteger_object &target_go, int f_override_choose_next_base_point, int(*choose_next_base_point_method)(actions::action *A, int *Elt, int verbose_level), int verbose_level)
Definition: sims_main.cpp:675
int strip_and_add(int *elt, int *residue, int verbose_level)
Definition: sims_main.cpp:379
#define FREE_int(p)
Definition: foundations.h:640
#define Lint_vec_print(A, B, C)
Definition: foundations.h:686
#define NEW_int(n)
Definition: foundations.h:625
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define Int_vec_print(A, B, C)
Definition: foundations.h:685
the orbiter library for the classification of combinatorial objects