Orbiter 2022
Combinatorial Objects
young.cpp
Go to the documentation of this file.
1// young.cpp
2//
3// Anton Betten
4//
5// started: March 16, 2015
6//
7//
8//
9
10#include "orbiter.h"
11
12using namespace std;
13
14namespace orbiter {
15namespace layer5_applications {
16namespace apps_algebra {
17
18
20{
21 null();
22}
23
25{
26 freeself();
27}
28
30{
31 A = NULL;
32 Elt = NULL;
33 v = NULL;
34 Aconj = NULL;
35 ABC = NULL;
36 Sch = NULL;
37 SG = NULL;
38 class_size = NULL;
39 class_rep = NULL;
40 D = NULL;
41
42 row_parts = NULL;
43 col_parts = NULL;
44 Tableau = NULL;
45
46 Row_partition = NULL;
47 Col_partition = NULL;
48
49 gens1 = NULL;
50 gens2 = NULL;
51 S1 = NULL;
52 S2 = NULL;
53}
54
56{
57 int verbose_level = 0;
58 int f_v = (verbose_level >= 1);
59
60
61 if (f_v) {
62 cout << "young::freeself" << endl;
63 }
64
65 if (f_v) {
66 cout << "young::freeself before delete Sch" << endl;
67 }
68 if (Sch) {
69 delete Sch;
70 }
71 if (f_v) {
72 cout << "young::freeself before delete SG" << endl;
73 }
74 if (SG) {
75 delete SG;
76 }
77 if (class_size) {
79 }
80 if (class_rep) {
82 }
83 if (f_v) {
84 cout << "young::freeself before delete D" << endl;
85 }
86 if (D) {
87 delete D;
88 }
89 if (col_parts) {
91 }
92 if (Tableau) {
94 }
95 if (Row_partition) {
96 delete Row_partition;
97 }
98 if (Col_partition) {
99 delete Col_partition;
100 }
101 if (f_v) {
102 cout << "young::freeself before delete gens1" << endl;
103 }
104 if (gens1) {
105 delete gens1;
106 }
107 if (gens2) {
108 delete gens2;
109 }
110 if (f_v) {
111 cout << "young::freeself before delete S1" << endl;
112 }
113 if (S1) {
114 delete S1;
115 }
116 if (S2) {
117 delete S2;
118 }
119
120
121 if (f_v) {
122 cout << "young::freeself before delete A" << endl;
123 }
124 if (A) {
125 delete A;
126 }
127 if (Elt) {
128 FREE_int(Elt);
129 }
130 if (v) {
131 FREE_int(v);
132 }
133
134 if (f_v) {
135 cout << "young::freeself before delete Aconj" << endl;
136 }
137 if (Aconj) {
138 delete Aconj;
139 }
140#if 0
141 if (f_v) {
142 cout << "young::freeself before delete ABC" << endl;
143 }
144 if (ABC) {
145 delete ABC;
146 }
147#endif
148 if (f_v) {
149 cout << "young::freeself done" << endl;
150 }
151}
152
153void young::init(int n, int verbose_level)
154{
155 int f_v = (verbose_level >= 1);
156 int f_vv = (verbose_level >= 2);
157 int i;
158
159 if (f_v) {
160 cout << "young::init" << endl;
161 }
162 int f_no_base = FALSE;
163
164 young::n = n;
166 A->init_symmetric_group(n, f_no_base, verbose_level);
167 A->group_order(go);
168
169 goi = go.as_int();
170
171 if (f_v) {
172 cout << "Created group Sym(" << n << ") of size " << goi << endl;
173 }
174
176
177 v = NEW_int(n);
178
179 S = A->Sims;
180
181 if (f_vv) {
182 cout << "Listing all elements in the group "
183 "Sym(" << n << "):" << endl;
184 for (i = 0; i < goi; i++) {
186 cout << "element " << i << " is ";
187 A->element_print_quick(Elt, cout);
188 cout << endl;
189 }
190 }
191
192
193 if (f_v) {
194 cout << "computing conjugacy classes:" << endl;
195 }
196
199 verbose_level);
200
201 if (f_v) {
202 cout << "computing conjugacy classes done" << endl;
203 }
204
205
206
208 D->init_integer_fractions(verbose_level);
209
210 if (f_v) {
211 cout << "young::init done" << endl;
212 }
213}
214
215void young::create_module(int *h_alpha,
216 int *&Base, int *&base_cols, int &rk,
217 int verbose_level)
218{
219 int f_v = (verbose_level >= 1);
220 int i, j;
221
222 if (f_v) {
223 cout << "young::create_module" << endl;
224 }
225
226 int sz;
227
228
231
232
233 int *M1;
234
235 M1 = NEW_int(goi * sz);
236 Base = NEW_int(goi * sz * D->size_of_instance_in_int);
237 for (j = 0; j < sz; j++) {
238 M1[0 * sz + j] = h_alpha[j];
239 }
240
241 int *elt4, *elt5;
242
245
246
247 for (i = 1; i < goi; i++) {
249 elt4[i] = 1;
250 group_ring_element_mult(A, S, h_alpha, elt4, elt5);
251 for (j = 0; j < sz; j++) {
252 M1[i * sz + j] = elt5[j];
253 }
254 }
255
256
257 if (FALSE) {
258 cout << "M1=" << endl;
259 Int_matrix_print(M1, goi, sz);
260 }
261
262 for (i = 0; i < goi * sz; i++) {
263 D->make_integer(D->offset(Base, i), M1[i], 0 /* verbose_level*/);
264 }
265
266 if (f_v) {
267 cout << "A basis is:" << endl;
268 D->print_matrix(Base, goi, sz);
269 }
270
271 int f_special = FALSE;
272 int f_complete = TRUE;
273 int f_P = FALSE;
274
275 base_cols = NEW_int(sz);
276
277 if (f_v) {
278 cout << "Calling Gauss_echelon_form:" << endl;
279 }
280
281 rk = D->Gauss_echelon_form(Base, f_special, f_complete, base_cols,
282 f_P, NULL, goi, sz, goi, 0 /*verbose_level*/);
283
284 if (f_v) {
285 cout << "rk=" << rk << endl;
286 cout << "Basis=" << endl;
287 D->print_matrix(Base, rk, sz);
288 }
289
290 if (f_v) {
291 cout << "base_cols=" << endl;
292 Int_vec_print(cout, base_cols, rk);
293 cout << endl;
294 }
295
296
297 FREE_int(M1);
298 FREE_int(elt4);
299 FREE_int(elt5);
300
301 if (f_v) {
302 cout << "young::create_module done" << endl;
303 }
304}
305
307 int *base_cols, int rk, int verbose_level)
308{
309 int f_v = (verbose_level >= 1);
310 int f_v3 = (verbose_level >= 3);
311 int i, j, h, sz;
312
313 if (f_v) {
314 cout << "young::create_representations" << endl;
315 }
316 int ii, idx, c;
317
318 int *Mtx;
319 int *M4;
320 int *elt3, *elt4, *elt5;
321
323
324 Mtx = NEW_int(rk * rk * D->size_of_instance_in_int);
325 M4 = NEW_int((rk + 1) * sz * D->size_of_instance_in_int);
326
330
331 for (c = 0; c < nb_classes; c++) {
332
333
334 h = class_rep[c];
335
336 //for (c = -1, h = 0; h < sz; h++) {
337
338
339 for (i = 0; i < rk; i++) {
340 for (j = 0; j < sz; j++) {
341 elt3[j] = D->as_int(D->offset(Base, i * sz + j), 0);
342 }
344 elt4[h] = 1;
345 group_ring_element_mult(A, S, elt3, elt4, elt5);
346
347 for (ii = 0; ii < rk * sz; ii++) {
348 D->copy(D->offset(Base, ii), D->offset(M4, ii), 0);
349 }
350 for (j = 0; j < sz; j++) {
351 D->make_integer(D->offset(M4, rk * sz + j),
352 elt5[j], 0 /* verbose_level*/);
353 }
354
355
356 if (f_v3) {
357 cout << "The extended matrix is:" << endl;
358 D->print_matrix(M4, rk + 1, sz);
359 }
360
361
362 for (ii = 0; ii < rk; ii++) {
363 idx = base_cols[ii];
364 D->copy(D->offset(M4, rk * sz + idx),
365 D->offset(Mtx, i * rk + ii), 0);
366 }
367
368 for (ii = 0; ii < rk; ii++) {
369 idx = base_cols[ii];
370 D->Gauss_step(D->offset(M4, ii * sz),
371 D->offset(M4, rk * sz), sz, idx,
372 0 /* verbose_level */);
373 if (f_v3) {
374 cout << "Row " << i << " basis vector " << ii
375 << " has been subtracted" << endl;
376 D->print_matrix(M4, rk + 1, sz);
377 }
378
379 }
380 if (!D->is_zero_vector(D->offset(M4, rk * sz), sz,
381 0 /* verbose_level */)) {
382 cout << "The vector does not lie in the span of the "
383 "basis, something is wrong" << endl;
384 exit(1);
385 }
386
387 if (f_v3) {
388 cout << "Row " << i << " has been computed" << endl;
389 }
390
391 } // next i
392
393
394 cout << "Conjugacy class " << c << " is represented "
395 "by group element " << h;
397 cout << " which is ";
398 A->element_print(Elt, cout);
399 cout << " which is represented by the matrix:" << endl;
400 D->print_matrix(Mtx, rk, rk);
401 cout << endl;
402
403
404 } // next c
405
406
407 FREE_int(elt3);
408 FREE_int(elt4);
409 FREE_int(elt5);
410 FREE_int(Mtx);
411
412 if (f_v) {
413 cout << "young::create_representations done" << endl;
414 }
415}
416
418 int *Base_inv, int rk, int group_elt, int *Mtx,
419 int verbose_level)
420// Mtx[rk * rk * D->size_of_instance_in_int]
421{
422 int f_v = (verbose_level >= 1);
423 int f_v3 = (verbose_level >= 3);
424 int i, j, sz;
425
426 if (f_v) {
427 cout << "young::create_representation" << endl;
428 }
429 int ii;
430
431 int *M4;
432 int *elt3, *elt4, *elt5;
433
435
436 M4 = NEW_int((rk + 1) * sz * D->size_of_instance_in_int);
437
441
442
443 for (i = 0; i < rk; i++) {
444 for (j = 0; j < sz; j++) {
445 elt3[j] = D->as_int(D->offset(Base, i * sz + j), 0);
446 }
448 elt4[group_elt] = 1;
449 group_ring_element_mult(A, S, elt3, elt4, elt5);
450
451 for (ii = 0; ii < rk * sz; ii++) {
452 D->copy(D->offset(Base, ii), D->offset(M4, ii), 0);
453 }
454 for (j = 0; j < sz; j++) {
455 D->make_integer(D->offset(M4, rk * sz + j), elt5[j],
456 0 /* verbose_level*/);
457 }
458
459
460 if (f_v3) {
461 cout << "The extended matrix is:" << endl;
462 D->print_matrix(M4, rk + 1, sz);
463 }
464
465 D->mult_matrix(D->offset(M4, rk * sz), Base_inv,
466 D->offset(Mtx, i * rk), 1, rk, rk, 0);
467
468#if 0
469 for (ii = 0; ii < rk; ii++) {
470 idx = base_cols[ii];
471 D->copy(D->offset(M4, rk * sz + idx),
472 D->offset(Mtx, i * rk + ii), 0);
473 D->Gauss_step(D->offset(M4, ii * sz),
474 D->offset(M4, rk * sz), sz, idx,
475 0 /* verbose_level */);
476 if (f_v3) {
477 cout << "Row " << i << " basis vector " << ii
478 << " has been subtracted" << endl;
479 D->print_matrix(M4, rk + 1, sz);
480 }
481
482 }
483 if (!D->is_zero_vector(D->offset(M4, rk * sz), sz,
484 0 /* verbose_level */)) {
485 cout << "The vector does not lie in the span of the "
486 "basis, something is wrong" << endl;
487 exit(1);
488 }
489#endif
490
491 if (f_v3) {
492 cout << "Row " << i << " has been computed" << endl;
493 }
494
495 } // next i
496
497 if (f_v) {
498 cout << "The element " << group_elt << " is represented "
499 "by the matrix:" << endl;
500 D->print_matrix(Mtx, rk, rk);
501 cout << endl;
502 }
503
504
505
506 FREE_int(elt3);
507 FREE_int(elt4);
508 FREE_int(elt5);
509
510 if (f_v) {
511 cout << "young::create_representation done" << endl;
512 }
513}
514
515void young::young_symmetrizer(int *row_parts, int nb_row_parts,
516 int *tableau,
517 int *elt1, int *elt2, int *elt3,
518 int verbose_level)
519{
520 int f_v = (verbose_level >= 1);
521 int f_vv = (verbose_level >= 2);
522 int i, j, a, b, h;
524
525 if (f_v) {
526 cout << "young::young_symmetrizer" << endl;
527 }
528
530 l1 = nb_row_parts;
531 l2 = row_parts[0];
532 Tableau = NEW_int(l1 * l2);
534
535 a = row_parts[l1 - 1];
536 for (j = 0; j < a; j++) {
537 col_parts[j] = l1;
538 }
539 for (i = l1 - 2; i >= 0; i--) {
540 b = row_parts[i];
541 //cout << "i=" << i << " a=" << a << " b=" << b << endl;
542 if (b == a) {
543 continue;
544 }
545 for ( ; j < b; j++) {
546 col_parts[j] = i + 1;
547 }
548 a = b;
549 }
550
551 if (f_v) {
552 cout << "row_part: ";
553 Int_vec_print(cout, row_parts, l1);
554 cout << endl;
555 cout << "col_part: ";
556 Int_vec_print(cout, col_parts, l2);
557 cout << endl;
558 }
559
560 h = 0;
561 for (i = 0; i < l1; i++) {
562 a = row_parts[i];
563 for (j = 0; j < a; j++) {
564 Tableau[i * l2 + j] = tableau[h];
565 h++;
566 }
567 }
568
569 if (f_v) {
570 cout << "We are using the following tableau:" << endl;
572 }
573
574
577
578 Row_partition->init_basic_with_Sz_in_int(n, l1, row_parts, 0 /* verbose_level*/);
579 for (i = 0; i < l1; i++) {
580 a = row_parts[i];
581 for (j = 0; j < a; j++) {
582 b = Tableau[i * l2 + j];
583 Row_partition->Sets[i][j] = b;
584 }
585 cout << endl;
586 }
587 Col_partition->init_basic_with_Sz_in_int(n, l2, col_parts, 0 /* verbose_level*/);
588 for (i = 0; i < l2; i++) {
589 a = col_parts[i];
590 for (j = 0; j < a; j++) {
591 b = Tableau[j * l2 + i];
592 Col_partition->Sets[i][j] = b;
593 }
594 cout << endl;
595 }
596
597 if (f_v) {
598 cout << "Row partition:" << endl;
600 cout << "Col partition:" << endl;
602 }
603
604
605 int go1, go2;
606
607 compute_generators(go1, go2, verbose_level);
608
609
611 gens1, go1, 0 /* verbose_level */);
612 if (f_v) {
613 cout << "Row stabilizer created" << endl;
614 }
615
616
617 if (f_vv) {
618 for (i = 0; i < go1; i++) {
620 cout << "element " << i << " is ";
621 A->element_print_quick(Elt, cout);
622 cout << endl;
623 }
624 }
625
626
627
629 gens2, go2, 0 /* verbose_level */);
630 if (f_v) {
631 cout << "Column stabilizer created" << endl;
632 }
633
634 if (f_v) {
635 for (i = 0; i < go2; i++) {
637 cout << "element " << i << " is ";
638 A->element_print_quick(Elt, cout);
639 cout << endl;
640 }
641 }
642
643
644 Int_vec_zero(elt1, goi);
645 Int_vec_zero(elt2, goi);
646
647
648 // Unrank the element in the row-stabilizer subgroup,
649 // then rank the element in the symmetric group.
650 // Put the coefficient as one.
651 for (i = 0; i < go1; i++) {
653 j = S->element_rank_lint(Elt);
654 elt1[j] += 1;
655 }
656
657 int s;
658
659 // Unrank the element in the column-stabilizer subgroup,
660 // then rank the element in the symmetric group.
661 // Put the coefficient as the sign of the permutation.
662 for (i = 0; i < go2; i++) {
664 j = S->element_rank_lint(Elt);
665
666 s = Combi.perm_signum(Elt, n);
667
668 elt2[j] += s;
669 }
670
671
672 if (f_v) {
673 cout << "elt1=" << endl;
675 cout << endl;
676
677 cout << "elt2=" << endl;
679 cout << endl;
680 }
681
682 // multiply the two group ring elements:
683
684 group_ring_element_mult(A, S, elt1, elt2, elt3);
685
686 if (f_v) {
687 cout << "elt3=" << endl;
689 cout << endl;
690 }
691
692
693
694 if (f_v) {
695 cout << "young::young_symmetrizer done" << endl;
696 }
697}
698
699void young::compute_generators(int &go1, int &go2, int verbose_level)
700{
701 int f_v = (verbose_level >= 1);
702 int i, j, a, h;
704
705 if (f_v) {
706 cout << "young::compute_generators" << endl;
707 }
708
709 int nb_gens1, nb_gens2;
710
711 nb_gens1 = 0;
712 for (i = 0; i < l1; i++) {
713 a = row_parts[i];
714 if (a > 1) {
715 nb_gens1 += a - 1;
716 }
717 }
718 if (f_v) {
719 cout << "nb_gens1 = " << nb_gens1 << endl;
720 }
721
722 nb_gens2 = 0;
723 for (i = 0; i < l2; i++) {
724 a = col_parts[i];
725 if (a > 1) {
726 nb_gens2 += a - 1;
727 }
728 }
729 if (f_v) {
730 cout << "nb_gens2 = " << nb_gens2 << endl;
731 }
732
735
736 int u, s, t;
737
738 gens1->init(A, verbose_level - 2);
739 gens1->allocate(nb_gens1, verbose_level - 2);
740 h = 0;
741 go1 = 1;
742 for (i = 0; i < l1; i++) {
743 a = row_parts[i];
744 if (a > 1) {
745 go1 *= Combi.int_factorial(a);
746 for (j = 1; j < a; j++, h++) {
747 for (u = 0; u < n; u++) {
748 v[u] = u;
749 }
750 s = Row_partition->Sets[i][0];
751 t = Row_partition->Sets[i][j];
752 v[s] = t;
753 v[t] = s;
754 A->make_element(Elt, v, 0 /* verbose_level */);
755 A->element_move(Elt, gens1->ith(h), 0);
756 }
757 }
758 }
759 if (f_v) {
760 cout << "go1=" << go1 << endl;
761 cout << "Generators for row stabilizer:" << endl;
762 gens1->print(cout);
763 }
764
765 gens2->init(A, verbose_level - 2);
766 gens2->allocate(nb_gens2, verbose_level - 2);
767 h = 0;
768 go2 = 1;
769 for (i = 0; i < l2; i++) {
770 a = col_parts[i];
771 if (a > 1) {
772 go2 *= Combi.int_factorial(a);
773 for (j = 1; j < a; j++, h++) {
774 for (u = 0; u < n; u++) {
775 v[u] = u;
776 }
777 s = Col_partition->Sets[i][0];
778 t = Col_partition->Sets[i][j];
779 v[s] = t;
780 v[t] = s;
781 A->make_element(Elt, v, 0 /* verbose_level */);
782 A->element_move(Elt, gens2->ith(h), 0);
783 }
784 }
785 }
786 if (f_v) {
787 cout << "go2=" << go2 << endl;
788 cout << "Generators for col stabilizer:" << endl;
789 gens2->print(cout);
790 }
791
792 if (f_v) {
793 cout << "young::compute_generators done" << endl;
794 }
795
796}
797
798void young::Maschke(int *Rep,
799 int dim_of_module, int dim_of_submodule,
800 int *&Mu,
801 int verbose_level)
802{
803 int f_v = (verbose_level >= 1);
804 int f_vv = (verbose_level >= 2);
805 int n, k, r;
806 int i, j, h, hv;
807 int sz;
808 int *A, *Av;
809 int *g, *gv, *Tau, *Theta, *TauTheta;
810
811 if (f_v) {
812 cout << "young::Maschke" << endl;
813 }
814
815 n = dim_of_module;
816 k = dim_of_submodule;
817 r = n - k;
818
819 sz = dim_of_module * dim_of_module * D->size_of_instance_in_int;
820 if (f_v) {
821 cout << "young::Maschke n=" << n << endl;
822 cout << "young::Maschke k=" << k << endl;
823 cout << "young::Maschke r=" << r << endl;
824 }
825
826
827 if (f_v) {
828 cout << "young::Maschke checking if submodule "
829 "is invariant" << endl;
830 }
831 for (h = 0; h < goi; h++) {
832 A = Rep + h * sz;
833 for (i = 0; i < dim_of_submodule; i++) {
834 for (j = dim_of_submodule; j < dim_of_module; j++) {
835 if (!D->is_zero(D->offset(A, i * dim_of_module + j), 0)) {
836 cout << "The submodule is not invariant "
837 "under the action" << endl;
838 exit(1);
839 }
840 }
841 }
842 }
843 if (f_v) {
844 cout << "young::Maschke submodule is invariant, OK" << endl;
845 }
846
849 Tau = NEW_int(r * r * D->size_of_instance_in_int);
850 Theta = NEW_int(r * k * D->size_of_instance_in_int);
851 TauTheta = NEW_int(r * k * D->size_of_instance_in_int);
852 Mu = NEW_int(r * k * D->size_of_instance_in_int);
853
854 D->make_integer(g, goi, 0);
855 D->inverse(g, gv, 0);
856 D->negate(gv, 0);
857
858 if (f_v) {
859 cout << "-1/g=";
860 D->print(gv);
861 cout << endl;
862 }
863
864 D->make_zero_vector(Mu, r * k, 0);
865
866 if (f_vv) {
867 cout << "Mu (beginning) = " << endl;
868 D->print_matrix(Mu, r, k);
869 cout << endl;
870 }
871
872
873 for (h = 0; h < goi; h++) {
874
875 hv = S->invert_by_rank(h, 0 /* verbose_level */);
876
877 if (f_v) {
878 cout << "h=" << h << " / " << goi << " hv=" << hv << endl;
879 }
880 A = Rep + h * sz;
881 Av = Rep + hv * sz;
882
883 // get Tau(hv):
884 for (i = 0; i < r; i++) {
885 for (j = 0; j < r; j++) {
886 D->copy(D->offset(Av, (k + i) * n + k + j),
887 D->offset(Tau, i * r + j), 0);
888 }
889 }
890
891 if (f_vv) {
892 cout << "Tau(hv) = " << endl;
893 D->print_matrix(Tau, r, r);
894 cout << endl;
895 }
896
897 // get Theta(h):
898 for (i = 0; i < r; i++) {
899 for (j = 0; j < k; j++) {
900 D->copy(D->offset(A, (k + i) * n + j),
901 D->offset(Theta, i * k + j), 0);
902 }
903 }
904 if (f_vv) {
905 cout << "Theta(h) = " << endl;
906 D->print_matrix(Theta, r, k);
907 cout << endl;
908 }
909
910 // multiply Tau and Theta:
911
912 D->mult_matrix(Tau, Theta, TauTheta, r, r, k,
913 0 /* verbose_level */);
914
915 if (f_vv) {
916 cout << "TauTheta = " << endl;
917 D->print_matrix(TauTheta, r, k);
918 cout << endl;
919 }
920
921 // add to Mu:
922
923 D->add_apply_matrix(Mu, TauTheta, r, k,
924 0 /* verbose_level */);
925
926 if (f_vv) {
927 cout << "Mu (partial sum) = " << endl;
928 D->print_matrix(Mu, r, k);
929 cout << endl;
930 }
931
932 }
933
934 D->matrix_mult_apply_scalar(Mu, gv, r, k,
935 0 /* verbose_level */);
936
937 if (f_v) {
938 cout << "Mu = " << endl;
939 D->print_matrix(Mu, r, k);
940 cout << endl;
941 }
942
943
944 FREE_int(g);
945 FREE_int(gv);
946 FREE_int(Tau);
947 FREE_int(Theta);
948 FREE_int(TauTheta);
949 //FREE_int(Mu);
950
951
952 if (f_v) {
953 cout << "young::Maschke done" << endl;
954 }
955}
956
958 groups::sims *S)
959{
960 long int goi;
961
963 return goi;
964}
965
967 groups::sims *S, int *&elt)
968{
969 long int goi;
970
972 elt = NEW_int(goi);
974}
975
977 groups::sims *S, int *elt)
978{
979 FREE_int(elt);
980}
981
983 groups::sims *S, int *elt)
984{
985 long int goi;
986
988 Int_vec_print(cout, elt, goi);
989}
990
992 groups::sims *S,
993 int *elt_from, int *elt_to)
994{
995 long int goi;
996
998 Int_vec_copy(elt_from, elt_to, goi);
999}
1000
1002 groups::sims *S, int *elt)
1003{
1004 long int goi;
1005
1006 goi = S->group_order_lint();
1007 Int_vec_zero(elt, goi);
1008}
1009
1011 groups::sims *S, int *elt1, int *elt2, int *elt3)
1012{
1013 long int goi;
1014 int i, j, k;
1015 int a, b, c;
1016
1017 goi = S->group_order_lint();
1018 Int_vec_zero(elt3, goi);
1019 for (i = 0; i < goi; i++) {
1020 a = elt1[i];
1021 for (j = 0; j < goi; j++) {
1022 b = elt2[j];
1023 c = a * b;
1024 k = S->mult_by_rank(i, j, 0 /* verbose_level */);
1025 elt3[k] += c;
1026 }
1027 }
1028}
1029
1030
1031}}}
1032
1033
1034
related to the computation of Young representations
Definition: algebra.h:32
void Gauss_step(int *v1, int *v2, int len, int idx, int verbose_level)
Definition: a_domain.cpp:1129
void copy(int *elt_from, int *elt_to, int verbose_level)
Definition: a_domain.cpp:275
int Gauss_echelon_form(int *A, int f_special, int f_complete, int *base_cols, int f_P, int *P, int m, int n, int Pn, int verbose_level)
Definition: a_domain.cpp:842
void add_apply_matrix(int *A, int *B, int m, int n, int verbose_level)
Definition: a_domain.cpp:1454
void mult_matrix(int *A, int *B, int *C, int ma, int na, int nb, int verbose_level)
Definition: a_domain.cpp:1395
void make_zero_vector(int *elt, int len, int verbose_level)
Definition: a_domain.cpp:142
void init_integer_fractions(int verbose_level)
Definition: a_domain.cpp:53
void make_integer(int *elt, int n, int verbose_level)
Definition: a_domain.cpp:102
void matrix_mult_apply_scalar(int *A, int *s, int m, int n, int verbose_level)
Definition: a_domain.cpp:1473
int is_zero(int *elt, int verbose_level)
Definition: a_domain.cpp:176
void negate(int *elt, int verbose_level)
Definition: a_domain.cpp:445
void inverse(int *elt_a, int *elt_b, int verbose_level)
Definition: a_domain.cpp:682
int as_int(int *elt, int verbose_level)
Definition: a_domain.cpp:65
int is_zero_vector(int *elt, int len, int verbose_level)
Definition: a_domain.cpp:155
void print_matrix(int *A, int m, int n)
Definition: a_domain.cpp:774
void print_tableau(int *Tableau, int l1, int l2, int *row_parts, int *col_parts)
void init_basic_with_Sz_in_int(int underlying_set_size, int nb_sets, int *Sz, int verbose_level)
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 init_symmetric_group(int degree, int f_no_base, int verbose_level)
void make_element(int *Elt, int *data, int verbose_level)
Definition: action.cpp:1875
void element_move(void *a, void *b, int verbose_level)
Definition: action_cb.cpp:335
void group_order(ring_theory::longinteger_object &go)
Definition: action.cpp:2223
groups::sims * create_sims_from_generators_with_target_group_order_lint(data_structures_groups::vector_ge *gens, long int target_go, int verbose_level)
void init(actions::action *A, int verbose_level)
Definition: vector_ge.cpp:55
a permutation group represented via a stabilizer chain
Definition: groups.h:1273
long int invert_by_rank(long int rk_a, int verbose_level)
long int mult_by_rank(long int rk_a, long int rk_b, int verbose_level)
void element_unrank_lint(long int rk, int *Elt, int verbose_level)
Definition: sims.cpp:1326
void compute_conjugacy_classes(actions::action *&Aconj, induced_actions::action_by_conjugation *&ABC, schreier *&Sch, strong_generators *&SG, int &nb_classes, int *&class_size, int *&class_rep, int verbose_level)
void create_module(int *h_alpha, int *&Base, int *&base_cols, int &rk, int verbose_level)
Definition: young.cpp:215
void compute_generators(int &go1, int &go2, int verbose_level)
Definition: young.cpp:699
void group_ring_element_mult(actions::action *A, groups::sims *S, int *elt1, int *elt2, int *elt3)
Definition: young.cpp:1010
long int group_ring_element_size(actions::action *A, groups::sims *S)
Definition: young.cpp:957
void Maschke(int *Rep, int dim_of_module, int dim_of_submodule, int *&Mu, int verbose_level)
Definition: young.cpp:798
void create_representation(int *Base, int *base_cols, int rk, int group_elt, int *Mtx, int verbose_level)
Definition: young.cpp:417
void init(int n, int verbose_level)
Definition: young.cpp:153
void create_representations(int *Base, int *Base_inv, int rk, int verbose_level)
Definition: young.cpp:306
void group_ring_element_print(actions::action *A, groups::sims *S, int *elt)
Definition: young.cpp:982
void group_ring_element_copy(actions::action *A, groups::sims *S, int *elt_from, int *elt_to)
Definition: young.cpp:991
void young_symmetrizer(int *row_parts, int nb_row_parts, int *tableau, int *elt1, int *elt2, int *elt3, int verbose_level)
Definition: young.cpp:515
void group_ring_element_zero(actions::action *A, groups::sims *S, int *elt)
Definition: young.cpp:1001
void group_ring_element_free(actions::action *A, groups::sims *S, int *elt)
Definition: young.cpp:976
void group_ring_element_create(actions::action *A, groups::sims *S, int *&elt)
Definition: young.cpp:966
#define FREE_int(p)
Definition: foundations.h:640
#define Int_vec_zero(A, B)
Definition: foundations.h:713
#define NEW_OBJECT(type)
Definition: foundations.h:638
#define NEW_int(n)
Definition: foundations.h:625
#define Int_matrix_print(A, B, C)
Definition: foundations.h:707
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define Int_vec_copy(A, B, C)
Definition: foundations.h:693
#define Int_vec_print(A, B, C)
Definition: foundations.h:685
the orbiter library for the classification of combinatorial objects