/* compute all of the permutations of the allowable subgroups induced by the extended automorphisms described in auts;
store them in image format in a 2-dimensional array, perms */
int **permute_subgroups(FILE *LINK_input, int **a, int **b, char **c, int ***auts, struct pga_vars *pga, struct pcp_vars *pcp)
{ registerint alpha; registerint nmr_of_perms; registerint q = pga->q; int **A; /* automorphism matrix */ int **perms;
Logical soluble_group;
/* set up space for automorphism matrix */
A = allocate_matrix(q, q, 0, FALSE);
/* set up space for orbit and stabiliser information */ if (soluble_group && pga->space_efficient)
space_for_orbits(a, b, c, pga);
/* set up space to store permutations */
nmr_of_perms = (pga->space_efficient ? 1 : MAX(pga->nmr_of_perms, 1));
perms = allocate_matrix(nmr_of_perms, pga->Degree, 1, FALSE);
/* the stabiliser of a reduced p-covering group may be trivial */ if (pga->nmr_of_perms == 0)
setup_identity_perm(perms[nmr_of_perms], pga);
for (alpha = 1; alpha <= pga->m; ++alpha) {
if (pga->trace)
printf("Processing automorphism %d:\n", alpha);
assemble_matrix(A, q, auts[alpha], pcp);
/* check if the matrix passes some elementary tests */ if (!valid_matrix(A, q, pga->p, 0)) {
printf("The following automorphism matrix is invalid\n");
print_matrix(A, q, q); exit(FAILURE);
}
if (pga->print_automorphism_matrix) {
printf("Automorphism matrix %d is\n", alpha);
print_matrix(A, q, q);
}
if (!soluble_group) { #ifdefined(GAP_LINK) || defined(GAP_LINK_VIA_FILE)
write_GAP_matrix(LINK_input, "ANUPQglb.genQ", A, q, 0, alpha); #endif
}
/* is the action on the p-multiplicator non-trivial? */ if (pga->map[alpha] != 0) {
nmr_of_perms = (pga->space_efficient ? 1 : pga->map[alpha]);
compute_permutation(perms[nmr_of_perms], A, pga);
if (pga->s != 0) { /* process each definition set in turn */
pga->nmr_subgroups = 0; for (i = 0; i < pga->nmr_def_sets; ++i)
compute_images(A, pga->list[i], pga->available[i], permutation, pga);
} else {
permutation[1] = 1;
pga->nmr_subgroups = 1;
}
}
/* compute the images of all allowable subgroups having definition
set K under the action of automorphism matrix A */
void compute_images( int **A, int K, int depth, int *permutation, struct pga_vars *pga)
/* number of available positions */
{ int **S; /* standard matrix */ int **Image; /* image of allowable subgroup under A */ int *row; /* indices of available positions in S */ int *column; int *position; /* array to keep track of processed image */ int *subset; /* array to store definition set of image */ int K_Image; /* bit string representation of same */ int nmr_of_bytes = pga->q * sizeof(int); registerint i; registerint index; registerint s = pga->s; registerint q = pga->q; registerint p = pga->p; registerint nmr_subgroups = pga->nmr_subgroups;
S = allocate_matrix(s, q, 0, FALSE);
Image = allocate_matrix(s, q, 0, TRUE);
subset = allocate_vector(s, 0, 0);
position = allocate_vector(depth + 1, 0, 1);
/* set up row and column indices of available positions as arrays of length depth + 1; also set up Image as image of
allowable subgroup with least label under action of A */
find_available_positions(K, A, Image, &row, &column, depth, pga);
/* for each allowable subgroup in turn, compute its image under A */
do {
/* make a copy of the image matrix and echelonise the copy */ for (i = 0; i < s; ++i)
memcpy(S[i], Image[i], nmr_of_bytes);
K_Image = echelonise_matrix(S, s, q, p, subset, pga);
/* compute and store the label of the resulting standard matrix */
++nmr_subgroups; if (nmr_subgroups % 1000000 == 0)
printf("processing subgroup %d\n", nmr_subgroups);
void
update_image(int **A, int column, int **Image, int row, struct pga_vars *pga)
{ registerint i; registerint q = pga->q; registerint p = pga->p;
for (i = 0; i < q; ++i)
Image[row][i] = (Image[row][i] + A[i][column]) % p;
}
/* set up the indices of the available positions of the standard matrices determined by K as two arrays, row and column; also set up Image as
image of allowable subgroup with least label under action of A */
void find_available_positions(int K, int **A, int **Image, int **row, int **column, int depth, struct pga_vars *pga)
{ registerint i, j; registerint index = 0; registerint s = pga->s; registerint q = pga->q; int *subset;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.