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

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

1.1     ! maekawa     1: #include <stdio.h>
        !             2: #include "datatype.h"
        !             3: #include "stackm.h"
        !             4: #include "extern.h"
        !             5: #include "extern2.h"
        !             6: #include "lookup.h"
        !             7: #include "matrix.h"
        !             8: #include "gradedset.h"
        !             9: #include "kclass.h"
        !            10:
        !            11: static int Message = 1;
        !            12: extern int KanGBmessage;
        !            13:
        !            14: /** :kan, :ring */
        !            15: struct object Kreduction(f,set)
        !            16: struct object f;
        !            17: struct object set;
        !            18: {
        !            19:   POLY r;
        !            20:   struct gradedPolySet *grG;
        !            21:   struct syz0 syz;
        !            22:   struct object rob;
        !            23:   int flag;
        !            24:   extern int ReduceLowerTerms;
        !            25:
        !            26:   if (f.tag != Spoly) errorKan1("%s\n","Kreduction(): the first argument must be a polynomial.");
        !            27:
        !            28:   if (ectag(set) == CLASSNAME_GradedPolySet) {
        !            29:     grG = KopGradedPolySet(set);
        !            30:     flag = 1;
        !            31:   }else{
        !            32:     if (set.tag != Sarray) errorKan1("%s\n","Kreduction(): the second argument must be a set of polynomials.");
        !            33:     grG = arrayToGradedPolySet(set);
        !            34:     flag = 0;
        !            35:   }
        !            36:   if (ReduceLowerTerms) {
        !            37:     r = (*reductionCdr)(f.lc.poly,grG,1,&syz);
        !            38:   }else{
        !            39:     r = (*reduction)(f.lc.poly,grG,1,&syz);
        !            40:   }
        !            41:   if (flag) {
        !            42:     rob = newObjectArray(3);
        !            43:     putoa(rob,0,KpoPOLY(r));
        !            44:     putoa(rob,1,KpoPOLY(syz.cf));
        !            45:     putoa(rob,2,syzPolyToArray(countGradedPolySet(grG),syz.syz,grG));
        !            46:   }else {
        !            47:     rob = newObjectArray(4);
        !            48:     putoa(rob,0,KpoPOLY(r));
        !            49:     putoa(rob,1,KpoPOLY(syz.cf));
        !            50:     putoa(rob,2,syzPolyToArray(getoaSize(set),syz.syz,grG));
        !            51:     putoa(rob,3,gradedPolySetToArray(grG,1));
        !            52:   }
        !            53:   return(rob);
        !            54: }
        !            55:
        !            56: struct object Kgroebner(ob)
        !            57: struct object ob;
        !            58: {
        !            59:   int needSyz = 0;
        !            60:   int needBack = 0;
        !            61:   int needInput = 0;
        !            62:   int countDown = 0;
        !            63:   int cdflag = 0;
        !            64:   struct object ob1,ob2,ob2c;
        !            65:   int i;
        !            66:   struct gradedPolySet *grG;
        !            67:   struct pair *grP;
        !            68:   struct arrayOfPOLY *a;
        !            69:   struct object rob;
        !            70:   struct gradedPolySet *grBases;
        !            71:   struct matrixOfPOLY *mp;
        !            72:   struct matrixOfPOLY *backwardMat;
        !            73:   struct object ob1New;
        !            74:   extern char *F_groebner;
        !            75:   extern int CheckHomogenization;
        !            76:   extern int StopDegree;
        !            77:   int sdflag = 0;
        !            78:   int forceReduction = 0;
        !            79:
        !            80:   int ob1Size, ob2Size, noZeroEntry;
        !            81:   int *ob1ToOb2;
        !            82:   int *ob1ZeroPos;
        !            83:   int method;
        !            84:   int j,k;
        !            85:   struct object rob2;
        !            86:   struct object rob3;
        !            87:   struct object rob4;
        !            88:   struct ring *myring;
        !            89:   POLY f;
        !            90:   struct object orgB;
        !            91:   struct object newB;
        !            92:   struct object orgC;
        !            93:   struct object newC;
        !            94:   static struct object paddingVector(struct object ob, int table[], int m);
        !            95:   static struct object unitVector(int pos, int size,struct ring *r);
        !            96:   extern struct ring *CurrentRingp;
        !            97:
        !            98:   StopDegree = 0x7fff;
        !            99:
        !           100:   if (ob.tag != Sarray) errorKan1("%s\n","Kgroebner(): The argument must be an array.");
        !           101:   switch(getoaSize(ob)) {
        !           102:   case 1:
        !           103:     needBack = 0; needSyz = 0; needInput = 0;
        !           104:     ob1 = getoa(ob,0);
        !           105:     break;
        !           106:   case 2:
        !           107:     ob1 = getoa(ob,0);
        !           108:     ob2 = getoa(ob,1);
        !           109:     if (ob2.tag != Sarray) {
        !           110:       errorKan1("%s\n","Kgroebner(): The options must be given by an array.");
        !           111:     }
        !           112:     for (i=0; i<getoaSize(ob2); i++) {
        !           113:       ob2c = getoa(ob2,i);
        !           114:       if (ob2c.tag == Sdollar) {
        !           115:        if (strcmp(ob2c.lc.str,"needBack")==0) {
        !           116:          needBack = 1;
        !           117:        }else if (strcmp(ob2c.lc.str,"needSyz")==0) {
        !           118:          if (!needBack) {
        !           119:            /* warningKan("Kgroebner(): needBack is automatically set."); */
        !           120:          }
        !           121:          needSyz = needBack = 1;
        !           122:        }else if (strcmp(ob2c.lc.str,"forceReduction")==0) {
        !           123:          forceReduction = 1;
        !           124:        }else if (strcmp(ob2c.lc.str,"countDown")==0) {
        !           125:          countDown = 1; cdflag = 1;
        !           126:          if (needSyz) {
        !           127:            warningKan("Kgroebner(): needSyz is automatically turned off.");
        !           128:            needSyz = 0;
        !           129:          }
        !           130:        }else if (strcmp(ob2c.lc.str,"StopDegree")==0) {
        !           131:          StopDegree = 0; sdflag = 1;
        !           132:          if (needSyz) {
        !           133:            warningKan("Kgroebner(): needSyz is automatically turned off.");
        !           134:            needSyz = 0;
        !           135:          }
        !           136:        }else {
        !           137:          warningKan("Unknown keyword for options.");
        !           138:        }
        !           139:       }else if (ob2c.tag == Sinteger) {
        !           140:        if (cdflag) {
        !           141:          cdflag = 0;
        !           142:          countDown = KopInteger(ob2c);
        !           143:        }else if (sdflag) {
        !           144:          sdflag = 0;
        !           145:          StopDegree = KopInteger(ob2c);
        !           146:        }
        !           147:       }
        !           148:     }
        !           149:     break;
        !           150:   default:
        !           151:     errorKan1("%s\n","Kgroebner(): [ [polynomials] ] or [[polynomials] [options]].");
        !           152:   }
        !           153:
        !           154:   if (ob1.tag != Sarray) errorKan1("%s\n","Kgroebner(): The argument must be an array. Example: [ [$x-1$ . $x y -2$ .] [$needBack$ $needSyz$ $needInput$]] ");
        !           155:   ob1New = newObjectArray(getoaSize(ob1));
        !           156:   for (i=0; i< getoaSize(ob1); i++) {
        !           157:     if (getoa(ob1,i).tag == Spoly) {
        !           158:       putoa(ob1New,i,getoa(ob1,i));
        !           159:     }else if (getoa(ob1,i).tag == Sarray) {
        !           160:       /* If the generater is given as an array, flatten it. */
        !           161:       putoa(ob1New,i,KpoPOLY( arrayToPOLY(getoa(ob1,i))));
        !           162:     }else{
        !           163:       errorKan1("%s\n","Kgroebner(): The elements must be polynomials or array of polynomials.");
        !           164:     }
        !           165:     /* getoa(ob1,i) is poly, now check the homogenization. */
        !           166:     if (CheckHomogenization) {
        !           167:       if ((strcmp(F_groebner,"standard")==0) &&
        !           168:          !isHomogenized(KopPOLY(getoa(ob1New,i)))) {
        !           169:        fprintf(stderr,"\n%s",KPOLYToString(KopPOLY(getoa(ob1New,i))));
        !           170:        errorKan1("%s\n","Kgroebner(): The above polynomial is not homogenized. cf. homogenize.");
        !           171:       }
        !           172:     }
        !           173:   }
        !           174:   ob1 = ob1New;
        !           175:
        !           176:   /* To handle the input with zero entries. For debug, debug/gr.sm1*/
        !           177:   ob1Size = getoaSize(ob1);
        !           178:   ob2Size = 0; myring = CurrentRingp;
        !           179:   for (i=0; i<ob1Size; i++) {
        !           180:     if (KopPOLY(getoa(ob1,i)) != POLYNULL) ob2Size++;
        !           181:   }
        !           182:   if (ob2Size == ob1Size) noZeroEntry = 1;
        !           183:   else noZeroEntry = 0;
        !           184:   if (ob1Size == 0)  {
        !           185:     if (needBack && needSyz) {
        !           186:       rob = newObjectArray(3);
        !           187:       putoa(rob,0,newObjectArray(0));
        !           188:       putoa(rob,1,newObjectArray(0));
        !           189:       putoa(rob,2,newObjectArray(0));
        !           190:     }else if (needBack) {
        !           191:       rob = newObjectArray(2);
        !           192:       putoa(rob,0,newObjectArray(0));
        !           193:       putoa(rob,1,newObjectArray(0));
        !           194:     }else {
        !           195:       rob = newObjectArray(1);
        !           196:       putoa(rob,0,newObjectArray(0));
        !           197:     }
        !           198:     return(rob);
        !           199:   }
        !           200:   /* Assume ob1size > 0 */
        !           201:   if (ob2Size == 0) {
        !           202:     rob2 = newObjectArray(1); putoa(rob2,0,KpoPOLY(POLYNULL));
        !           203:     if (needBack && needSyz) {
        !           204:       rob = newObjectArray(3);
        !           205:       putoa(rob,0,rob2);
        !           206:       rob3 = newObjectArray(1);
        !           207:       putoa(rob3,0,unitVector(-1,ob1Size,(struct ring *)NULL));
        !           208:       putoa(rob,1,rob3);
        !           209:       rob4 = newObjectArray(ob1Size);
        !           210:       for (i=0; i<ob1Size; i++) {
        !           211:        putoa(rob4,i,unitVector(i,ob1Size,myring));
        !           212:       }
        !           213:       putoa(rob,2,rob4);
        !           214:     }else if (needBack) {
        !           215:       rob = newObjectArray(2);
        !           216:       putoa(rob,0,rob2);
        !           217:       rob3 = newObjectArray(1);
        !           218:       putoa(rob3,0,unitVector(-1,ob1Size,(struct ring *)NULL));
        !           219:       putoa(rob,1,rob3);
        !           220:     }else {
        !           221:       rob = newObjectArray(1);
        !           222:       putoa(rob,0,rob2);
        !           223:     }
        !           224:     return(rob);
        !           225:   }
        !           226:   /* Assume ob1Size , ob2Size > 0 */
        !           227:   ob2 = newObjectArray(ob2Size);
        !           228:   ob1ToOb2 =   (int *)GC_malloc(sizeof(int)*ob1Size);
        !           229:   ob1ZeroPos = (int *)GC_malloc(sizeof(int)*(ob1Size-ob2Size+1));
        !           230:   if (ob1ToOb2 == NULL || ob1ZeroPos == NULL) errorKan1("%s\n","No more memory.");
        !           231:   j = 0; k = 0;
        !           232:   for (i=0; i<ob1Size; i++) {
        !           233:     f = KopPOLY(getoa(ob1,i));
        !           234:     if (f != POLYNULL) {
        !           235:       myring = f->m->ringp;
        !           236:       putoa(ob2,j,KpoPOLY(f));
        !           237:       ob1ToOb2[i] = j; j++;
        !           238:     }else{
        !           239:       ob1ToOb2[i] = -1;
        !           240:       ob1ZeroPos[k] = i; k++;
        !           241:     }
        !           242:   }
        !           243:
        !           244:   a = arrayToArrayOfPOLY(ob2);
        !           245:   grG = (*groebner)(a,needBack,needSyz,&grP,countDown,forceReduction);
        !           246:
        !           247:   if (strcmp(F_groebner,"gm") == 0 && (needBack || needSyz)) {
        !           248:     warningKan("The options needBack and needSyz are ignored.");
        !           249:     needBack = needSyz = 0;
        !           250:   }
        !           251:
        !           252:   /*return(gradedPolySetToGradedArray(grG,0));*/
        !           253:   if (needBack && needSyz) {
        !           254:     rob = newObjectArray(3);
        !           255:     if (Message && KanGBmessage) {
        !           256:       printf("Computing the backward transformation   ");
        !           257:       fflush(stdout);
        !           258:     }
        !           259:     getBackwardTransformation(grG); /* mark and syz is modified. */
        !           260:     if (KanGBmessage) printf("Done.\n");
        !           261:
        !           262:     /* Computing the syzygies. */
        !           263:     if (Message && KanGBmessage) {
        !           264:       printf("Computing the syzygies    ");
        !           265:       fflush(stdout);
        !           266:     }
        !           267:     mp = getSyzygy(grG,grP->next,&grBases,&backwardMat);
        !           268:     if (KanGBmessage) printf("Done.\n");
        !           269:
        !           270:     putoa(rob,0,gradedPolySetToArray(grG,0));
        !           271:     putoa(rob,1,matrixOfPOLYToArray(backwardMat));
        !           272:     putoa(rob,2,matrixOfPOLYToArray(mp));
        !           273:   }else if (needBack) {
        !           274:     rob = newObjectArray(2);
        !           275:     if (Message && KanGBmessage) {
        !           276:       printf("Computing the backward transformation.....");
        !           277:       fflush(stdout);
        !           278:     }
        !           279:     getBackwardTransformation(grG); /* mark and syz is modified. */
        !           280:     if (KanGBmessage) printf("Done.\n");
        !           281:     putoa(rob,0,gradedPolySetToArray(grG,0));
        !           282:     putoa(rob,1,getBackwardArray(grG));
        !           283:   }else {
        !           284:     rob = newObjectArray(1);
        !           285:     putoa(rob,0,gradedPolySetToArray(grG,0));
        !           286:   }
        !           287:
        !           288:   /* To handle zero entries in the input. */
        !           289:   if (noZeroEntry) {
        !           290:     return(rob);
        !           291:   }
        !           292:   method = getoaSize(rob);
        !           293:   switch(method) {
        !           294:   case 1:
        !           295:     return(rob);
        !           296:     break;
        !           297:   case 2:
        !           298:     orgB = getoa(rob,1); /* backward transformation. */
        !           299:     newB = newObjectArray(getoaSize(orgB));
        !           300:     for (i=0; i<getoaSize(orgB); i++) {
        !           301:       putoa(newB,i,paddingVector(getoa(orgB,i),ob1ToOb2,ob1Size));
        !           302:     }
        !           303:     rob2 = newObjectArray(2);
        !           304:     putoa(rob2,0,getoa(rob,0));
        !           305:     putoa(rob2,1,newB);
        !           306:     return(rob2);
        !           307:     break;
        !           308:   case 3:
        !           309:     orgB = getoa(rob,1); /* backward transformation. */
        !           310:     newB = newObjectArray(getoaSize(orgB));
        !           311:     for (i=0; i<getoaSize(orgB); i++) {
        !           312:       putoa(newB,i,paddingVector(getoa(orgB,i),ob1ToOb2,ob1Size));
        !           313:     }
        !           314:     orgC = getoa(rob,2);
        !           315:     newC = newObjectArray(getoaSize(orgC)+ob1Size-ob2Size);
        !           316:     for (i=0; i<getoaSize(orgC); i++) {
        !           317:       putoa(newC, i, paddingVector(getoa(orgC,i),ob1ToOb2,ob1Size));
        !           318:     }
        !           319:     for (i = getoaSize(orgC), j = 0; i<getoaSize(orgC)+ob1Size-ob2Size; i++,j++) {
        !           320:       putoa(newC,i,unitVector(ob1ZeroPos[j],ob1Size,myring));
        !           321:     }
        !           322:     rob2 = newObjectArray(3);
        !           323:     putoa(rob2,0,getoa(rob,0));
        !           324:     putoa(rob2,1,newB);
        !           325:     putoa(rob2,2,newC);
        !           326:     return(rob2);
        !           327:     break;
        !           328:   default:
        !           329:     errorKan1("%s","Kgroebner: unknown method.");
        !           330:   }
        !           331: }
        !           332:
        !           333: static struct object paddingVector(struct object ob, int table[], int m)
        !           334: {
        !           335:   struct object rob;
        !           336:   int i;
        !           337:   rob = newObjectArray(m);
        !           338:   for (i=0; i<m; i++) {
        !           339:     if (table[i] != -1) {
        !           340:       putoa(rob,i,getoa(ob,table[i]));
        !           341:     }else{
        !           342:       putoa(rob,i,KpoPOLY(POLYNULL));
        !           343:     }
        !           344:   }
        !           345:   return(rob);
        !           346: }
        !           347:
        !           348: static struct object unitVector(int pos, int size,struct ring *r)
        !           349: {
        !           350:   struct object rob;
        !           351:   int i;
        !           352:   POLY one;
        !           353:   rob = newObjectArray(size);
        !           354:   for (i=0; i<size; i++) {
        !           355:     putoa(rob,i,KpoPOLY(POLYNULL));
        !           356:   }
        !           357:   if ((0 <= pos) && (pos < size)) {
        !           358:     putoa(rob,pos, KpoPOLY(cxx(1,0,0,r)));
        !           359:   }
        !           360:   return(rob);
        !           361: }
        !           362:
        !           363:
        !           364:
        !           365: /* :misc */
        !           366:
        !           367: #define INITGRADE 3
        !           368: #define INITSIZE 0
        !           369:
        !           370: struct gradedPolySet *arrayToGradedPolySet(ob)
        !           371: struct object ob;
        !           372: {
        !           373:   int n,i,grd,ind;
        !           374:   POLY f;
        !           375:   struct gradedPolySet *grG;
        !           376:   int serial;
        !           377:   extern int Sugar;
        !           378:
        !           379:   if (ob.tag != Sarray) errorKan1("%s\n","arrayToGradedPolySet(): the argument must be array.");
        !           380:   n = getoaSize(ob);
        !           381:   for (i=0; i<n; i++) {
        !           382:     if (getoa(ob,i).tag != Spoly)
        !           383:       errorKan1("%s\n","arrayToGradedPolySet(): the elements must be polynomials.");
        !           384:   }
        !           385:   grG = newGradedPolySet(INITGRADE);
        !           386:
        !           387:   for (i=0; i<grG->lim; i++) {
        !           388:     grG->polys[i] = newPolySet(INITSIZE);
        !           389:   }
        !           390:   for (i=0; i<n; i++) {
        !           391:     f = KopPOLY(getoa(ob,i));
        !           392:     grd = -1; whereInG(grG,f,&grd,&ind,Sugar);
        !           393:     serial = i;
        !           394:     grG = putPolyInG(grG,f,grd,ind,(struct syz0 *)NULL,1,serial);
        !           395:   }
        !           396:   return(grG);
        !           397: }
        !           398:
        !           399:
        !           400: struct object polySetToArray(ps,keepRedundant)
        !           401: struct polySet *ps;
        !           402: int keepRedundant;
        !           403: {
        !           404:   int n,i,j;
        !           405:   struct object ob;
        !           406:   if (ps == (struct polySet *)NULL) return(newObjectArray(0));
        !           407:   n = 0;
        !           408:   if (keepRedundant) {
        !           409:     n = ps->size;
        !           410:   }else{
        !           411:     for (i=0; i<ps->size; i++) {
        !           412:       if (ps->del[i] == 0) ++n;
        !           413:     }
        !           414:   }
        !           415:   ob = newObjectArray(n);
        !           416:   j = 0;
        !           417:   for (i=0; i<ps->size; i++) {
        !           418:     if (keepRedundant || (ps->del[i] == 0)) {
        !           419:       putoa(ob,j,KpoPOLY(ps->g[i]));
        !           420:       j++;
        !           421:     }
        !           422:   }
        !           423:   return(ob);
        !           424: }
        !           425:
        !           426:
        !           427: struct object gradedPolySetToGradedArray(gps,keepRedundant)
        !           428: struct gradedPolySet *gps;
        !           429: int keepRedundant;
        !           430: {
        !           431:   struct object ob,vec;
        !           432:   int i;
        !           433:   if (gps == (struct gradedPolySet *)NULL) return(NullObject);
        !           434:   ob = newObjectArray(gps->maxGrade +1);
        !           435:   vec = newObjectArray(gps->maxGrade);
        !           436:   for (i=0; i<gps->maxGrade; i++) {
        !           437:     putoa(vec,i,KpoInteger(i));
        !           438:     putoa(ob,i+1,polySetToArray(gps->polys[i],keepRedundant));
        !           439:   }
        !           440:   putoa(ob,0,vec);
        !           441:   return(ob);
        !           442: }
        !           443:
        !           444:
        !           445: struct object gradedPolySetToArray(gps,keepRedundant)
        !           446: struct gradedPolySet *gps;
        !           447: int keepRedundant;
        !           448: {
        !           449:   struct object ob,vec;
        !           450:   struct polySet *ps;
        !           451:   int k;
        !           452:   int i,j;
        !           453:   int size;
        !           454:   if (gps == (struct gradedPolySet *)NULL) return(NullObject);
        !           455:   size = 0;
        !           456:   for (i=0; i<gps->maxGrade; i++) {
        !           457:     ps = gps->polys[i];
        !           458:     if (keepRedundant) {
        !           459:       size += ps->size;
        !           460:     }else{
        !           461:       for (j=0; j<ps->size; j++) {
        !           462:        if (ps->del[j] == 0) ++size;
        !           463:       }
        !           464:     }
        !           465:   }
        !           466:
        !           467:   ob = newObjectArray(size);
        !           468:   k = 0;
        !           469:   for (i=0; i<gps->maxGrade; i++) {
        !           470:     ps = gps->polys[i];
        !           471:     for (j=0; j<ps->size; j++) {
        !           472:       if (keepRedundant || (ps->del[j] == 0)) {
        !           473:        putoa(ob,k,KpoPOLY(ps->g[j]));
        !           474:        k++;
        !           475:       }
        !           476:     }
        !           477:   }
        !           478:   return(ob);
        !           479: }
        !           480:
        !           481:
        !           482: /* serial == -1  :  It's not in the marix input. */
        !           483: struct object syzPolyToArray(size,f,grG)
        !           484: int size;
        !           485: POLY f;
        !           486: struct gradedPolySet *grG;
        !           487: {
        !           488:   struct object ob;
        !           489:   int i,g0,i0,serial;
        !           490:
        !           491:   ob = newObjectArray(size);
        !           492:   for (i=0; i<size; i++) {
        !           493:     putoa(ob,i,KpoPOLY(ZERO));
        !           494:   }
        !           495:
        !           496:   while (f != POLYNULL) {
        !           497:     g0 = srGrade(f);
        !           498:     i0 = srIndex(f);
        !           499:     serial = grG->polys[g0]->serial[i0];
        !           500:     if (serial < 0) {
        !           501:       errorKan1("%s\n","syzPolyToArray(): invalid serial[i] of grG.");
        !           502:     }
        !           503:     if (KopPOLY(getoa(ob,serial)) != ZERO) {
        !           504:       errorKan1("%s\n","syzPolyToArray(): syzygy polynomial is broken.");
        !           505:     }
        !           506:     putoa(ob,serial,KpoPOLY(f->coeffp->val.f));
        !           507:     f = f->next;
        !           508:   }
        !           509:   return(ob);
        !           510: }
        !           511:
        !           512: struct object getBackwardArray(grG)
        !           513: struct gradedPolySet *grG;
        !           514: {
        !           515:   /* use serial, del.  cf. getBackwardTransformation(). */
        !           516:   int inputSize,outputSize;
        !           517:   int i,j,k;
        !           518:   struct object ob;
        !           519:   struct polySet *ps;
        !           520:
        !           521:   inputSize = 0; outputSize = 0;
        !           522:   for (i=0; i<grG->maxGrade; i++) {
        !           523:     ps = grG->polys[i];
        !           524:     for (j=0; j<ps->size; j++) {
        !           525:       if (ps->serial[j] >= 0) ++inputSize;
        !           526:       if (ps->del[j] == 0) ++outputSize;
        !           527:     }
        !           528:   }
        !           529:
        !           530:   ob = newObjectArray(outputSize);
        !           531:   k = 0;
        !           532:   for (i=0; i<grG->maxGrade; i++) {
        !           533:     ps = grG->polys[i];
        !           534:     for (j=0; j<ps->size; j++) {
        !           535:       if (ps->del[j] == 0) {
        !           536:        putoa(ob,k,syzPolyToArray(inputSize,ps->syz[j]->syz,grG));
        !           537:        k++;
        !           538:       }
        !           539:     }
        !           540:   }
        !           541:   return(ob);
        !           542: }
        !           543:
        !           544:
        !           545: POLY arrayToPOLY(ob)
        !           546: struct object ob;
        !           547: {
        !           548:   int size,i;
        !           549:   struct object f;
        !           550:   POLY r;
        !           551:   static int nn,mm,ll,cc,n,m,l,c;
        !           552:   static struct ring *cr = (struct ring *)NULL;
        !           553:   POLY ff,ee;
        !           554:   MONOMIAL tf;
        !           555:
        !           556:   if (ob.tag != Sarray) errorKan1("%s\n","arrayToPOLY(): The argument must be an array.");
        !           557:   size = getoaSize(ob);
        !           558:   r = ZERO;
        !           559:   for (i=0; i<size; i++) {
        !           560:     f = getoa(ob,i);
        !           561:     if (f.tag != Spoly) errorKan1("%s\n","arrayToPOLY(): The elements must be polynomials.");
        !           562:     ff = KopPOLY(f);
        !           563:     if (ff != ZERO) {
        !           564:       tf = ff->m;
        !           565:       if (tf->ringp != cr) {
        !           566:        n = tf->ringp->n;
        !           567:        m = tf->ringp->m;
        !           568:        l = tf->ringp->l;
        !           569:        c = tf->ringp->c;
        !           570:        nn = tf->ringp->nn;
        !           571:        mm = tf->ringp->mm;
        !           572:        ll = tf->ringp->ll;
        !           573:        cc = tf->ringp->cc;
        !           574:        cr = tf->ringp;
        !           575:       }
        !           576:       if (n-nn >0) ee = cxx(1,n-1,i,tf->ringp);
        !           577:       else if (m-mm >0) ee = cxx(1,m-1,i,tf->ringp);
        !           578:       else if (l-ll >0) ee = cxx(1,l-1,i,tf->ringp);
        !           579:       else if (c-cc >0) ee = cxx(1,c-1,i,tf->ringp);
        !           580:       else ee = ZERO;
        !           581:       r = ppAddv(r,ppMult(ee,ff));
        !           582:     }
        !           583:   }
        !           584:   return(r);
        !           585: }
        !           586:
        !           587: struct object POLYToArray(ff)
        !           588: POLY ff;
        !           589: {
        !           590:
        !           591:   static int nn,mm,ll,cc,n,m,l,c;
        !           592:   static struct ring *cr = (struct ring *)NULL;
        !           593:   POLY ee;
        !           594:   MONOMIAL tf;
        !           595:   int k,i,matn,size;
        !           596:   struct matrixOfPOLY *mat;
        !           597:   POLY ex,sizep;
        !           598:   struct object ob;
        !           599:
        !           600:   if (ff != ZERO) {
        !           601:     tf = ff->m;
        !           602:     if (tf->ringp != cr) {
        !           603:       n = tf->ringp->n;
        !           604:       m = tf->ringp->m;
        !           605:       l = tf->ringp->l;
        !           606:       c = tf->ringp->c;
        !           607:       nn = tf->ringp->nn;
        !           608:       mm = tf->ringp->mm;
        !           609:       ll = tf->ringp->ll;
        !           610:       cc = tf->ringp->cc;
        !           611:       cr = tf->ringp;
        !           612:     }
        !           613:     if (n-nn >0) ee = cxx(1,n-1,1,tf->ringp);
        !           614:     else if (m-mm >0) ee = cxx(1,m-1,1,tf->ringp);
        !           615:     else if (l-ll >0) ee = cxx(1,l-1,1,tf->ringp);
        !           616:     else if (c-cc >0) ee = cxx(1,c-1,1,tf->ringp);
        !           617:     else ee = ZERO;
        !           618:   }else{
        !           619:     ob = newObjectArray(1);
        !           620:     getoa(ob,0) = KpoPOLY(ZERO);
        !           621:     return(ob);
        !           622:   }
        !           623:   mat = parts(ff,ee);
        !           624:   matn = mat->n;
        !           625:   sizep = getMatrixOfPOLY(mat,0,0);
        !           626:   if (sizep == ZERO) size = 1;
        !           627:   else size = coeffToInt(sizep->coeffp)+1;
        !           628:   ob = newObjectArray(size);
        !           629:   for (i=0; i<size; i++) getoa(ob,i) = KpoPOLY(ZERO);
        !           630:   for (i=0; i<matn; i++) {
        !           631:     ex = getMatrixOfPOLY(mat,0,i);
        !           632:     if (ex == ZERO) k = 0;
        !           633:     else {
        !           634:       k = coeffToInt(ex->coeffp);
        !           635:     }
        !           636:     getoa(ob,k) = KpoPOLY(getMatrixOfPOLY(mat,1,i));
        !           637:   }
        !           638:   return(ob);
        !           639: }
        !           640:
        !           641: static int isThereh(f)
        !           642: POLY f;
        !           643: {
        !           644:   POLY t;
        !           645:   if (f == 0) return(0);
        !           646:   t = f;
        !           647:   while (t != POLYNULL) {
        !           648:     if (t->m->e[0].D) return(1);
        !           649:     t = t->next;
        !           650:   }
        !           651:   return(0);
        !           652: }
        !           653:
        !           654: struct object homogenizeObject(ob,gradep)
        !           655: struct object ob;
        !           656: int *gradep;
        !           657: {
        !           658:   struct object rob,ob1;
        !           659:   int maxg;
        !           660:   int gr,flag,i,d,size;
        !           661:   struct ring *rp;
        !           662:   POLY f;
        !           663:   extern struct ring *CurrentRingp;
        !           664:   extern int Homogenize_vec;
        !           665:
        !           666:   if (!Homogenize_vec) return(homogenizeObject_vec(ob,gradep));
        !           667:
        !           668:   switch(ob.tag) {
        !           669:   case Spoly:
        !           670:     if (isThereh(KopPOLY(ob))) {
        !           671:       fprintf(stderr,"\n%s\n",KPOLYToString(KopPOLY(ob)));
        !           672:       errorKan1("%s\n","homogenizeObject(): The above polynomial has already had a homogenization variable.\nPut the homogenization variable 1 before homogenization.\ncf. replace.");
        !           673:     }
        !           674:     f = homogenize( KopPOLY(ob) );
        !           675:     *gradep = (*grade)(f);
        !           676:     return(KpoPOLY(f));
        !           677:     break;
        !           678:   case Sarray:
        !           679:     size = getoaSize(ob);
        !           680:     if (size == 0) {
        !           681:       errorKan1("%s\n","homogenizeObject() is called for the empty array.");
        !           682:     }
        !           683:     rob = newObjectArray(size);
        !           684:     flag = 0;
        !           685:     ob1 = getoa(ob,0);
        !           686:     ob1 = homogenizeObject(ob1,&gr);
        !           687:     maxg = gr;
        !           688:     getoa(rob,0) = ob1;
        !           689:     for (i=1; i<size; i++) {
        !           690:       ob1 = getoa(ob,i);
        !           691:       ob1 = homogenizeObject(ob1,&gr);
        !           692:       if (gr > maxg) {
        !           693:        maxg = gr;
        !           694:       }
        !           695:       getoa(rob,i) = ob1;
        !           696:     }
        !           697:     maxg = maxg+size-1;
        !           698:     if (1) {
        !           699:       rp = oRingp(rob);
        !           700:       if (rp == (struct ring *)NULL) rp = CurrentRingp;
        !           701:       for (i=0; i<size; i++) {
        !           702:        gr = oGrade(getoa(rob,i));
        !           703:        /**printf("maxg=%d, gr=%d(i=%d) ",maxg,gr,i); fflush(stdout);**/
        !           704:        if (maxg > gr) {
        !           705:          f = cdd(1,0,maxg-gr-i,rp); /* h^{maxg-gr-i} */
        !           706:          getoa(rob,i) = KooMult(KpoPOLY(f),getoa(rob,i));
        !           707:        }
        !           708:       }
        !           709:     }
        !           710:     *gradep = maxg;
        !           711:     return(rob);
        !           712:     break;
        !           713:   default:
        !           714:     errorKan1("%s\n","homogenizeObject(): Invalid argument data type.");
        !           715:     break;
        !           716:   }
        !           717: }
        !           718:
        !           719: struct object homogenizeObject_vec(ob,gradep)
        !           720: struct object ob;
        !           721: int *gradep;
        !           722: {
        !           723:   struct object rob,ob1;
        !           724:   int maxg;
        !           725:   int gr,i,size;
        !           726:   POLY f;
        !           727:   extern struct ring *CurrentRingp;
        !           728:
        !           729:   switch(ob.tag) {
        !           730:   case Spoly:
        !           731:     if (isThereh(KopPOLY(ob))) {
        !           732:       fprintf(stderr,"\n%s\n",KPOLYToString(KopPOLY(ob)));
        !           733:       errorKan1("%s\n","homogenizeObject_vec(): The above polynomial has already had a homogenization variable.\nPut the homogenization variable 1 before homogenization.\ncf. replace.");
        !           734:     }
        !           735:     if (containVectorVariable(KopPOLY(ob))) {
        !           736:       errorKan1("%s\n","homogenizedObject_vec(): The given polynomial contains a variable to express a vector component.");
        !           737:     }
        !           738:     f = homogenize( KopPOLY(ob) );
        !           739:     *gradep = (*grade)(f);
        !           740:     return(KpoPOLY(f));
        !           741:     break;
        !           742:   case Sarray:
        !           743:     size = getoaSize(ob);
        !           744:     if (size == 0) {
        !           745:       errorKan1("%s\n","homogenizeObject_vec() is called for the empty array.");
        !           746:     }
        !           747:     rob = newObjectArray(size);
        !           748:     for (i=0; i<size; i++) {
        !           749:       ob1 = getoa(ob,i);
        !           750:       ob1 = homogenizeObject_vec(ob1,&gr);
        !           751:       if (i==0) maxg = gr;
        !           752:       else {
        !           753:        maxg = (maxg > gr? maxg: gr);
        !           754:       }
        !           755:       putoa(rob,i,ob1);
        !           756:     }
        !           757:     *gradep = maxg;
        !           758:     return(rob);
        !           759:     break;
        !           760:   default:
        !           761:     errorKan1("%s\n","homogenizeObject_vec(): Invalid argument data type.");
        !           762:     break;
        !           763:   }
        !           764: }
        !           765:
        !           766: struct ring *oRingp(ob)
        !           767: struct object ob;
        !           768: {
        !           769:   struct ring *rp,*rptmp;
        !           770:   int i,size;
        !           771:   POLY f;
        !           772:   switch(ob.tag) {
        !           773:   case Spoly:
        !           774:     f = KopPOLY(ob);
        !           775:     if (f == ZERO) return((struct ring *)NULL);
        !           776:     return( f->m->ringp);
        !           777:     break;
        !           778:   case Sarray:
        !           779:     size = getoaSize(ob);
        !           780:     rp = (struct ring *)NULL;
        !           781:     for (i=0; i<size; i++) {
        !           782:       rptmp = oRingp(getoa(ob,i));
        !           783:       if (rptmp != (struct ring *)NULL) rp = rptmp;
        !           784:       return(rp);
        !           785:     }
        !           786:     break;
        !           787:   default:
        !           788:     errorKan1("%s\n","oRingp(): Invalid argument data type.");
        !           789:     break;
        !           790:   }
        !           791: }
        !           792:
        !           793: int oGrade(ob)
        !           794: struct object ob;
        !           795: {
        !           796:   int i,size;
        !           797:   POLY f;
        !           798:   int maxg,tmpg;
        !           799:   switch(ob.tag) {
        !           800:   case Spoly:
        !           801:     f = KopPOLY(ob);
        !           802:     return( (*grade)(f) );
        !           803:     break;
        !           804:   case Sarray:
        !           805:     size = getoaSize(ob);
        !           806:     if (size == 0) return(0);
        !           807:     maxg = oGrade(getoa(ob,0));
        !           808:     for (i=1; i<size; i++) {
        !           809:       tmpg = oGrade(getoa(ob,i));
        !           810:       if (tmpg > maxg) maxg = tmpg;
        !           811:     }
        !           812:     return(maxg);
        !           813:     break;
        !           814:   default:
        !           815:     errorKan1("%s\n","oGrade(): Invalid data type for the argument.");
        !           816:     break;
        !           817:   }
        !           818: }
        !           819:
        !           820:
        !           821: struct object oPrincipalPart(ob)
        !           822: struct object ob;
        !           823: {
        !           824:   POLY f;
        !           825:   struct object rob;
        !           826:
        !           827:   switch(ob.tag) {
        !           828:   case Spoly:
        !           829:     f = KopPOLY(ob);
        !           830:     return( KpoPOLY(POLYToPrincipalPart(f)));
        !           831:     break;
        !           832:   default:
        !           833:     errorKan1("%s\n","oPrincipalPart(): Invalid data type for the argument.");
        !           834:     break;
        !           835:   }
        !           836: }
        !           837: struct object oInitW(ob,oWeight)
        !           838: struct object ob;
        !           839: struct object oWeight;
        !           840: {
        !           841:   POLY f;
        !           842:   struct object rob;
        !           843:   int w[2*N0];
        !           844:   int n,i;
        !           845:   struct object ow;
        !           846:
        !           847:   if (oWeight.tag != Sarray) {
        !           848:     errorKan1("%s\n","oInitW(): the second argument must be array.");
        !           849:   }
        !           850:   n = getoaSize(oWeight);
        !           851:   if (n >= 2*N0) errorKan1("%s\n","oInitW(): the size of the second argument is invalid.");
        !           852:   for (i=0; i<n; i++) {
        !           853:     ow = getoa(oWeight,i);
        !           854:     if (ow.tag != Sinteger) {
        !           855:       errorKan1("%s\n","oInitW(): the entries of the second argument must be integers.");
        !           856:     }
        !           857:     w[i] = KopInteger(ow);
        !           858:   }
        !           859:   switch(ob.tag) {
        !           860:   case Spoly:
        !           861:     f = KopPOLY(ob);
        !           862:     return( KpoPOLY(POLYToInitW(f,w)));
        !           863:     break;
        !           864:   default:
        !           865:     errorKan1("%s\n","oInitW(): Argument must be polynomial.");
        !           866:     break;
        !           867:   }
        !           868: }
        !           869:
        !           870: int KpolyLength(POLY f) {
        !           871:   int size;
        !           872:   if (f == POLYNULL) return(1);
        !           873:   size = 0;
        !           874:   while (f != POLYNULL) {
        !           875:     f = f->next;
        !           876:     size++;
        !           877:   }
        !           878:   return(size);
        !           879: }
        !           880:
        !           881: int validOutputOrder(int ord[],int n) {
        !           882:   int i,j,flag;
        !           883:   for (i=0; i<n; i++) {
        !           884:     flag = 0;
        !           885:     for (j=0; j<n; j++) {
        !           886:       if (ord[j] == i) flag = 1;
        !           887:     }
        !           888:     if (flag == 0) return(0); /* invalid */
        !           889:   }
        !           890:   return(1);
        !           891: }
        !           892:
        !           893: struct object KsetOutputOrder(struct object ob, struct ring *rp)
        !           894: {
        !           895:   int n,i;
        !           896:   struct object ox;
        !           897:   struct object otmp;
        !           898:   int *xxx;
        !           899:   int *ddd;
        !           900:   if (ob.tag  != Sarray) {
        !           901:     errorKan1("%s\n","KsetOutputOrder(): the argument must be of the form [x y z ...]");
        !           902:   }
        !           903:   n = rp->n;
        !           904:   ox = ob;
        !           905:   if (getoaSize(ox) != 2*n) {
        !           906:     errorKan1("%s\n","KsetOutputOrder(): the argument must be of the form [x y z ...] and the length of [x y z ...] must be equal to the number of x and D variables.");
        !           907:   }
        !           908:   xxx = (int *)sGC_malloc(sizeof(int)*n*2);
        !           909:   if (xxx == NULL ) {
        !           910:     errorKan1("%s\n","KsetOutputOrder(): no more memory.");
        !           911:   }
        !           912:   for (i=0; i<2*n; i++) {
        !           913:     otmp = getoa(ox,i);
        !           914:     if(otmp.tag != Sinteger) {
        !           915:       errorKan1("%s\n","KsetOutputOrder(): elements must be integers.");
        !           916:     }
        !           917:     xxx[i] = KopInteger(otmp);
        !           918:   }
        !           919:   if (!validOutputOrder(xxx,2*n)) {
        !           920:     errorKan1("%s\n","KsetOutputOrder(): Invalid output order for variables.");
        !           921:   }
        !           922:   rp->outputOrder = xxx;
        !           923:   return(ob);
        !           924: }
        !           925:
        !           926: struct object KschreyerSkelton(struct object g)
        !           927: {
        !           928:   struct object rob;
        !           929:   struct object ij;
        !           930:   struct object ab;
        !           931:   struct object tt;
        !           932:   struct arrayOfPOLY *ap;
        !           933:   struct arrayOfMonomialSyz ans;
        !           934:   int k;
        !           935:   rob.tag = Snull;
        !           936:   if (g.tag != Sarray) {
        !           937:     errorKan1("%s\n","KschreyerSkelton(): argument must be an array of polynomials.");
        !           938:   }
        !           939:
        !           940:   ap = arrayToArrayOfPOLY(g);
        !           941:   ans = schreyerSkelton(*ap);
        !           942:
        !           943:   rob = newObjectArray(ans.size);
        !           944:   for (k=0; k<ans.size; k++) {
        !           945:     ij = newObjectArray(2);
        !           946:     putoa(ij,0, KpoInteger(ans.p[k]->i));
        !           947:     putoa(ij,1, KpoInteger(ans.p[k]->j));
        !           948:     ab = newObjectArray(2);
        !           949:     putoa(ab,0, KpoPOLY(ans.p[k]->a));
        !           950:     putoa(ab,1, KpoPOLY(ans.p[k]->b));
        !           951:     tt = newObjectArray(2);
        !           952:     putoa(tt,0, ij);
        !           953:     putoa(tt,1, ab);
        !           954:     putoa(rob,k,tt);
        !           955:   }
        !           956:   return(rob);
        !           957: }
        !           958:
        !           959: struct object KisOrdered(struct object of)
        !           960: {
        !           961:   if (of.tag != Spoly) {
        !           962:     errorKan1("%s\n","KisOrdered(): argument must be a polynomial.");
        !           963:   }
        !           964:   if (isOrdered(KopPOLY(of))) {
        !           965:     return(KpoInteger(1));
        !           966:   }else{
        !           967:     return(KpoInteger(0));
        !           968:   }
        !           969: }
        !           970:
        !           971: struct object KvectorToSchreyer_es(struct object obarray)
        !           972: {
        !           973:   int m,i;
        !           974:   int nn;
        !           975:   POLY f;
        !           976:   POLY g;
        !           977:   struct object ob;
        !           978:   struct ring *rp;
        !           979:   if (obarray.tag != Sarray) {
        !           980:     errorKan1("%s\n","KvectorToSchreyer_es(): argument must be an array of polynomials.");
        !           981:   }
        !           982:   m = getoaSize(obarray);
        !           983:   f = POLYNULL;
        !           984:   for (i=0; i<m; i++) {
        !           985:     ob = getoa(obarray,i);
        !           986:     if (ob.tag != Spoly) {
        !           987:       errorKan1("%s\n","KvectorToSchreyer_es(): each element of the array must be a polynomial.");
        !           988:     }
        !           989:     g = KopPOLY(ob);
        !           990:     if (g != POLYNULL) {
        !           991:       rp = g->m->ringp;
        !           992:       nn = rp->nn;
        !           993:       /*   g = es^i  g */
        !           994:       g = mpMult_poly(cxx(1,nn,i,rp), g);
        !           995:       if (!isOrdered(g)) {
        !           996:        errorKan1("%s\n","KvectorToSchreyer_es(): given polynomial is not ordered properly by the given Schreyer order.");
        !           997:       }
        !           998:       f = ppAdd(f,g);
        !           999:     }
        !          1000:   }
        !          1001:   return(KpoPOLY(f));
        !          1002: }

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