Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/GAP/pkg/cohomolo/standalone/progs.d/   (Algebra von RWTH Aachen Version 4.15.1©)  Datei vom 17.9.2025 mit Größe 10 kB image not shown  

Quelle  exa.c   Sprache: C

 
#include "defs.h"
#include "permfns.h"

#define tmalloc(D, T, N)                                                     \
  {                                                                          \
    D = (T *)malloc(sizeof(T) * (N));                                        \
    if (D == 0) {                                                            \
      fprintf(stderr, "Out of space.\n");                                    \
      return (-1);                                                           \
    }                                                                        \
  }
#define tfree(D)                                                             \
  {                                                                          \
    if (D)                                                                   \
      free((char *)D);                                                       \
    D = 0;                                                                   \
  }

extern char  mult, inf1[], inf2[], inf3[], outf[];
extern short rwd[], ***scoeff[], **cdpsp[], *cpsp[], csp[], wd1[], wd2[],
    wd3[], wd4[];
extern int   cspace, psp, space, cptrsp, svsp;
extern short perm[], sv[], orb[], imsp[], *ptsp[], **simcos[], pinv[], gno[],
    base[], lorb[], pno[], *pptr[], *svptr[], cord[], invg[], rno[], cp[],
    mspace[], *vec[], **mat[], mp, cdptrsp, mwl2, mpt, mb, mdim, mpr, ptrsp,
    mm, msp, mv, mwdl, mlwdl;
int   rsp;
short endr, maxcos, *fpt, *bpt, nelim, bno, lo, **imcos, *spst, **pspst, dim,
    prime, ccos, lastd, cind, nfree, stcr, endcr, fcos, bcos, lcl, npt, np2,
    *rel, *spv, **spm, ng, rwl, nb;
short *cst, *cend, ***coeff, **cpst, ***cdpst, fullsc, clsd, lkah, conch,
    **cco, *ocst, **def;
FILE *ip, *op;

