Orbiter 2022
Combinatorial Objects
orbit_of_equations.cpp
Go to the documentation of this file.
1// orbit_of_equations.cpp
2//
3// Anton Betten
4// May 29, 2018
5//
6//
7//
8//
9//
10
12#include "discreta/discreta.h"
15
16using namespace std;
17
18namespace orbiter {
19namespace layer4_classification {
20
21
22static int orbit_of_equations_compare_func(void *a, void *b, void *data);
23
24
25
27{
28 A = NULL;
29 F = NULL;
30 SG = NULL;
31 AonHPD = NULL;
32 Equations = NULL;
33 prev = NULL;
34 label = NULL;
35 data_tmp = NULL;
37 print_function = NULL;
40 reduction_function = NULL;
42 null();
43}
44
46{
47 freeself();
48}
49
51{
52}
53
55{
56 int i;
57
58 if (Equations) {
59 for (i = 0; i < used_length; i++) {
61 }
63 }
64 if (prev) {
66 }
67 if (label) {
69 }
70 if (data_tmp) {
72 }
73 null();
74}
75
79 groups::strong_generators *SG, int *coeff_in,
80 int verbose_level)
81{
82 int f_v = (verbose_level >= 1);
83
84 if (f_v) {
85 cout << "orbit_of_equations::init" << endl;
86 }
91
93 if (f_v) {
94 cout << "orbit_of_equations::init nb_monomials = " << nb_monomials << endl;
95 }
96 sz = 1 + nb_monomials;
98
100
101 if (f_v) {
102 cout << "orbit_of_equations::init computing orbit of ";
103 Int_vec_print(cout, coeff_in, nb_monomials);
104 cout << endl;
105 }
106 if (f_v) {
107 cout << "orbit_of_equations::init before compute_orbit" << endl;
108 }
109 compute_orbit(coeff_in, 0 /* verbose_level */);
110 if (f_v) {
111 cout << "orbit_of_equations::init after compute_orbit" << endl;
112 }
113
114 if (f_v) {
115 cout << "orbit_of_equations::init printing the orbit" << endl;
116 print_orbit();
117 }
118
119 if (f_v) {
120 cout << "orbit_of_equations::init done" << endl;
121 }
122}
123
124void orbit_of_equations::map_an_equation(int *object_in, int *object_out,
125 int *Elt, int verbose_level)
126{
127 int f_v = (verbose_level >= 1);
128
129 if (f_v) {
130 cout << "orbit_of_equations::map_an_equation" << endl;
131 }
132 if (f_v) {
133 cout << "orbit_of_equations::map_an_equation object_in=";
134 Int_vec_print(cout, object_in + 1, nb_monomials);
135 cout << endl;
136 }
137 if (f_v) {
138 cout << "orbit_of_equations::map_an_equation Elt=" << endl;
139 A->element_print(Elt, cout);
140 }
142 Elt, object_in + 1, object_out + 1, verbose_level - 2);
143 object_out[0] = 0;
144 if (f_v) {
145 cout << "orbit_of_equations::map_an_equation object_out=";
146 Int_vec_print(cout, object_out + 1, nb_monomials);
147 cout << endl;
148 }
149 if (f_has_reduction) {
150 if (f_v) {
151 cout << "orbit_of_equations::map_an_equation before reduction_function" << endl;
152 }
153 (*reduction_function)(object_out + 1, reduction_function_data);
154 if (f_v) {
155 cout << "orbit_of_equations::map_an_equation after reduction_function" << endl;
156 }
157 }
158 if (f_v) {
159 cout << "orbit_of_equations::map_an_equation before F->PG_element_normalize_from_front" << endl;
160 }
162 object_out + 1, 1, nb_monomials);
163 if (f_v) {
164 cout << "orbit_of_equations::map_an_equation after F->PG_element_normalize_from_front" << endl;
165 }
166 if (f_v) {
167 cout << "orbit_of_equations::map_an_equation done" << endl;
168 }
169}
170
172{
173 int i;
174
175 cout << "orbit_of_equations::print_orbit We found an orbit of "
176 "length " << used_length << endl;
177 for (i = 0; i < used_length; i++) {
178 cout << i << " : ";
179 Int_vec_print(cout, Equations[i] + 1, nb_monomials);
180 cout << " : ";
181 //AonHPD->HPD->print_equation(cout, Equations[i] + 1);
183 (*print_function)(Equations[i], sz, print_function_data);
184 }
185 cout << endl;
186 }
187}
188
189void orbit_of_equations::compute_orbit(int *coeff, int verbose_level)
190{
191 int f_v = (verbose_level >= 1);
192 int f_vv = (verbose_level >= 2);
193 int f_vvv = (verbose_level >= 3);
194 int i, cur, j, idx;
195 int *cur_object;
196 int *new_object;
197 int *Q;
198 int Q_len;
199
200 if (f_v) {
201 cout << "orbit_of_equations::compute_orbit" << endl;
202 }
203 if (f_v) {
204 cout << "orbit_of_equations::compute_orbit sz=" << sz << endl;
205 }
206 cur_object = NEW_int(sz);
207 new_object = NEW_int(sz);
208 allocation_length = 1000;
212 Equations[0] = NEW_int(sz);
213 prev[0] = -1;
214 label[0] = -1;
215 if (f_v) {
216 cout << "orbit_of_equations::compute_orbit init Equations[0]" << endl;
217 }
218 Int_vec_copy(coeff, Equations[0] + 1, nb_monomials);
219 Equations[0][0] = 0;
221
223
224 used_length = 1;
226 Q[0] = 0;
227 Q_len = 1;
228 while (Q_len) {
229 if (f_vv) {
230 cout << "orbit_of_equations::compute_orbit Q_len = "
231 << Q_len << " : used_length=" << used_length << " : ";
232 Int_vec_print(cout, Q, Q_len);
233 cout << endl;
234 }
235 cur = Q[0];
236 for (i = 1; i < Q_len; i++) {
237 Q[i - 1] = Q[i];
238 }
239 Q_len--;
240
241 Int_vec_copy(Equations[cur], cur_object, sz);
242
243
244 for (j = 0; j < SG->gens->len; j++) {
245 if (f_vvv) {
246 cout << "orbit_of_equations::compute_orbit "
247 "applying generator " << j << endl;
248 }
249
250 map_an_equation(cur_object, new_object,
251 SG->gens->ith(j), verbose_level);
252
253
254 if (f_vvv) {
255 cout << "orbit_of_equations::compute_orbit "
256 "before search_data" << endl;
257 }
258 if (search_data(new_object, idx, FALSE)) {
259 if (f_vvv) {
260 cout << "orbit_of_equations::compute_orbit "
261 "image object is already in the list, "
262 "at position " << idx << endl;
263 }
264 }
265 else {
266 if (f_vvv) {
267 cout << "orbit_of_equations::compute_orbit "
268 "Found a n e w object : ";
269 Int_vec_print(cout, new_object, sz);
271 (*print_function)(new_object, sz, print_function_data);
272 }
273 cout << endl;
274 }
275
277 int al2 = allocation_length + 1000;
278 int **Equations2;
279 int *prev2;
280 int *label2;
281 int *Q2;
282 if (f_vv) {
283 cout << "orbit_of_equations::compute_orbit "
284 "reallocating to length " << al2 << endl;
285 }
286 Equations2 = NEW_pint(al2);
287 prev2 = NEW_int(al2);
288 label2 = NEW_int(al2);
289 for (i = 0; i < allocation_length; i++) {
290 Equations2[i] = Equations[i];
291 }
295 FREE_int(prev);
297 Equations = Equations2;
298 prev = prev2;
299 label = label2;
300 Q2 = NEW_int(al2);
301 Int_vec_copy(Q, Q2, Q_len);
302 FREE_int(Q);
303 Q = Q2;
304 allocation_length = al2;
305 }
306 for (i = used_length; i > idx; i--) {
307 Equations[i] = Equations[i - 1];
308 }
309 for (i = used_length; i > idx; i--) {
310 prev[i] = prev[i - 1];
311 }
312 for (i = used_length; i > idx; i--) {
313 label[i] = label[i - 1];
314 }
315 Equations[idx] = NEW_int(sz);
316 prev[idx] = cur;
317 label[idx] = j;
318
319 Int_vec_copy(new_object, Equations[idx], sz);
320
321 if (position_of_original_object >= idx) {
323 }
324 if (cur >= idx) {
325 cur++;
326 }
327 for (i = 0; i < used_length + 1; i++) {
328 if (prev[i] >= 0 && prev[i] >= idx) {
329 prev[i]++;
330 }
331 }
332 for (i = 0; i < Q_len; i++) {
333 if (Q[i] >= idx) {
334 Q[i]++;
335 }
336 }
337 used_length++;
338 if ((used_length % 10000) == 0) {
339 cout << "orbit_of_equations::compute_orbit "
340 << used_length << endl;
341 }
342 Q[Q_len++] = idx;
343 if (f_vvv) {
344 cout << "orbit_of_equations::compute_orbit "
345 "storing n e w equation at position "
346 << idx << endl;
347 }
348
349#if 0
350 for (i = 0; i < used_length; i++) {
351 cout << i << " : ";
352 int_vec_print(cout, Equations[i], sz);
353 cout << endl;
354 }
355#endif
356 }
357 }
358 }
359 if (f_v) {
360 cout << "orbit_of_equations::compute_orbit found an orbit "
361 "of length " << used_length << endl;
362 }
363
364
365 FREE_int(Q);
366 FREE_int(new_object);
367 FREE_int(cur_object);
368 if (f_v) {
369 cout << "orbit_of_equations::compute_orbit done" << endl;
370 }
371}
372
374 int *transporter, int verbose_level)
375// transporter is an element which maps
376// the orbit representative to the given subspace.
377{
378 int f_v = (verbose_level >= 1);
379 int *Elt1, *Elt2;
380 int idx0, idx1, l;
381
382 if (f_v) {
383 cout << "orbit_of_equations::get_transporter" << endl;
384 }
385 Elt1 = NEW_int(A->elt_size_in_int);
386 Elt2 = NEW_int(A->elt_size_in_int);
387
388 A->element_one(Elt1, 0);
389 idx1 = idx;
390 idx0 = prev[idx1];
391 while (idx0 >= 0) {
392 l = label[idx1];
393 A->element_mult(SG->gens->ith(l), Elt1, Elt2, 0);
394 A->element_move(Elt2, Elt1, 0);
395 idx1 = idx0;
396 idx0 = prev[idx1];
397 }
398 if (idx1 != position_of_original_object) {
399 cout << "orbit_of_equations::get_transporter "
400 "idx1 != position_of_original_object" << endl;
401 exit(1);
402 }
403 A->element_move(Elt1, transporter, 0);
404
405 FREE_int(Elt1);
406 FREE_int(Elt2);
407 if (f_v) {
408 cout << "orbit_of_equations::get_transporter done" << endl;
409 }
410}
411
413 int *Elt, int verbose_level)
414{
415 int f_v = (verbose_level >= 1);
416 int f_vv = FALSE; //(verbose_level >= 2);
417 int len, r1, r2, pt1, pt2, pt3;
418 int *E1, *E2, *E3, *E4, *E5;
419 int *cur_object;
420 int *new_object;
422
423 if (f_v) {
424 cout << "orbit_of_equations::get_random_schreier_generator" << endl;
425 }
431 cur_object = NEW_int(sz);
432 new_object = NEW_int(sz);
433 len = used_length;
435
436 // get a random coset:
437 r1 = Os.random_integer(len);
438 get_transporter(r1, E1, 0);
439
440 // get a random generator:
441 r2 = Os.random_integer(SG->gens->len);
442 if (f_vv) {
443 cout << "r2=" << r2 << endl;
444 }
445 if (f_vv) {
446 cout << "random coset " << r1
447 << ", random generator " << r2 << endl;
448 }
449
450 A->element_mult(E1, SG->gens->ith(r2), E2, 0);
451
452 // compute image of original subspace under E2:
453 Int_vec_copy(Equations[pt1], cur_object, sz);
454
455 map_an_equation(cur_object, new_object, E2, 0 /* verbose_level*/);
456
457 if (search_data(new_object, pt2, FALSE)) {
458 if (f_vv) {
459 cout << "n e w object is at position " << pt2 << endl;
460 }
461 }
462 else {
463 cout << "orbit_of_equations::get_random_schreier_generator "
464 "image space is not found in the orbit" << endl;
465 exit(1);
466 }
467
468
469 get_transporter(pt2, E3, 0);
470 A->element_invert(E3, E4, 0);
471 A->element_mult(E2, E4, E5, 0);
472
473 // test:
474 map_an_equation(cur_object, new_object, E5, 0 /* verbose_level*/);
475 if (search_data(new_object, pt3, FALSE)) {
476 if (f_vv) {
477 cout << "testing: n e w object is at position " << pt3 << endl;
478 }
479 }
480 else {
481 cout << "orbit_of_equations::get_random_schreier_generator "
482 "(testing) image space is not found in the orbit" << endl;
483 exit(1);
484 }
485
486 if (pt3 != position_of_original_object) {
487 cout << "orbit_of_equations::get_random_schreier_generator "
488 "pt3 != position_of_original_subspace" << endl;
489 exit(1);
490 }
491
492
493
494 A->element_move(E5, Elt, 0);
495
496
497 FREE_int(E1);
498 FREE_int(E2);
499 FREE_int(E3);
500 FREE_int(E4);
501 FREE_int(E5);
502 FREE_int(cur_object);
503 FREE_int(new_object);
504 if (f_v) {
505 cout << "orbit_of_equations::get_random_schreier_generator "
506 "done" << endl;
507 }
508}
509
511 int *canonical_equation,
512 int *transporter_to_canonical_form,
513 groups::strong_generators *&gens_stab_of_canonical_equation,
514 ring_theory::longinteger_object &full_group_order,
515 int verbose_level)
516{
517 int f_v = (verbose_level >= 1);
518 int idx = 0;
519
520 if (f_v) {
521 cout << "orbit_of_equations::get_canonical_form" << endl;
522 }
523
524 Int_vec_copy(Equations[0] + 1, canonical_equation, nb_monomials);
525
526 if (f_v) {
527 cout << "orbit_of_equations::get_canonical_form before stabilizer_any_point" << endl;
528 }
529 gens_stab_of_canonical_equation = stabilizer_any_point(
530 full_group_order, idx, 0 /*verbose_level*/);
531 if (f_v) {
532 cout << "orbit_of_equations::get_canonical_form after stabilizer_any_point" << endl;
533 }
534
535
536 if (f_v) {
537 cout << "orbit_of_equations::get_canonical_form before get_transporter" << endl;
538 }
539 get_transporter(idx, transporter_to_canonical_form, 0);
540 if (f_v) {
541 cout << "orbit_of_equations::get_canonical_form after get_transporter" << endl;
542 }
543
544
545 if (f_v) {
546 cout << "orbit_of_equations::get_canonical_form done" << endl;
547 }
548}
549
551 ring_theory::longinteger_object &full_group_order, int verbose_level)
552{
553 int f_v = (verbose_level >= 1);
555 groups::sims *Stab;
556
557 if (f_v) {
558 cout << "orbit_of_equations::stabilizer_orbit_rep" << endl;
559 }
560
561 if (f_v) {
562 cout << "orbit_of_equations::stabilizer_orbit_rep before stabilizer_orbit_rep_work" << endl;
563 }
564 stabilizer_orbit_rep_work(A /* default_action */, full_group_order,
565 Stab, 0 /*verbose_level*/);
566 if (f_v) {
567 cout << "orbit_of_equations::stabilizer_orbit_rep after stabilizer_orbit_rep_work" << endl;
568 }
569
571
572 Stab->group_order(stab_order);
573 if (f_v) {
574 cout << "orbit_of_equations::stabilizer_orbit_rep "
575 "found a stabilizer group of order "
576 << stab_order << endl;
577 }
578
580 gens->init(A);
581 gens->init_from_sims(Stab, verbose_level);
582
583 FREE_OBJECT(Stab);
584 if (f_v) {
585 cout << "orbit_of_equations::stabilizer_orbit_rep done" << endl;
586 }
587 return gens;
588}
589
591 actions::action *default_action,
593 groups::sims *&Stab, int verbose_level)
594// this function allocates a sims structure into Stab.
595{
596 int f_v = (verbose_level >= 1);
597 int f_vv = (verbose_level >= 2);
598 int f_vvv = (verbose_level >= 3);
599 int f_v4 = (verbose_level >= 4);
600
601
602 if (f_v) {
603 cout << "orbit_of_equations::stabilizer_orbit_rep_work" << endl;
604 }
605
606 Stab = NEW_OBJECT(groups::sims);
607 ring_theory::longinteger_object cur_go, target_go;
609 int len, r, cnt = 0, f_added, drop_out_level, image;
610 int *residue;
611 int *E1;
612
613
614 if (f_v) {
615 cout << "orbit_of_equations::stabilizer_orbit_rep_work computing "
616 "stabilizer inside a group of order " << go << " in action ";
617 default_action->print_info();
618 cout << endl;
619 }
620 E1 = NEW_int(default_action->elt_size_in_int);
621 residue = NEW_int(default_action->elt_size_in_int);
622 len = used_length;
623 D.integral_division_by_int(go, len, target_go, r);
624 if (r) {
625 cout << "orbit_of_equations::stabilizer_orbit_rep_work orbit length "
626 "does not divide group order" << endl;
627 exit(1);
628 }
629 if (f_vv) {
630 cout << "orbit_of_equations::stabilizer_orbit_rep_work expecting "
631 "group of order " << target_go << endl;
632 }
633
634 Stab->init(default_action, verbose_level - 2);
635 Stab->init_trivial_group(verbose_level - 1);
636 while (TRUE) {
637 Stab->group_order(cur_go);
638 if (D.compare(cur_go, target_go) == 0) {
639 break;
640 }
641 if (cnt % 2 || Stab->nb_gen[0] == 0) {
642 get_random_schreier_generator(E1, 0 /* verbose_level */);
643 if (f_vvv) {
644 cout << "orbit_of_equations::stabilizer_orbit_rep_work "
645 "created random Schreier generator" << endl;
646 //default_action->element_print(E1, cout);
647 }
648 }
649 else {
650 Stab->random_schreier_generator(E1, 0 /* verbose_level */);
651 //A->element_move(Stab->schreier_gen, E1, 0);
652 if (f_v4) {
653 cout << "orbit_of_equations::stabilizer_orbit_rep_work "
654 "created random schreier generator from sims"
655 << endl;
656 //default_action->element_print(E1, cout);
657 }
658 }
659
660
661
662 if (Stab->strip(E1, residue, drop_out_level, image,
663 0 /*verbose_level - 3*/)) {
664 if (f_vvv) {
665 cout << "orbit_of_equations::stabilizer_orbit_rep_work "
666 "element strips through" << endl;
667 if (FALSE) {
668 cout << "residue:" << endl;
669 A->element_print(residue, cout);
670 cout << endl;
671 }
672 }
673 f_added = FALSE;
674 }
675 else {
676 f_added = TRUE;
677 if (f_vvv) {
678 cout << "orbit_of_equations::stabilizer_orbit_rep_work "
679 "element needs to be inserted at level = "
680 << drop_out_level << " with image " << image << endl;
681 if (FALSE) {
682 A->element_print(residue, cout);
683 cout << endl;
684 }
685 }
686 Stab->add_generator_at_level(residue, drop_out_level,
687 verbose_level - 4);
688 }
689 Stab->group_order(cur_go);
690 if ((f_vv && f_added) || f_vvv) {
691 cout << "iteration " << cnt
692 << " the n e w group order is " << cur_go
693 << " expecting a group of order " << target_go << endl;
694 }
695 cnt++;
696 }
697 FREE_int(E1);
698 FREE_int(residue);
699 if (f_v) {
700 cout << "orbit_of_equations::stabilizer_orbit_rep_work finished" << endl;
701 }
702}
703
704
706 ring_theory::longinteger_object &full_group_order, int idx,
707 int verbose_level)
708{
709 int f_v = (verbose_level >= 1);
712 int *transporter;
713 int *transporter_inv;
714
715 if (f_v) {
716 cout << "orbit_of_equations::stabilizer_any_point" << endl;
717 }
718
719 transporter = NEW_int(A->elt_size_in_int);
720 transporter_inv = NEW_int(A->elt_size_in_int);
721
722 gens0 = stabilizer_orbit_rep(
723 full_group_order, 0 /* verbose_level */);
724
725 get_transporter(idx,
726 transporter_inv, 0 /* verbose_level */);
727 // transporter_inv is an element which maps
728 // the orbit representative to the given object.
729
730 A->element_invert(transporter_inv, transporter, 0);
731
732
733
734
736
737
738 if (f_v) {
739 cout << "orbit_of_equations::stabilizer_any_point "
740 "before gens->init_generators_for_the_conjugate_group_aGav" << endl;
741 }
743 transporter, verbose_level);
744 if (f_v) {
745 cout << "orbit_of_equations::stabilizer_any_point "
746 "after gens->init_generators_for_the_conjugate_group_aGav" << endl;
747 }
748
749 FREE_int(transporter);
750 FREE_int(transporter_inv);
751
752 if (f_v) {
753 cout << "orbit_of_equations::stabilizer_any_point done" << endl;
754 }
755 FREE_OBJECT(gens0);
756 return gens;
757}
758
759
760int orbit_of_equations::search_equation(int *eqn, int &idx, int verbose_level)
761{
762 int f_v = (verbose_level >= 1);
764 int p[1];
765 p[0] = sz_for_compare;
766 int ret;
767 int *data;
768
769 if (f_v) {
770 cout << "orbit_of_equations::search_data" << endl;
771 }
772 if (f_v) {
773 cout << "The equation is:";
774 AonHPD->HPD->print_equation_simple(cout, eqn);
775 cout << endl;
776 }
777 data = NEW_int(sz_for_compare);
778 data[0] = 0;
779 Int_vec_copy(eqn, data + 1, AonHPD->HPD->get_nb_monomials());
780 if (Sorting.vec_search((void **)Equations,
781 orbit_of_equations_compare_func,
782 p,
783 used_length, data, idx,
784 0 /* verbose_level */)) {
785 if (f_v) {
786 cout << "orbit_of_equations::search_data we found the equation at " << idx << endl;
787 }
788 ret = TRUE;
789 }
790 else {
791 if (f_v) {
792 cout << "orbit_of_equations::search_data we did not find the equation" << endl;
793 }
794 ret = FALSE;
795 }
796 if (f_v) {
797 cout << "orbit_of_equations::search_data done" << endl;
798 }
799 FREE_int(data);
800 return ret;
801}
802
803
804int orbit_of_equations::search_data(int *data, int &idx, int verbose_level)
805{
806 int f_v = (verbose_level >= 1);
808 int p[1];
809 p[0] = sz_for_compare;
810 int ret;
811
812 if (f_v) {
813 cout << "orbit_of_equations::search_data" << endl;
814 }
815 if (f_v) {
816 cout << "The data set is:";
817 Int_vec_print(cout, data, sz_for_compare);
818 cout << endl;
819 }
820 if (Sorting.vec_search((void **)Equations,
821 orbit_of_equations_compare_func,
822 p,
823 used_length, data, idx,
824 0 /* verbose_level */)) {
825 if (f_v) {
826 cout << "orbit_of_equations::search_data we found the equation at " << idx << endl;
827 }
828 ret = TRUE;
829 }
830 else {
831 if (f_v) {
832 cout << "orbit_of_equations::search_data we did not find the equation" << endl;
833 }
834 ret = FALSE;
835 }
836 if (f_v) {
837 cout << "orbit_of_equations::search_data done" << endl;
838 }
839 return ret;
840}
841
842void orbit_of_equations::save_csv(std::string &fname, int verbose_level)
843{
844 int i;
845 int *Data;
847
849 for (i = 0; i < used_length; i++) {
850 Int_vec_copy(Equations[i] + 1, Data + i * nb_monomials, nb_monomials);
851 }
853}
854
855
856static int orbit_of_equations_compare_func(void *a, void *b, void *data)
857{
858 int *A = (int *)a;
859 int *B = (int *)b;
860 int *p = (int *) data;
861 int n = *p;
862 int i;
863
864 for (i = 0; i < n; i++) {
865 if (A[i] < B[i]) {
866 return 1;
867 }
868 if (A[i] > B[i]) {
869 return -1;
870 }
871 }
872 return 0;
873}
874
875}}
876
877
878
a collection of functions related to sorted vectors
int vec_search(void **v, int(*compare_func)(void *a, void *b, void *data), void *data_for_compare, int len, void *a, int &idx, int verbose_level)
Definition: sorting.cpp:945
void int_matrix_write_csv(std::string &fname, int *M, int m, int n)
Definition: file_io.cpp:1300
domain to compute with objects of type longinteger
Definition: ring_theory.h:240
int compare(longinteger_object &a, longinteger_object &b)
void integral_division_by_int(longinteger_object &a, int b, longinteger_object &q, int &r)
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(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 element_invert(void *a, void *av, int verbose_level)
Definition: action_cb.cpp:322
void element_one(void *elt, int verbose_level)
Definition: action_cb.cpp:224
void element_move(void *a, void *b, int verbose_level)
Definition: action_cb.cpp:335
a permutation group represented via a stabilizer chain
Definition: groups.h:1273
void init(actions::action *A, int verbose_level)
Definition: sims.cpp:289
void group_order(ring_theory::longinteger_object &go)
Definition: sims.cpp:951
void init_trivial_group(int verbose_level)
Definition: sims.cpp:584
void add_generator_at_level(int *elt, int lvl, int verbose_level)
Definition: sims_main.cpp:543
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
a strong generating set for a permutation group with respect to a fixed action
Definition: groups.h:1703
void init_generators_for_the_conjugate_group_aGav(strong_generators *SG, int *Elt_a, int verbose_level)
void init_from_sims(groups::sims *S, int verbose_level)
data_structures_groups::vector_ge * gens
Definition: groups.h:1708
induced action on the set of homogeneous polynomials over a finite field
groups::strong_generators * stabilizer_orbit_rep(ring_theory::longinteger_object &full_group_order, int verbose_level)
int search_equation(int *eqn, int &idx, int verbose_level)
induced_actions::action_on_homogeneous_polynomials * AonHPD
Definition: orbits.h:33
void get_canonical_form(int *canonical_equation, int *transporter_to_canonical_form, groups::strong_generators *&gens_stab_of_canonical_equation, ring_theory::longinteger_object &full_group_order, int verbose_level)
int search_data(int *data, int &idx, int verbose_level)
void(* print_function)(int *object, int sz, void *print_function_data)
Definition: orbits.h:49
void save_csv(std::string &fname, int verbose_level)
void map_an_equation(int *object_in, int *object_out, int *Elt, int verbose_level)
void get_random_schreier_generator(int *Elt, int verbose_level)
void stabilizer_orbit_rep_work(actions::action *default_action, ring_theory::longinteger_object &go, groups::sims *&Stab, int verbose_level)
groups::strong_generators * stabilizer_any_point(ring_theory::longinteger_object &full_group_order, int idx, int verbose_level)
void(* reduction_function)(int *object, void *reduction_function_data)
Definition: orbits.h:53
void get_transporter(int idx, int *transporter, int verbose_level)
void init(actions::action *A, field_theory::finite_field *F, induced_actions::action_on_homogeneous_polynomials *AonHPD, groups::strong_generators *SG, int *coeff_in, int verbose_level)
void compute_orbit(int *coeff, int verbose_level)
#define FREE_int(p)
Definition: foundations.h:640
#define NEW_pint(n)
Definition: foundations.h:627
#define NEW_OBJECT(type)
Definition: foundations.h:638
#define FREE_OBJECT(p)
Definition: foundations.h:651
#define NEW_int(n)
Definition: foundations.h:625
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define Int_vec_copy(A, B, C)
Definition: foundations.h:693
#define FREE_pint(p)
Definition: foundations.h:641
#define Int_vec_print(A, B, C)
Definition: foundations.h:685
the orbiter library for the classification of combinatorial objects