int main(void)
{ short i, j, m, n, y, np, nb, mxp, ord, im, len, *p, *q; int quot; int chct; char nt, f, id, eq, fault, flnm[80];
reenter:
printf("Do you wish to read permutations from a file (y/n)? "); if (getchar() == 'y') {
f = 1;
snl();
printf("Input filename: ");
scanf("%s", flnm);
snl(); if ((ip = fopen(flnm, "r")) == 0) {
fprintf(stderr, "Cannot open %s.\n", flnm); goto reenter;
}
fscanf(ip, "%hd%hd%hd%hd", &npt, &np, &nb, &m);
seeknln(); if (nb != 0) { if (nb >= mb) {
fprintf(stderr, "Too many base points. Increase MB.\n"); return (-1);
} for (i = 1; i <= nb; i++)
fscanf(ip, "%hd", base + i);
seeknln();
} if (m != 0)
seeknln();
} else {
f = 0;
snl();
printf("Input npt: ");
scanf("%hd", &npt);
snl();
nb = 0;
} if (npt > mpt) {
fprintf(stderr, "npt too big. Increase NPT.\n"); exit(1);
}
quot = psp / npt; if (quot > mp)
mxp = mp; else
mxp = quot;
printf("Perm nos 1 - %d can be read. Perm no 0 is always the identity\n",
mxp - 1); for (i = 0; i < mxp; i++) {
pptr[i] = perm - 1 + npt * i;
pno[i] = 0;
}
p = pptr[0]; for (i = 1; i <= npt; i++)
p[i] = i;
pno[0] = 1; if (f) { if (np >= mxp) {
fprintf(stderr, "Not enough perm space to read perms from file.");
fprintf(stderr, " Increase PSP (or MP).\n"); exit(1);
} for (i = 1; i <= np; i++) { if (readperm(pptr[i]) == 2) {
fprintf(stderr, "Perm no %i is not a permutation.\n"); exit(1);
}
pno[i] = 1;
seeknln();
}
fclose(ip);
}
while (1) {
printf("Choose option. Print 'l' for list.\n");
scanf("%s", opt); if (strcmp(opt, "l") == 0) {
snl();
printf("rp n = read perm no n.\n");
printf("pp n = print perm no n.\n");
printf("ppc n = print perm no n in cycles.\n");
printf("inv m n = calc inverse p[n] of p[m].\n");
printf("pr n l i(1)...i(l) = calc prod p[n] of p[i(1)]...p[i(l)].\n");
printf("im m x = print image of point x under p[m].\n");
printf("fp n = print fixed pts of p[n].\n");
printf("fpn l i(1)...i(l) = print common fixed pts of " "p[i(1)],...,p[i(l)].\n");
printf("cyc n x = print cycle of point x under p[n].\n");
printf("ord n = print order of p[n].\n");
printf("orb l i(1)...i(l) = print orbits of p[i(1)]...p[i(l)].\n");
printf("rb = read in a base for the group.\n");
printf("op filename = output some perms to 'filename'.\n");
printf("opord filename = output some perms to 'filename' and\n");
printf( " compute order of group they generate.\n");
printf(" (Only works if base known for G!).\n");
printf( "rf n filename = read in additional perms from filename\n");
printf(" starting at perm. no. n.\n");
printf("q = quit.\n");
} elseif (strcmp(opt, "rp") == 0) {
scanf("%hd", &n);
snl(); if (n <= 0 || n >= mxp)
fprintf(stderr, "Invalid perm.no %d.\n", n); else { while (rp(pptr[n]) == 2) {
fprintf(stderr, "That is not a permutation. Try again!\n");
snl();
}
pno[n] = 1;
}
} elseif (strcmp(opt, "pp") == 0) {
scanf("%hd", &n);
snl(); if (n < 0 || n >= mxp || pno[n] == 0) {
fprintf(stderr, "Perm no %d is not defined.\n", n); continue;
}
p = pptr[n]; for (i = 1; i <= npt; i++)
printf("%4d", p[i]);
printf("\n");
} elseif (strcmp(opt, "ppc") == 0) {
scanf("%hd", &n);
snl(); if (n < 0 || n >= mxp || pno[n] == 0) {
fprintf(stderr, "Perm no %d is not defined.\n", n); continue;
} for (i = 1; i <= npt; i++)
orb[i] = 1;
p = pptr[n];
id = 1;
chct = 0; for (m = 1; m <= npt; m++) if (orb[m]) { if ((im = p[m]) != m) {
id = 0;
orb[im] = 0;
printf("(%d,%d", m, im);
chct += (num_digits(m) + num_digits(im) + 2); while ((im = p[im]) != m) { if (chct >= 75) {
printf(",\n%d", im);
chct = num_digits(im);
} else {
printf(",%d", im);
chct += (1 + num_digits(im));
}
orb[im] = 0;
}
printf(")");
chct++; if (chct >= 72) {
printf("\n");
chct = 0;
}
}
} if (id)
printf("Perm no %d is the identity.\n", n); else
printf("\n");
} elseif (strcmp(opt, "inv") == 0) {
scanf("%hd%hd", &m, &n);
snl(); if (m < 0 || m >= mxp || pno[m] == 0) {
fprintf(stderr, "Perm no %d is not defined.\n", m); continue;
} if (n <= 0 || n >= mxp) {
fprintf(stderr, "Invalid perm. no. %d.\n", n); continue;
}
invert(pptr[m], pptr[n]);
pno[n] = 1;
} elseif (strcmp(opt, "pr") == 0) {
scanf("%hd%hd", &m, cp); if (m <= 0 || m >= mxp) {
fprintf(stderr, "Invalid perm no. %d\n", m);
snl(); continue;
}
fault = 0; for (i = 1; i <= *cp; i++) {
scanf("%hd", cp + i);
n = *(cp + i); if (n < 0 || n >= mxp || pno[n] == 0) {
fprintf(stderr, "Perm no %d is not defined.\n", n);
fault = 1;
snl(); break;
}
} if (fault) continue;
snl();
p = pptr[m]; for (i = 1; i <= npt; i++)
p[i] = image(i);
pno[m] = 1;
} elseif (strcmp(opt, "im") == 0) {
scanf("%hd%hd", &n, &i);
snl(); if (n < 0 || n >= mxp || pno[n] == 0) {
fprintf(stderr, "Perm no %d is not defined.\n", n); continue;
} if (i <= 0 || i > npt) {
fprintf(stderr, "Inappropriate point %d.\n", i); continue;
}
printf("%d\n", pptr[n][i]);
} elseif (strcmp(opt, "fp") == 0) {
scanf("%hd", &n);
snl(); if (n < 0 || n >= mxp || pno[n] == 0) {
fprintf(stderr, "Perm no %d is not defined.\n", n); continue;
}
p = pptr[n];
nt = 1; for (i = 1; i <= npt; i++) if (p[i] == i) {
nt = 0;
printf("%4d", i);
} if (nt)
printf("No fixed points.\n"); else
printf("\n");
} elseif (strcmp(opt, "fpn") == 0) {
scanf("%hd", cp);
fault = 0; for (i = 1; i <= *cp; i++) {
scanf("%hd", cp + i);
n = *(cp + i); if (n < 0 || n >= mxp || pno[n] == 0) {
fprintf(stderr, "Perm no %d is not defined.\n", n);
fault = 1;
snl(); break;
}
} if (fault) continue;
snl();
nt = 1; for (n = 1; n <= npt; n++) {
f = 1; for (i = 1; i <= *cp; i++) if (pptr[cp[i]][n] != n) {
f = 0; break;
} if (f) {
nt = 0;
printf("%4d", n);
}
} if (nt)
printf("No fixed points.\n"); else
printf("\n");
} elseif (strcmp(opt, "cyc") == 0) {
scanf("%hd%hd", &n, &i);
snl(); if (i <= 0 || i > npt) {
fprintf(stderr, "Inappropriate point %d.\n", i); continue;
} if (n < 0 || n >= mxp || pno[n] == 0) {
fprintf(stderr, "Perm no %d is not defined.\n", n); continue;
}
p = pptr[n]; if ((im = p[i]) == i)
printf("%d is fixed under p[%d].\n", i, n); else {
printf("(%d,%d", i, im); while ((im = p[im]) != i)
printf(",%d", im);
printf(")\n");
}
} elseif (strcmp(opt, "ord") == 0) {
scanf("%hd", &n);
snl(); if (n < 0 || n >= mxp || pno[n] == 0) {
fprintf(stderr, "Perm no %d is not defined.\n", n); continue;
}
p = pptr[n];
id = 1; for (i = 1; i <= npt; i++)
orb[i] = 1;
ord = 1; for (m = 1; m <= npt; m++) if (orb[m]) { if ((im = p[m]) != m) {
id = 0;
orb[im] = 0;
len = 2; while ((im = p[im]) != m) {
orb[im] = 0;
len++;
}
ord = lcm(ord, len);
}
} if (id)
printf("Perm no %d is the identity.\n", n); else
printf("%d\n", ord);
} elseif (strcmp(opt, "orb") == 0) {
scanf("%hd", cp);
fault = 0; for (i = 1; i <= *cp; i++) {
scanf("%hd", cp + i);
n = *(cp + i); if (n < 0 || n >= mxp || pno[n] == 0) {
fprintf(stderr, "Perm no %d is not defined.\n", n);
fault = 1;
snl(); break;
}
} if (fault) continue;
snl();
allorbs();
} elseif (strcmp(opt, "eq") == 0) {
scanf("%hd%hd", &m, &n);
snl(); if (n < 0 || n >= mxp || pno[n] == 0) {
fprintf(stderr, "Perm no %d is not defined.\n", n); continue;
} if (m < 0 || m >= mxp || pno[m] == 0) {
fprintf(stderr, "Perm no %d is not defined.\n", m); continue;
}
p = pptr[m];
q = pptr[n];
eq = 1; for (i = 1; i <= npt; i++) if (p[i] != q[i]) {
eq = 0; break;
} if (eq)
printf("Permutations are equal.\n"); else
printf("Permutations are not equal on point %d.\n", i);
} elseif (strcmp(opt, "rb") == 0) {
snl();
printf("Input base points, preceded by their number.\n");
scanf("%hd", &nb); if (nb >= mb) {
fprintf(stderr, "Too many base points. Increase MB.\n"); return (-1);
} for (i = 1; i <= nb; i++)
scanf("%hd", base + i);
snl();
} elseif ((y = strcmp(opt, "opord")) == 0 || strcmp(opt, "op") == 0) { if (y == 0 && nb == 0) {
fprintf(stderr, "Order can only be computed when base is known.\n"); continue;
}
scanf("%s", flnm);
snl();
op = fopen(flnm, "w");
printf("Input perm nos to be saved, preceded by their number.\n");
scanf("%hd", &n);
fprintf(op, "%3d %4d%4d%4d\n", npt, n, nb, 0); if (nb != 0) if (npt >= 10000) { for (i = 1; i <= nb; i++)
fprintf(op, "%6d", base[i]);
fprintf(op, "\n");
} elseif (npt >= 1000) { for (i = 1; i <= nb; i++)
fprintf(op, "%5d", base[i]);
fprintf(op, "\n");
} else { for (i = 1; i <= nb; i++)
fprintf(op, "%4d", base[i]);
fprintf(op, "\n");
}
f = 0; for (i = 1; i <= n; i++) {
scanf("%hd", &m); if (m < 0 || m >= mxp || pno[m] == 0) {
printf("Perm no %d is not defined.\n", m);
fclose(op);
snl();
unlink(flnm);
f = 1; break;
}
printvec(pptr[m], 0);
} if (f) continue;
snl();
fclose(op); if (y == 0) {
sprintf(sysstring, "cp %s optxxx.ip", flnm);
system(sysstring);
system("gprun -b optxxx ip ip");
unlink("optxxx.ip");
}
} elseif (strcmp(opt, "rf") == 0) {
scanf("%hd", &n);
scanf("%s", flnm);
snl(); if ((ip = fopen(flnm, "r")) == 0) {
fprintf(stderr, "Cannot open %s.\n", flnm); continue;
}
fscanf(ip, "%hd%hd%hd%hd", &i, &np, &j, &m);
seeknln(); if (i != npt) {
fprintf(stderr, "npt does not agree.\n");
fclose(ip); continue;
} if (j != 0)
seeknln(); if (m != 0)
seeknln(); if (n <= 0 || np + n - 1 >= mxp) {
fprintf(stderr, "Not enough perm space to read perms from file.");
fclose(ip); continue;
} for (i = 1; i <= np; i++) { if (readperm(pptr[i + n - 1]) == 2) {
fprintf(stderr, "Perm no %i is not a permutation.\n");
pno[i + n - 1] = 0; break;
}
pno[i + n - 1] = 1;
seeknln();
}
fclose(ip);
} elseif (strcmp(opt, "q") == 0) {
snl(); break;
} else {
printf("Invalid option.\n");
snl();
}
} exit(0);
}
int snl(void)
{ while (getchar() != '\n')
;
}
int lcm(int x, int y)
{ short a, b, c;
a = x;
b = y; while ((c = a % b) != 0) {
a = b;
b = c;
} return (x * y / b);
}
int rp(short * ptr)
{ short i, j; for (i = 1; i <= npt; i++)
orb[i] = 0; for (i = 1; i <= npt; i++) {
scanf("%hd", ptr + i);
j = ptr[i]; if (j <= 0 || j > npt || orb[j]) return (2);
orb[j] = 1;
} return (0);
}
int allorbs(void)
{ short orct, lo, u, v, w, x, y, z; for (u = 1; u <= npt; u++)
orno[u] = 0;
orct = 0; for (u = 1; u <= npt; u++) if (orno[u] == 0) {
orct++;
orno[u] = orct;
lo = 1;
orb[1] = u; for (x = 1; x <= lo; x++) {
z = orb[x]; for (y = 1; y <= *cp; y++) {
w = cp[y];
v = pptr[w][z]; if (orno[v] == 0) {
lo++;
orb[lo] = v;
orno[v] = orct;
}
}
}
printf("Orbit number %3d, length %3d:\n", orct, lo); for (x = 1; x <= lo; x++)
printf("%4d", orb[x]);
printf("\n");
} return (0);
}
int num_digits(int n)
{ if (n < 10) return (1); if (n < 100) return (2); if (n < 1000) return (3); if (n < 10000) return (4); if (n < 100000) return (5); return (6);
}
Messung V0.5
¤ Dauer der Verarbeitung: 0.1 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.