int clrop(void) /* Clears and updates orbit permutation info */
{ short i, j, k, l; for (i = 1; i <= nhorbs; i++) {
l = *hlorb[i]; for (j = 1; j <= l; j++) {
k = orbperm[i][j]; if (k != 0 && deftime[i][k] >= adno) {
deftime[i][k] = 0;
orbperm[i][j] = 0;
}
}
} return (0);
}
void bind(int pno) /* Adds a permutation in H or a newly found one in N (=N(H)) to those generatingtheorbitofgbase[gskno].Theseorbitpointsneednotbe consideredasimagesofnewelements.
*/
{ short i, j, k, l, m, n; for (i = 1; i <= npt; i++) {
j = pptr[pno][i];
k = bindor[i];
l = bindor[j]; if (k != l) { if (k > l) {
m = k;
k = l;
l = m;
} for (n = 1; n <= npt; n++) if (bindor[n] == l)
bindor[n] = k;
}
}
}
int setskno(void) /* Preliminary processing done for a new value of gskno. */
{ short i, j, k, n, *p; /* if reg[adno]>0, we need not consider this as gskno */ while (reg[adno] > 0) {
adno -= 1;
inim[gbase[adno]] = 0;
clrop();
} /* Remember initial values of orhct and oorhct. These are recalled after we findanewgeneratorinN(H).
*/
oorhct = orhct;
ontct = ntct;
*expcp = 1;
gskno = adno; /* Set up info needed for running thro elements in search list. */ if (sym) {
bt = 1; for (i = 1; bt; i++) if (inim[i] == 0 && i != gbase[adno]) {
bt = 0;
expcp[1] = i;
}
bt = 1; for (i = npt; bt; i--) if (inim[i] == 0 && i != gbase[adno]) {
bt = 0;
start[adno + 1] = i;
}
} else {
expcp[1] = start[adno] + 1; if (adno <= lexp) {
sva = svgptr[adno];
ap = adpt + adno;
*ap = 1; while (sva[*ap] <= 0)
(*ap)++;
exprep(*ap, adno, sva);
}
}
*pno = 0; if (ntorno[adno] > 0) {
p = imlorb[orhct]; for (j = 1; j <= *p; j++)
p[j] = abs(p[j]);
} /* Initialize the "bound" orbit, using bind, as above, and add the relevant elementsofHtothegeneratorsofN.
*/ for (i = 1; i <= npt; i++)
bindor[i] = i;
bindor[gbase[gskno]] = 0;
n = 0; for (i = stn; i != -1; i = fp[i]) {
bind(i);
(*pno)++;
pno[*pno] = i;
n = i;
}
k = ntno[adno]; if (k != 0) { for (i = sth; i != -1; i = fp[i]) if (pptr[i][npt1] == k) { if (nf == -1) {
err(); return (-1);
} for (j = 1; j <= npt + npt1; j++)
pptr[nf][j] = pptr[i][j];
pptr[nf][npt1] = nskno;
(*pno)++;
pno[*pno] = nf; if (stn == -1)
stn = nf; else
fp[n] = nf;
bind(nf);
n = nf;
nf = fp[nf];
}
fp[n] = -1;
}
lorbn[nskno] = orbitsv(nbase[nskno], svnptr[nskno], 0);
printf("gskno=%d, nskno=%d.\n", gskno, nskno);
tp[npt1] = nskno; return (0);
}
int found(void) /* Processing required on finding a new generator of N. */
{ short i, j, k, *ptr, olo;
*pno = 0; for (i = stn; i != -1; i = fp[i]) {
(*pno)++;
pno[*pno] = i;
j = i;
} if (stn == -1)
stn = onf; else
fp[j] = onf;
(*pno)++;
pno[*pno] = onf;
j = (ntorno[gskno] > 0 || gskno > lnth) ? oorhct + 1 : oorhct; for (i = j; i <= orhct; i++) {
ptr = imlorb[i]; for (k = 1; k <= *ptr; k++)
ptr[k] = abs(ptr[k]);
}
orhct = oorhct;
ntct = ontct;
fp[onf] = -1;
bind(onf); if (nop) {
tp[npt + 1] = 1;
printvec(tp, 1);
tp[npt + 1] = nskno;
}
olo = lorbn[nskno];
lorbn[nskno] = orbitsv(nbase[nskno], svnptr[nskno], 0); if (prime == 0)
biggersylp = 0; else
biggersylp = ((lorbn[nskno] / olo) % prime == 0);
onf = nf; if (onf == -1) {
err(); return (-1);
}
nf = fp[nf];
tp = pptr[onf];
itp = tp + npt1; for (i = 1; i < gskno; i++)
tp[gbase[i]] = gbase[i];
tp[npt1] = nskno;
*expcp = 1;
adno = gskno; if (sym) { for (i = 1; i <= npt; i++)
inim[i] = 0; for (i = 1; i < adno; i++)
inim[gbase[i]] = 1;
} if (cent)
strcpy(type, "centralizer"); else
strcpy(type, "normalizer");
printf("Found element in %s. lorb=%3d.\n", type, lorbn[nskno]);
nnps++; return (0);
}
void deforbperm(int bpt, int imbpt) /* Update orbit permutation information using fact that tp[bpt]=imbpt. */
{ short i, x, y, z; for (i = 1; fail == 0 && i <= orhct; i++) {
x = horno[i][bpt];
y = imorno[i][imbpt];
z = orbperm[i][x]; if (z == 0) { if (deftime[i][y] == 0) { if (hlorb[i][x] == abs(imlorb[i][y])) {
orbperm[i][x] = y;
deftime[i][y] = adno;
} else
fail = 1;
} else
fail = 1;
} elseif (z != y)
fail = 1;
}
}
int nprg2(void)
{ short nbn, i, j, k, l, m, n, bpt, imbpt, ct, endo, *ptr; char hornt, complete, advance, bt, orhad; int quot;
nnps = 0;
stn = -1;
nbn = 0; /* Compute a largest possible basis of N */ for (i = 1; i <= nbg; i++) if (reg[i] <= 0) {
nbn++; if (nbn > mb) {
fprintf(stderr, "Too many N-base points. Increase MB.\n"); return (-1);
}
nbase[nbn] = gbase[i];
}
printf("nbn=%d.\n", nbn);
k = (sym) ? mb : lexp + mb;
quot = svsp / npt - k; if ((sym == 0) && *obase > nbn)
m = *obase; else
m = nbn; if (quot < m) {
fprintf(stderr, "svsp too small. Increase SVSP.\n"); return (-1);
}
ptr = (sym) ? sv - 1 : sv + lexp * npt - 1; for (i = 1; i <= m + mb; i++) {
svnptr[i] = ptr;
ptr += npt;
} if (sym) for (i = 1; i <= npt; i++)
inim[i] = 0;
/* During the main search, we attempt to construct a permutation tp, which wehopewilllieinN(H).Foreachbasepointinturn,bpt=gbase[adno], weconsidertheimageimbpt=tp[bpt],andsubjectittovarioustests.If itfailsanytest,thentheflagfailbecomestrue,andthisimageis knowntobeimpossible,soweattempttoalterthisimage,without changingtp[gbase[i]]fori<adno.Ifimpossible,webacktrack,andreduce adno.gsknoistheG-basenoforwhichwearecurrentlysearchingin G[gskno],andnsknothecorrespondingN-baseno.oorhctandntctare approximatelythevaluesoforhnoandntnoforthecurrentadno.Firstwe initializeeverything.
*/
j = 0;
n = 0;
ntct = 0;
orhct = 0; for (i = 1; i < nbg; i++) { if (ntorno[i] > 0)
orhct++; if (ntno[i] > 0)
ntct++; /* regsv is used when we compute automorphism actions of tp on O, as describedinnormp1.c
*/ if (reg[i] < 0 && ntno[i] > 0) {
n++; /* for (j=1;j<=npt;j++) regsv[n][j]=svhptr[ntct][j]; */
regsv[n] = svhptr[ntct];
}
k = gbase[i]; for (j = 1; j <= orhct; j++) {
l = horno[j][k]; if (deftime[j][l] == 0) {
orbperm[j][l] = l;
deftime[j][l] = i;
}
}
inim[k] = 1;
} if (ntorno[nbg] > 0 || cent) {
orhct++;
ntct++;
}
adno = nbg;
nskno = nbn;
onf = nf;
nf = fp[nf]; if (onf == -1) {
err(); return (-1);
}
tp = pptr[onf];
itp = tp + npt1; for (i = 1; i < nbg; i++)
tp[gbase[i]] = gbase[i];
tp[npt1] = nskno;
printf("\nBeginning main search.\n"); if (setskno() == -1) return (-1); if (nop) {
op = fopen(outf2, "w");
fprintf(op, " \n");
}
complete = 0; /* The main search loop follows. */ while (complete == 0) {
bpt = gbase[adno];
imbpt = (sym) ? expcp[*expcp] : expimage(bpt);
tp[bpt] = imbpt;
hornt = (ntorno[adno] > 0);
fail = 0;
advance = 0;
orhad = 0; if (adno == gskno) { if (bindor[imbpt] == 0)
fail = 1;
} /* Fails since imbpt is already in image of N */ elseif (hornt) { if (imlorb[orhct][imorno[orhct][imbpt]] < 0)
fail = 1;
} /* Fails since this orbit has already been ruled out as a possible image.
*/ if (reg[adno] > 0 && imbpt != defim[adno])
fail = 1; /* defim[adno] is the value of tp[bpt] which is forced by earlier values oftp,andautomorphisminformationcomputedearlierfromreginfo.
*/ if (fail == 0)
deforbperm(bpt, imbpt); /* If orbits are not permuted, deforbperm sets fail=1 */ if (fail == 0 && ntorno[adno] < 0) /* Now if ntorno[adno]<0 we check that the image of O1 has kernel at leastasbigasthatoftheimageofO.
*/
{
n = -ntorno[adno] - 1;
m = (n == 0) ? 0 : ntorno[n]; if (m > 0) {
l = imorno[m][imbpt];
ct = 0; for (i = 1; i <= npt; i++) if (imorno[m][i] == l) {
ct++;
orlist[ct] = i;
}
i = sth; while (pptr[i][npt1] > ntct) { for (j = 1; j <= ct; j++) {
k = orlist[j]; if (pptr[i][k] != k)
fail = 1;
}
i = fp[i];
}
}
} if (fail == 0 && hornt) /* In case adno corresponds to an H-base point, we now change the hbase[adno]toimbpt,andcomputestabilizerorbits,asimorno,imlorb. IfthesedonotcorrespondtotheoriginalsinH,thenfailbecomes true.EventuallytheywillbetheimagesoftheHorbits.
*/
{ if (intbase(imbpt, ntct, &sth, &nbh, hbase, lorbh, svhptr) == -1) return (-1); if (orhct < nhorbs) {
orhct++;
orhad = 1;
*pno = 0;
i = sth; while (pptr[i][npt1] > ntct) {
(*pno)++;
pno[*pno] = i;
i = fp[i];
}
allorbs(test, imorno[orhct]);
ptr = hlorb[orhct]; if (*ptr != *test) {
fail = 1;
orhct--;
} else { for (j = 1; j <= nptd2; j++) {
norsh[j] = 0;
norsim[j] = 0;
}
l = 0;
m = 0; for (j = 1; j <= *ptr; j++) { if (*(ptr + j) > nptd2)
l = *(ptr + j); else
norsh[*(ptr + j)]++; if (*(test + j) > nptd2)
m = *(test + j); else
norsim[*(test + j)]++;
}
fail = (l != m); for (i = 1; fail == 0 && i <= nptd2; i++)
fail = (norsh[i] != norsim[i]); if (fail)
orhct--; else for (i = 0; i <= *test; i++)
imlorb[orhct][i] = test[i];
}
} if (fail == 0 && reg[adno] < 0) /* If reg[adno]<0, we compute the corresponding F in the image, which musthavethesamesizeastheoriginalF.
*/
{
n = ntorno[adno];
m = imorno[n][imbpt];
ct = 0;
l = -reg[adno + 1];
bt = (n == nhorbs); for (i = 1; i <= npt; i++) if (imorno[n][i] == m) if (bt || imlorb[n + 1][imorno[n + 1][i]] == 1) {
ct++;
orlist[ct] = i;
} if (ct != l)
fail = 1; /* *pno=0; bt= (fail==0); i=sth; while(bt) {if(i==-1)bt=0;else {j=pptr[i][npt1];if(j>=ntct){(*pno)++;pno[*pno]=i;} elseif(j<ntct)bt=0;i=fp[i]; } } if(fail==0){i=-reg[adno];orbitsv(imbpt,regsv[i],0);}
*/ if (fail && orhad)
orhct--;
}
} if (fail == 0 && (endo = endorno[adno]) > 0) /* if adno completes the orbit O, we compute the images of the relevant sectionofHonO,usingthecopiesofthegeneratorsofHthatwemade attheendofnprg1().Thesewillbeusedtocomputetheimageson correspondingorbitsO1.
*/
{ if (sym == 0) for (i = 1; i <= npt; i++)
tp[i] = expimage(i);
i = fsth; while (pptr[i][npt1] > ntct)
i = fp[i]; while (i != -1) {
*cp = 0; for (j = endo; fail == 0 && j <= adno; j++) {
l = ntno[j];
m = image(tp[pptr[i][gbase[j]]]); if (l > 0) { if (svhptr[l][m] != 0)
addsv(m, svhptr[l]); else
fail = 1;
} elseif (m != tp[gbase[j]])
fail = 1;
} if (fail)
i = -1; else {
k = i + 1; for (j = 1; j <= npt; j++)
pptr[k][j] = backimage(j);
i = fp[i]; if (i != -1 && pptr[i][npt1] < ntno[endo])
i = -1;
}
} if (fail && orhad)
orhct--;
} if (fail == 0) /* tp has passed all tests for this adno, so we increase adno. If adno=nbg,wearereadytocomputetpinfull,andseeifitreallylies inN(H).
*/
{
inim[imbpt] = 1;
adno++; if (adno <= nbg) {
advance = 1; if (reg[adno] > 0) /* if reg[adno]>0 we can compute defim[gbase[adno]] using info already computed,andstoredinreginfo.
*/
{
n = reg[adno];
m = reginfo[n]; if (m > 0) /* Case 1: gbase[adno] in set F in orbit O. */
{
l = -reg[m];
n++;
ct = reginfo[n];
*cp = 0; for (i = 1; i <= ct; i++) {
n++;
addsv(tp[reginfo[n]], regsv[l]);
}
defim[adno] = image(tp[gbase[m]]);
} else /* Case 2: gbase[adno] in an orbit O1. */
{
n++;
*cp = reginfo[n]; for (k = 1; k <= *cp; k++)
cp[k] = reginfo[n + (*cp) + 1 - k];
defim[adno] = image(tp[-m]);
}
} if (sym) {
bt = 1; for (i = npt; bt; i--) if (inim[i] == 0) {
start[adno + 1] = i;
bt = 0;
}
bt = 1; if (reg[adno] > 0) {
k = defim[adno]; if (inim[k]) {
adno--; if (orhad)
orhct--;
advance = 0;
fail = 1;
} else {
(*expcp)++;
expcp[*expcp] = k;
}
} else for (i = 1; bt; i++) if (inim[i] == 0) {
(*expcp)++;
expcp[*expcp] = i;
bt = 0;
}
}
} else /* Compute tp, checking with deforbperm as we go. */
{ for (i = 1; fail == 0 && i <= npt; i++) if (nonb[i]) { if (sym) { for (k = 1; k <= npt; k++) if (inim[k] == 0) {
j = k;
tp[i] = k;
}
} else {
j = expimage(i);
tp[i] = j;
}
deforbperm(i, j);
} if (fail == 0) {
invert(tp, itp); /* See if it lies in N(H) (or C(H)) */
i = (hgst) ? 0 : sth; while (i != -1 && fail == 0) { if (cent) { for (j = 1; fail == 0 && j <= npt; j++) if (tp[pptr[i][itp[j]]] != pptr[i][j])
fail = 1;
} else {
*cp = 0; for (j = 1; fail == 0 && j <= nbg; j++) {
k = image(tp[pptr[i][gbase[j]]]);
l = ntno[j]; if (l != 0) { if (svhptr[l][k] != 0)
addsv(k, svhptr[l]); else
fail = 1;
} elseif (k != tp[gbase[j]])
fail = 1;
}
} if (hgst) {
i++; if (i == hgno)
i = -1;
} else
i = fp[i];
}
} if (fail)
adno--; else { if (found() == -1) return (-1); if (biggersylp) {
ad1 = gskno; break;
}
}
}
} if (advance) /* Change tp, changing image at current value of adno if possible. */
{ if (ntno[adno] > 0)
ntct++; if (adno <= lexp)
adpt[adno] = 0;
} else {
bt = 1; while (bt) {
imbpt = tp[gbase[adno]]; if (fail) {
m = ntorno[adno]; if (m > 0)
n = imorno[orhct][imbpt];
} if (reg[adno] <= 0 || defim[adno] != imbpt) { if (sym == 0) { if (expcp[*expcp] <= start[adno]) {
(*expcp)++;
expcp[*expcp] = start[adno] + 1;
bt = 0;
} elseif (adno > lexp && expcp[*expcp] < start[adno + 1]) {
expcp[*expcp]++;
bt = 0;
} if (adno <= lexp) {
sva = svgptr[adno];
ap = adpt + adno;
(*ap)++; while (sva[*ap] <= 0 && *ap <= npt)
(*ap)++; if (*ap <= npt) {
bt = 0;
exprep(*ap, adno, sva);
} else
bt = 1;
}
} elseif (expcp[*expcp] < start[adno + 1]) {
j = expcp[*expcp];
inim[j] = 0; for (i = j + 1; bt; i++) if (inim[i] == 0 && (adno != gskno || i != gbase[adno])) {
expcp[*expcp] = i;
bt = 0;
}
}
} if (bt) {
j = ntorno[adno]; if (j > 0) {
ptr = imlorb[orhct]; for (k = 1; k <= *ptr; k++)
ptr[k] = abs(ptr[k]);
ntct--;
} if (sym) {
inim[expcp[*expcp]] = 0;
(*expcp)--;
} elseif (expcp[*expcp] > start[adno])
(*expcp)--;
adno--; if (adno == 0)
bt = 0; else { if (ntorno[adno] > 0 && adno != lnth)
orhct--; if (*expcp == 0)
bt = 0;
}
}
}
clrop(); if (*expcp == 0) { if (adno < ad1) {
complete = 1;
printf("Algorithm complete.\n");
} else {
inim[gbase[adno]] = 0;
nskno--; if (setskno() == -1) return (-1);
}
} elseif (fail) { if (adno == gskno) {
k = bindor[imbpt]; for (i = 1; i <= npt; i++) if (bindor[i] == k)
bindor[i] = 0;
} elseif (m > 0)
imlorb[m][n] = -abs(imlorb[m][n]);
}
}
} /* Main search loop */
/* End of search. Add any remaining generators to N, change back to old baseifnecessary,andoutput.
*/ if (cent == 0) {
*pno = 0; for (i = stn; i != -1; i = fp[i]) {
(*pno)++;
pno[*pno] = i;
n = i;
} for (m = ad1 - 1; m >= 1; m--) {
k = ntno[m]; if (k != 0) { for (i = sth; i != -1; i = fp[i]) if (pptr[i][npt1] == k) { if (nf == -1) {
err(); return (-1);
} for (j = 1; j <= npt + npt1; j++)
pptr[nf][j] = pptr[i][j];
pptr[nf][npt1] = m;
(*pno)++;
pno[*pno] = nf; if (stn == -1)
stn = nf; else
fp[n] = nf;
n = nf;
nf = fp[nf];
}
fp[n] = -1;
}
lorbn[m] = orbitsv(nbase[m], svnptr[m], 0);
}
} if (nop) {
fclose(op); if (nnps == 0)
unlink(outf2); else {
op = fopen(outf2, "r+");
fprintf(op, "%4d%4d%4d%4d", npt, nnps, 0, 0);
fclose(op);
}
} if (sym == 0) for (i = 1; i <= *obase; i++) if (intbase(obase[i], i, &stn, &nbn, nbase, lorbn, svnptr) == -1) return (-1);
bt = 1; for (i = 1; i <= nbn; i++) if (lorbg[i] != lorbn[i]) {
bt = 0; break;
}
*pno = 0; for (i = stn; i != -1; i = fp[i]) {
(*pno)++;
pno[*pno] = i;
} if (*pno == 0) {
printf("Group is trivial.\n"); return (-1);
}
op = fopen(outf1, "w");
fprintf(op, "%4d%4d%4d%4d\n", npt, *pno, nbn, 3);
printbaselo(nbn, nbase, lorbn);
printpsv(nbn, pno, svnptr);
fclose(op); return (0);
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.14 Sekunden
(vorverarbeitet am 2026-06-26)
¤
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.