int extpprog(void)
{
  short i, j, k, l, m, n, b, l1, nperms, npt1, mxp, maxv, maxm, pos, *p, *q,
      *r;
  int     quot;
  short **dp, **dq, **dr, *pc;
  float   a;
  if ((ip = fopen(inf1, "r")) == 0) {
    fprintf(stderr, "Cannot open %s.\n", inf1);
    return (-1);
  }
  fscanf(ip, "%hd%hd%hd%hd", &npt, &nperms, &nb, &k);
  if (npt > mpt) {
    fprintf(stderr, "npt too big. Increase NPT.\n");
    return (-1);
  }
  if (nb > mb) {
    fprintf(stderr, "nb too big. Increase MB.\n");
    return (-1);
  }
  if (nb * npt > svsp) {
    fprintf(stderr, "Not enough sv space. Increase SVSP.\n");
    return (-1);
  }
  if (k <= 2) {
    fprintf(stderr, "Wrong input format.\n");
    return (-1);
  }
  npt1 = npt + 1;
  np2 = 2 * nperms - 1;
  quot = psp / npt1;
  if (quot > mp)
    quot = mp;
  mxp = quot;
  if (np2 >= mxp) {
    fprintf(stderr, "Too many permutations. Increase MP and/or PSP.\n");
    return (-1);
  }
  for (i = 0; i < mxp; i++)
    pptr[i] = perm + i * npt1 - 1;
  for (i = 1; i <= nb; i++)
    svptr[i] = sv + (i - 1) * npt - 1;
  readbaselo(nb, base, lorb);
  readpsv(0, nb, nperms, svptr);
  fclose(ip);
  for (i = 0; i < np2; i += 2) {
    invg[i] = i + 1;
    invg[i + 1] = i;
  }

  /* We need to read in matrices for generators when action is nontrivial */
  if (mult == 0) {
    if ((ip = fopen(inf3, "r")) == 0) {
      fprintf(stderr, "Cannot open %s.\n", inf3);
      return (-1);
    }
    fscanf(ip, "%hd%hd%hd", &prime, &dim, &k);
    if (prime > mpr) {
      fprintf(stderr, "Prime too big. Increase MPR.\n");
      return (-1);
    }
    if (dim > mdim) {
      fprintf(stderr, "Dim too big. Increase MDIM.\n");
      return (-1);
    }
    if (k != nperms) {
      fprintf(stderr, "No of mats wrong.\n");
      return (-1);
    }
    setpinv();
    maxv = msp / dim;
    if (maxv > mv)
      maxv = mv;
    for (i = 0; i < maxv; i++)
      vec[i] = mspace - 1 + i * dim;
    maxm = maxv / dim - 1;
    if (maxm >= mm)
      maxm = mm - 1;
    if (np2 >= maxm) {
      fprintf(stderr, "Not enough mat space. Increase MSP and/or MV,MM.\n");
      return (-1);
    }
    for (i = 0; i <= maxm; i++)
      mat[i] = vec - 1 + i * dim;
    spm = mat[maxm];
    spv = spm[1];
    for (i = 0; i < np2; i += 2) {
      readmat(mat[i]);
      inv(mat[i], mat[i + 1]);
    }
    fclose(ip);
  }

  printf("Input a,b,l1.\nmaxcos = a*lorb+b\n");
  printf("Exit lookahead after eliminating abs(l1) cosets.\n");
  printf("l1 negative for consistency checking.\n");
  scanf("%f%hd%hd", &a, &b, &l1);
  if (l1 < 0) {
    l1 = -l1;
    conch = 1;
  }
  else
    conch = 0;

  /* Now we read in the relations */
  if ((ip = fopen(inf2, "r")) == 0) {
    fprintf(stderr, "Cannot open %s.\n", inf2);
    return (-1);
  }
  fscanf(ip, "%hd%hd", &i, &j);
  if (i != nb || (mult == 0 && j != dim)) {
    fprintf(stderr, "Error in %s, line 1.\n", inf2);
    return (-1);
  }
  for (i = 1; i <= nb; i++)
    fscanf(ip, "%hd", rno + i);
  if (mult) {
    dim = j;
    for (i = 1; i <= dim; i++)
      fscanf(ip, "%hd", cord + i);
  }
  rel = imsp;
  spst = rel;
  for (i = 1; i <= 2 * rno[1]; i++) {
    fscanf(ip, "%hd", spst);
    l = *spst;
    for (j = 1; j <= l; j++)
      fscanf(ip, "%hd", spst + j);
    spst += (l + 1);
  }
  fclose(ip);

  /* Now we are ready to start the modified Todd-Coxeter procedure. This
     follows the ordinary tcrun with procedures added in the appropriate
     places to compute the coefficients as words in the generators of G and M.
     The Tood-Coxeter procedures are in exb.c and the word operation
     procedures in exc.c
  */

  pos = 0;
  endr = -1;
  pspst = ptsp;
  cst = csp;
  ocst = cst;
  cend = csp + cspace - 1;
  cpst = cpsp;
  cdpst = cdpsp;
  rsp = cspace;
  for (bno = nb; bno >= 1; bno--) {
    printf("bno=%d.\n", bno);
    l = rno[bno] - pos;
    for (i = 1; i <= 2 * l; i++) {
      endr++;
      endr += rel[endr];
    }
    pos = rno[bno];
    lo = lorb[bno];
    if (lo == 1)
      continue;
    maxcos = lo * a + b;
    ng = 0;
    tmalloc(def, short *, maxcos + 1);
    for (i = 0; i < np2; i += 2)
      if (pptr[i][npt1] >= bno)
        ng += 2;
      else
        break;
    k = (ng + 1) * maxcos;
    l = k + maxcos + 1;
    k -= lo;
    if (cpst + k - cpsp > cptrsp) {
      fprintf(stderr, "Out of cptrsp. Increase CPTRSP.\n");
      return (-1);
    }
    if (spst + l - imsp > space) {
      fprintf(stderr, "Out of im space. Increase SPACE.\n");
      return (-1);
    }
    if (pspst + ng - ptsp > ptrsp) {
      fprintf(stderr, "Out of ptrsp. Increase PTRSP.\n");
      return (-1);
    }
    if (cdpst + ng - cdpsp > cdptrsp) {
      fprintf(stderr, "Out of cdptr Increase CDPTRSP.\n");
      return (-1);
    }
    imcos = pspst;
    pspst += ng;
    gno[bno] = ng;
    for (i = 0; i < ng; i++) {
      imcos[i] = spst - 1;
      p = imcos[i];
      spst += maxcos;
      while (++p < spst)
        *p = 0;
    }
    fpt = spst;
    bpt = spst + maxcos;
    coeff = cdpst;
    cdpst += ng;
    for (i = 0; i < ng; i++) {
      coeff[i] = cpst - 1;
      dp = cpst - 1;
      cpst += maxcos;
      while (++dp < cpst)
        *dp = 0;
    }
    cco = cpst - lo - 1;
    *pno = 0;
    for (i = 0; i < np2; i += 2)
      if (pptr[i][npt1] >= bno) {
        (*pno)++;
        pno[*pno] = i;
        if (pptr[i][npt1] > bno) {
          imcos[i][1] = 1;
          imcos[i + 1][1] = 1;
          coeff[i][1] = cst;
          *cst = 1;
          *(++cst) = i;
          *(++cst) = 0;
          cst++;
          coeff[i + 1][1] = cst;
          *cst = 1;
          *(++cst) = i + 1;
          *(++cst) = 0;
          cst++;
          rsp -= 6;
        }
      }
    if (orbitsv(base[bno], svptr[bno], 0) != lo) {
      fprintf(stderr, "Orbit length wrong!\n");
      return (-1);
    }
    if (mult == 0) {
      tmalloc(def[1], short, 1);
      def[1][0] = 0;
    }
    for (l = 1; l <= lo; l++) {
      n = orb[l];
      cp[n] = l;
      if ((k = svptr[bno][n]) != -1) {
        j = pptr[k][n];
        m = cp[j];
        imcos[k - 1][m] = l;
        imcos[k][l] = m;
        if (mult == 0) {
          tmalloc(def[l], short, def[m][0] + 2);
          def[l][0] = def[m][0] + 1;
          def[l][1] = k;
          for (i = 1; i <= def[m][0]; i++)
            def[l][i + 1] = def[m][i];
        }
      }
    }

    lastd = lo;
    cind = lo;
    nfree = lo + 1;
    for (i = 1; i <= lo; i++)
      bpt[i] = i - 1;
    for (i = 0; i < maxcos; i++)
      fpt[i] = i + 1;
    fpt[lo] = 0;
    fpt[maxcos] = 0;
    ccos = 1;
    lkah = 0;
    /* At last we are ready to proceed with the enumeration */
    while (ccos != 0) {
      clsd = 1;
      endcr = -1;
      while (endcr != endr) {
        if (scanrel() == -1)
          return (-1);
        if (fullsc == 0) {
          clsd = 0;
          if (lkah == 0) {
            lcl = bpt[ccos];
            lkah = 1;
            nelim = 0;
            printf("Entering lookahead.\n");
          }
        }
      }
      ccos = fpt[ccos];
      if (lkah) {
        if (nelim >= l1 || ccos == 0) {
          if (cind != maxcos) {
            printf("Exiting lookahead. cind=%d.\n", cind);
            ccos = fpt[lcl];
            lkah = 0;
          }
          else {
            fprintf(stderr, "maxcos too small.\n");
            return (-1);
          }
        }
      }
    } /* while ccos!=0 */
      /* End of enumeration. Tidy up and prepare for next bno */
    p = imcos[0] + lo;
    q = imcos[1];
    k = maxcos - lo;
    dp = coeff[0] + lo;
    dq = coeff[1];
    for (i = 1; i < ng; i++) {
      imcos[i] = p;
      r = p + lo;
      while (++p <= r)
        *p = *(++q);
      q += k;
      coeff[i] = dp;
      dr = dp + lo;
      while (++dp <= dr)
        *dp = *(++dq);
      dq += k;
    }
    spst = p + 1;
    cpst = dp + 1;
    simcos[bno] = imcos;
    scoeff[bno] = coeff;
    if (bno > 1) {
      maxcos = lo;
      gc();
      ocst = cst;
    }
    if (mult == 0)
      for (i = 1; i <= lo; i++)
        tfree(def[i]);
    tfree(def);
  } /* for (bno=;... */

  /* End of program. Now output */
  op = fopen(outf, "w");
  fprintf(op, "%4d%4d\n", nb, dim);
  for (i = 1; i <= nb; i++)
    fprintf(op, " %3d", lorb[i]);
  fprintf(op, "\n");
  if (mult) {
    for (i = 1; i <= dim; i++)
      fprintf(op, "%4d", cord[i]);
    fprintf(op, "\n");
  }
  for (i = 1; i <= nb; i++)
    fprintf(op, "%4d", gno[i]);
  fprintf(op, "\n");
  for (i = 1; i <= nb; i++)
    if ((l = lorb[i]) > 1)
      for (j = 0; j < gno[i]; j++) {
        p = simcos[i][j];
        for (k = 1; k <= l; k++)
          fprintf(op, " %3d", p[k]);
        fprintf(op, "\n");
        dp = scoeff[i][j];
        for (k = 1; k <= l; k++) {
          if ((pc = dp[k]) == 0)
            fprintf(op, "%3d %3d ", 0, 0);
          else {
            fprintf(op, "%3d ", *pc);
            for (m = 1; m <= *pc; m++)
              fprintf(op, " %2d", pc[m]);
            pc += (1 + *pc);
            fprintf(op, " %3d ", *pc);
            for (m = 1; m <= *pc; m++)
              fprintf(op, " %2d", pc[m]);
          }
        }
        fprintf(op, "\n");
      }
  fclose(op);
  return (0);
}

Messung V0.5
C=96 H=80 G=88

¤ Dauer der Verarbeitung: 0.10 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

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.