[BACK]Return to syz0.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / kan96xx / Kan

Annotation of OpenXM/src/kan96xx/Kan/syz0.c, Revision 1.1

1.1     ! maekawa     1: #include <stdio.h>
        !             2: #include "datatype.h"
        !             3: #include "extern2.h"
        !             4: #include "matrix.h"
        !             5: #include "gradedset.h"
        !             6:
        !             7: extern int KanGBmessage;
        !             8: static int Debugsyz0 = 0;
        !             9:
        !            10: static POLY getFactor0(struct gradedPolySet *grG,int grd,int index);
        !            11: static void clearMark(struct gradedPolySet *grG);
        !            12: static void printMatrixOfPOLY(struct matrixOfPOLY *mat);
        !            13: static void printArrayOfPOLY(struct arrayOfPOLY *mat);
        !            14: static int isZeroRow(struct matrixOfPOLY *mat,int i);
        !            15:
        !            16: static int getSize00OfGradedSet(struct gradedPolySet *g);
        !            17: static int positionInPairs(struct pair *top,struct pair *pairs);
        !            18: /*  if the top is not in the list pairs, it returns -1. */
        !            19: static struct pair *oldPairsToNewPairs(struct pair *opairs,
        !            20:                                       int *table,int size);
        !            21: /* In the function getSyzygy(), reduced Grobner basis *grBases is
        !            22:    constructed from grG by deleting unnecessary elements.
        !            23:    The array <<table>> gives the correspondence between the index
        !            24:    ig (i-grade), ii (i-index) of *grBases and grG.
        !            25:    When <<opairs>> keeps syzygies for grG, it returns syzygies for
        !            26:    *grBases.
        !            27:    Note that the result syzygies are not necessarily COMPLETE.
        !            28:    Note that the <<prev>> fields are not set properly.
        !            29: */
        !            30: struct matrixOfPOLY *getSyzygy01(struct gradedPolySet *reducedBasis,
        !            31:                                 struct pair *excludedPairs);
        !            32: /*
        !            33:    When <<excludedPairs>> is NULL,
        !            34:    this function computes all syzygies for the <<reducedBasis>>.
        !            35:    If not, this function computes all syzygies except those in excludedPairs.
        !            36:    The <<serial>> field of the <<reducedBasis>> is used to change
        !            37:    syzygy polynomials into arrays.  March 15, 1997
        !            38:  */
        !            39:
        !            40:
        !            41:
        !            42: /* if (mark[j]), then the simplification is done. */
        !            43: void getBackwardTransformation(grG)
        !            44: struct gradedPolySet *grG;
        !            45: /* grG->polys[i]->mark[j],syz[j] are modified. */
        !            46: {
        !            47:   int i,j;
        !            48:   struct polySet *ps;
        !            49:
        !            50:
        !            51:   for (i=0; i<grG->maxGrade; i++) {
        !            52:     ps = grG->polys[i];
        !            53:     for (j=0; j<ps->size; j++) {
        !            54:       if (ps->mark[j] == 0 && ps->del[j] == 0) {
        !            55:        simplifyBT(i,j,grG);
        !            56:       }
        !            57:     }
        !            58:   }
        !            59: }
        !            60:
        !            61: void simplifyBT(grd,index,grG)
        !            62: int grd;
        !            63: int index;
        !            64: struct gradedPolySet *grG;
        !            65: {
        !            66:   POLY s,r;
        !            67:   int g0,i0;
        !            68:
        !            69:   s = grG->polys[grd]->syz[index]->syz;
        !            70:   r = ZERO;
        !            71:
        !            72:   if (KanGBmessage) {printf("."); fflush(stdout); }
        !            73:
        !            74:   while (s != ZERO) {
        !            75:     g0 = srGrade(s);
        !            76:     i0 = srIndex(s);
        !            77:     if (grG->polys[g0]->mark[i0]) {
        !            78:       r = ppAdd(r,cpMult(s->coeffp,grG->polys[g0]->syz[i0]->syz));
        !            79:     }else{
        !            80:       simplifyBT(g0,i0,grG);
        !            81:       r = ppAdd(r,cpMult(s->coeffp,grG->polys[g0]->syz[i0]->syz));
        !            82:     }
        !            83:     s = s->next;
        !            84:   }
        !            85:   grG->polys[grd]->syz[index]->syz = r;
        !            86:   grG->polys[grd]->mark[index] = 1;
        !            87: }
        !            88:
        !            89:
        !            90: static POLY getFactor0(grG,grd,index)
        !            91: struct gradedPolySet *grG;
        !            92: int grd;
        !            93: int index;
        !            94: {
        !            95:   POLY ans;
        !            96:   int i,j;
        !            97:   struct polySet *ps;
        !            98:
        !            99:   ans = cxx(1,0,0,grG->polys[grd]->g[index]->m->ringp);
        !           100:   for (i=0; i<grG->maxGrade; i++) {
        !           101:     ps = grG->polys[i];
        !           102:     for (j=0; j<ps->size; j++) {
        !           103:       if (ps->mark[j] && !(i == grd && j == index)) {
        !           104:        ans = ppMult(ps->syz[j]->cf,ans);
        !           105:       }
        !           106:     }
        !           107:   }
        !           108:   return(ans);
        !           109: }
        !           110:
        !           111: struct arrayOfPOLY *getSyzygy0(grG,zeroPairs)
        !           112: struct gradedPolySet *grG;
        !           113: struct pair *zeroPairs;
        !           114: {
        !           115:   struct pair *tmp;
        !           116:   int size,k,i;
        !           117:   POLY s;
        !           118:   struct arrayOfPOLY *r;
        !           119:   struct arrayOfPOLY *ans;
        !           120:
        !           121:   /* outputGradedPolySet(grG); */
        !           122:   /* outputNode(zeroPairs);   */
        !           123:   /* outputNode() workds as outputPairs() */
        !           124:   tmp = zeroPairs; size = 0;
        !           125:   while (tmp != (struct pair *)NULL) {
        !           126:     size++;
        !           127:     tmp = tmp->next;
        !           128:   }
        !           129:   ans = newArrayOfPOLY(size+1);
        !           130:
        !           131:   k = 0;
        !           132:
        !           133:   while (zeroPairs != (struct pair *)NULL) {
        !           134:     s = getSyzPolyFromSp(zeroPairs,grG);
        !           135:     if (s ISZERO) {
        !           136:
        !           137:     }else {
        !           138:       getArrayOfPOLY(ans,k) = s;
        !           139:       k++;
        !           140:     }
        !           141:     zeroPairs = zeroPairs->next;
        !           142:   }
        !           143:
        !           144:   r = newArrayOfPOLY(k);
        !           145:   for (i=0; i<k; i++) {
        !           146:     getArrayOfPOLY(r,i) = getArrayOfPOLY(ans,i);
        !           147:   }
        !           148:   return(r);
        !           149: }
        !           150:
        !           151: struct matrixOfPOLY *getSyzygy(grG,zeroPairs,grBasesp,backwardMatp)
        !           152: struct gradedPolySet *grG;
        !           153: struct pair *zeroPairs;
        !           154: struct gradedPolySet **grBasesp;
        !           155: struct matrixOfPOLY **backwardMatp;
        !           156: {
        !           157:   int serial;
        !           158:   int i,j,kk;
        !           159:   struct polySet *ps;
        !           160:   POLY fi;
        !           161:   int grd,indx;
        !           162:   struct gradedPolySet *newG;
        !           163:   POLY r;
        !           164:   struct syz0 syz;
        !           165:   struct arrayOfPOLY *ap,*vec;
        !           166:   struct matrixOfPOLY *mp;
        !           167:   struct matrixOfPOLY *b,*nc,*m2,*m1,*ans,*ans2;
        !           168:   struct arrayOfPOLY *dc;
        !           169:   int size;
        !           170:   int *table;
        !           171:   struct pair *excludePairs;
        !           172:   struct matrixOfPOLY *mp0;
        !           173:   struct matrixOfPOLY *m0;
        !           174:   extern int Sugar;
        !           175:
        !           176:   size = getSize00OfGradedSet(grG);
        !           177:   table = (int *)sGC_malloc(sizeof(int)*4*(size+1));
        !           178:   if (table == (int *)NULL) errorSyz0("Out of memory.");
        !           179:
        !           180:   if (Debugsyz0) { printf("grG=");outputGradedPolySet(grG,1);}
        !           181:
        !           182:   /* set grBases */
        !           183:   *grBasesp = newGradedPolySet(0);
        !           184:   serial = 0;
        !           185:   for (i=0; i<grG->maxGrade; i++) {
        !           186:     ps = grG->polys[i];
        !           187:     for (j=0; j<ps->size; j++) {
        !           188:       if (ps->del[j] == 0) {
        !           189:        fi = ps->g[j];
        !           190:        grd = -1;whereInG(*grBasesp,fi,&grd,&indx,Sugar);
        !           191:        *grBasesp =
        !           192:          putPolyInG(*grBasesp,fi,grd,indx,newSyz0(),0,serial);
        !           193:        table[4*serial] = i; table[4*serial+1] = j;
        !           194:        table[4*serial+2] = grd; table[4*serial+3] = indx;
        !           195:        serial++;
        !           196:       }
        !           197:     }
        !           198:   }
        !           199:   if (Debugsyz0) {printf("*grBasesp=");outputGradedPolySet(*grBasesp,1);}
        !           200:
        !           201:   if (size != serial) {
        !           202:     fprintf(stderr," size(%d) != serial(%d) ",size,serial);
        !           203:     errorSyz0("Internal error size != serial");
        !           204:   }
        !           205:
        !           206:   /* set newG. Compute the forward transformations.*/
        !           207:   newG = gradedPolySetCopy(grG);
        !           208:   for (i=0; i<grG->maxGrade;i++) {
        !           209:     ps = newG->polys[i];
        !           210:     for (j=0; j<ps->size; j++) {
        !           211:       fi = ps->g[j];
        !           212:       r = (*reduction)(fi,*grBasesp,1,&syz);
        !           213:       if (KanGBmessage) {printf("."); fflush(stdout);}
        !           214:       if (! (r ISZERO)) errorSyz0("Internal error; getSyzygy(): groebner basis must be given.");
        !           215:       ps->syz[j] = newSyz0();
        !           216:       /* printf("%s : ",POLYToString(syz.cf,'*',1));
        !           217:          printf("%s\n",POLYToString(syz.syz,'*',1)); */
        !           218:       ps->syz[j]->cf = syz.cf;
        !           219:       ps->syz[j]->syz = syz.syz;
        !           220:     }
        !           221:   }
        !           222:
        !           223:   ap = getSyzygy0(newG,zeroPairs);
        !           224:
        !           225:   /*    */
        !           226:   excludePairs = oldPairsToNewPairs(zeroPairs,table,size);
        !           227:   if (Debugsyz0) {
        !           228:     printf("zeroPairs = "); outputNode(zeroPairs);
        !           229:     for (i=0; i<size; i++) {
        !           230:       printf("old gi=%d, old ii=%d, new gi=%d, new ii=%d\n",
        !           231:             table[4*i],table[4*i+1],table[4*i+2],table[4*i+3]);
        !           232:     }
        !           233:     printf("excludePairs = "); outputNode(excludePairs);
        !           234:     printf("\n");
        !           235:   }
        !           236:
        !           237:   if (KanGBmessage) {printf("#"); fflush(stdout); }
        !           238:   mp0 = getSyzygy01(*grBasesp,excludePairs);
        !           239:   if (KanGBmessage) {printf("#"); fflush(stdout); }
        !           240:
        !           241:   /* We compute E-CB. The number of G (G-basis) is serial. */
        !           242:   /* F = - C G,  G = B F , then  F + CB F = 0*/
        !           243:   b = getBackwardMatrixOfPOLY(grG);
        !           244:   nc = getNC(newG,serial,*grBasesp);
        !           245:   dc = getDC(newG);
        !           246:   /*{
        !           247:     printf("\nb=\n"); printMatrixOfPOLY(b);
        !           248:     printf("\n\nnc=\n"); printMatrixOfPOLY(nc);
        !           249:     printf("\n\ndc=\n"); printArrayOfPOLY(dc);
        !           250:   }*/
        !           251:
        !           252:   if (KanGBmessage) {printf(":"); fflush(stdout);}
        !           253:   m2 = getSyzygy1(b,nc,dc);
        !           254:   *backwardMatp = b;
        !           255:
        !           256:   /* mp is the syzygy of the G-basis. */
        !           257:   mp = newMatrixOfPOLY(ap->n,serial);
        !           258:   for (i=0; i < ap->n; i++) {
        !           259:     vec = syzPolyToArrayOfPOLY(serial,getArrayOfPOLY(ap,i),*grBasesp);
        !           260:     for (j=0; j < serial; j++) {
        !           261:       getMatrixOfPOLY(mp,i,j) = getArrayOfPOLY(vec,j);
        !           262:     }
        !           263:   }
        !           264:   /*printf(" ap->n = %d, serial=%d \n",ap->n, serial);
        !           265:   printf("\nmp = \n"); printMatrixOfPOLY(mp); */
        !           266:
        !           267:   if (KanGBmessage) {printf(";"); fflush(stdout);}
        !           268:   m1 = aaMult(mp,b);
        !           269:   m0 = aaMult(mp0,b);
        !           270:   /* printf("\nm0 = \n"); printMatrixOfPOLY(m0); */
        !           271:
        !           272:   ans = newMatrixOfPOLY((m0->m)+(m1->m)+(m2->m),m2->n);
        !           273:   kk = 0;
        !           274:   for (i=0; i<m0->m; i++) {
        !           275:     if (!isZeroRow(m0,i)) {
        !           276:       for (j=0; j<m0->n; j++) {
        !           277:        getMatrixOfPOLY(ans,kk,j) = getMatrixOfPOLY(m0,i,j);
        !           278:       }
        !           279:       kk++;
        !           280:     }
        !           281:   }
        !           282:   for (i=0; i<m1->m; i++) {
        !           283:     if (!isZeroRow(m1,i)) {
        !           284:       for (j=0; j<m1->n; j++) {
        !           285:        getMatrixOfPOLY(ans,kk,j) = getMatrixOfPOLY(m1,i,j);
        !           286:       }
        !           287:       kk++;
        !           288:     }
        !           289:   }
        !           290:   for (i=0; i<m2->m; i++) {
        !           291:     if (!isZeroRow(m2,i)) {
        !           292:       for (j=0; j<m2->n; j++) {
        !           293:        getMatrixOfPOLY(ans,kk,j) = getMatrixOfPOLY(m2,i,j);
        !           294:       }
        !           295:       kk++; if (KanGBmessage) printf("*");
        !           296:     }
        !           297:   }
        !           298:   if (kk != ans->m) {
        !           299:     ans2 = newMatrixOfPOLY(kk,ans->n);
        !           300:     for (i=0; i<kk; i++) {
        !           301:       for (j=0; j<ans->n; j++) {
        !           302:        getMatrixOfPOLY(ans2,i,j) = getMatrixOfPOLY(ans,i,j);
        !           303:       }
        !           304:     }
        !           305:     return(ans2);
        !           306:   }else{
        !           307:     return(ans);
        !           308:   }
        !           309:
        !           310: }
        !           311:
        !           312: POLY getSyzPolyFromSp(spij,grG)
        !           313: struct pair *spij;
        !           314: struct gradedPolySet *grG;
        !           315: {
        !           316:   int ig,ii,jg,ji;
        !           317:   POLY dk;
        !           318:   POLY f;
        !           319:   POLY t,ans;
        !           320:   int grd,indx;
        !           321:
        !           322:   ig = spij->ig; ii = spij->ii;
        !           323:   jg = spij->jg; ji = spij->ji;
        !           324:   if (grG->polys[ig]->del[ii] != 0 || grG->polys[jg]->del[ji] != 0)
        !           325:     return(ZERO);
        !           326:   dk = spij->syz; /* in SyzRing */
        !           327:   clearMark(grG);
        !           328:   f = dk;
        !           329:   while (f != POLYNULL) {
        !           330:     grd = srGrade(f);
        !           331:     indx = srIndex(f);
        !           332:     grG->polys[grd]->mark[indx] = 1;
        !           333:     f=f->next;
        !           334:   }
        !           335:
        !           336:   f = dk; ans = ZERO;
        !           337:   while (f != POLYNULL) {
        !           338:     grd = srGrade(f);
        !           339:     indx = srIndex(f);
        !           340:     t = grG->polys[grd]->syz[indx]->syz;
        !           341:     t = cpMult(f->coeffp,t);
        !           342:     t = cpMult(toSyzCoeff(getFactor0(grG,grd,indx)),t);
        !           343:     ans = ppAdd(ans,t);
        !           344:     f = f->next;
        !           345:   }
        !           346:   return(ans);
        !           347: }
        !           348:
        !           349: static void clearMark(grG)
        !           350: struct gradedPolySet *grG;
        !           351: {
        !           352:   int i,j;
        !           353:   struct polySet *ps;
        !           354:   for (i=0; i<grG->maxGrade; i++) {
        !           355:     ps = grG->polys[i];
        !           356:     for (j=0; j<ps->size; j++) {
        !           357:       ps->mark[j] = 0;
        !           358:     }
        !           359:   }
        !           360: }
        !           361:
        !           362:
        !           363: struct arrayOfPOLY *syzPolyToArrayOfPOLY(size,f,grG)
        !           364: int size;
        !           365: POLY f; /* f is in the SyzRingp */
        !           366: struct gradedPolySet *grG;
        !           367: {
        !           368:   struct arrayOfPOLY *ap;
        !           369:   int i,g0,i0,serial;
        !           370:
        !           371:   ap = newArrayOfPOLY(size);
        !           372:   for (i=0; i<size; i++) {
        !           373:     getArrayOfPOLY(ap,i) = ZERO;
        !           374:   }
        !           375:
        !           376:   while (f != POLYNULL) {
        !           377:     g0 = srGrade(f);
        !           378:     i0 = srIndex(f);
        !           379:     serial = grG->polys[g0]->serial[i0];
        !           380:     if (serial < 0) {
        !           381:       errorSyz0("syzPolyToArrayOfPOLY(): invalid serial[i] of grG.");
        !           382:     }
        !           383:     if (getArrayOfPOLY(ap,serial) != ZERO) {
        !           384:       errorSyz0("syzPolyToArrayOfPOLY(): syzygy polynomial is broken.");
        !           385:     }
        !           386:     getArrayOfPOLY(ap,serial) = srSyzCoeffToPOLY(f->coeffp);
        !           387:     f = f->next;
        !           388:   }
        !           389:   return(ap);
        !           390: }
        !           391:
        !           392:
        !           393:
        !           394: struct matrixOfPOLY *getBackwardMatrixOfPOLY(struct gradedPolySet *grG)
        !           395: {
        !           396:   /* use serial, del.  cf. getBackwardArray() */
        !           397:   int inputSize,outputSize;
        !           398:   int i,j,k,p;
        !           399:   struct arrayOfPOLY *vec;
        !           400:   struct matrixOfPOLY *mat;
        !           401:   struct polySet *ps;
        !           402:
        !           403:   inputSize = 0; outputSize = 0;
        !           404:   for (i=0; i<grG->maxGrade; i++) {
        !           405:     ps = grG->polys[i];
        !           406:     for (j=0; j<ps->size; j++) {
        !           407:       if (ps->serial[j] >= 0) ++inputSize;
        !           408:       if (ps->del[j] == 0) ++outputSize;
        !           409:     }
        !           410:   }
        !           411:
        !           412:   mat = newMatrixOfPOLY(outputSize,inputSize);
        !           413:   k = 0;
        !           414:   for (i=0; i<grG->maxGrade; i++) {
        !           415:     ps = grG->polys[i];
        !           416:     for (j=0; j<ps->size; j++) {
        !           417:       if (ps->del[j] == 0) {
        !           418:        vec = syzPolyToArrayOfPOLY(inputSize,ps->syz[j]->syz,grG);
        !           419:        for (p=0; p<inputSize; p++) {
        !           420:          getMatrixOfPOLY(mat,k,p)=getArrayOfPOLY(vec,p);
        !           421:        }
        !           422:        k++;
        !           423:       }
        !           424:     }
        !           425:   }
        !           426:   return(mat);
        !           427: }
        !           428:
        !           429:
        !           430: struct matrixOfPOLY *getNC(newG,n,grBases)
        !           431: struct gradedPolySet *newG;   /* F is stored and indexed by serial. */
        !           432: int n;                        /* The number of G. */
        !           433: struct gradedPolySet *grBases; /* G (G-basis) is stored. */
        !           434: {
        !           435:   int size,i,j,k,ii;
        !           436:   struct matrixOfPOLY *mat;
        !           437:   struct polySet *ps;
        !           438:   struct arrayOfPOLY *vec;
        !           439:
        !           440:   if (newG == (struct gradedPolySet *)NULL) {
        !           441:     return(newMatrixOfPOLY(0,0));
        !           442:   }
        !           443:   size = 0;
        !           444:   for (i=0; i<newG->maxGrade; i++) {
        !           445:     ps = newG->polys[i];
        !           446:     for (j=0; j<ps->size; j++) {
        !           447:       if (ps->serial[j] >= 0) size++;
        !           448:     }
        !           449:   }
        !           450:   mat = newMatrixOfPOLY(size,n);
        !           451:   for (i=0; i<newG->maxGrade; i++) {
        !           452:     ps = newG->polys[i];
        !           453:     for (j=0; j<ps->size; j++) {
        !           454:       if (ps->serial[j] >= 0) {
        !           455:        ii = ps->serial[j];
        !           456:        vec = syzPolyToArrayOfPOLY(n,ps->syz[j]->syz,grBases);
        !           457:        for (k=0; k<n; k++) {
        !           458:          getMatrixOfPOLY(mat,ii,k) = getArrayOfPOLY(vec,k);
        !           459:        }
        !           460:       }
        !           461:     }
        !           462:   }
        !           463:   return(mat);
        !           464: }
        !           465:
        !           466: struct arrayOfPOLY *getDC(newG)
        !           467: struct gradedPolySet *newG;   /* F is stored and indexed by serial. */
        !           468: {
        !           469:   int size,i,j,k,ii;
        !           470:   struct arrayOfPOLY *mat;
        !           471:   struct polySet *ps;
        !           472:   extern struct ring *CurrentRingp;
        !           473:
        !           474:   if (newG == (struct gradedPolySet *)NULL) {
        !           475:     return(newArrayOfPOLY(0));
        !           476:   }
        !           477:   size = 0;
        !           478:   for (i=0; i<newG->maxGrade; i++) {
        !           479:     ps = newG->polys[i];
        !           480:     for (j=0; j<ps->size; j++) {
        !           481:       if (ps->serial[j] >= 0) size++;
        !           482:     }
        !           483:   }
        !           484:   mat = newArrayOfPOLY(size);
        !           485:   for (i=0; i<newG->maxGrade; i++) {
        !           486:     ps = newG->polys[i];
        !           487:     for (j=0; j<ps->size; j++) {
        !           488:       if (ps->serial[j] >= 0) {
        !           489:        ii = ps->serial[j];
        !           490:        getArrayOfPOLY(mat,ii) = ps->syz[j]->cf;
        !           491:       }
        !           492:     }
        !           493:   }
        !           494:   return(mat);
        !           495: }
        !           496:
        !           497:
        !           498:
        !           499: /* Syzygy from E-CB */
        !           500: struct matrixOfPOLY *getSyzygy1(b,nc,dc)
        !           501: struct matrixOfPOLY *b;
        !           502: struct matrixOfPOLY *nc;
        !           503: struct arrayOfPOLY *dc;
        !           504: {
        !           505:   int m,n2,n;
        !           506:   struct matrixOfPOLY *mat;
        !           507:   int i,j,k;
        !           508:   POLY r;
        !           509:   POLY tmp;
        !           510:
        !           511:   m = nc->m;
        !           512:   n2 = nc->n;
        !           513:   n = b->n;
        !           514:   mat = newMatrixOfPOLY(m,n);
        !           515:   for (i=0; i<m; i++) {
        !           516:     for (j=0; j<n; j++) {
        !           517:       r = ZERO;
        !           518:       if (i == j) {
        !           519:        r = getArrayOfPOLY(dc,i);
        !           520:       }
        !           521:       for (k=0; k<n2; k++) {
        !           522:        tmp = ppMult(getMatrixOfPOLY(nc,i,k),getMatrixOfPOLY(b,k,j));
        !           523:        r = ppAdd(r,tmp);
        !           524:       }
        !           525:       getMatrixOfPOLY(mat,i,j) = r;
        !           526:     }
        !           527:   }
        !           528:   return(mat);
        !           529: }
        !           530:
        !           531: static int isZeroRow(mat,i)
        !           532: struct matrixOfPOLY *mat;
        !           533: int i;
        !           534: {
        !           535:   int n,j;
        !           536:   n = mat->n;
        !           537:   for (j=0; j<n; j++) {
        !           538:     if (getMatrixOfPOLY(mat,i,j) != ZERO) return(0);
        !           539:   }
        !           540:   return(1);
        !           541: }
        !           542:
        !           543: void errorSyz0(s)
        !           544: char *s;
        !           545: {
        !           546:   fprintf(stderr,"Error(syz0.c): %s \n",s);
        !           547:   exit(10);
        !           548: }
        !           549:
        !           550:
        !           551: static void printMatrixOfPOLY(mat)
        !           552: struct matrixOfPOLY *mat;
        !           553: {
        !           554:   int n,m,i,j;
        !           555:   POLY f;
        !           556:   m = mat->m; n = mat->n;
        !           557:   for (i=0; i<m; i++) {
        !           558:     for (j=0; j<n; j++) {
        !           559:       f = getMatrixOfPOLY(mat,i,j);
        !           560:       printf("%s,  ",POLYToString(f,'*',1));
        !           561:     }
        !           562:     printf("\n");
        !           563:   }
        !           564:   printf("\n\n");
        !           565: }
        !           566:
        !           567: static void printArrayOfPOLY(mat)
        !           568: struct arrayOfPOLY *mat;
        !           569: {
        !           570:   int n,m,i,j;
        !           571:   POLY f;
        !           572:   m = mat->n;
        !           573:   for (i=0; i<m; i++) {
        !           574:     f = getArrayOfPOLY(mat,i);
        !           575:     printf("%s,  ",POLYToString(f,'*',1));
        !           576:   }
        !           577:   printf("\n\n");
        !           578: }
        !           579:
        !           580: struct matrixOfPOLY *getSyzygy01(struct gradedPolySet *reducedBasis,
        !           581:                                 struct pair *excludePairs)
        !           582: {
        !           583:   int r;
        !           584:   struct gradedPolySet *g;
        !           585:   struct gradedPairs *d;
        !           586:   int i,j;
        !           587:   int grade,indx;
        !           588:   POLY gt;
        !           589:   struct pair *top;
        !           590:   int ig,ii,jg,ji;
        !           591:   POLY gi,gj;
        !           592:   struct spValue h;
        !           593:   struct syz0 syz;
        !           594:   int pgrade = 0;
        !           595:   POLY rd;
        !           596:   POLY syzPoly;
        !           597:   POLY syzCf;
        !           598:   struct syz0 *syzp;
        !           599:   int serial;
        !           600:   struct pair *listP;
        !           601:   struct pair *listPfirst;
        !           602:   extern int Verbose;
        !           603:   extern struct ring *CurrentRingp;
        !           604:   struct polySet *ps;
        !           605:   int size;
        !           606:   int listPsize = 0;
        !           607:   struct arrayOfPOLY *vec;
        !           608:   struct matrixOfPOLY *mp;
        !           609:   extern int Sugar;
        !           610:
        !           611:
        !           612:   if (Debugsyz0) printf("--------------------- getSyzygy01 -----------\n");
        !           613:   if (reducedBasis == (struct gradedPolySet *)NULL)
        !           614:     return((struct matrixOfPOLY *)NULL);
        !           615:
        !           616:   g = newGradedPolySet(reducedBasis->maxGrade+1);
        !           617:   for (i=0; i<g->lim; i++) { g->polys[i] = newPolySet(1); }
        !           618:   d = newGradedPairs((reducedBasis->maxGrade)*(reducedBasis->maxGrade)+1);
        !           619:   for (i=0; i< reducedBasis->maxGrade; i++) {
        !           620:     ps = reducedBasis->polys[i];
        !           621:     for (j=0; j< ps->size; j++) {
        !           622:       gt = ps->g[j];
        !           623:       grade=-1;whereInG(g,gt,&grade,&indx,Sugar);
        !           624:       d = updatePairs(d,gt,grade,indx,g);
        !           625:       g = putPolyInG(g,gt,grade,indx,newSyz0(),1,ps->serial[j]);
        !           626:       if (Debugsyz0) {
        !           627:        outputGradedPairs(d); outputGradedPolySet(g,1);
        !           628:       }
        !           629:     }
        !           630:   }
        !           631:
        !           632:   listP = newPair((struct pair *)NULL);  /* A list of syzygies will be stored*/
        !           633:   listPfirst  = listP;
        !           634:
        !           635:   while ((top = getPair(d)) != (struct pair *)NULL) {
        !           636:     if (positionInPairs(top,excludePairs) < 0) {
        !           637:       ig = top->ig; ii = top->ii; /* [ig,ii] */
        !           638:       jg = top->jg; ji = top->ji; /* [jg,ji] */
        !           639:       gi = g->polys[ig]->g[ii];
        !           640:       gj = g->polys[jg]->g[ji];
        !           641:
        !           642:       h = (*sp)(gi,gj);
        !           643:       rd = ppAddv(ppMult(h.a,gi),ppMult(h.b,gj));
        !           644:       rd = (*reduction)(rd,g,1,&syz);
        !           645:       syzPoly = syz.syz;
        !           646:       syzCf = syz.cf;
        !           647:
        !           648:       if (KanGBmessage) {
        !           649:        if (pgrade != top->grade) {
        !           650:          pgrade = top->grade;
        !           651:          printf(" %d",pgrade);
        !           652:          fflush(stdout);
        !           653:        }else{
        !           654:          if (rd ISZERO) {
        !           655:            printf("o"); fflush(stdout);
        !           656:          }else{
        !           657:            printf("."); fflush(stdout);
        !           658:          }
        !           659:        }
        !           660:       }
        !           661:
        !           662:       if (!(rd ISZERO)) {
        !           663:        fprintf(stderr,"The given argument of getSyzygy01 is not a g-basis.\n");
        !           664:        return((struct matrixOfPOLY *)NULL);
        !           665:       }else{
        !           666:        top->syz = ppAdd(toSyzPoly(h.a,ig,ii),toSyzPoly(h.b,jg,ji));
        !           667:        top->syz = cpMult(toSyzCoeff(syzCf),top->syz);
        !           668:        top->syz = ppAdd(top->syz,syzPoly);
        !           669:        listP->next = top; top->prev = listP; listP = listP->next;
        !           670:        listPsize++;
        !           671:       }
        !           672:     }
        !           673:   }
        !           674:
        !           675:   if (KanGBmessage) { printf("c"); fflush(stdout); }
        !           676:
        !           677:   size = getSize00OfGradedSet(g);
        !           678:   listPfirst = listPfirst->next;  /* It is the true top of sygyzies. */
        !           679:   mp = newMatrixOfPOLY(listPsize,size);
        !           680:   for (i=0; i<listPsize; i++) {
        !           681:     vec = syzPolyToArrayOfPOLY(size,listPfirst->syz,g);
        !           682:     for (j=0; j<size; j++) {
        !           683:       getMatrixOfPOLY(mp,i,j) = getArrayOfPOLY(vec,j);
        !           684:     }
        !           685:     listPfirst = listPfirst->next;
        !           686:   }
        !           687:   return(mp);
        !           688:
        !           689:
        !           690: }
        !           691:
        !           692: static int getSize00OfGradedSet(struct gradedPolySet *g) {
        !           693:   int size;
        !           694:   int i,j;
        !           695:   struct polySet *ps;
        !           696:   size = 0;
        !           697:   if (g == (struct gradedPolySet *)NULL) return(0);
        !           698:   for (i=0; i<g->maxGrade; i++) {
        !           699:     ps = g->polys[i];
        !           700:     for (j=0; j<ps->size; j++) {
        !           701:       if (ps->del[j] == 0) {
        !           702:        size += 1;
        !           703:       }
        !           704:     }
        !           705:   }
        !           706:   return(size);
        !           707: }
        !           708:
        !           709: static int positionInPairs(struct pair *top, struct pair *pairs) {
        !           710:   struct pair *tmp;
        !           711:   int pos;
        !           712:   tmp = pairs;
        !           713:   pos = 0;
        !           714:   if (top == (struct pair *)NULL) return(-1);
        !           715:   while (tmp != (struct pair *)NULL) {
        !           716:     if (((top->ig == tmp->ig) && (top->ii == tmp->ii) &&
        !           717:         (top->jg == tmp->jg) && (top->ji == tmp->ji)) ||
        !           718:        ((top->ig == tmp->jg) && (top->ii == tmp->ji) &&
        !           719:         (top->jg == tmp->ig) && (top->ji == tmp->ii))) {
        !           720:       return(pos);
        !           721:     }
        !           722:     pos++;
        !           723:     tmp = tmp->next;
        !           724:   }
        !           725:   return(-1);
        !           726: }
        !           727:
        !           728: static struct pair *oldPairsToNewPairs(struct pair *opairs,
        !           729:                                       int *table,int size) {
        !           730:   /* Never loop up prev field. */
        !           731:   int ig,ii,jg,ji;
        !           732:   int p,q;
        !           733:   struct pair *ans;
        !           734:
        !           735:   if (opairs == (struct pair *)NULL) return((struct pair *)NULL);
        !           736:   ig = opairs->ig; ii = opairs->ii;
        !           737:   jg = opairs->jg; ji = opairs->ji;
        !           738:   for (p=0; p<size; p++) {
        !           739:     if (table[4*p] == ig && table[4*p+1] == ii ) {
        !           740:       for (q = 0; q<size; q++) {
        !           741:        if (table[4*q] == jg && table[4*q+1] == ji) {
        !           742:          ans = newPair(NULL);
        !           743:          *ans = *opairs;
        !           744:          ans->prev = NULL;
        !           745:          ans->ig = table[4*p+2]; ans->ii = table[4*p+3];
        !           746:          ans->jg = table[4*q+2]; ans->ji = table[4*q+3];
        !           747:          ans->next = oldPairsToNewPairs(opairs->next,table,size);
        !           748:          return(ans);
        !           749:        }
        !           750:       }
        !           751:     }
        !           752:   }
        !           753:   return(oldPairsToNewPairs(opairs->next,table,size));
        !           754: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>