/* for each automorphism, compute its action on each of the generators;
this code is a modified version of the code to be found in the file extend_automorphisms -- the modifications are introduced in order to store the automorphims much more efficiently than the 3-dimensional array used in that code; the efficiency is achieved by storing the description using two 1-dimensional arrays, head and list;
these vectors are organised as follows -- ptr = head[(alpha - 1) * lastg + i] is a pointer to action of automorphism alpha on generator i; length = list[ptr + 1] = length of generator-exponent string storing action;
list[ptr + 2] ... list[ptr + 1 + length] contains the string */
void Extend_Auts(int **head, int **list, int start, struct pcp_vars *pcp)
{ registerint lastg = pcp->lastg; registerint offset; registerint alpha; int index = 0; int max_length;
FILE *fp; int nmr_saved; int list_length;
int saved_length; /* total length of description saved to file */ int restored_length = 0; /* amount of description restored from file */ intnew; /* new storage requirement */
/* this used to be 5 * lastg + 4 -- April 1994 */ if (is_space_exhausted(7 * lastg + 4, pcp)) return;
for (alpha = 1; alpha <= pcp->m; ++alpha) {
offset = (alpha - 1) * lastg;
restored_length +=
restore_auts(fp, offset, nmr_saved, start - 1, &index, *head, *list);
Extend_Aut(
start, max_length, &list_length, *head, list, offset, &index, pcp); #ifdef DEBUG if (alpha != pcp->m) {
printf("*** After automorphism %d, allocation is %d\n",
alpha,
list_length);
printf("*** Value of index is now %d\n", index);
} #endif
if ((new = saved_length - restored_length + index) > list_length) {
*list = reallocate_vector(*list, list_length + 1, new + 1, 0, FALSE);
list_length = new; #ifdef DEBUG
printf("*** Allocation is increased to %d\n", list_length); #endif
}
}
(*head)[0] = lastg;
(*list)[0] = list_length;
CloseFile(fp);
#ifdef DEBUG1
printf("*** Final allocated space for automorphisms is %d\n", list_length);
printf("*** Final amount used is %d\n", index); #endif
}
/* list the action of each automorphism on each of the
pcp generators, first .. last, by their image */
void List_Auts(int *head, int *list, int first, int last, struct pcp_vars *pcp)
{ registerint alpha, i, j, ptr, length; int offset = 0; #include"access.h"
/* set up description of action of automorphisms on defining generators */
void Setup_Action(int **head, int **list, int ***auts, int nmr_of_exponents, struct pcp_vars *pcp)
{ registerint *y = y_address;
registerint i, generator; int position, max_length, exp, alpha, offset; int lastg = pcp->lastg; int fq_rank = y[pcp->clend + 1]; int list_length; int index = 0;
for (alpha = 1; alpha <= pcp->m; ++alpha) {
offset = (alpha - 1) * fq_rank; for (generator = 1; generator <= fq_rank; ++generator) {
position = (*head)[offset + generator] = index;
(*list)[++position] = 0;
++index; for (i = 1; i <= nmr_of_exponents; ++i) { if ((exp = auts[alpha][generator][i]) != 0) {
++(*list)[position];
(*list)[++index] = PACK2(exp, i);
}
}
}
}
(*head)[0] = fq_rank;
(*list)[0] = list_length;
}
/* extend the automorphism whose action on the defining generators of the group is described in the two 1-dimensional arrays, head and list, to act on the generators of the group; the first
generator whose image is computed is start */
void Extend_Aut(int start, int max_length, int *list_length, int *head, int **list, int offset, int *index, struct pcp_vars *pcp)
{ registerint *y = y_address;
registerint i, generator; registerint lastg = pcp->lastg; registerint structure = pcp->structure; int cp1 = pcp->submlg - lastg - 2; int cp2 = cp1 - lastg; int result = cp2 - lastg; registerint value; int u, v; int exp; int position, new;
#include"access.h"
/* update submlg because of possible call to power */
pcp->submlg -= (3 * lastg + 2);
/* for each specified generator, compute its image under
the action of the automorphism */
for (generator = start; generator <= lastg; ++generator) {
if (v == 0)
Extend_Pow(cp1, cp2, u, offset, head, *list, pcp); else
Extend_Comm(cp1, cp2, u, v, offset, head, *list, pcp);
#ifdefined(GROUP) /* solve the appropriate equation, storing the image of generator under the action of alpha at result; in the Lie Program, Extend_Comm has already
set up the answer at location result */
for (i = 1; i <= lastg; ++i) { if ((exp = y[result + i]) != 0) {
++(*list)[position];
(*list)[++*index] = PACK2(exp, i);
}
}
}
/* reset value of submlg */
pcp->submlg += (3 * lastg + 2);
}
void evaluate_image( int *head, int *list, int offset, int ptr, int cp, struct pcp_vars *pcp)
{ registerint *y = y_address;
int lastg = pcp->lastg; int i, j, start, u; int pointer; int exp; int image_length, relation_length; int next_gen, next_exp; int p = pcp->p; #include"access.h"
/* given generator t of the p-multiplicator, whose definition is u^p; hence, we have the equation
u^p = W * t
where W is a word (possibly trivial) in the generators of the group; find the image of t under alpha by setting up (W)alpha at cp1,
((u)alpha)^p at cp2, and then call solve_equation */
void Extend_Pow(int cp1, int cp2, int u, int offset, int *head, int *list, struct pcp_vars *pcp)
{ registerint *y = y_address;
for (i = 1; i <= lastg; ++i)
y[cp1 + i] = y[cp2 + i] = 0;
/* set up the image of u under alpha at cp2 */
traverse_list(1, head[offset + u], list, cp2, pcp);
/* raise the image of u under alpha to its pth power */
power(pcp->p, cp2, pcp);
/* set up image of W under alpha at cp1 */ if ((value = y[pcp->ppower + u]) < 0)
Collect_Image_Of_Str(-value, cp1, offset, head, list, pcp);
}
#ifdefined(GROUP)
/* given generator t of the p-multiplicator, whose definition is [u, v]; hence, we have the equation
[u, v] = W * t, or equivalently, u * v = v * u * W * t
where W is a word (possibly trivial) in the generators of the group; find the image of t under alpha by setting up (v)alpha * (u)alpha * (W)alpha at cp1, (u)alpha * (v)alpha at cp2
and then call solve_equation */
void Extend_Comm(int cp1, int cp2, int u, int v, int offset, int *head, int *list, struct pcp_vars *pcp)
{ registerint *y = y_address;
for (i = 1; i <= lastg; ++i)
y[cp1 + i] = y[cp2 + i] = 0;
/* set up the image of u under alpha at cp2 */
traverse_list(1, head[offset + u], list, cp2, pcp);
/* collect image of v under alpha at cp2 */
Collect_Image_Of_Gen(cp2, head[offset + v], list, pcp);
/* set up image of v under alpha at cp1 */
traverse_list(1, head[offset + v], list, cp1, pcp);
/* collect image of u under alpha at cp1 */
Collect_Image_Of_Gen(cp1, head[offset + u], list, pcp);
/* collect image of W under alpha at cp1 */
pointer = y[pcp->ppcomm + u]; if ((value = y[pointer + v]) < 0)
Collect_Image_Of_Str(-value, cp1, offset, head, list, pcp);
}
#endif
/* there may be a case where each of the exponent and p is large to use the power routine to compute the exp power of the image of generator under automorphism -- it does not seem to
be worthwhile where p = 5 -- needs further investigation */
void Pq_Collect_Image_Of_Gen( int exp, int cp, int head, int *list, struct pcp_vars *pcp)
{ registerint *y = y_address;
for (i = 1; i <= length; ++i)
y[lused + 1 + i] = list[head + i];
collect(-lused, cp, pcp);
}
/* collect image of supplied string under the action of
supplied automorphism and store the result at cp */
void Collect_Image_Of_Str( int string, int cp, int offset, int *head, int *list, struct pcp_vars *pcp)
{ registerint *y = y_address;
registerint i; registerint generator, exp; registerint value; registerint length = y[string + 1] - 1; /* last element of string
is in p-multiplicator */ #include"access.h"
/* process the string generator by generator, collecting exp copies of the image of generator under action of automorphism
-- should power routine be used? */
for (i = 1; i <= length; ++i) {
value = y[string + 1 + i];
generator = FIELD2(value);
exp = FIELD1(value); while (exp > 0) {
Collect_Image_Of_Gen(cp, head[offset + generator], list, pcp);
--exp;
}
}
}
¤ Dauer der Verarbeitung: 0.3 Sekunden
(vorverarbeitet)
¤
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.