20namespace layer5_applications {
21namespace apps_algebra {
26 int f_v = (verbose_level >= 1);
29 cout <<
"character_table_burnside::do_it" << endl;
43 int f_no_base =
FALSE;
50 cout <<
"Created group Sym(" << n <<
") of size " << goi << endl;
58 for (i = 0; i < goi; i++) {
60 cout <<
"element " << i <<
" is ";
69 cout <<
"Creating action by conjugation" << endl;
74 cout <<
"Creating action by conjugation done" << endl;
85 Sch->
init(Aconj, verbose_level - 2);
94 cout <<
"action does not have strong generators" << endl;
101 cout <<
"Computing conjugacy classes:" << endl;
110 class_size =
NEW_int(nb_classes);
112 for (i = 0; i < nb_classes; i++) {
115 cout <<
"class sizes : ";
128 Sch, nb_classes, N, verbose_level);
131 for (r = 0; r < nb_classes; r++) {
132 cout <<
"N_" << r <<
":" << endl;
138 r0 =
compute_r0(N, nb_classes, verbose_level);
142 cout <<
"Did not find a matrix with the right number "
143 "of distinct eigenvalues" << endl;
148 cout <<
"r0=" << r0 << endl;
152 N0 = N + r0 * nb_classes * nb_classes;
163 cout <<
"N_" << r0 <<
":" << endl;
173 cout <<
"Has " << nb_mu <<
" distinct eigenvalues" << endl;
176 cout <<
"We found " << nb_lambda <<
" integer roots, they are: " << endl;
179 cout <<
"We found " << nb_mu <<
" distinct integer roots, they are: " << endl;
180 for (i = 0; i < nb_mu; i++) {
181 cout << Mu[i] <<
" with multiplicity " << Mu_mult[i] << endl;
187 compute_omega(D, N0, nb_classes, Mu, nb_mu, Omega, verbose_level);
191 cout <<
"Omega:" << endl;
198 int *character_degree;
202 character_degree, verbose_level);
205 cout <<
"character degrees : ";
210 int *character_table;
214 character_degree, class_size,
215 character_table, verbose_level);
221 cout <<
"character table:" << endl;
224 int f_special =
TRUE;
230 t_max = character_degree[0];
231 for (i = 0; i < nb_classes; i++) {
232 if (character_degree[i] > t_max) {
233 t_max = character_degree[i];
237 cout <<
"t_max=" << t_max << endl;
239 cout <<
"creating generators:" << endl;
245 Gens,nb_gens, t_max, Distribution, verbose_level);
248 cout <<
"Distribution table:" << endl;
252 for (i = 0; i < nb_classes; i++) {
254 cout <<
"character " << i <<
" / " << nb_classes <<
":" << endl;
255 Int_vec_print(cout, character_table + i * nb_classes, nb_classes);
264 for (t = 0; t <= t_max; t++) {
266 for (j = 0; j < nb_classes; j++) {
267 a = Distribution[t * nb_classes + j];
271 S[t] += a * character_table[i * nb_classes + j];
286 character_degree, class_size,
289 cout <<
"M=" << endl;
297 cout <<
"determinant:" << p << endl;
302 cout <<
"has degree " << deg << endl;
312 cout <<
"character table:" << endl;
324 for (i = 0; i < nb_gens; i++) {
349 cout <<
"character_table_burnside::do_it" << endl;
354 int *character_degree,
int *class_size,
357 int f_v = (verbose_level >= 1);
362 cout <<
"character_table_burnside::create_matrix" << endl;
364 n = character_degree[i];
366 cout <<
"n=" << n << endl;
372 for (j = 0; j <= n; j++) {
378 M.
s_ij(0, n - j) = p;
382 for (ii = 1; ii <= n; ii++) {
384 cout <<
"ii=" << ii << endl;
386 for (j = 0; j <= ii; j++) {
396 cout <<
"j=" << j <<
" p=" << p << endl;
398 M.
s_ij(ii, ii - j) = p;
403 cout <<
"character_table_burnside::create_matrix done" << endl;
410 int *character_degree,
int *class_size,
411 int *&character_table,
int verbose_level)
413 int f_v = (verbose_level >= 1);
414 int f_vv = (verbose_level >= 3);
418 cout <<
"character_table_burnside::compute_character_table" << endl;
421 character_table =
NEW_int(nb_classes * nb_classes);
423 for (i = 0; i < nb_classes; i++) {
425 for (j = 0; j < nb_classes; j++) {
428 cout <<
"i=" << i <<
" j=" << j
429 <<
" character_degree[i]=" << character_degree[i]
432 <<
" class_size[j]=" << class_size[j] << endl;
435 w = character_degree[i] * D->
as_int(D->
offset(Omega, j * nb_classes + i), 0);
436 if (w % class_size[j]) {
437 cout <<
"class size does not divide w" << endl;
440 character_table[i * nb_classes + j] = w / class_size[j];
446 cout <<
"character_table_burnside::compute_character_table done" << endl;
452 int goi,
int nb_classes,
int *Omega,
int *class_size,
453 int *&character_degree,
int verbose_level)
455 int f_v = (verbose_level >= 1);
456 int f_vv = (verbose_level >= 2);
458 int *A, *B, *C, *Cv, *G, *S, *Sv, *E, *F;
461 cout <<
"character_table_burnside::compute_character_degrees" << endl;
464 character_degree =
NEW_int(nb_classes);
475 for (i = 0; i < nb_classes; i++) {
480 for (r = 0; r < nb_classes; r++) {
481 D->
copy(D->
offset(Omega, r * nb_classes + i), A, 0);
490 D->
mult(B, Cv, E, 0);
498 D->
mult(G, Sv, F, 0);
505 cout <<
"f is not a perfect square" << endl;
510 cout <<
"i=" << i <<
" d=" << d << endl;
513 character_degree[i] = d;
525 cout <<
"character_table_burnside::compute_character_degrees done" << endl;
531 int *Mu,
int nb_mu,
int *&Omega,
int verbose_level)
533 int f_v = (verbose_level >= 1);
534 int f_vv = (verbose_level >= 2);
537 int h, x, rk, i, j, a;
540 cout <<
"character_table_burnside::compute_omega" << endl;
544 base_cols =
NEW_int(nb_classes);
546 for (h = 0; h < nb_mu; h++) {
550 cout <<
"eigenvalue " << h <<
" / " << nb_mu
551 <<
" is " << x <<
":" << endl;
553 for (i = 0; i < nb_classes; i++) {
554 for (j = 0; j < nb_classes; j++) {
555 a = N0[i * nb_classes + j];
563 cout <<
"before get_image_and_kernel:" << endl;
574 cout <<
"after get_image_and_kernel:" << endl;
578 cout <<
"after get_image_and_kernel, rk=" << rk << endl;
581 if (rk != nb_classes - 1) {
582 cout <<
"rk != nb_classes - 1" << endl;
590 D->
copy(D->
offset(M, (nb_classes - 1) * nb_classes), b, 0);
597 for (i = 0; i < nb_classes; i++) {
599 (nb_classes - 1) * nb_classes + i), c, 0);
603 cout <<
"after rescaling:" << endl;
606 for (i = 0; i < nb_classes; i++) {
607 D->
copy(D->
offset(M, (nb_classes - 1) * nb_classes + i),
608 D->
offset(Omega, i * nb_classes + h), 0);
620 cout <<
"Omega:" << endl;
627 cout <<
"character_table_burnside::compute_omega done" << endl;
633 int f_v = (verbose_level >= 1);
634 int f_vv = (verbose_level >= 3);
638 cout <<
"character_table_burnside::compute_r0" << endl;
642 for (r = 0; r < nb_classes; r++) {
651 cout <<
"N_" << r <<
":" << endl;
664 cout <<
"Has " << nb_mu <<
" distinct eigenvalues" << endl;
667 cout <<
"We found " << nb_lambda
668 <<
" integer roots, they are: " << endl;
671 cout <<
"We found " << nb_mu
672 <<
" distinct integer roots, they are: " << endl;
673 for (i = 0; i < nb_mu; i++) {
674 cout << Mu[i] <<
" with multiplicity " << Mu_mult[i] << endl;
678 if (nb_mu == nb_classes) {
690 cout <<
"character_table_burnside::compute_r0 done" << endl;
700 int f_v = (verbose_level >= 1);
701 int r, rl, rf, s, sl, sf, i, a, j, b, c, idx, t, tf;
705 cout <<
"character_table_burnside::compute_multiplication_constants_center_of_group_ring" << endl;
708 N =
NEW_int(nb_classes * nb_classes * nb_classes);
712 for (r = 0; r < nb_classes; r++) {
716 for (s = 0; s < nb_classes; s++) {
721 for (i = 0; i < rl; i++) {
722 a = Sch->
orbit[rf + i];
724 for (j = 0; j < sl; j++) {
725 b = Sch->
orbit[sf + j];
738 N[r * nb_classes * nb_classes + s * nb_classes + t]++;
745 cout <<
"character_table_burnside::compute_multiplication_constants_center_of_group_ring done" << endl;
752 int **Gens,
int nb_gens,
int t_max,
int *&Distribution,
int verbose_level)
754 int f_v = (verbose_level >= 1);
756 int f_vvv = (verbose_level >= 3);
766 cout <<
"character_table_burnside::compute_Distribution_table" << endl;
772 Distribution =
NEW_int((t_max + 1) * nb_classes);
776 for (t = 1; t <= t_max; t++) {
786 for (t = 1; t <= t_max; t++) {
787 cout <<
"t=" << t <<
" Nb[t]=" << Nb[t] << endl;
788 for (h = 0; h < Nb[t]; h++) {
792 cout <<
"h=" << h <<
" Choice=";
797 multiply_word(A, Gens, Choice, t, Elt1, Elt2, verbose_level);
810 cout <<
" has rank " << i <<
" and belongs to class " << j;
814 Distribution[t * nb_classes + j]++;
818 cout <<
"after t=" << t <<
" Distribution:" << endl;
829 cout <<
"character_table_burnside::compute_Distribution_table done" << endl;
839 for (i = 1; i < t; i++) {
847 int f_v = (verbose_level >= 1);
852 cout <<
"character_table_burnside::create_generators" << endl;
856 for (i = 0; i < nb_gens; i++) {
863 for (i = 0; i < nb_gens; i++) {
864 for (j = 0; j < n; j++) {
873 for (i = 0; i < nb_gens; i++) {
874 for (j = 0; j < n; j++) {
882 cout <<
"generators:" << endl;
883 for (i = 0; i < nb_gens; i++) {
884 cout <<
"generator " << i <<
":" << endl;
903 int f_v = (verbose_level >= 1);
910 cout <<
"character_table_burnside::integral_eigenvalues" << endl;
914 cout <<
"characteristic polynomial:" << charpoly << endl;
919 cout <<
"has degree " << deg << endl;
925 for (i = 0; i <= deg; i++) {
926 A[i] = charpoly.
s_ii(i);
941 for (x = -100; x < 100; x++) {
943 for (i = deg - 1; i >= 0; i--) {
949 cout <<
"Found integer root " << x << endl;
951 Lambda[nb_lambda++] = x;
952 if (nb_mu && Mu[nb_mu - 1] == x) {
954 cout <<
"The root is a multiple root" << endl;
956 Mu_mult[nb_mu - 1]++;
964 for (i = deg - 1; i >= 0; i--) {
966 A[i] = A[i] + x * B[i];
967 if (i == 0 && A[0]) {
968 cout <<
"division unsuccessful" << endl;
975 cout <<
"after dividing off, the polynomial is: ";
986 cout <<
"after dividing off integer roots, the polynomial is: ";
992 cout <<
"We found " << nb_lambda <<
" integer roots, they are: " << endl;
995 cout <<
"We found " << nb_mu <<
" distinct integer roots, they are: " << endl;
996 for (i = 0; i < nb_mu; i++) {
997 cout << Mu[i] <<
" with multiplicity " << Mu_mult[i] << endl;
1007 int f_v = (verbose_level >= 1);
1008 int f_vv = (verbose_level >= 2);
1013 cout <<
"character_table_burnside::characteristic_poly" << endl;
1017 for (i = 0; i < size; i++) {
1018 for (j = 0; j < size; j++) {
1024 cout <<
"M=" << endl;
1035 cout <<
"M - x * Id=" << endl << M << endl;
1038 cout <<
"the Smith normal form is:" << endl;
1042 cout <<
"P * Pv=" << endl << S << endl;
1045 cout <<
"Q * Qv=" << endl << S << endl;
1048 cout <<
"T.mult(S, Q):" << endl;
1050 cout <<
"T=" << endl << T << endl;
1061 cout <<
"characteristic polynomial:" << charpoly << endl;
1067 for (i = 0; i <= deg; i++) {
1068 b = charpoly.
s_ii(i);
1073 charpoly.
m_ii(i, b);
1076 cout <<
"characteristic polynomial:" << charpoly << endl;
1080 cout <<
"character_table_burnside::characteristic_poly done" << endl;
1097 int f_v = (verbose_level >= 1);
1098 int f_vv = (verbose_level >= 2);
1099 double pivot, pivot_inv, z, f, a, b, c, p;
1100 int i, j, k, jj, rank, idx;
1103 cout <<
"character_table_burnside::double_Gauss" << endl;
1106 for (j = 0; j < n; j++) {
1108 cout <<
"j=" << j << endl;
1113 for (k = i; k < m; k++) {
1126 cout <<
"column " << i <<
" pivot is " << p <<
" in row " << idx << endl;
1131 cout <<
"no pivot found" << endl;
1139 for (jj = j; jj < n; jj++) {
1146 cout <<
"row " << i <<
" pivot in row " << k <<
" colum " << j << endl;
1155 pivot = A[i * n + j];
1157 cout <<
"pivot=" << pivot << endl;
1160 pivot_inv = 1. / pivot;
1162 cout <<
"pivot=" << pivot <<
" pivot_inv=" << pivot_inv << endl;
1165 for (jj = j; jj < n; jj++) {
1166 A[i * n + jj] *= pivot_inv;
1169 cout <<
"pivot=" << pivot <<
" pivot_inv=" << pivot_inv
1170 <<
" made to one: " << A[i * n + j] << endl;
1178 cout <<
"doing elimination in column " << j <<
" from row " << i + 1 <<
" to row " << m - 1 <<
":" << endl;
1180 for (k = i + 1; k < m; k++) {
1182 cout <<
"k=" << k << endl;
1191 cout <<
"eliminating row " << k << endl;
1193 for (jj = j; jj < n; jj++) {
1211 for (i = rank - 1; i >= 0; i--) {
1213 cout <<
"."; cout.flush();
1219 for (k = i - 1; k >= 0; k--) {
1225 for (jj = j; jj < n; jj++) {
1242 for (i = 0; i < m; i++) {
1243 for (j = 0; j < n; j++) {
1244 cout << setw(10) << A[i * n + j] <<
" ";
1265 for (i = 0; i < n; i++) {
1266 if (j < nb_base_cols && i == base_cols[j]) {
1270 kernel_cols[k++] = i;
1275 int &kernel_m,
int &kernel_n,
double *kernel)
1278 int r, k, i, j, ii, iii, a, b;
1296 for (i = 0; i < n; i++) {
1312 cout <<
"character_table_burnside::matrix_get_kernel ii != k" << endl;
1324 for (i = 0; i < n; i++) {
1326 for (iii = 0; iii < k; iii++) {
1328 kernel[i * kernel_n + iii] = M[j * n + a];
1339 for (iii = 0; iii < k; iii++) {
1341 kernel[i * kernel_n + iii] = -1.;
1344 kernel[i * kernel_n + iii] = 0;
1360 a1 = (double)a - 0.000001;
1361 a2 = (double)a + 0.000001;
1362 if (a1 < a && a < a2) {
1365 cout <<
"error in double_as_int" << endl;
related to the computation of Young representations
void copy(int *elt_from, int *elt_to, int verbose_level)
void init_integer_fractions(int verbose_level)
void make_integer(int *elt, int n, int verbose_level)
void add_apply(int *elt_a, int *elt_b, int verbose_level)
void mult_apply(int *elt_a, int *elt_b, int verbose_level)
void make_zero(int *elt, int verbose_level)
void mult(int *elt_a, int *elt_b, int *elt_c, int verbose_level)
void inverse(int *elt_a, int *elt_b, int verbose_level)
int * offset(int *A, int i)
void get_image_and_kernel(int *M, int n, int &rk, int verbose_level)
int size_of_instance_in_int
int as_int(int *elt, int verbose_level)
void print_matrix(int *A, int m, int n)
various functions related to geometries
void AG_element_unrank(int q, int *v, int stride, int len, long int a)
basic number theoretic functions
int i_power_j(int i, int j)
interface to create latex output files
void print_integer_matrix_tex(std::ostream &ost, int *p, int m, int n)
a class to represent arbitrary precision integers
void mult(discreta_base &x, discreta_base &y)
discreta_matrix & m_mn(int m, int n)
void smith_normal_form(discreta_matrix &P, discreta_matrix &Pv, discreta_matrix &Q, discreta_matrix &Qv, int verbose_level)
discreta_matrix & m_mn_n(int m, int n)
discreta_base & s_ij(int i, int j)
void elements_to_unipoly()
void m_iji(int i, int j, int a)
void determinant(discreta_base &d, int verbose_level)
DISCRETA class for polynomials in one variable.
a permutation group in a fixed action.
void element_print_quick(void *elt, std::ostream &ost)
void element_print(void *elt, std::ostream &ost)
void init_symmetric_group(int degree, int f_no_base, int verbose_level)
void element_mult(void *a, void *b, void *ab, int verbose_level)
int f_has_strong_generators
void make_element(int *Elt, int *data, int verbose_level)
void element_move(void *a, void *b, int verbose_level)
void group_order(ring_theory::longinteger_object &go)
void induced_action_by_conjugation(groups::sims *old_G, groups::sims *Base_group, int f_ownership, int f_basis, int verbose_level)
Schreier trees for orbits of groups on points.
void compute_all_point_orbits(int verbose_level)
void init_generators(data_structures_groups::vector_ge &generators, int verbose_level)
void init(actions::action *A, int verbose_level)
a permutation group represented via a stabilizer chain
void element_unrank_lint(long int rk, int *Elt, int verbose_level)
a strong generating set for a permutation group with respect to a fixed action
void init_from_sims(groups::sims *S, int verbose_level)
data_structures_groups::vector_ge * gens
induced action by conjugation on the elements of a given group
long int multiply(actions::action *A, long int i, long int j, int verbose_level)
void multiply_word(actions::action *A, int **Gens, int *Choice, int t, int *Elt1, int *Elt2, int verbose_level)
void double_matrix_print(double *A, int m, int n)
void integral_eigenvalues(int *M, int n, int *&Lambda, int &nb_lambda, int *&Mu, int *&Mu_mult, int &nb_mu, int verbose_level)
void do_it(int n, int verbose_level)
void characteristic_poly(int *N, int size, unipoly &charpoly, int verbose_level)
void matrix_get_kernel(double *M, int m, int n, int *base_cols, int nb_base_cols, int &kernel_m, int &kernel_n, double *kernel)
int double_as_int(double x)
void double_swap(double &a, double &b)
void compute_multiplication_constants_center_of_group_ring(actions::action *A, induced_actions::action_by_conjugation *ABC, groups::schreier *Sch, int nb_classes, int *&N, int verbose_level)
double double_abs(double x)
void compute_character_degrees(algebra::a_domain *D, int goi, int nb_classes, int *Omega, int *class_size, int *&character_degree, int verbose_level)
void compute_Distribution_table(actions::action *A, induced_actions::action_by_conjugation *ABC, groups::schreier *Sch, int nb_classes, int **Gens, int nb_gens, int t_max, int *&Distribution, int verbose_level)
int compute_r0(int *N, int nb_classes, int verbose_level)
void compute_omega(algebra::a_domain *D, int *N0, int nb_classes, int *Mu, int nb_mu, int *&Omega, int verbose_level)
void compute_character_table(algebra::a_domain *D, int nb_classes, int *Omega, int *character_degree, int *class_size, int *&character_table, int verbose_level)
void create_matrix(discreta_matrix &M, int i, int *S, int nb_classes, int *character_degree, int *class_size, int verbose_level)
void create_generators(actions::action *A, int n, int **&Elt, int &nb_gens, int f_special, int verbose_level)
int double_Gauss(double *A, int m, int n, int *base_cols, int verbose_level)
void kernel_columns(int n, int nb_base_cols, int *base_cols, int *kernel_cols)
#define Int_vec_zero(A, B)
#define Int_matrix_print(A, B, C)
#define Int_vec_copy(A, B, C)
#define Int_vec_print(A, B, C)
algebra, combinatorics and graph theory, geometry, linear algebra, number theory, data structures,...
the orbiter library for the classification of combinatorial objects
induced_actions::action_by_conjugation * ABC