/* This function compresses a permutation group for which the complete orbit structure. After compression, the group must remain essentially constant, and it may not be freed with deletePermGroup. During compression, 1) G->startOfOrbitNo[i] is reduced to its exact size, whenever its exact size is <= half the degree. 2) G->basicOrbit[i] is made to point to a location in completeOrbit[i], and the contents of G->basicOrbit[i] is transferred to the
appropriate locations in completeOrbit[i]. */
void compressGroup(
PermGroup *const G) /* The group to be compressed. */
{ Unsigned d, i, orbitCountPlus1;
UnsignedS *oldStartOfOrbit, *oldBasicOrbit;
/* This function acts like compressGroup, except that compression occurs only
at one specified level). */
void compressAtLevel(
PermGroup *const G, /* The group to be compressed. */ constUnsigned level) /* The level at which compression occurs. */
{ Unsigned i, orbitCountPlus1;
UnsignedS *oldStartOfOrbit, *oldBasicOrbit;
/* Here we compress the startOfOrbitNo fields. */
oldStartOfOrbit = G->startOfOrbitNo[level]; for ( orbitCountPlus1 = 1 ; oldStartOfOrbit[orbitCountPlus1] <=
G->degree ; ++orbitCountPlus1 )
;
G->startOfOrbitNo[level] =
(UnsignedS *) malloc( (orbitCountPlus1+1) * sizeof(UnsignedS) ); for ( i = 1 ; i <= orbitCountPlus1 ; ++i )
G->startOfOrbitNo[level][i] = oldStartOfOrbit[i];
/* Here we compress the basic orbit fields. */
oldBasicOrbit = G->basicOrbit[level];
G->basicOrbit[level] = G->completeOrbit[level] +
G->startOfOrbitNo[level][ G->orbNumberOfPt[level][G->base[level]] ] - 1; for ( i = 1 ; i <= G->basicOrbLen[level] ; ++i )
G->basicOrbit[level][i] = oldBasicOrbit[i];
freeIntArrayDegree( oldBasicOrbit);
}
/* This function sorts the strong generators for a group in descending order according to the "level" field. Within a fixed level, involutory
generators are placed before noninvolutory ones. */
/* Here the generators are placed on separate forward-linked lists, two for
each level (one for involutions, the other for non-involutions. */ for ( gen = G->generator ; gen ; gen = gen->next ) if ( isInvolutoryElt(gen) ) {
gen->next = involGen[gen->level];
involGen[gen->level] = gen;
} else {
gen->next = nonInvolGen[gen->level];
nonInvolGen[gen->level] = gen;
}
G->generator = NULL;
/* Now we reform a singly-linked list of the generators in sorted order. */ for ( i = 1 ; i <= G->baseSize ; ++i ) { if ( nonInvolGen[i] ) {
oldListHeader = G->generator;
G->generator = involGen[i]; for ( gen = G->generator ; gen->next ; gen = gen->next )
;
gen->next = oldListHeader;
} if ( involGen[i] ) {
oldListHeader = G->generator;
G->generator = involGen[i]; for ( gen = G->generator ; gen->next ; gen = gen->next )
;
gen->next = oldListHeader;
}
}
/* Finally we reconstruct the backward links. */
previousGen = NULL; for ( gen = G->generator ; gen ; gen = gen->next ) {
gen->last = previousGen;
previousGen = gen;
}
} #endif
Messung V0.5
¤ Dauer der Verarbeitung: 0.12 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 und die Messung sind noch experimentell.