#include "defs.h"
#include "permfns.h"
extern char inf[], inf2[], outf[], full, stabcall;
extern short perm[], sv2[], cp[], orb[], base[], lorb[], fixpt[], fixb[],
pno[], *pptr[], *svptr[], mnpt, mp, mb;
short npt;
FILE *ip, *op;
int egprog(void )
{
short nperms, ngens, nb, stab, olfb, nlfb, i, l, m, z;
if (full) {
if ((ip = fopen(inf2, "r" )) == 0 ) {
printf("Cannot open %s.\n" , inf2);
return (-1 );
}
fscanf(ip, "%hd%hd" , &i, &ngens);
fclose(ip);
}
if ((ip = fopen(inf, "r" )) == 0 ) {
printf("Cannot open %s.\n" , inf);
return (-1 );
}
if (stabcall) {
printf("Stabilize how many points? " );
scanf("%hd" , &stab);
}
else
stab = 0 ;
fscanf(ip, "%hd%hd%hd%hd" , &npt, &nperms, &nb, &l);
if (npt > mnpt) {
fprintf(stderr, "npt,too big. Increase NPT.\n" );
return (-1 );
}
if (nperms > mp) {
fprintf(stderr, "nperms too big. Increase MXP.\n" );
return (-1 );
}
if (nb > mb) {
fprintf(stderr, "nb too big. Increase MNB.\n" );
return (-1 );
}
if (l <= 0 ) {
fprintf(stderr, "Wrong input format.\n" );
return (-1 );
}
for (i = 0 ; i <= nperms; i++)
pptr[i] = perm + (npt + 1 ) * i - 1 ;
for (i = 1 ; i <= nb; i++)
svptr[i] = sv2 + npt * (i - 1 ) - 1 ;
for (i = 1 ; i <= npt; i++)
pptr[0 ][i] = i;
readbaselo(nb, base, lorb);
for (i = 1 ; i <= nperms; i++)
readvec(pptr[i], 1 );
fclose(ip);
/* Main algorithm begins */
op = fopen(outf, "w" );
*pno = 0 ;
fixpt[nb + 1 ] = 0 ;
for (l = nb; l > stab; l--) {
for (i = 1 ; i <= nperms; i++)
if (pptr[i][npt + 1 ] == l) {
(*pno)++;
pno[*pno] = i;
}
fixpt[l] = *pno;
}
for (l = stab; l >= 1 ; l--)
fixpt[l] = fixpt[stab + 1 ];
for (l = nb; l > stab; l--) {
olfb = fixpt[l + 1 ];
nlfb = fixpt[l];
if ((nlfb - olfb) > 1 )
for (i = olfb + 1 ; i <= nlfb; i++) {
z = pno[i];
/* We test whether perm no z is redundant as a generator.
If so , we leave pno [ i ] = 0 , if not we put it back to z .
*/
if (full == 0 || z > ngens) {
pno[i] = 0 ;
for (m = l; m > stab && pno[i] == 0 ; m--) {
*pno = fixpt[m];
if (orbitsv(base[m], svptr[m], 0 ) < lorb[m])
pno[i] = z;
}
}
}
}
*pno = 0 ;
l = 0 ;
for (i = nb; i >= 1 ; i--) {
z = fixpt[i];
while (l < z) {
l++;
if (pno[l] > 0 ) {
(*pno)++;
pno[*pno] = pno[l];
}
}
lorb[i] = orbitsv(base[i], svptr[i], 0 );
}
fprintf(op, "%4d%4d%4d%4d\n" , npt, *pno, nb, 3 );
printbaselo(nb, base, lorb);
printpsv(nb, pno, svptr);
for (i = 1 ; i <= *pno; i++)
fprintf(op, "%4d" , pno[i]);
fprintf(op, "\n" );
return (0 );
}
Messung V0.5 in Prozent C=99 H=58 G=80
¤ Dauer der Verarbeitung: 0.13 Sekunden
(vorverarbeitet am 2026-06-17)
¤
*© Formatika GbR, Deutschland