Orbiter 2022
Combinatorial Objects
vector_ge.cpp
Go to the documentation of this file.
1// vector_ge.cpp
2//
3// Anton Betten
4// December 9, 2003
5
7#include "group_actions.h"
8
9using namespace std;
10
11
12#undef PRINT_WITH_TYPE
13#define RANGE_CHECKING
14
15namespace orbiter {
16namespace layer3_group_actions {
17namespace data_structures_groups {
18
19
21{
22 A = NULL;
23 data = NULL;
24 len = 0;
25 //null();
26}
27
29{
30 null();
32}
33
35{
36 //cout << "in ~vector_ge data = " << data << endl;
37 freeself();
38}
39
41{
42 vector_ge::A = NULL;
43 data = NULL;
44 len = 0;
45}
46
48{
49 if (data) {
51 data = NULL;
52 }
53}
54
55void vector_ge::init(actions::action *A, int verbose_level)
56{
57 int f_v = (verbose_level >= 1);
58
59 if (f_v) {
60 cout << "vector_ge::init" << endl;
61 }
62 //cout << "vector_ge::init()" << endl;
63 freeself();
65 data = NULL;
66 len = 0;
67 if (f_v) {
68 cout << "vector_ge::init done" << endl;
69 }
70}
71
72void vector_ge::copy(vector_ge *&vector_copy, int verbose_level)
73{
74 int i;
75 int f_v = (verbose_level >= 1);
76
77 if (f_v) {
78 cout << "vector_ge::copy" << endl;
79 }
80
81 vector_copy = NEW_OBJECT(vector_ge);
82 vector_copy->init(A, verbose_level);
83 vector_copy->allocate(len, verbose_level);
84 for (i = 0; i < len; i++) {
85 A->element_move(ith(i), vector_copy->ith(i), 0);
86 }
87 if (f_v) {
88 cout << "vector_ge::copy done" << endl;
89 }
90}
91
92void vector_ge::init_by_hdl(actions::action *A, int *gen_hdl, int nb_gen, int verbose_level)
93{
94 int i;
95 int f_v = (verbose_level >= 1);
96
97 if (f_v) {
98 cout << "vector_ge::init_by_hdl" << endl;
99 }
100 init(A, verbose_level);
101 allocate(nb_gen, verbose_level);
102 for (i = 0; i < nb_gen; i++) {
103 A->element_retrieve(gen_hdl[i], ith(i), 0);
104 }
105 if (f_v) {
106 cout << "vector_ge::init_by_hdl done" << endl;
107 }
108}
109
110void vector_ge::init_single(actions::action *A, int *Elt, int verbose_level)
111{
112 int f_v = (verbose_level >= 1);
113
114 if (f_v) {
115 cout << "vector_ge::init_single" << endl;
116 }
117 init(A, verbose_level);
118 allocate(1, verbose_level);
119 A->element_move(Elt, ith(0), 0);
120 if (f_v) {
121 cout << "vector_ge::init_single done" << endl;
122 }
123}
124
125void vector_ge::init_double(actions::action *A, int *Elt1, int *Elt2, int verbose_level)
126{
127 int f_v = (verbose_level >= 1);
128
129 if (f_v) {
130 cout << "vector_ge::init_double" << endl;
131 }
132 init(A, verbose_level);
133 allocate(2, verbose_level);
134 A->element_move(Elt1, ith(0), 0);
135 A->element_move(Elt2, ith(1), 0);
136 if (f_v) {
137 cout << "vector_ge::init_double done" << endl;
138 }
139}
140
142 actions::action *A, groups::sims *S, int *data,
143 int nb_elements, int verbose_level)
144// data[nb_elements * A->degree]
145{
146 int f_v = (verbose_level >= 1);
147 int f_vv = (verbose_level >= 2);
148 int i;
149 int *Elt;
150
151 if (f_v) {
152 cout << "vector_ge::init_from_permutation_representation" << endl;
153 }
154 Elt = NEW_int(A->elt_size_in_int);
155 init(A, verbose_level);
156 allocate(nb_elements, verbose_level);
157 for (i = 0; i < nb_elements; i++) {
159 Elt, S, data + i * A->degree, 0/*verbose_level*/);
160 if (f_vv) {
161 cout << "vector_ge::init_from_permutation_representation "
162 "generator " << i << ": " << endl;
163 A->element_print_quick(Elt, cout);
164 A->element_print_latex(Elt, cout);
165 }
166 A->element_move(Elt, ith(i), 0);
167 }
168
169 FREE_int(Elt);
170 if (f_v) {
171 cout << "vector_ge::init_from_permutation_representation done" << endl;
172 }
173}
174
176 int nb_elements, int elt_size, int verbose_level)
177{
178 int f_v = (verbose_level >= 1);
179 int f_vv = (verbose_level >= 2);
180 int i;
181 int *Elt;
182
183 if (f_v) {
184 cout << "vector_ge::init_from_data" << endl;
185 }
186 Elt = NEW_int(A->elt_size_in_int);
187 init(A, verbose_level);
188 allocate(nb_elements, verbose_level);
189 for (i = 0; i < nb_elements; i++) {
190 A->make_element(Elt, data + i * elt_size, verbose_level);
191 if (f_vv) {
192 cout << "vector_ge::init_from_data "
193 "generator " << i << ": " << endl;
194 A->element_print_quick(Elt, cout);
195 }
196 A->element_move(Elt, ith(i), 0);
197 }
198
199 FREE_int(Elt);
200 if (f_v) {
201 cout << "vector_ge::init_from_data done" << endl;
202 }
203}
204
206 int *Elt, int verbose_level)
207{
208 int f_v = (verbose_level >= 1);
209 int i;
210 int *Elt1, *Elt2, *Elt3;
211
212 if (f_v) {
213 cout << "vector_ge::init_conjugate_svas_of" << endl;
214 }
215
216 init(v->A, verbose_level);
217 allocate(v->len, verbose_level);
218
219 Elt1 = NEW_int(A->elt_size_in_int);
220 Elt2 = NEW_int(A->elt_size_in_int);
221 Elt3 = NEW_int(A->elt_size_in_int);
222 A->invert(Elt, Elt1);
223 for (i = 0; i < len; i++) {
224 A->element_mult(Elt1, v->ith(i), Elt2, FALSE);
225 A->element_mult(Elt2, Elt, Elt3, FALSE);
226 A->element_move(Elt3, ith(i), FALSE);
227 }
228
229 FREE_int(Elt1);
230 FREE_int(Elt2);
231 FREE_int(Elt3);
232 if (f_v) {
233 cout << "vector_ge::init_conjugate_svas_of done" << endl;
234 }
235}
236
238 int *Elt, int verbose_level)
239{
240 int f_v = (verbose_level >= 1);
241 int i;
242 int *Elt1, *Elt2, *Elt3;
243
244 if (f_v) {
245 cout << "vector_ge::init_conjugate_svas_of" << endl;
246 }
247
248 init(v->A, verbose_level);
249 allocate(v->len, verbose_level);
250
251 Elt1 = NEW_int(A->elt_size_in_int);
252 Elt2 = NEW_int(A->elt_size_in_int);
253 Elt3 = NEW_int(A->elt_size_in_int);
254 A->invert(Elt, Elt1);
255 for (i = 0; i < len; i++) {
256 A->element_mult(Elt, v->ith(i), Elt2, FALSE);
257 A->element_mult(Elt2, Elt1, Elt3, FALSE);
258 A->element_move(Elt3, ith(i), FALSE);
259 }
260
261 FREE_int(Elt1);
262 FREE_int(Elt2);
263 FREE_int(Elt3);
264 if (f_v) {
265 cout << "vector_ge::init_conjugate_sasv_of done" << endl;
266 }
267}
268
269int *vector_ge::ith(int i)
270{
271#ifdef RANGE_CHECKING
272 if (i < 0 || i >= len) {
273 cout << "vector_ge::ith() access error "
274 "i = " << i << " len = " << len << endl;
275 exit(1);
276 }
277#endif
278 return data + i * A->elt_size_in_int;
279}
280
281void vector_ge::print(ostream &ost)
282{
283 int i;
284
285 for (i = 0; i < len; i++) {
286 ost << "Element " << i << " / " << len << " is:" << endl;
287 A->element_print_quick(ith(i), ost);
288 ost << endl;
289 }
290}
291
292#if 0
293ostream& vector_ge::print(ostream& ost)
294{
295 int i;
296
297 ost << "(" << endl;
298 //ost << "len=" << len << " A->elt_size_in_int="
299 //<< A->elt_size_in_int << " data=" << data << endl;
300 for (i = 0; i < len; i++) {
301 if (data == NULL) {
302 cout << "vector_ge::print fatal: data == NULL" << endl;
303 exit(1);
304 }
305 A->element_print(ith(i), ost);
306 if (i < len - 1) {
307 ost << ", " << endl;
308 }
309 }
310 ost << ")" << endl;
311 return ost;
312}
313#endif
314
315void vector_ge::print_quick(ostream& ost)
316{
317 int i;
318
319 ost << "(" << endl;
320 //ost << "len=" << len << " A->elt_size_in_int=" << A->elt_size_in_int << " data=" << data << endl;
321 for (i = 0; i < len; i++) {
322 if (data == NULL) {
323 cout << "vector_ge::print fatal: data == NULL" << endl;
324 exit(1);
325 }
326 A->element_print_quick(ith(i), ost);
327 if (i < len - 1) {
328 ost << ", " << endl;
329 }
330 }
331 ost << ")" << endl;
332}
333
334#if 0
335ostream& vector_ge::print_tex(ostream& ost)
336{
337 int i;
338
339 //ost << "(" << endl;
340 //ost << "len=" << len << " A->elt_size_in_int="
341 //<< A->elt_size_in_int << " data=" << data << endl;
342 for (i = 0; i < len; i++) {
343 if (data == NULL) {
344 cout << "vector_ge::print fatal: data == NULL" << endl;
345 exit(1);
346 }
347 A->element_print_latex(ith(i), ost);
348 if (i < len - 1) {
349 ost << ", " << endl;
350 }
351 }
352 //ost << ")" << endl;
353 return ost;
354}
355#endif
356
357void vector_ge::print_tex(ostream &ost)
358{
359 int i;
360
361 ost << "$$" << endl;
362 for (i = 0; i < len; i++) {
363 //cout << "Generator " << i << " / " << gens->len
364 // << " is:" << endl;
365 A->element_print_latex(ith(i), ost);
366 if (i < len - 1) {
367 ost << ", " << endl;
368 }
369 if (((i + 1) % 3) == 0 && i < len - 1) {
370 ost << "$$" << endl;
371 ost << "$$" << endl;
372 }
373 }
374 ost << "$$" << endl;
375}
376
377
378
380 ring_theory::longinteger_object &go, ostream &ost)
381{
382 int i;
383
384 ost << "Generators for a group of order " << go << ":" << endl;
385 ost << "$$" << endl;
386 for (i = 0; i < len; i++) {
387 //cout << "Generator " << i << " / " << gens->len
388 // << " is:" << endl;
389 A->element_print_latex(ith(i), ost);
390 if (((i + 1) % 4) == 0 && i < len - 1) {
391 ost << "$$" << endl;
392 ost << "$$" << endl;
393 }
394 }
395 ost << "$$" << endl;
396 for (i = 0; i < len; i++) {
398 ost << "\\\\" << endl;
399 }
400}
401
403{
404 int i;
405
406 ost << "(" << endl;
407 for (i = 0; i < len; i++) {
408 A->element_print(ith(i), ost);
409 if (A->degree < 1000) {
410 cout << "is the permutation" << endl;
412 }
413 else {
414 cout << "vector_ge::print_as_permutation "
415 "the degree is too large, we won't print "
416 "the permutation" << endl;
417 }
418 if (i < len - 1) {
419 ost << ", " << endl;
420 }
421 }
422 ost << ")" << endl;
423}
424
425void vector_ge::allocate(int length, int verbose_level)
426{
427 int f_v = (verbose_level >= 1);
428
429 if (f_v) {
430 cout << "vector_ge::allocate" << endl;
431 }
432 if (data) {
433 FREE_int(data);
434 //cout << "vector_ge::allocate warning, data != NULL, "
435 //"we seem to be having a memory leak here" << endl;
436 }
437 len = length;
438 data = NEW_int(length * A->elt_size_in_int);
439 if (f_v) {
440 cout << "vector_ge::allocate done" << endl;
441 }
442}
443
444void vector_ge::reallocate(int new_length, int verbose_level)
445{
446 int *data2;
447 int *elt, *elt2, i, l;
448
449 int f_v = (verbose_level >= 1);
450
451 if (f_v) {
452 cout << "vector_ge::reallocate" << endl;
453 }
454 data2 = NEW_int(new_length * A->elt_size_in_int);
455
456 l = MINIMUM(len, new_length);
457 for (i = 0; i < l; i++) {
458 elt = ith(i);
459 elt2 = data2 + i * A->elt_size_in_int;
460 A->element_move(elt, elt2, FALSE);
461 }
462 if (data) {
463 FREE_int(data);
464 data = NULL;
465 }
466 data = data2;
467 len = new_length;
468 if (f_v) {
469 cout << "vector_ge::reallocate done" << endl;
470 }
471}
472
473void vector_ge::reallocate_and_insert_at(int position, int *elt, int verbose_level)
474{
475 int *data2;
476 int *elt1, *elt2, i;
477
478 int f_v = (verbose_level >= 1);
479
480 if (f_v) {
481 cout << "vector_ge::reallocate_and_insert_at len=" << len << endl;
482 }
483 data2 = NEW_int((len + 1) * A->elt_size_in_int);
484 for (i = 0; i < len; i++) {
485 elt1 = ith(i);
486 if (i >= position) {
487 elt2 = data2 + (i + 1) * A->elt_size_in_int;
488 }
489 else {
490 elt2 = data2 + i * A->elt_size_in_int;
491 }
492 A->element_move(elt1, elt2, FALSE);
493 }
494 if (data) {
495 FREE_int(data);
496 data = NULL;
497 }
498 else {
499 if (f_v) {
500 cout << "vector_ge::reallocate_and_insert_at data == NULL" << endl;
501 }
502 }
503 data = data2;
504 len = len + 1;
505 if (position < 0 || position >= len) {
506 cout << "vector_ge::reallocate_and_insert_at position out of bounds, position=" << position << endl;
507 exit(1);
508 }
509 copy_in(position, elt);
510 if (f_v) {
511 cout << "vector_ge::reallocate_and_insert_at done" << endl;
512 }
513}
514
515void vector_ge::insert_at(int length_before, int position, int *elt, int verbose_level)
516// does not reallocate, but shifts elements up to make space.
517// the last element might be lost if there is no space.
518{
519 int *elt1, *elt2, i;
520
521 int f_v = (verbose_level >= 1);
522
523 if (f_v) {
524 cout << "vector_ge::insert_at" << endl;
525 }
526 for (i = length_before; i >= position; i--) {
527 if (i + 1 >= len) {
528 continue;
529 }
530
531 elt1 = ith(i);
532 elt2 = ith(i + 1);
533 A->element_move(elt1, elt2, FALSE);
534 }
535 copy_in(position, elt);
536 if (f_v) {
537 cout << "vector_ge::insert_at done" << endl;
538 }
539}
540
541void vector_ge::append(int *elt, int verbose_level)
542{
543 int f_v = (verbose_level >= 1);
544
545 if (f_v) {
546 cout << "vector_ge::append" << endl;
547 }
548 reallocate_and_insert_at(len, elt, verbose_level);
549 if (f_v) {
550 cout << "vector_ge::append done" << endl;
551 }
552}
553
554void vector_ge::copy_in(int i, int *elt)
555{
556 int *elt2 = ith(i);
557 A->element_move(elt, elt2, FALSE);
558};
559
560void vector_ge::copy_out(int i, int *elt)
561{
562 int *elt2 = ith(i);
563 A->element_move(elt2, elt, FALSE);
564}
565
567{
568 int i;
569 int *Elt1, *Elt2, *Elt3;
570
571 Elt1 = NEW_int(A->elt_size_in_int);
572 Elt2 = NEW_int(A->elt_size_in_int);
573 Elt3 = NEW_int(A->elt_size_in_int);
574 A->invert(Elt, Elt1);
575 for (i = 0; i < len; i++) {
576 A->element_mult(Elt1, ith(i), Elt2, FALSE);
577 A->element_mult(Elt2, Elt, Elt3, FALSE);
578 A->element_move(Elt3, ith(i), FALSE);
579 }
580 FREE_int(Elt1);
581 FREE_int(Elt2);
582 FREE_int(Elt3);
583}
584
586{
587 int i;
588 int *Elt1, *Elt2, *Elt3;
589
590 Elt1 = NEW_int(A->elt_size_in_int);
591 Elt2 = NEW_int(A->elt_size_in_int);
592 Elt3 = NEW_int(A->elt_size_in_int);
593 A->invert(Elt, Elt1);
594 for (i = 0; i < len; i++) {
595 A->element_mult(Elt, ith(i), Elt2, FALSE);
596 A->element_mult(Elt2, Elt1, Elt3, FALSE);
597 A->element_move(Elt3, ith(i), FALSE);
598 }
599 FREE_int(Elt1);
600 FREE_int(Elt2);
601 FREE_int(Elt3);
602}
603
605{
606 int i, l;
607
608 l = len;
609 for (i = 0; i < l; i++) {
610 ost << "generator " << i << ":" << endl;
611 A->element_print_quick(ith(i), ost);
612 ost << endl;
614 ost << endl;
615 }
616}
617
618void vector_ge::print(ostream &ost, int f_print_as_permutation,
619 int f_offset, int offset, int f_do_it_anyway_even_for_big_degree,
620 int f_print_cycles_of_length_one)
621{
622 int i, l;
623
624 l = len;
625 if (!f_offset) {
626 offset = 0;
627 }
628 ost << "Strong generators: (" << l << " of them)" << endl;
629 ost << "f_print_as_permutation=" << f_print_as_permutation << endl;
630 for (i = 0; i < l; i++) {
631 ost << "generator " << i << ":" << endl;
632 A->element_print_quick(ith(i), ost);
633 ost << endl;
634 if (f_print_as_permutation) {
635 //A->element_print_as_permutation(ith(i), ost);
637 offset, f_do_it_anyway_even_for_big_degree,
638 f_print_cycles_of_length_one, 0/*verbose_level*/);
639 ost << endl;
640 }
641 }
642}
643
645{
646 int i, l;
647
648 l = len;
649 ost << "Strong generators: (" << l << " of them)" << endl;
650 for (i = 0; i < l; i++) {
652 ost << "\\\\" << endl;
653 }
654}
655
656
658 orbiter_kernel_system::memory_object *m, int verbose_level)
659{
660 int f_v = (verbose_level >= 1);
661 int i;
662
663 if (f_v) {
664 cout << "vector_ge::write_to_memory_object" << endl;
665 }
666 m->write_int(len);
667 for (i = 0; i < len; i++) {
669 }
670}
671
673 orbiter_kernel_system::memory_object *m, int verbose_level)
674{
675 int f_v = (verbose_level >= 1);
676 int i, l;
677
678 if (f_v) {
679 cout << "vector_ge::read_from_memory_object" << endl;
680 }
681 m->read_int(&l);
682 allocate(l, verbose_level);
683 for (i = 0; i < len; i++) {
685 }
686}
687
688void vector_ge::write_to_file_binary(ofstream &fp, int verbose_level)
689{
690 int f_v = (verbose_level >= 1);
691 int i;
692
693 if (f_v) {
694 cout << "vector_ge::write_to_file_binary" << endl;
695 }
696 fp.write((char *) &len, sizeof(int));
697 for (i = 0; i < len; i++) {
698 if (f_v) {
699 cout << "vector_ge::write_to_file_binary writing element " << i << " / " << len << endl;
700 }
701 A->element_write_to_file_binary(ith(i), fp, verbose_level);
702 }
703}
704
705void vector_ge::read_from_file_binary(ifstream &fp, int verbose_level)
706{
707 int f_v = (verbose_level >= 1);
708 int i, l;
709
710 if (f_v) {
711 cout << "vector_ge::read_from_file_binary" << endl;
712 }
713 fp.read((char *) &l, sizeof(int));
714 allocate(l, verbose_level);
715 for (i = 0; i < len; i++) {
716 if (f_v) {
717 cout << "vector_ge::read_from_file_binary reading element " << i << " / " << len << endl;
718 }
719 A->element_read_from_file_binary(ith(i), fp, verbose_level);
720 }
721}
722
723void vector_ge::write_to_csv_file_coded(std::string &fname, int verbose_level)
724{
725 int f_v = (verbose_level >= 1);
726 int i, j;
727
728 if (f_v) {
729 cout << "vector_ge::write_to_csv_file_coded" << endl;
730 }
731 int *Table;
732
733 Table = NEW_int(len * A->make_element_size);
734 for (i = 0; i < len; i++) {
735 for (j = 0; j < A->make_element_size; j++) {
736 Table[i * A->make_element_size + j] = ith(i)[j];
737 }
738 }
740
741 Fio.int_matrix_write_csv(fname, Table, len, A->make_element_size);
742 if (f_v) {
743 cout << "vector_ge::write_to_csv_file_coded written file " << fname
744 << " of size " << Fio.file_size(fname) << endl;
745 }
746 if (f_v) {
747 cout << "vector_ge::write_to_csv_file_coded done" << endl;
748 }
749}
750
751void vector_ge::save_csv(std::string &fname, int verbose_level)
752{
753 int f_v = (verbose_level >= 1);
754
755 if (f_v) {
756 cout << "vector_ge::save_csv" << endl;
757 }
758
760 int i;
761 int *Elt;
762 int *data;
763
765 {
766 ofstream ost(fname);
767
768 ost << "Row,Element" << endl;
769 for (i = 0; i < len; i++) {
770 Elt = ith(i);
771
773
774 stringstream ss;
776 ost << i << ",\"" << ss.str() << "\"" << endl;
777 }
778 ost << "END" << endl;
779 }
780 FREE_int(data);
781
782 if (f_v) {
783 cout << "sims::save_csv Written file " << fname << " of size " << Fio.file_size(fname) << endl;
784 }
785
786}
787void vector_ge::read_column_csv(std::string &fname, actions::action *A, int col_idx, int verbose_level)
788{
789 int f_v = (verbose_level >= 1);
790
791 if (f_v) {
792 cout << "vector_ge::read_column_csv" << endl;
793 }
794
797 int n, i, me_sz;
798
799
800 init(A, verbose_level);
801
802 me_sz = A->make_element_size;
803
804 if (f_v) {
805 cout << "vector_ge::read_column_csv reading file " << fname
806 << " of size " << Fio.file_size(fname) << endl;
807 }
808
809 S.read_spreadsheet(fname, verbose_level);
810
811 n = S.nb_rows - 1;
812
813 allocate(n, verbose_level);
814 for (i = 0; i < n; i++) {
815 string s;
816 int *data;
817 int sz;
818
819 S.get_string(s, i + 1, col_idx);
820 Int_vec_scan(s, data, sz);
821 if (sz != me_sz) {
822 cout << "vector_ge::read_column_csv sz != me_sz" << endl;
823 cout << "vector_ge::read_column_csv sz = " << sz << endl;
824 cout << "vector_ge::read_column_csv me_sz = " << me_sz << endl;
825 exit(1);
826 }
827 A->make_element(ith(i), data, 0 /*verbose_level*/);
828 FREE_int(data);
829 }
830
831 if (f_v) {
832 cout << "vector_ge::read_column_csv done" << endl;
833 }
834}
835
837 const char *rank_vector_text, groups::sims *S, int verbose_level)
838{
839 int f_v = (verbose_level >= 1);
840
841 if (f_v) {
842 cout << "vector_ge::extract_subset_of_elements_"
843 "by_rank_text_vector" << endl;
844 }
845 int *v;
846 int len;
847
848 Int_vec_scan(rank_vector_text, v, len);
849 if (f_v) {
850 cout << "vector_ge::extract_subset_of_elements_"
851 "by_rank_text_vector after scanning: ";
852 Int_vec_print(cout, v, len);
853 cout << endl;
854 }
855 extract_subset_of_elements_by_rank(v, len, S, verbose_level);
856 FREE_int(v);
857 if (f_v) {
858 cout << "vector_ge::extract_subset_of_elements_"
859 "by_rank_text_vector done" << endl;
860 }
861}
862
864 int *rank_vector, int len, groups::sims *S, int verbose_level)
865{
866 int f_v = (verbose_level >= 1);
867 long int i, r;
868 int *Elt;
869
870 if (f_v) {
871 cout << "vector_ge::extract_subset_of_elements_by_rank" << endl;
872 }
873 Elt = NEW_int(A->elt_size_in_int);
874 allocate(len, verbose_level);
875 for (i = 0; i < len; i++) {
876 r = rank_vector[i];
877 S->element_unrank_lint(r, Elt);
878
879 if (f_v) {
880 cout << "vector_ge::extract_subset_of_elements_by_rank "
881 "element " << i << " = " << r << " / " << len << endl;
882 A->element_print_quick(Elt, cout);
883 }
884 A->element_move(Elt, ith(i), 0);
885 }
886 FREE_int(Elt);
887 if (f_v) {
888 cout << "vector_ge::extract_subset_of_elements_by_rank done" << endl;
889 }
890}
891
893{
894 int i;
895
896 for (i = 0; i < len; i++) {
897 if (A2->element_image_of(pt, ith(i), 0) != pt) {
898 return FALSE;
899 }
900 }
901 return TRUE;
902}
903
905 long int *set, int sz, int verbose_level)
906{
907 int f_v = (verbose_level >= 1);
908 int i;
909
910 if (f_v) {
911 cout << "vector_ge::test_if_all_elements_stabilize_a_set" << endl;
912 }
913
914 for (i = 0; i < len; i++) {
915 if (f_v) {
916 cout << "testing element " << i << " / " << len << endl;
917 }
918 if (!A2->test_if_set_stabilizes(ith(i),
919 sz, set, 0 /* verbose_level*/)) {
920 return FALSE;
921 }
922 }
923 if (f_v) {
924 cout << "vector_ge::test_if_all_elements_stabilize_a_set done" << endl;
925 }
926 return TRUE;
927}
928
929
931 actions::action *A_given, int verbose_level)
932{
933 int f_v = (verbose_level >= 1);
934 groups::schreier *Sch;
935
936 if (f_v) {
937 cout << "vector_ge::orbits_on_points_schreier "
938 "degree = " << A_given->degree << endl;
939 }
940 if (f_v) {
941 cout << "vector_ge::orbits_on_points_schreier "
942 "action ";
943 A_given->print_info();
944 cout << endl;
945 }
946
948
949 Sch->init(A_given, verbose_level - 2);
950 Sch->initialize_tables();
951 Sch->init_generators(*this, verbose_level - 2);
952 Sch->compute_all_point_orbits(verbose_level);
953
954 if (f_v) {
955 cout << "vector_ge::orbits_on_points_schreier "
956 "done, we found " << Sch->nb_orbits << " orbits" << endl;
957 }
958 return Sch;
959}
960
962{
963 int f_v = (verbose_level >= 1);
964 int i;
966
967 if (f_v) {
968 cout << "vector_ge::reverse_isomorphism_exterior_square" << endl;
969 }
970
973 int A4[17];
974
975
977
979 O->init(1 /* epsilon */, 6 /* n */, F, verbose_level);
980
982 K->init(F, O, verbose_level);
983
984
985 for (i = 0; i < len; i++) {
986
987 K->reverse_isomorphism(ith(i), A4, verbose_level);
988 cout << "generator " << i << " / " << len << ":" << endl;
989
990 cout << "before:" << endl;
991 Int_matrix_print(ith(i), 6, 6);
992
993 cout << "after:" << endl;
994 Int_matrix_print(A4, 4, 4);
995 }
996
997 FREE_OBJECT(K);
998 FREE_OBJECT(O);
999 if (f_v) {
1000 cout << "vector_ge::reverse_isomorphism_exterior_square done" << endl;
1001 }
1002}
1003
1005 induced_actions::action_on_homogeneous_polynomials *A_on_HPD, int *&M, int &nb_gens,
1006 int verbose_level)
1007{
1008 int f_v = (verbose_level >= 1);
1009 int i;
1010 int n;
1011
1012 if (f_v) {
1013 cout << "vector_ge::matrix_representation" << endl;
1014 }
1015
1016 nb_gens = len;
1017
1018 n = A_on_HPD->dimension;
1019
1020 M = NEW_int(len * n * n);
1021
1022 for (i = 0; i < len; i++) {
1023
1024 A_on_HPD->compute_representation(ith(i),
1025 M + i * n * n, verbose_level);
1026
1027 }
1028
1029 if (f_v) {
1030 cout << "vector_ge::matrix_representation done" << endl;
1031 }
1032}
1033
1034
1035
1036}}}
1037
1038
1039
void read_spreadsheet(std::string &fname, int verbose_level)
the Klein correspondence between lines in PG(3,q) and points on the Klein quadric
Definition: geometry.h:1353
void init(field_theory::finite_field *F, orthogonal_geometry::orthogonal *O, int verbose_level)
void reverse_isomorphism(int *A6, int *A4, int verbose_level)
void int_matrix_write_csv(std::string &fname, int *M, int m, int n)
Definition: file_io.cpp:1300
void init(int epsilon, int n, field_theory::finite_field *F, int verbose_level)
Definition: orthogonal.cpp:312
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_latex(void *elt, std::ostream &ost)
Definition: action_cb.cpp:364
void element_print_as_permutation_with_offset(void *elt, std::ostream &ost, int offset, int f_do_it_anyway_even_for_big_degree, int f_print_cycles_of_length_one, int verbose_level)
Definition: action_cb.cpp:463
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 make_element_from_permutation_representation(int *Elt, groups::sims *S, int *data, int verbose_level)
Definition: action.cpp:1664
void element_retrieve(int hdl, void *elt, int verbose_level)
Definition: action_cb.cpp:301
void element_read_from_file_binary(int *Elt, std::ifstream &fp, int verbose_level)
Definition: action_cb.cpp:737
void element_mult(void *a, void *b, void *ab, int verbose_level)
Definition: action_cb.cpp:315
void element_read_from_memory_object(int *Elt, orbiter_kernel_system::memory_object *m, int verbose_level)
Definition: action_cb.cpp:689
void element_write_to_file_binary(int *Elt, std::ofstream &fp, int verbose_level)
Definition: action_cb.cpp:708
void element_print_for_make_element(void *elt, std::ostream &ost)
Definition: action_cb.cpp:409
void element_code_for_make_element(void *elt, int *data)
Definition: action_cb.cpp:403
field_theory::finite_field * matrix_group_finite_field()
Definition: action.cpp:2883
void make_element(int *Elt, int *data, int verbose_level)
Definition: action.cpp:1875
int test_if_set_stabilizes(int *Elt, int size, long int *set, int verbose_level)
Definition: action.cpp:622
void element_move(void *a, void *b, int verbose_level)
Definition: action_cb.cpp:335
void element_write_to_memory_object(int *Elt, orbiter_kernel_system::memory_object *m, int verbose_level)
Definition: action_cb.cpp:673
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 init_double(actions::action *A, int *Elt1, int *Elt2, int verbose_level)
Definition: vector_ge.cpp:125
void extract_subset_of_elements_by_rank_text_vector(const char *rank_vector_text, groups::sims *S, int verbose_level)
Definition: vector_ge.cpp:836
void write_to_memory_object(orbiter_kernel_system::memory_object *m, int verbose_level)
Definition: vector_ge.cpp:657
void init_conjugate_svas_of(vector_ge *v, int *Elt, int verbose_level)
Definition: vector_ge.cpp:205
void reallocate_and_insert_at(int position, int *elt, int verbose_level)
Definition: vector_ge.cpp:473
void matrix_representation(induced_actions::action_on_homogeneous_polynomials *A_on_HPD, int *&M, int &nb_gens, int verbose_level)
Definition: vector_ge.cpp:1004
void read_from_memory_object(orbiter_kernel_system::memory_object *m, int verbose_level)
Definition: vector_ge.cpp:672
void extract_subset_of_elements_by_rank(int *rank_vector, int len, groups::sims *S, int verbose_level)
Definition: vector_ge.cpp:863
void init_conjugate_sasv_of(vector_ge *v, int *Elt, int verbose_level)
Definition: vector_ge.cpp:237
void init_single(actions::action *A, int *Elt, int verbose_level)
Definition: vector_ge.cpp:110
void read_column_csv(std::string &fname, actions::action *A, int col_idx, int verbose_level)
Definition: vector_ge.cpp:787
void write_to_csv_file_coded(std::string &fname, int verbose_level)
Definition: vector_ge.cpp:723
void reallocate(int new_length, int verbose_level)
Definition: vector_ge.cpp:444
void save_csv(std::string &fname, int verbose_level)
Definition: vector_ge.cpp:751
groups::schreier * orbits_on_points_schreier(actions::action *A_given, int verbose_level)
Definition: vector_ge.cpp:930
void insert_at(int length_before, int position, int *elt, int verbose_level)
Definition: vector_ge.cpp:515
void write_to_file_binary(std::ofstream &fp, int verbose_level)
Definition: vector_ge.cpp:688
void copy(vector_ge *&vector_copy, int verbose_level)
Definition: vector_ge.cpp:72
void init_from_data(actions::action *A, int *data, int nb_elements, int elt_size, int verbose_level)
Definition: vector_ge.cpp:175
void init(actions::action *A, int verbose_level)
Definition: vector_ge.cpp:55
void print_generators_tex(ring_theory::longinteger_object &go, std::ostream &ost)
Definition: vector_ge.cpp:379
void init_from_permutation_representation(actions::action *A, groups::sims *S, int *data, int nb_elements, int verbose_level)
Definition: vector_ge.cpp:141
int test_if_all_elements_stabilize_a_set(actions::action *A2, long int *set, int sz, int verbose_level)
Definition: vector_ge.cpp:904
void init_by_hdl(actions::action *A, int *gen_hdl, int nb_gen, int verbose_level)
Definition: vector_ge.cpp:92
void read_from_file_binary(std::ifstream &fp, int verbose_level)
Definition: vector_ge.cpp:705
void print_with_given_action(std::ostream &ost, actions::action *A2)
Definition: vector_ge.cpp:604
int test_if_all_elements_stabilize_a_point(actions::action *A2, int pt)
Definition: vector_ge.cpp:892
Schreier trees for orbits of groups on points.
Definition: groups.h:839
void compute_all_point_orbits(int verbose_level)
Definition: schreier.cpp:988
void init_generators(data_structures_groups::vector_ge &generators, int verbose_level)
Definition: schreier.cpp:373
void init(actions::action *A, int verbose_level)
Definition: schreier.cpp:308
a permutation group represented via a stabilizer chain
Definition: groups.h:1273
void element_unrank_lint(long int rk, int *Elt, int verbose_level)
Definition: sims.cpp:1326
induced action on the set of homogeneous polynomials over a finite field
#define Int_vec_scan(A, B, C)
Definition: foundations.h:716
#define MINIMUM(x, y)
Definition: foundations.h:216
#define FREE_int(p)
Definition: foundations.h:640
#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 Int_matrix_print(A, B, C)
Definition: foundations.h:707
#define Int_vec_print_str_naked(A, B, C)
Definition: foundations.h:700
#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