/* this routine moves existing structures in the array y to create thespacenecessarytostorethepresentationtobecomputedfor thenextclass;foradescriptionofthebasicdatastructures,
read the header file setup.h */
registerint moccur; registerint new_space; /* new space required for next class */ registerint max_gens; /* upper bound for total number of generators */ registerint end_ccm2; /* last generator of class pcp->cc - 2 */ registerint halfwt; registerint oldpc;
registerint pcomm; registerint extra_ppower; /* extra pointers to powers */ registerint extra_ppcomm; /* extra pointers to pointers to commutators */ registerint extra_comm; /* extra pointers to commutators */
/* structure information is stored at the back of y */
pcp->structure = pcp->backy - ndgen;
pcp->words = pcp->structure;
pcp->subgrp = pcp->words;
pcp->submlg = pcp->subgrp - pcp->lastg;
pcp->nwords = 0;
pcp->nsubgp = 0;
/* pcp->lused is the last used location working from the front */
pcp->lused = pcp->relp + 2 * pcp->ndrel;
/* pcp->gspace is the index of the first garbage collectable
location in the array y */
pcp->gspace = pcp->lused + 1;
if (is_space_exhausted(0, pcp)) return;
/* mark all defining generators as irredundant */ for (i = 1; i <= ndgen; ++i) {
y[pcp->dgen + i] = i;
y[moccur + i] = 0;
}
/* set up inverse, j^(p - 1), for defining generator j; notallinversesarerequiredbutwechoosetocomputethese
as such information is useful for the Holt & Rees programs */
/* for generators of current class, generator eliminating equationsarepointedtobyy[structure+i]; y[structure+i]ispositiveifgeneratoriisnotredundant; y[structure+i]=0ifgeneratoriistrivial; y[structure+i]=-ptrifgeneratorihasvaluepointedtobyptr;
eachpositivewordiny[structure+i]has3piecesof informationstoredinitarrangedasfollows-- bits25tothe(noofbitsinacomputerword-1)contain weight(class)information; bits0to24containthedefininginformationforgeneratori; thedefininginformationiscomposedof2parts, bits0to8containingasay,andbits9to24containingbsay; ifb=0thengeneratoriisontheimageofdefininggeneratora; ifa=0thengeneratoriisonthepowerb^p; ifbothaandbarenon-zerothengeneratoriisonthe commutator(b,a);itispossiblethatthisversionallowsthe usertocontrolthetheprecisebreakdownofthewordvia
the run-time options -c and -d */
/* insert structure information to indicate that i is irredundant */ for (i = 1; i <= ndgen; ++i)
y[pcp->structure + i] = i;
return;
}
/* for class 2 we create space for -- thepointerstopowers(baseaddresspcp->ppower), pointerstopointerstocommutators(baseaddresspcp->ppcomm), pointerstocommutators,andadditionalstructureinformation;
this data is accommodated by moving the structure array forward */
if (pcp->cc == 2) {
pcp->ncomm = lastg * (lastg - 1) / 2;
/* is the next class already set up? */ if (pcp->ncset != 0) {
new_space = pcp->ncomm + ndgen;
class_setup(new_space, pcp); return;
}
/* the following additional space is required -- forpcp->ppower=lastg;forpcp->ppower=lastg; forpcp->ppcomm=lastg-1;forpcomm=pcp->ncomm;
also required is pcp->ncomm + ndgen */
/* structure information is moved to accommodate the new data */
pcp->structure -= new_space;
pcp->words = pcp->structure;
pcp->subgrp = pcp->words;
pcp->submlg = pcp->subgrp - lastg;
if (is_space_exhausted(0, pcp)) return;
for (i = 1; i <= lastg; ++i)
y[pcp->structure + i] = y[pcp->structure + new_space + i];
/* pointers to powers follow structure plus any spare area */
pcp->ppower = pcp->structure + lastg + pcp->ncomm + ndgen;
for (i = 1; i <= lastg; ++i)
y[pcp->ppower + i] = 0;
/* initialise pcp->ppcomm so that y[pcp->ppcomm + 2] is the
first location after y[pcp->ppower + lastg] */
pcp->ppcomm = pcp->ppower + lastg - 1;
/* pointers to commutators follow in lexicographic order
after y[pcp->ppcomm + lastg] */
pcomm = pcp->ppcomm + lastg; for (i = 2; i <= lastg; ++i) {
pcomm += i - 2;
y[pcp->ppcomm + i] = pcomm;
}
for (i = 1, bound = pcp->ncomm; i <= bound; ++i)
y[pcp->ppcomm + lastg + i] = 0;
return;
}
/* class 3 onwards --
check that occurrence conditions don't stop at this class */
/* calculate an upper bound for the number of new generators */
value = y[class_end + 1];
max_gens = value * (value - 1) / 2 + (lastg - value) * value + ndgen;
/* is the next class already set up? */ if (pcp->ncset != 0) {
new_space = max_gens;
class_setup(new_space, pcp); return;
}
/* compute the new space required */
end_ccm2 = y[class_end + pcp->cc - 2];
extra_ppower = lastg - end_ccm2;
extra_ppcomm = extra_ppower;
halfwt = (pcp->cc - 1) / 2;
/* compute the number of extra commutators to be stored */ for (i = 1, extra_comm = 0; i <= halfwt; ++i) {
extra_comm +=
(y[class_end + i] - y[class_end + i - 1]) *
(y[class_end + pcp->cc - i] - y[class_end + pcp->cc - i - 1]);
}
/* move pointers to commutators and compute pointers to these */ for (w = 3, bound = pcp->cc; w <= bound; w++) {
s = MAX(y[class_end + w - 3] + 1, 2);
e = y[class_end + w - 2];
for (i = s; i <= e; ++i) {
y[pcp->ppcomm + i] = pcomm;
value = y[class_end + pcp->cc - w + 1]; for (ee = MIN(i - 1, value); ee > 0; --ee) {
y[++pcomm] = y[++oldpc]; if (y[pcomm] < 0) {
p1 = -y[pcomm];
y[p1] = pcomm;
}
}
x = w - 2 - halfwt; if (x > 0) /* make room for (w - 2, pcp->cc - (w - 2)) commutators */
k = y[class_end + pcp->cc - w + 2] - value; else { if (x == 0 && MOD(pcp->cc, 2) == 0) /* make room for (pcp->cc / 2, pcp->cc / 2) commutators */
k = MAX(0, i - y[class_end + halfwt - 1] - 1); else
k = 0;
} for (j = 1; j <= k; ++j)
y[pcomm + j] = 0;
pcomm += k;
}
}
/* append the left-normed commutators of class pcp->cc */
s = y[class_end + pcp->cc - 2] + 1;
k = y[class_end + 1]; for (i = s; i <= lastg; ++i) { for (j = 1; j <= k; ++j)
y[pcomm + j] = 0;
y[pcp->ppcomm + i] = pcomm;
pcomm += k;
}
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 und die Messung sind noch experimentell.