Quelle group.h
Sprache: C
#ifndef GROUP
#define GROUP
/* File group.h. File to be included with all permutation group theoretic
functions . Defines constants and types relating to permutation groups .
Also defines some convenient macros .
Certain preprocessor symbols must , or may , be defined on the compilation
command line . Of the symbols below , INT_SIZE is always required ; the others
are sometime required , or desirable :
INT_SIZE d - - Here d is the number of bits in type int ( usually
16 or 32 ) .
EBCDIC - - Must be defined if the system uses EBCDIC ( rather
than ASCII ) to represent characters .
PERIOD_TO_BLANK - - If defined , periods in a file name are translated
to blanks . This option is present primarily
for use with CMS . It allows , for example ,
a file named PSP82 GROUP A1 to be entered
in the form PSP82 . GROUP . A1 .
LONG_EXTERNAL_NAMES - - Should be defined if the compiler and linker
support external names ( 31 characters ) .
EXTRA_LARGE - - If defined , the compiler represents points using
type int rather than type short or unsigned short .
This permits permutation groups of high degree but
increases memory requirements considerably . This
option is intended for C compilers in which
sizeof ( int ) = 4 .
SIGNED - - Assuming EXTRA_LARGE is not defined , defining
signed causes points to be represented using
type short rather than type unsigned short . This
reduces the maximum degree for permutations groups
but speeds up the algorithm significantly on some
machines ( e . g . , IBM 3090 ) .
NOFLOAT - - Causes generation of code performing no floating
point operations . Useful primarily in cases
where the C compiler generates code requiring a
coprocessor when floating point arithmetic is
used .
TICK - - A value of CLK_TCK to be used in place of the
value defined in the header file time . h . This
is needed in the NOFLOAT option is chosen and if
CLK_TCK is given as a floating point quantity
( e . g . , 18 . 2 in Turbo C for the IBM PC ) . It is
also needed if an alternate CPU time function
is specified .
CPU_TIME timeFunc - - If defined , timeFunc must be the name of a user -
supplied function for measuring CPU time . If
not defined , the C function clock ( ) is used .
( This function is required on the SUN / 3 since
the clock function wraps around after less than
an hour . )
DEFAULT_MAX_BASE_SIZE b - - Here b is a default bound on the size of the base for
permutation groups . It is 62 by default . Larger
values of b increase memory requirements slightly
and may increase execution time very slightly .
This default value may be overridden by
means of the - mb option .
MAX_NAME_LENGTH n - - Here n is the number of characters allowed in
the name of a group , permutation , set , or
partition . Default is 16 . Large values may
cause problems with output .
MAX_FILE_ NAME_LENGTH m - - Here m is the number of characters allowed in
any file name ( including path information .
The default is 60 .
For some compilers , it may be necessary to insert code unique to that compiler .
In this case , a special symbol identifying the machine and compiler
( e . g . , IBM_CMS_WATERLOOC for Waterloo C on the IBM 370 ) should be defined ,
and the special code should be in the body of an # if directive specifying
that special symbol. */
#include <limits.h>
#include "leon_config.h"
#define INT_SIZE SIZEOF_INT<<3
#ifdef CPU_TIME
#define ALT_TIME_HEADER
#else
#define CPU_TIME clock
#endif
#ifndef LONG_EXTERNAL_NAMES
#include "extname.h"
#endif
#define Unsigned unsigned
#define UnsignedS unsigned
#define MAX_INT UINT_MAX
#define SCANF_Int_FORMAT "%u"
#ifndef MAX_NAME_LENGTH
#define MAX_NAME_LENGTH 256
#endif
#ifndef MAX_FILE_NAME_LENGTH
#define MAX_FILE_NAME_LENGTH 256
#endif
#ifndef DEFAULT_MAX_BASE_SIZE
#define DEFAULT_MAX_BASE_SIZE 62
#endif
#ifndef MAX_CODE_LENGTH
#define MAX_CODE_LENGTH 128
#endif
#define MAX_REFINEMENT_PARMS 3
#define MAX_FAMILY_PARMS 6
#define MAX_PRIME_FACTORS 30
#define MAX_EXTRA 10
#define SYMMETRIC_GROUP_CHAR '#'
#define IS_SYMMETRIC(g) ((g)->name[0 ] == SYMMETRIC_GROUP_CHAR)
#define ERROR_RETURN_CODE 15
#define MAX_COSET_REP_PRINT 300
#define TRUE 1
#define FALSE 0
#define BOOLEAN Unsigned
#define IRREDUCIBLE MAX_INT
#define UNKNOWN MAX_INT
#define MIN(x,y) ( ((x) < (y)) ? (x) : (y) )
#define MAX(x,y) ( ((x) > (y)) ? (x) : (y) )
#define ABS(x) ( ((x) < 0 ) ? (-(x)) : (x) )
#define FIRST_IN_ORBIT ((Permutation *) 1 )
#define EXCHANGE(x,y,temp) {temp = x; x = y; y = temp;}
#define ERROR(function,message) \
errorMessage( __FILE__, __LINE__, function, message);
#define ERROR1i(function,message1,intParm,message2) \
errorMessage1i( __FILE__, __LINE__, function, message1, intParm, message2);
#define ERROR1s(function,message1,strParm,message2) \
errorMessage1s( __FILE__, __LINE__, function, message1, strParm, message2);
#define ESSENTIAL_AT_LEVEL(perm,level) essentialAtLevel( perm, level)
#define ESSENTIAL_BELOW_LEVEL(perm,level) essentialBelowLevel( perm, level)
#define ESSENTIAL_ABOVE_LEVEL(perm,level) essentialAboveLevel( perm, level)
#define MAKE_ESSENTIAL_AT_LEVEL(perm,level) makeEssentialAtLevel( perm, level)
#define MAKE_NOT_ESSENTIAL_AT_LEVEL(perm,level) \
makeNotEssentialAtLevel( perm, level)
#define MAKE_NOT_ESSENTIAL_ATABOV_LEVEL(perm,level) \
makeNotEssentialAtAboveLevel( perm, level)
#define MAKE_NOT_ESSENTIAL_ALL(perm) makeNotEssentialAll( perm)
#define MAKE_UNKNOWN_ESSENTIAL(perm) makeUnknownEssential( perm)
#define COPY_ESSENTIAL(newPerm,oldPerm) copyEssential( newPerm, oldPerm)
#define RPQ_SIZE( rpq) rpq->size
#define RPQ_CLEAR( rpq) rpq->size = 0 ;
#ifdef EXTRA_LARGE
#define XLARGE TRUE
#endif
#ifndef EXTRA_LARGE
#define XLARGE FALSE
#endif
#ifdef SIGNED
#define SGND TRUE
#endif
#ifndef SIGNED
#define SGND FALSE
#endif
#ifdef NOFLOAT
#define NFLT TRUE
#endif
#ifndef NOFLOAT
#define NFLT FALSE
#endif
#ifndef CLK_TCK
#define CLK_TCK CLOCKS_PER_SEC
#endif
typedef struct {
int mbs, mnl, mpf, mrp, mfp, me, xl, sg, nf;
} CompileOptions;
#ifndef MAIN
void checkCompileOptions(
char *localFileName,
CompileOptions *mainOpts,
CompileOptions *localOpts);
#endif
#define CHECK(fileName) \
void x## fileName( CompileOptions *mainOptsPtr) \
{ CompileOptions localOpts = { DEFAULT_MAX_BASE_SIZE, MAX_NAME_LENGTH, \
MAX_PRIME_FACTORS, \
MAX_REFINEMENT_PARMS, MAX_FAMILY_PARMS, \
MAX_EXTRA, XLARGE, SGND, NFLT}; \
checkCompileOptions( __FILE__, mainOptsPtr, &localOpts); \
}
extern unsigned long bitSetAt[32 ];
extern unsigned long bitSetBelow[33 ];
typedef
enum {
PERM_GROUP, PERMUTATION, POINT_SET, PARTITION, DESIGN, MATRIX_01,
BINARY_CODE, INVALID_OBJECT
} ObjectType;
typedef struct {
Unsigned noOfFactors;
UnsignedS prime[MAX_PRIME_FACTORS+1 ];
UnsignedS exponent[MAX_PRIME_FACTORS+1 ];
} FactoredInt;
struct Word;
struct OccurenceOfGen;
typedef
struct Permutation {
char name[MAX_NAME_LENGTH+1 ];
UnsignedS degree;
UnsignedS *image; /* Alloc (degree+2)*sizeof(UnsignedS). */
UnsignedS *invImage; /* Alloc (degree+2)*sizeof(UnsignedS). */
Unsigned level;
unsigned long *essential;
struct Permutation *invPermutation;
struct Permutation *next,
*last;
struct Permutation *xNext,
*xLast;
struct Word *word; /* Alloc (MWLENGTH+2)*sizeof(Word *). */
struct OccurenceOfGen *occurHeader;
} Permutation;
typedef
struct Word {
Unsigned length;
Permutation **position;
} Word;
typedef
struct Relator {
Unsigned length;
Unsigned level;
Permutation **rel;
Unsigned **fRel;
Unsigned **bRel;
struct Relator *next;
struct Relator *last;
} Relator;
typedef
struct OccurenceOfGen {
Relator *r;
Unsigned relLength;
Unsigned level;
Unsigned **fRelStart;
Unsigned **bRelFinish;
struct OccurenceOfGen *next;
} OccurenceOfGen;
typedef
struct SplitSize {
Unsigned oldCellSize;
Unsigned newCellSize;
} SplitSize;
typedef
enum {
cycleFormat,
imageFormat,
binaryFormat,
cayleyLibraryFormat,
cayleyReadFormat
} PermFormat;
typedef /* Note below MBS denotes */
struct PermGroup { /* MAX_BASE_SIZE. */
char name[MAX_NAME_LENGTH+1 ];
Unsigned degree;
Unsigned baseSize;
FactoredInt *order; /* Alloc sizeof(FactoredInt). */
UnsignedS *base; /* Alloc (MBS+2)*sizeof(UnsignedS). */
UnsignedS *basicOrbLen; /* Alloc (MBS+2)*sizeof(UnsignedS). */
UnsignedS **basicOrbit; /* Alloc (MBS+2)*sizeof(UnsignedS **). */
Permutation ***schreierVec; /* Alloc (MBS+2)*sizeof(Permutation***).*/
UnsignedS **completeOrbit; /* Alloc (MBS+2)*sizeof(UnsignedS **). */
UnsignedS **orbNumberOfPt; /* Alloc (MBS+2)*sizeof(UnsignedS **). */
UnsignedS **startOfOrbitNo; /* Alloc (MBS+2)*sizeof(UnsignedS **). */
Permutation *generator;
UnsignedS *omega; /* Alloc (degree+2)*sizeof(UnsignedS). */
UnsignedS *invOmega; /* Alloc (degree+2)*sizeof(UnsignedS). */
PermFormat printFormat;
Relator *relator;
} PermGroup;
typedef
struct Partition {
char name[MAX_NAME_LENGTH+1 ];
Unsigned degree;
UnsignedS *pointList; /* Alloc (degree+2)*sizeof(UnsignedS). */
UnsignedS *invPointList; /* Alloc (degree+2)*sizeof(UnsignedS). */
UnsignedS *cellNumber; /* Alloc (degree+2)*sizeof(UnsignedS). */
UnsignedS *startCell; /* Alloc (degree+2)*sizeof(UnsignedS). */
} Partition;
typedef
struct PartitionStack {
Unsigned height;
Unsigned degree;
UnsignedS *pointList; /* Allocate (degree+2)*sizeof(UnsignedS). */
UnsignedS *invPointList; /* Allocate (degree+2)*sizeof(UnsignedS). */
UnsignedS *cellNumber; /* Allocate (degree+2)*sizeof(UnsignedS). */
UnsignedS *parent; /* Allocate (degree+2)*sizeof(UnsignedS). */
UnsignedS *startCell; /* Allocate (degree+2)*sizeof(UnsignedS). */
UnsignedS *cellSize; /* Allocate (degree+2)*sizeof(UnsignedS). */
} PartitionStack;
typedef
struct CellPartitionStack {
Partition *basePartn;
Unsigned height;
Unsigned cellCount;
UnsignedS *cellList; /* Alloc (cellCount+2)*sizeof(UnsignedS). */
UnsignedS *invCellList; /* Alloc (cellCount+2)*sizeof(UnsignedS). */
UnsignedS *cellGroupNumber; /* Alloc (cellCount+2)*sizeof(UnsignedS). */
UnsignedS *parentGroup; /* Alloc (cellCount+2)*sizeof(UnsignedS). */
UnsignedS *startCellGroup; /* Alloc (cellCount+2)*sizeof(UnsignedS). */
UnsignedS *cellGroupSize; /* Alloc (cellCount+2)*sizeof(UnsignedS). */
UnsignedS *totalGroupSize; /* Alloc (cellCount+2)*sizeof(UnsignedS). */
} CellPartitionStack;
typedef
union {
Unsigned intParm;
void *ptrParm;
} RefinementParm;
typedef SplitSize RefinementMapping(
const RefinementParm familyParm[],
const RefinementParm refnParm[],
PartitionStack *const UpsilonStack);
typedef struct {
RefinementMapping *refine;
RefinementParm familyParm_L[MAX_FAMILY_PARMS];
RefinementParm familyParm_R[MAX_FAMILY_PARMS];
} RefinementFamily;
typedef struct {
RefinementFamily *family;
RefinementParm refnParm[MAX_REFINEMENT_PARMS];
} Refinement;
typedef struct {
Refinement refn;
long priority;
} RefinementPriorityPair;
typedef RefinementPriorityPair ReducChkFn(
const RefinementFamily *family,
const PartitionStack *const UpsilonStack);
/* R-base notation is as in "Perm Grp Algs...". Note fields omega, invOmega,
alpha are not included here , but are set in the structure for the
containing group. */
typedef /* Note below MBS denotes */
struct { /* MAX_BASE_SIZE. */
Unsigned ell;
Unsigned k;
Unsigned degree;
Refinement *aAA; /* Alloc (degree+2) * sizeof(Refinement).*/
PartitionStack *PsiStack; /* Alloc sizeof(PartitionStack). */
UnsignedS *n_; /* Alloc (MBS+2)*sizeof(UnsignedS). */
UnsignedS *p_; /* Alloc (MBS+2)*sizeof(UnsignedS). */
UnsignedS *alphaHat; /* Alloc (MBS+2)*sizeof(UnsignedS). */
UnsignedS *a_; /* Alloc (degree+2)*sizeof(UnsignedS). */
UnsignedS *b_; /* Alloc (degree+2)*sizeof(UnsignedS). */
UnsignedS *omega; /* Alloc (degree+2)*sizeof(UnsignedS). */
UnsignedS *invOmega; /* Alloc (degree+2)*sizeof(UnsignedS). */
} RBase;
typedef
struct PointSet {
char name[MAX_NAME_LENGTH+1 ];
Unsigned size;
Unsigned degree;
UnsignedS *pointList; /* Alloc (degree+2)*sizeof(UnsignedS). */
char *inSet; /* Alloc (degree+2)*sizeof(char) */
} PointSet;
typedef
struct {
Unsigned size;
Unsigned degree;
Unsigned maxSize;
UnsignedS *pointList; /* Alloc (maxSize+2)*sizeof(UnsignedS). */
} RPriorityQueue;
typedef BOOLEAN Property( const Permutation *const );
typedef struct {
Unsigned maxBaseSize;
Unsigned maxDegree;
Unsigned maxWordLength;
BOOLEAN statistics;
BOOLEAN inform;
BOOLEAN strongMinDCosetCheck;
BOOLEAN compress;
Unsigned maxStrongGens;
Unsigned maxBaseChangeLevel;
Unsigned idealBasicCellSize;
Unsigned trimSGenSetToSize;
Unsigned writeConjPerm;
Unsigned restrictedDegree; /* For informCosetRep only. */
void (*altInformCosetRep)( Permutation *y);
Unsigned alphaHat1;
char genNamePrefix[8 ];
char outputFileMode[3 ];
char *groupOrderMessage;
char *cosetRepMessage;
char *noCosetRepMessage;
} GroupOptions;
typedef struct {
unsigned long initialSeed;
Unsigned minWordLengthIncrement;
Unsigned maxWordLengthIncrement;
Unsigned stopAfter;
BOOLEAN reduceGenOrder;
Unsigned rejectNonInvols;
Unsigned rejectHighOrder;
BOOLEAN onlyEssentialInitGens;
BOOLEAN onlyEssentialAddedGens;
} RandomSchreierOptions;
typedef struct {
char refnType;
PermGroup *leftGroup;
PermGroup *rightGroup;
} SpecialRefinementDescriptor;
typedef struct {
UnsignedS **revWord;
UnsignedS **invWord;
UnsignedS *lengthAtLevel; /* alloc (MAX_BASE_SIZE+2) * sizeof(UnsignedS) */
} THatWordType;
typedef char FieldElement;
typedef struct {
char name[MAX_NAME_LENGTH+1 ];
Unsigned size;
Unsigned characteristic;
Unsigned exponent;
char **sum;
char **dif;
char **prod;
char *inv;
} Field;
typedef struct {
char name[MAX_NAME_LENGTH+1 ];
Unsigned setSize;
Field *field;
Unsigned numberOfRows;
Unsigned numberOfCols;
char **entry;
Unsigned *unused;
} Matrix_01;
typedef struct {
char name[MAX_NAME_LENGTH+1 ];
Unsigned fieldSize;
Field *field;
Unsigned dimension;
Unsigned length;
char **basis;
Unsigned *infoSet;
} Code;
typedef struct {
Unsigned cellCount;
CellPartitionStack *xPsiStack;
CellPartitionStack *xUpsilonStack;
Refinement *xRRR;
void (*cstExtraRBase)(Unsigned level);
UnsignedS *applyAfter;
UnsignedS *xA_;
UnsignedS *xB_;
} ExtraDomain;
#endif
Messung V0.5 in Prozent C=93 H=79 G=86
¤ Dauer der Verarbeitung: 0.20 Sekunden
(vorverarbeitet am 2026-06-26)
¤
*© Formatika GbR, Deutschland
2026-07-27