/*static int ***setup_identity_auts (int nmr_of_generators, int ***auts, struct
* pga_vars *pga);*/ staticvoid evaluate_generators(int pointer, int nmr_of_generators, int ***stabiliser, int ***auts, struct pga_vars *pga, struct pcp_vars *pcp);
/* find the stabiliser of the representative, rep; all of the permutations are stored in perms;
nmr_of_generators is the number of pcp generators in the descendant */
int ***stabiliser_of_rep(int **perms, int rep, int orbit_length, int *a, int *b, char *c, char *d, int ***auts, struct pga_vars *pga, struct pcp_vars *pcp)
{ registerint *y = y_address;
int ***stabiliser = 0; int pointer = pcp->lused + 1;
Logical soluble_group =
(pga->soluble || pga->Degree == 1 || pga->nmr_of_perms == 0); int nmr_of_generators; int restriction; int j; int *relative;
/* if necessary, compute the stabiliser of the representative in the insoluble portion using a system call to GAP -- this is done before setting up the remainder of the automorphisms
to minimise the size of the workspace created by the system call */
if (!soluble_group) {
#ifdefined(GAP_LINK) || defined(GAP_LINK_VIA_FILE)
insoluble_stab_gens(rep, orbit_length, pga, pcp); #else
printf("To compute stabilisers in insoluble automorphism groups, ");
printf("you must compile pq\nwith the compiler flag GAP_LINK set\n"); exit(FAILURE); #endif
}
/* determine the generators for the stabiliser if soluble */ if (soluble_group) {
stabiliser_generators(perms, rep, a, b, c, d, auts, pga, pcp);
/* allocate space for stabiliser */
stabiliser = allocate_array(
pga->nmr_stabilisers, pga->ndgen, nmr_of_generators, TRUE);
/* construct the generators of the stabiliser in the soluble group
as automorphisms */
if (pga->nmr_stabilisers != 0 && soluble_group) {
restriction = pga->final_stage ? y[pcp->clend + pcp->cc - 1] + pga->s
: y[pcp->clend + pcp->cc - 1];
evaluate_generators(pointer, restriction, stabiliser, auts, pga, pcp);
}
} else { /* read in the generators of the stabiliser in the insoluble case --
these were computed using GAP */
/* find generators for the stabiliser for orbit representative, rep;
store each word in y, preceded by its length */
void stabiliser_generators(int **perms, int rep, int *a, int *b, char *c, char *d, int ***auts, struct pga_vars *pga, struct pcp_vars *pcp)
{ registerint *y = y_address;
registerint alpha, k, next; registerint word_length; registerint pointer = pcp->lused + 1; int index; int perm_number;
/* let k run over the elements of orbit with representative rep; if c[k] >= 2, then some permutation did not extend the orbit of k; hence, there is some product of subsequent permutations which
stabilises the representative a[k] */
k = rep; while (k != 0) { if (c[k] >= 2) { for (alpha = d[k] + 1; alpha <= d[k] + c[k] - 1; ++alpha) {
++pga->nmr_stabilisers;
word_length = 1;
y[pointer + word_length] = alpha;
/* does automorphism alpha induce a trivial permutation? */ if ((perm_number = pga->map[alpha]) == 0)
next = a[k]; else {
next = pga->space_efficient
? find_image(a[k], auts[alpha], pga, pcp)
: perms[perm_number][a[k]];
}
while (next != a[k]) {
index = d[next];
++word_length;
y[pointer + word_length] = index; if ((perm_number = pga->map[index]) != 0) {
next = pga->space_efficient
? find_image(next, auts[index], pga, pcp)
: perms[perm_number][next];
}
}
y[pointer] = word_length;
pointer += word_length + 1;
}
}
k = b[k];
}
pcp->lused = pointer;
}
/* evaluate the action of a stabiliser of a representative on the defining generators of the group; each stabiliser generator is stored as a word in the automorphisms, auts, of the parent, where
y[pointer] = length of word defining first generator */
staticvoid evaluate_generators(int pointer, int nmr_of_generators, int ***stabiliser, int ***auts, struct pga_vars *pga, struct pcp_vars *pcp)
{ registerint *y = y_address;
registerint i, j; registerint gamma; int cp = pcp->lused;
for (gamma = 1; gamma <= pga->nmr_stabilisers; ++gamma) {
for (i = 1; i <= pga->ndgen; ++i) { /* compute image of defining generator i
under generator gamma of stabiliser */
image_of_generator(i, pointer, auts, pga, pcp);
/* copy restriction of result into stabiliser array */ for (j = 1; j <= nmr_of_generators; ++j)
stabiliser[gamma][i][j] = y[cp + j];
}
pointer += y[pointer] + 1;
}
}
/* compute the image of group generator under a stabiliser generator, whose definition as a word in the automorphisms, auts, of the parent
is stored at y[pointer + 1], .., y[pointer + y[pointer]] */
void image_of_generator(int generator, int pointer, int ***auts, struct pga_vars *pga, struct pcp_vars *pcp)
{ registerint *y = y_address;
registerint i, j, k, l; registerint alpha, letter; registerint length, exp; int cp = pcp->lused; int ptr = cp + pcp->lastg; int nmr_of_letters = y[pointer]; registerint bound;
/* alpha is the last letter in the stabiliser generator word */
alpha = y[pointer + nmr_of_letters];
/* set up the image of gen under the action of alpha at cp */ for (i = 1; i <= pcp->lastg; ++i)
y[cp + i] = auts[alpha][generator][i];
/* for each remaining letter in the generator word, set up as a
word its action on each of the elements of the image under alpha */
for (letter = nmr_of_letters - 1; letter >= 1; --letter) {
alpha = y[pointer + letter];
/* set up image under alpha */
length = 0; for (i = 1; i <= pcp->lastg; ++i) { if ((exp = y[cp + i]) > 0) { /* set up exp copies of the image of generator i under
action of automorphism alpha */ for (j = 1; j <= exp; ++j) { for (k = 1; k <= pcp->lastg; ++k) {
bound = auts[alpha][i][k]; for (l = 1; l <= bound; ++l) {
++length;
y[ptr + length] = k;
}
}
}
}
}
/* now zero out previous result */ for (i = 1; i <= pcp->lastg; ++i)
y[cp + i] = 0;
/* now collect the result of the composition of maps so far to cp */ for (l = 1; l <= length; ++l)
collect(y[ptr + l], cp, pcp);
}
}
/* find which automorphism, alpha, induces the permutation with index perm */
int preimage(int perm, struct pga_vars *pga)
{ int alpha;
for (alpha = 1; alpha <= pga->m; ++alpha) if (pga->map[alpha] == perm) return alpha;
printf("*** Error in function preimage ***\n"); exit(FAILURE);
}
/* set up those automorphisms which induced the identity on the
p-multiplicator as the leading elements of the stabiliser */ /* static int ***setup_identity_auts (int nmr_of_generators, int ***auts, struct pga_vars *pga) { int alpha, i = 0, j, k; int ***stabiliser;
for (alpha = 1; alpha <= pga->m; ++alpha) { if (pga->map[alpha] == 0) { ++i; for (j = 1; j <= pga->ndgen; ++j) for (k = 1; k <= nmr_of_generators; ++k) stabiliser[i][j][k] = auts[alpha][j][k]; } }
return stabiliser; }
*/
#ifdefined(GAP_LINK_VIA_FILE)
/* read the insoluble stabiliser generators from LINK file; each list of stabilisers is preceded by a list of integers -- the first indicates whether the stabiliser is soluble; the second is the number of soluble generators for the stabiliser; for each soluble generator, its relative order is now listed;
finally the total number of generators is listed */
int ***read_stabiliser_gens(int nmr_of_generators, int ***soluble_generators, struct pga_vars *pga, struct pcp_vars *pcp)
{ registerint ndgen = pga->ndgen; registerint gamma, i, j;
FILE *LINK_output; int ***stabiliser; int nmr_items; int temp;
#ifdef DEBUG1
printf("Nmr of soluble gens for stabiliser is %d\n", pga->nmr_soluble);
printf("FROM GAP Relative orders are "); for (i = 1; i <= pga->nmr_soluble; ++i)
printf("%d ", pga->relative[i]);
printf("\n");
printf("Total Nmr of gens for stabiliser is %d\n", pga->nmr_stabilisers); #endif
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.