Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  conpdc2.c   Sprache: C

 
#include "defs.h"

extern char inf0[], inf1[], inf2[], inf3[], outf1[], outf2[], outf3[],
    temp1[], temp2[], ofstr[], ngn[], expg, exph, cr, dcr, hg, triv, cong;
extern int trsp, trptr;
extern int nfuse, tree[], perm[], gorb[], lorbg[], lorbh[], base[], fpt[],
    bpt[], coh_index[], *cp[], *trad[], *sv[], *tailad[], **cpad[],
    **svgptr[], **svhptr[], npt, **lcp, **ucp, *stop, *pst, *pend, nb, fnt,
    lnt, ind, coind, oind, cind, bno, pt, **expp, npg;
extern FILE *ip, *op;

/* The basic aim of this part of the program is to compute permutations of G
   as permutations on the left cosets of H. This is used to compute double
   coset reps if required.
*/

int cnprg2(void)
{
  int i, j, k, l, m, n, ncp, pno, mexh, lorb, ndcr, nntb, *orb, rep, *q, **p,
      **conp, *len, *orbptr, *cperm, flct, inch;
  char ngth, fuse;
  int  c;
  if (exph) {
    mexh = (pend - pst) / npt;
    lcp = cp;
    j = 0;
    for (i = 1; i <= lnt; i++)
      j += (lorbh[i] - 1);
    if (j < mexh)
      for (i = 1; i <= lnt; i++) {
        for (j = 1; j <= npt; j++)
          expp[j] = 0;
        expp[base[i]] = stop;
        p = svhptr[i];
        for (j = 1; j <= npt; j++)
          if (p[j] != 0 && p[j] != stop) {
            expp[j] = pst;
            ucp = lcp - 1;
            addsvf(j, p);
            for (k = 1; k <= npt; k++)
              pst[k] = image(k);
            pst += npt;
          }
        for (j = 1; j <= npt; j++)
          p[j] = expp[j];
      }
    else {
      printf("Not enough room to expand H.\n");
      exph = 0;
    }
  }
  conp = cp + 2 * npt;
  if (cong) {
    strcat(inf1, ".cp");
    op = fopen(inf1, "w");
    fprintf(op, "%4d%4d\n", ind, npg);
    printf("Computing coeffs of perms in G.\n");
    for (pno = 1; pno <= npg; pno++) {
      *conp = perm + (pno - 1) * 2 * npt - 1;
      printf("Coeffs of permutation no %d.\n", pno);
      /* The basic conversion algorithm now follows. In this case, coefficents
         are being output, as well as the perms themselves.
      */

      ucp = conp;
      q = tree;
      for (bno = fnt; bno != -1; bno = fpt[bno]) {
        tailad[bno] = q;
        q += 2;
        cpad[bno] = ucp + 1;
      }
      for (cind = 1; cind <= ind; cind++) {
        if (cind > 1)
          advance();
        lcp = conp;
        trptr = 0;
        for (bno = 1; bno <= nb; bno++) {
          if (fpt[bno] != 0) {
            i = tree[trptr];
            j = image(i);
            while (svhptr[bno][j] == 0) {
              trptr = tree[trptr + 1];
              i = tree[trptr];
              j = image(i);
            }
            if (expg) {
              q = svgptr[bno][i];
              if (q != stop) {
                lcp--;
                *lcp = q + npt;
              }
            }
            else
              addsvb(i, svgptr[bno]);
            trptr += 2;
          }
          else
            j = image(base[bno]);
          if (exph) {
            q = svhptr[bno][j];
            if (q != stop) {
              ucp++;
              *ucp = q;
            }
          }
          else
            addsvf(j, svhptr[bno]);
          fprintf(op, " %d", j);
        }
        fprintf(op, " %6d ", tree[trptr]);
      } /* for (cind=1;... */
      fprintf(op, "\n");
    } /* for (pno=1;...  */
    fclose(op);
  } /* if (cong) */
  if (hg == 0)
    return (0);

  *conp = expg ? perm - 1 : pst - 1;
  flct = -1;
  printf("Converting permutations from %s.\n", inf3);
  if ((ip = fopen(inf3, "r")) == 0) {
    fprintf(stderr, "Cannot open %s.\n", inf3);
    return (-1);
  }
  fscanf(ip, "%d%d%d%d", &i, &ncp, &j, &k);
  if (k != 0)
    k = 3;
  else if (j > 0)
    k = 2;
  else
    k = 1;
  if (i != npt) {
    fprintf(stderr, "npt wrong in %s.\n", inf3);
    return (-1);
  }
  for (i = 1; i <= k; i++)
    while ((c = getc(ip)) != '\n')
      ;
  op = fopen(temp1, "w");
  fprintf(op, "%4d%4d%4d%4d\n", ind, ncp, 0, 0);

  ngth = 0;
  while (1) {
    for (pno = 1; pno <= ncp; pno++) {
      printf("Converting perm no %d.\n", pno);
      q = *conp + 1;
      for (i = 1; i <= npt; i++) {
        fscanf(ip, "%d", q);
        q++;
      }
      while ((c = getc(ip)) != '\n')
        ;
      ucp = conp;
      q = tree;
      for (bno = fnt; bno != -1; bno = fpt[bno]) {
        tailad[bno] = q;
        q += 2;
        cpad[bno] = ucp + 1;
      }
      for (cind = 1; cind <= ind; cind++) {
        if (cind > 1)
          advance();
        lcp = conp;
        trptr = 0;
        for (bno = 1; bno <= lnt; bno++) {
          if (fpt[bno] != 0) {
            i = tree[trptr];
            j = image(i);
            while (svhptr[bno][j] == 0) {
              trptr = tree[trptr + 1];
              i = tree[trptr];
              j = image(i);
            }
            if (expg) {
              q = svgptr[bno][i];
              if (q != stop) {
                lcp--;
                *lcp = q + npt;
              }
            }
            else
              addsvb(i, svgptr[bno]);
            trptr += 2;
          }
          else
            j = image(base[bno]);
          if (exph) {
            q = svhptr[bno][j];
            if (q != stop) {
              ucp++;
              *ucp = q;
            }
          }
          else
            addsvf(j, svhptr[bno]);
        }
        fprintf(op, " %3d", tree[trptr]);
      }
      fprintf(op, "\n");
    } /* for (pno=1;... */
    fclose(op);
    fclose(ip);
    flct++;
    if (flct > nfuse)
      break;
    if (flct == 0) {
      strcpy(inf2, inf0);
      strcat(inf2, ngn);
      if ((ip = fopen(inf2, "r")) == 0) {
        flct++;
        if (flct > nfuse)
          break;
        ngth = 0;
      }
      else
        ngth = 1;
    }
    if (flct > 0) {
      strcpy(inf2, inf0);
      strcat(inf2, "dcr");
      ofstr[0] = flct + '0';
      strcat(inf2, ofstr);
    }
    strcpy(outf3, inf2);
    strcat(outf3, ".nr");
    if ((ip = fopen(inf2, "r")) == 0) {
      fprintf(stderr, "Cannot open %s.\n", inf2);
      return (-1);
    }
    fscanf(ip, "%d%d", &i, &ncp);
    while (getc(ip) != '\n')
      ;
    if (i != npt) {
      fprintf(stderr, "npt wrong in %s.\n", inf2);
      return (-1);
    }
    op = fopen(outf3, "w");
    fprintf(op, "%3d\n", ncp);
    printf("Converting permutations from %s.\n", inf2);
  } /* while(1) */

  /* We are now ready to compute orbits of the new perms if necessary, in
     order to compute double coset reps. The tree information is no longer
     required, and the tree space is used to store the new permutations.
  */

  if (dcr) {
    if (trsp < 4 * ind) {
      fprintf(stderr, "No room to compute orbits. Increase TRSP.\n");
      return (-1);
    }
    ndcr = ind - 1;
    orb = tree - 1;
    len = orb + ind;
    orbptr = len + ind;
    cperm = orbptr + ind;
    for (i = 1; i <= ind; i++) {
      orb[i] = i;
      len[i] = 1;
      orbptr[i] = 0;
    }
    printf("Computing orbits of con perms from %s.\n", outf1);
    ip = fopen(temp1, "r");
    fscanf(ip, "%d%d", &i, &ncp);
    while ((c = getc(ip)) != '\n') {}
    flct = -1;
    fuse = 0;
    while (1) {
      for (i = 1; i <= ncp; i++) {
        q = cperm;
        for (j = 1; j <= ind; j++) {
          q++;
          fscanf(ip, "%d", q);
        }
        for (j = 1; j <= ind; j++) {
          k = orb[j];
          l = orb[cperm[j]];
          if (k != l) {
            if (fuse) {
              if (len[l] < len[k]) {
                m = k;
                k = l;
                l = m;
              }
            }
            else
              len[k] += len[l];
            len[l] = 0;
            n = k;
            while ((m = orbptr[n]) != 0)
              n = m;
            orbptr[n] = l;
            while (l != 0) {
              orb[l] = k;
              l = orbptr[l];
            }
            ndcr--;
          }
        }
      }
      fclose(ip);
      flct++;
      if (flct == 0)
        unlink(temp1);
      else
        unlink(outf3);
      if (flct > nfuse)
        break;
      if (flct == 0) {
        fuse = 1;
        if (ngth == 0)
          flct++;
        if (flct > nfuse)
          break;
      }
      strcpy(outf3, inf0);
      if (flct == 0)
        strcat(outf3, ngn);
      else {
        strcat(outf3, "dcr");
        ofstr[0] = flct + '0';
        strcat(outf3, ofstr);
      }
      strcat(outf3, ".nr");
      ip = fopen(outf3, "r");
      fscanf(ip, "%d", &ncp);
      printf("Computing orbits of con perms from %s.\n", outf3);
    }
    printf("Computing dcreps.\n");
    if (len[1] != 1)
      printf("Warning. Orb of 1 is greater than one.\n");
    nntb = 0;
    for (i = fnt; i != -1; i = fpt[i])
      nntb++;
    lcp = cp;
    ip = fopen(temp2, "r");
    op = fopen(outf2, "w");
    fprintf(op, "%4d %3d%4d%4d\n", npt, ndcr, 0, 0);
    for (rep = 2; rep <= ind; rep++)
      if ((lorb = len[rep]) > 0) {
        ucp = lcp - 1;
        for (bno = fnt; bno != -1; bno = fpt[bno]) {
          fscanf(ip, "%d", &inch);
          if (expg) {
            q = svgptr[bno][inch];
            if (q != stop) {
              ucp++;
              *ucp = q;
            }
          }
          else
            addsvf(inch, svgptr[bno]);
        }
        if (npt >= 1000)
          for (i = 1; i <= npt; i++)
            fprintf(op, "%5d", image(i));
        else
          for (i = 1; i <= npt; i++)
            fprintf(op, "%4d", image(i));
        fprintf(op, " %4d\n", lorb);
      }
      else
        for (i = 1; i <= nntb; i++)
          fscanf(ip, "%d", &inch);
    fclose(op);
    fclose(ip);
    unlink(temp2);
  }
  /* If we are keeping the converted permutations, then invert them, to
    get action on right cosets
  */

  if (hg && dcr == 0) {
    ip = fopen(temp1, "r");
    op = fopen(outf1, "w");
    fscanf(ip, "%d%d", &i, &ncp);
    while ((c = getc(ip)) != '\n')
      ;
    if (triv)
      fprintf(op, "%4d%4d%4d%4d\n1\n", ind, ncp, 1, 0);
    else
      fprintf(op, "%4d%4d%4d%4d\n", ind, ncp, 0, 0);
    for (i = 1; i <= ncp; i++) {
      for (j = 1; j <= ind; j++) {
        fscanf(ip, "%d", &k);
        tree[k] = j;
      }
      for (j = 1; j <= ind; j++)
        fprintf(op, " %3d", tree[j]);
      fprintf(op, "\n");
    }
    fclose(ip);
    fclose(op);
    unlink(temp1);
  }
  return (0);
}

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

¤ Dauer der Verarbeitung: 0.5 Sekunden  ¤

*© 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.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge