/* This function may be used to determine the total number of generators, and thenumberofknowninvolutorygenerators,inapermutationgroup.The functionreturnsthetotalnumberofgeneratorsandsetsthesecond parametertothenumberofinvolutorygenerators.Notethefunctionassumes inversegeneratorsarepresentaspermutationsonthelinkedlistof
generators, unless involCount == NULL. */
Unsigned genCount( const PermGroup *const G, /* The permutation group. */ Unsigned *involCount) /* If nonnull, set to number of
involutory generators. */
{ Unsigned totalCount = 0, tempInvolCount = 0;
Permutation *gen;
for ( gen = G->generator ; gen ; gen = gen->next ) {
++totalCount; if ( isInvolution( gen) )
++tempInvolCount;
}
/* The function isFixedPointOf( G, level, point) returns true if the point
point is a fixed point of G^(level), and it returns false otherwise. */
BOOLEAN isFixedPointOf( const PermGroup *const G, /* A group with known base and sgs. */ constUnsigned level, /* The level mentioned above. */ constUnsigned point) /* Check if this point is a fixed point. */
{
Permutation *gen;
for ( gen = G->generator ; gen ; gen = gen->next ) if ( gen->level >= level && gen->image[point] != point ) returnFALSE;
/* This function returns true if a permutation group has order at least 2 and
false if it has order 1. A base/sgs are not needed. */
BOOLEAN isNontrivialGroup(
PermGroup *G) /* The permutation group to test. */
{
Permutation *gen; for ( gen = G->generator ; gen ; gen = gen->next ) if ( !isIdentity( gen) ) returnTRUE; returnFALSE;
}
/* This function returns the level of a permutation relative to the sequenceofpointsinthearraybaseofapermutationgroup.(Thearray neednotactuallybeabase.)Ifthepermutationfixesthe"base",the
value returned is 1+baseSize. */
Unsigned levelIn(
PermGroup *G, /* The perm group (base and baseSize filled in). */
Permutation *perm) /* The permutation whose level is returned. */
{ Unsigned level; for ( level = 1 ; level <= G->baseSize && perm->image[G->base[level]] ==
G->base[level] ; ++level )
; return level;
}
/* This function returns true if a given permutation known to lie in a group withknownbaseistheidentity,andfalseotherwise.Thefunctionis
fast, as the permutation need be applied only to the base. */
BOOLEAN isIdentityElt(
PermGroup *G, /* The permutation group (base known). */
Permutation *perm) /* The permutation known to lie in G. */
{ Unsigned i;
if ( !IS_SYMMETRIC(G) ) { for ( i = 1 ; i <= G->baseSize && perm->image[G->base[i]] ==
G->base[i] ; ++i )
; return i > G->baseSize;
} else { for ( i = 1 ; i <= G->degree && perm->image[i] == i ; ++i )
; return i > G->degree;
}
}
/* This function returns true if a given permutation known to lie in a group withknownbaseisaninvolution,andfalseotherwise.Thefunctionis
fast, as the permutation need be applied only to the base. */
BOOLEAN isInvolutoryElt(
PermGroup *G, /* The permutation group (base known). */
Permutation *perm) /* The permutation known to lie in G. */
{ Unsigned i; for ( i = 1 ; i <= G->baseSize && perm->image[perm->image[G->base[i]]] ==
G->base[i] ; ++i )
; return i > G->baseSize;
}
/* The function fixesBasicOrbit( G, level, perm) returns true if permutation permfixes(setwise)thelevel'thbasicorbitorpermutationgroupGand
returns false otherwise. Note: The basic orbit need not be correct. */
/* This function constructs a singly linked list of all the generators of a permutationgroupessentialataspecifiedlevel,usingthexNextfield ofthegeneratingpermutations.Itreturnsapointertothehead permutationonthelist.Thefieldessentialofeachgeneratormustbe
filled in. */
Permutation *linkEssentialGens(
PermGroup *G, /* The permutation group. */ Unsigned level) /* Generators essential at this level are
linked. */
{
Permutation *listHeader = NULL, *previousGen = NULL, *gen;
for ( gen = G->generator ; gen ; gen = gen->next ) if ( ESSENTIAL_AT_LEVEL(gen,level) ) { if ( previousGen )
previousGen->xNext = gen; else
listHeader = gen;
gen->xNext = NULL;
previousGen = gen;
}
/* This function assigns a name to a generator for a permutation group. The namechosenis<options.genNamePrefix>zz,wherezzisthe2-digitASCII representationofthesmallestpositiveintegernotcurrentlyinusefor ageneratorname.However,if<options.genNamePrefix>is*,thenthename willbeasingleletter,thefirstnotcurrentlyinuse,ortwoidentical letters,ifallsinglelettersareinuse.Thefunctionterminateswith
an error message if all possible names are already in use. */
/* This function tests rather the "depth" of a group G exceeds a specified integralvaluecomparisonDepth.HerethedepthofGisdefinedtobe log(|G|)/log(degree(G)).Thefunctionreturnstrueifthedepthof GexceedscomparisonDepthandfalseotherwise.Overflowshouldoccur onlyif(degree(G))^comparisonDepthisoutofbounds.IftheNOFLOAT
option is given, the computation is approximate. */
BOOLEAN depthGreaterThan( const PermGroup *const G, constUnsigned comparisonDepth)
{ int i, j;
/* This function may be used to conjugate one permutation by another. The permutationpermisreplacedbyconjPerm^-1*perm*conjPerm.Itis
assumed that both permutations have the same degree. */
/* This function may be used to conjugate a permutation group by a permutation. ThepermutationgroupGisreplacedbyconjPerm^-1*G*conjPerm.Itis assumedthatthegroupandthepermutationhavethesamedegree.The completeThecompleteOrbit,orbNumberOfPt,andstartOfOrbitNofieldsare
not currently handled, nor are omega and invOmega. */
/* The function checkConjugacyInGroup( G, e, f, conjPerm) returns true if permutationconjPerminGconjugatespermutationeingroupGtopermutation finG,thatis,ife^conjPerm=f,orequivalently, e*conjPerm=conjPerm*f.ItisassumedGhasabaseandstrong
generating set. */
/* The function isElementOf( perm, group) returns true is the permutation permliesinthegroupGandfalseotherwise.Thegroupmustalready haveabaseandstronggeneratingset.Thisprocedureisnotparticularly efficient:Itdoesagreatdealofunnecessarymultiplications
if containment turns out not to hold. */
/* Check that the group has a base. If not, give error message. */ if ( group->base == NULL)
ERROR1s( "isElementOf", "Group ", group->name, " must have a base.")
/* Make a copy of permutation perm. */
perm1 = copyOfPermutation( perm);
/* Now attempt to factor perm1. If process breaks down because the appropriatepointisnotintherequiredbasicorbit,returnfalse
immediately. */ for ( level = 1 ; level <= group->baseSize ; ++level) {
gamma = perm1->image[group->base[level]]; while ( (gen = group->schreierVec[level][gamma]) != NULL &&
gen != FIRST_IN_ORBIT ) {
rightMultiplyInv( perm1, gen);
gamma = gen->invImage[gamma];
} if ( gen == NULL ) {
deletePermutation( perm1); returnFALSE;
}
}
/* If all the appropriate points lie in the correct basic orbits, return
true if and only if the remaining permutation is the identity. */
returnValue = isIdentity( perm1);
deletePermutation( perm1); return returnValue;
}
/* The function isSubgroupOf( subGroup, group) returns true if subGroup isasubgroupofgroupandreturnsfalseotherwise.Thedegreesofthe groupsmustbeequal.Itisnottooefficientbecauseitchecksall (possiblystrong)generatorsofsubGroup.Notegroupmusthavea
base and strong generating set, but subGroup need not. */
/* Check that the group has a base. If not, give error message. */ if ( group->base == NULL)
ERROR1s( "isElementOf", "Group ", group->name, " must have a base.")
/* Now check each generator of subGroup for containment in group. */ for ( gen = subGroup->generator ; gen ; gen = gen->next ) if ( !isElementOf(gen,group) ) returnFALSE; returnTRUE;
}
/* The function isNormalizedBy( group, nGroup) returns true if group isnormalizedbynGroupandreturnsfalseotherwise.Thedegreesofthe groupsmustbeequal.Itisinefficientbecauseitchecksall (possiblystrong)generatorsofgroupconjugatedbyall(possiblystrong) generatorsofnGroupand,moreimportantly,itdoesNOTtakeadvantageof anypriorknowledgethatgroupisasubgroupofnGroup.Notegroupmust
have a base and strong generating set, but nGroup need not. */
/* Check that the group has a base. If not, give error message. */ if ( group->base == NULL)
ERROR1s( "isElementOf", "Group ", group->name, " must have a base.")
/* Now check each conjugage of each generator of group for containment in
nGroup. */ for ( gen = group->generator ; gen ; gen = gen->next ) {
involFlag = isInvolution( gen); if ( involFlag && perm->invImage != perm->image ) {
freeIntArrayDegree( perm->invImage);
perm->invImage = perm->image;
} elseif ( !involFlag && perm->invImage == perm->image )
perm->invImage = allocIntArrayDegree(); for ( nGen = nGroup->generator ; nGen ; nGen = nGen->next ) { for ( pt = 1 ; pt <= group->degree ; ++pt )
perm->image[nGen->image[pt]] = nGen->image[gen->image[pt]]; if ( !involFlag ) for ( pt = 1 ; pt <= group->degree ; ++pt )
perm->invImage[perm->image[pt]] = pt; if ( !isElementOf(perm,group) ) {
freePermutation( perm); returnFALSE;
}
}
}
/* The function isCentralizedBy( group, cGroup) returns true if group iscentralizedbycGroupandreturnsfalseotherwise.Thedegreesofthe groupsmustbeequal.Itisinefficientbecauseitchecksallpairsof (possiblystrong)generatorsfromthetwogroupsand,moreimportantly,it doesNOTtakeadvantageofanypriorknowledgeofthebasesofthetwo
groups (as would be possible when one is contained in the other). */
/* Check equality of degrees. */ if ( group->degree != cGroup->degree )
ERROR( "isCentralizedBy", "Groups do not have same degree.")
/* Check each generator of group commutes with each generator of cGroup. */ for ( gen = group->generator ; gen ; gen = gen->next ) for ( cGen = cGroup->generator ; cGen ; cGen = cGen->next ) for ( pt = 1 ; pt <= group->degree ; ++pt ) if ( cGen->image[gen->image[pt]] != gen->image[cGen->image[pt]] ) returnFALSE;
/* The function isBaseImage( G, image), where G is a permutation group having abaseandstronggeneratingsetandwhereimageisanarrayofpointsof lengthG->baseSize,returnstrueifthereexistsapermutationinGmapping
the base to the sequence image, and returns false otherwise. */
/* The function reduceWrtGroup( G, h, reductionLevel), where G is a permutationgroupwithbaseandstronggeneratingsetandwherehisa permutation(withinverseimage)replaceshby hu_1[d_1]^-1u_2[d_2]^-1u_j-1[d_j-1]^-1, wherethenewhfixesthefirstj-1basepointsofG,andwherethe newhmapsthej'thbasepointoutsidethej'thbasicorbit,orwhere j=G->baseSize+1.UnlessreductionLevel=NULL,itsets*reductionLevel
to j. */
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.