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

Annotation of OpenXM/src/kan96xx/Kan/Kclass/indeterminate.c, Revision 1.1.1.1

1.1       maekawa     1: /* Kclass/indeterminate.c    */
                      2: /* This file handles   indeterminate, tree, recursivePolynomial,
                      3:     polynomialInOneVariable
                      4: */
                      5: #include <stdio.h>
                      6: #include "../datatype.h"
                      7: #include "../stackm.h"
                      8: #include "../extern.h"
                      9: #include "../gradedset.h"
                     10: #include "../extern2.h"
                     11: #include "../kclass.h"
                     12:
                     13:
                     14: /* Data conversion function : see KclassDataConversion*/
                     15: struct object KpoIndeterminate(struct object ob) {
                     16:   struct object rob;
                     17:   struct object *newobp;
                     18:   rob.tag = Sclass;
                     19:   rob.lc.ival = CLASSNAME_indeterminate;
                     20:   newobp = (struct object *) sGC_malloc(sizeof(struct object));
                     21:   if (newobp == NULL) errorKan1("%s\n","Kclass/indeterminate.c, no more memory.");
                     22:   if (ob.tag != Sdollar) {
                     23:     errorKan1("%s\n","Kclass/indeterminate.c, only String object can be transformed into indeterminate.");
                     24:   }
                     25:   *newobp = ob;
                     26:   rob.rc.voidp = newobp;
                     27:   return(rob);
                     28: }
                     29:
                     30: /* The second constructor. */
                     31: struct object KnewIndeterminate(char *s) {
                     32:   struct object ob;
                     33:
                     34:   ob = KpoString(s);  /* We do not clone s */
                     35:   return(KpoIndeterminate(ob));
                     36: }
                     37:
                     38:
                     39: /* Printing function : see fprintClass */
                     40: void fprintIndeterminate(FILE *fp,struct object op)
                     41: {
                     42:   printObject(KopIndeterminate(op),0,fp);
                     43: }
                     44:
                     45:
                     46: /* ---------------------------------------------------- */
                     47: /* Data conversion function : see KclassDataConversion*/
                     48: struct object KpoTree(struct object ob) {
                     49:   struct object rob;
                     50:   struct object ob1,ob2,ob3;
                     51:   struct object *newobp;
                     52:   rob.tag = Sclass;
                     53:   rob.lc.ival = CLASSNAME_tree;
                     54:   newobp = (struct object *) sGC_malloc(sizeof(struct object));
                     55:   if (newobp == NULL) errorKan1("%s\n","Kclass/indeterminate.c, no more memory.");
                     56:   if (ob.tag != Sarray) {
                     57:     errorKan1("%s\n","Kclass/indeterminate.c, only properly formatted list object can be transformed into tree. [name, cdname, arglist].");
                     58:   }
                     59:   if (getoaSize(ob) < 3) {
                     60:     errorKan1("%s\n","Kclass/indeterminate.c, the length must 3 or more than 3. [name, cdname, arglist].");
                     61:   }
                     62:   ob1 = getoa(ob,0); ob2 = getoa(ob,1); ob3 = getoa(ob,2);
                     63:   if (ob1.tag != Sdollar || ob2.tag != Sdollar || ob3.tag != Sarray) {
                     64:     errorKan1("%s\n","Kclass/indeterminate.c, [string name, string cdname, list arglist].");
                     65:   }
                     66:   *newobp = ob;
                     67:   rob.rc.voidp = newobp;
                     68:   return(rob);
                     69: }
                     70:
                     71:
                     72: /* Printing function : see fprintClass */
                     73: void fprintTree(FILE *fp,struct object op)
                     74: {
                     75:   printObject(KopTree(op),0,fp);
                     76: }
                     77:
                     78: int isTreeAdd(struct object ob) {
                     79:   struct object name;
                     80:   if (ob.tag != Sclass) {
                     81:     return(0);
                     82:   }
                     83:   if (ectag(ob) != CLASSNAME_tree) {
                     84:     return(0);
                     85:   }
                     86:   ob = KopTree(ob);
                     87:   if (ob.tag != Sarray) {
                     88:     errorKan1("%s\n","CLASSNAME_tree is broken. Should be array.");
                     89:   }
                     90:   name = getoa(ob,0);
                     91:   if (name.tag != Sdollar) {
                     92:     errorKan1("%s\n","CLASSNAME_tree is broken. Should be string.");
                     93:   }
                     94:   if (strcmp(KopString(name),"add") == 0) {
                     95:     return(1);
                     96:   }else{
                     97:     return(0);
                     98:   }
                     99: }
                    100:
                    101: struct object addTree(struct object ob1, struct object ob2)
                    102: {
                    103:   struct object rob,aob;
                    104:   struct object ob3,ob4;
                    105:   int i;
                    106:   if (isTreeAdd(ob1) && !isTreeAdd(ob2)) {
                    107:     ob1 = KopTree(ob1);
                    108:     ob3 = getoa(ob1,2);
                    109:     aob = newObjectArray(getoaSize(ob3)+1);
                    110:     for (i=0; i<getoaSize(ob3); i++) {
                    111:       putoa(aob,i,getoa(ob3,i));
                    112:     }
                    113:     putoa(aob,getoaSize(ob3),ob2);
                    114:   }else if (!isTreeAdd(ob1) && isTreeAdd(ob2)) {
                    115:     ob2 = KopTree(ob2);
                    116:     ob3 = getoa(ob2,2);
                    117:     aob = newObjectArray(getoaSize(ob3)+1);
                    118:     putoa(aob,0,ob1);
                    119:     for (i=0; i<getoaSize(ob3); i++) {
                    120:       putoa(aob,1+i,getoa(ob3,i));
                    121:     }
                    122:   }else if (isTreeAdd(ob1) && isTreeAdd(ob2)) {
                    123:     ob1 = KopTree(ob1);
                    124:     ob2 = KopTree(ob2);
                    125:     ob3 = getoa(ob1,2);
                    126:     ob4 = getoa(ob2,2);
                    127:     aob = newObjectArray(getoaSize(ob3)+getoaSize(ob4));
                    128:     for (i=0; i<getoaSize(ob3); i++) {
                    129:       putoa(aob,i,getoa(ob3,i));
                    130:     }
                    131:     for (i=0; i<getoaSize(ob4); i++) {
                    132:       putoa(aob,getoaSize(ob3)+i,getoa(ob4,i));
                    133:     }
                    134:   }else{
                    135:     aob = newObjectArray(2);
                    136:     putoa(aob,0,ob1);
                    137:     putoa(aob,1,ob2);
                    138:   }
                    139:   rob = newObjectArray(3);
                    140:   putoa(rob,0,KpoString("add"));
                    141:   putoa(rob,1,KpoString("Basic"));
                    142:   putoa(rob,2,aob);
                    143:   return(KpoTree(rob));
                    144: }
                    145:
                    146:
                    147: /*------------------------------------------*/
                    148:
                    149: struct object KpoRecursivePolynomial(struct object ob) {
                    150:   struct object rob;
                    151:   struct object *newobp;
                    152:   rob.tag = Sclass;
                    153:   rob.lc.ival = CLASSNAME_recursivePolynomial;
                    154:   newobp = (struct object *) sGC_malloc(sizeof(struct object));
                    155:   if (newobp == NULL) errorKan1("%s\n","Kclass/indeterminate.c, no more memory.");
                    156:   if (ob.tag != Sarray) {
                    157:     errorKan1("%s\n","Kclass/indeterminate.c, only array object can be transformed into recusivePolynomial.");
                    158:   }
                    159:   *newobp = ob;
                    160:   rob.rc.voidp = newobp;
                    161:   return(rob);
                    162: }
                    163:
                    164: static void  printBodyOfRecursivePolynomial(struct object body,
                    165:                                            struct object vlist, FILE *fp)
                    166: {
                    167:   int i,j;
                    168:   int k;
                    169:   if (ectag(body) != CLASSNAME_polynomialInOneVariable) {
                    170:     printObject(body,0,fp);
                    171:     return;
                    172:   }
                    173:   body = KopPolynomialInOneVariable(body);
                    174:   if (body.tag != Sarray) {
                    175:     errorKan1("%s\n","Kclass/indeterminate.c, format error for recursive polynomial.");
                    176:   }
                    177:   if (getoaSize(body) == 0) {
                    178:     errorKan1("%s\n","printBodyOfRecursivePolynomial: format error for a recursive polynomial.");
                    179:   }
                    180:   i = KopInteger(getoa(body,0));
                    181:   for (j=1; j<getoaSize(body); j = j+2) {
                    182:     k = KopInteger(getoa(body,j));
                    183:     if (k != 0) {
                    184:       fprintf(fp,"%s",KopString(getoa(vlist,i)));
                    185:       if (k > 1) {
                    186:        fprintf(fp,"^%d ",k);
                    187:       }else if (k == 1) {
                    188:       }else{
                    189:        fprintf(fp,"^(%d) ",k);
                    190:       }
                    191:       fprintf(fp," * ");
                    192:     }
                    193:     fprintf(fp,"(");
                    194:     printBodyOfRecursivePolynomial(getoa(body,j+1),vlist,fp);
                    195:     fprintf(fp,")");
                    196:     if (j != getoaSize(body)-2) {
                    197:       fprintf(fp," + ");
                    198:     }
                    199:   }
                    200:   return;
                    201: }
                    202:
                    203: void fprintRecursivePolynomial(FILE *fp,struct object op)
                    204: {
                    205:   /* old  code
                    206:   printObject(KopRecursivePolynomial(op),0,fp); return;
                    207:   */
                    208:   struct object ob;
                    209:   struct object vlist;
                    210:   struct object body;
                    211:   ob = KopRecursivePolynomial(op);
                    212:   if (ob.tag != Sarray) {
                    213:     printObject(ob,0,fp); return;
                    214:   }
                    215:   if (!isRecursivePolynomial2(op)) {
                    216:     printObject(KopRecursivePolynomial(op),0,fp); return;
                    217:   }
                    218:   vlist = getoa(ob,0);
                    219:   body = getoa(ob,1);
                    220:   printBodyOfRecursivePolynomial(body,vlist,fp);
                    221:   return;
                    222: }
                    223:
                    224: /*------------------------------------------*/
                    225:
                    226: struct object KpoPolynomialInOneVariable(struct object ob) {
                    227:   struct object rob;
                    228:   struct object *newobp;
                    229:   rob.tag = Sclass;
                    230:   rob.lc.ival = CLASSNAME_polynomialInOneVariable;
                    231:   newobp = (struct object *) sGC_malloc(sizeof(struct object));
                    232:   if (newobp == NULL) errorKan1("%s\n","Kclass/indeterminate.c, no more memory.");
                    233:   if (ob.tag != Sarray) {
                    234:     errorKan1("%s\n","Kclass/indeterminate.c, only array object can be transformed into polynomialInOneVariable.");
                    235:   }
                    236:   *newobp = ob;
                    237:   rob.rc.voidp = newobp;
                    238:   return(rob);
                    239: }
                    240:
                    241: void fprintPolynomialInOneVariable(FILE *fp,struct object op)
                    242: {
                    243:   printObject(KopPolynomialInOneVariable(op),0,fp);
                    244: }
                    245:
                    246: struct object polyToRecursivePoly(struct object p) {
                    247:   struct object rob = NullObject;
                    248:   int vx[N0], vd[N0];
                    249:   int i,j,k,n,count;
                    250:   POLY f;
                    251:   struct object vlist,vlist2;
                    252:   struct object ob1,ob2,ob3,ob4;
                    253:   int vn;
                    254:
                    255:   if (p.tag != Spoly) return(rob);
                    256:   f = KopPOLY(p);
                    257:   if (f == ZERO) {
                    258:     rob = p; return(rob);
                    259:   }
                    260:   /* construct list of variables. */
                    261:   for (i=0; i<N0; i++) {
                    262:     vx[i] = vd[i] = 0;
                    263:   }
                    264:   n = f->m->ringp->n; count = 0;
                    265:   for (i=0; i<n; i++) {
                    266:     if (pDegreeWrtV(f,cxx(1,i,1,f->m->ringp))) {
                    267:       vx[i] = 1; count++;
                    268:     }
                    269:     if (pDegreeWrtV(f,cdd(1,i,1,f->m->ringp))) {
                    270:       vd[i] = 1; count++;
                    271:     }
                    272:   }
                    273:   vlist = newObjectArray(count); k = 0;
                    274:   vlist2 = newObjectArray(count); k = 0;
                    275:   for (i=0; i<n; i++) {
                    276:     if (vd[i]) {
                    277:       putoa(vlist,k,KpoPOLY(cdd(1,i,1,f->m->ringp)));
                    278:       putoa(vlist2,k,KpoString(POLYToString(cdd(1,i,1,f->m->ringp),'*',0)));
                    279:       k++;
                    280:     }
                    281:   }
                    282:   for (i=0; i<n; i++) {
                    283:     if (vx[i]) {
                    284:       putoa(vlist,k,KpoPOLY(cxx(1,i,1,f->m->ringp)));
                    285:       putoa(vlist2,k,KpoString(POLYToString(cxx(1,i,1,f->m->ringp),'*',0)));
                    286:       k++;
                    287:     }
                    288:   }
                    289:   /* printObject(vlist,1,stdout); */
                    290:   if (getoaSize(vlist) == 0) {
                    291:     vn = -1;
                    292:   }else{
                    293:     vn = 0;
                    294:   }
                    295:   ob1 = polyToRecursivePoly2(p,vlist,vn);
                    296:   rob = newObjectArray(2);
                    297:   putoa(rob,0,vlist2); putoa(rob,1,ob1);
                    298:   /* format of rob
                    299:      [ list of variables, poly or universalNumber or yyy to express
                    300:                           a recursive polynomial. ]
                    301:      format of yyy = CLASSNAME_polynomialInOneVariable
                    302:      [Sinteger,    Sinteger, coeff obj, Sinteger, coeff obj, .....]
                    303:       name of var, exp,      coeff,     exp,      coeff
                    304:     This format is checked by isRecursivePolynomial2().
                    305:   */
                    306:   rob = KpoRecursivePolynomial(rob);
                    307:   if (isRecursivePolynomial2(rob)) {
                    308:     return(rob);
                    309:   }else{
                    310:     errorKan1("%s\n","polyToRecursivePolynomial could not translate this object.");
                    311:   }
                    312: }
                    313:
                    314: static void objectFormatError_ind0(char *s) {
                    315:   char tmp[1024];
                    316:   sprintf(tmp,"polyToRecursivePoly2: object format error for the variable %s",s);
                    317:   errorKan1("%s\n",tmp);
                    318: }
                    319:
                    320: struct object polyToRecursivePoly2(struct object p,struct object vlist, int vn) {
                    321:   struct object rob = NullObject;
                    322:   POLY f;
                    323:   POLY vv;
                    324:   struct object v;
                    325:   struct object c;
                    326:   struct object e;
                    327:   int i;
                    328:
                    329:
                    330:   if (p.tag != Spoly) return(rob);
                    331:   f = KopPOLY(p);
                    332:   if (f == ZERO) {
                    333:     rob = p; return(rob);
                    334:   }
                    335:   if (vn < 0 || vn >= getoaSize(vlist)) {
                    336:     return(coeffToObject(f->coeffp));
                    337:   }
                    338:   v = getoa(vlist,vn);
                    339:   if (v.tag != Spoly) objectFormatError_ind0("v");
                    340:   vv = KopPOLY(v);
                    341:   c = parts2(f,vv);
                    342:   e = getoa(c,0);  /* exponents. Array of integer. */
                    343:   if (e.tag != Sarray) objectFormatError_ind0("e");
                    344:   c = getoa(c,1);  /* coefficients. Array of POLY. */
                    345:   if (c.tag != Sarray) objectFormatError_ind0("c");
                    346:   rob = newObjectArray(getoaSize(e)*2+1);
                    347:
                    348:   putoa(rob,0,KpoInteger(vn)); /* put the variable number. */
                    349:   for (i=0; i < getoaSize(e); i++) {
                    350:     putoa(rob,1+i*2, getoa(e,i));
                    351:     putoa(rob,1+i*2+1, polyToRecursivePoly2(getoa(c,i),vlist,vn+1));
                    352:   }
                    353:   /* printObject(rob,0,stderr); */
                    354:   return(KpoPolynomialInOneVariable(rob));
                    355: }
                    356:
                    357: static int isRecursivePolynomial2a(struct object ob2, int n) {
                    358:   char *s = "Format error (isRecursivePolynomial2a) : ";
                    359:   struct object tmp;
                    360:   int i;
                    361:   if (ectag(ob2) == CLASSNAME_polynomialInOneVariable) {
                    362:     ob2 = KopPolynomialInOneVariable(ob2);
                    363:   }else if (ob2.tag == Sarray) {
                    364:     fprintf(stderr,"isRecursivePolynomial2, argument is an array.\n");
                    365:     printObject(ob2,0,stderr);
                    366:     fprintf(stderr,"\n");
                    367:     return(0);   /* Array must be an error, but other objects are OK. */
                    368:   }else {
                    369:     return(1);
                    370:   }
                    371:   if (ob2.tag != Sarray) {
                    372:     return(1);
                    373:     /* coeff can be any. */
                    374:   }
                    375:   if (getoaSize(ob2) % 2 == 0) {
                    376:     fprintf(stderr,"%s list body. The size of body must be odd.\n",s); printObject(ob2,1,stderr);
                    377:     return(0);
                    378:   }
                    379:   tmp = getoa(ob2,0);
                    380:   if (tmp.tag != Sinteger) {
                    381:     fprintf(stderr,"%s list body. body[0] must be integer.\n",s); printObject(ob2,1,stderr);
                    382:     return(0);
                    383:   }
                    384:   if (KopInteger(tmp) < 0 || KopInteger(tmp) >= n) {
                    385:     fprintf(stderr,"%s list body. body[0] must be integer between 0 and the size of vlist -1.\n",s); printObject(ob2,1,stderr);
                    386:     return(0);
                    387:   }
                    388:   for (i=1; i<getoaSize(ob2); i = i+2) {
                    389:     tmp = getoa(ob2,i);
                    390:     if (tmp.tag != Sinteger) {
                    391:       fprintf(stderr,"%s [list vlist, list body]. body[%d] must be integer.\n",s,i);
                    392:       printObject(ob2,1,stderr);
                    393:       return(0);
                    394:     }
                    395:   }
                    396:   for (i=2; i<getoaSize(ob2); i = i+2) {
                    397:     tmp = getoa(ob2,i);
                    398:     if (ectag(tmp) == CLASSNAME_polynomialInOneVariable) {
                    399:       if (isRecursivePolynomial2a(tmp,n)) {
                    400:       }else{
                    401:        fprintf(stderr,"isRecursivePolynomial2a: entry is not a polynomial in one variable.\n");
                    402:        printObject(tmp,0,stderr); fprintf(stderr,"\n");
                    403:        return(0);
                    404:       }
                    405:     }
                    406:   }
                    407:   return(1);
                    408: }
                    409:
                    410: int isRecursivePolynomial2(struct object ob) {
                    411:   /* This checks only the top level */
                    412:   char *s = "Format error (isRecursivePolynomial2) : ";
                    413:   struct object ob1, ob2,tmp;
                    414:   int i;
                    415:   int n;
                    416:   if (ob.tag != Sclass) return(0);
                    417:   if (ectag(ob) != CLASSNAME_recursivePolynomial) return(0);
                    418:   ob = KopRecursivePolynomial(ob);
                    419:   if (ob.tag != Sarray) {
                    420:     fprintf(stderr,"%s [vlist, body]\n",s); printObject(ob,1,stderr);
                    421:     return(0);
                    422:   }
                    423:   if (getoaSize(ob) != 2) {
                    424:     fprintf(stderr,"%s [vlist, body]. The length must be 2. \n",s);
                    425:     printObject(ob,1,stderr);
                    426:     return(0);
                    427:   }
                    428:   ob1 = getoa(ob,0);
                    429:   ob2 = getoa(ob,1);
                    430:   if (ob1.tag != Sarray) {
                    431:     fprintf(stderr,"%s [list vlist, body].\n",s); printObject(ob,1,stderr);
                    432:     return(0);
                    433:   }
                    434:   n = getoaSize(ob1);
                    435:   for (i=0; i<n; i++) {
                    436:     tmp = getoa(ob1,i);
                    437:     if (tmp.tag != Sdollar) {
                    438:       fprintf(stderr,"%s [list vlist, body]. Element of the vlist must be a string.\n",s); printObject(ob,1,stderr);
                    439:       return(0);
                    440:     }
                    441:   }
                    442:   return(isRecursivePolynomial2a(ob2,n));
                    443: }
                    444:
                    445:
                    446: struct object coeffToObject(struct coeff *cp) {
                    447:   struct object rob = NullObject;
                    448:   switch(cp->tag) {
                    449:   case INTEGER:
                    450:     rob = KpoInteger( coeffToInt(cp) );
                    451:     return(rob);
                    452:     break;
                    453:
                    454:   case MP_INTEGER:
                    455:     rob.tag = SuniversalNumber;
                    456:     rob.lc.universalNumber = newUniversalNumber2((cp->val).bigp);
                    457:     return(rob);
                    458:     break;
                    459:
                    460:   case POLY_COEFF:
                    461:     rob = KpoPOLY((cp->val).f);
                    462:     return(rob);
                    463:     break;
                    464:
                    465:   default:
                    466:     return(rob);
                    467:   }
                    468: }
                    469:
                    470:
                    471: struct object recursivePolyToPoly(struct object rp) {
                    472:   struct object rob = NullObject;
                    473:   POLY f;
                    474:   errorKan1("%s\n","recursivePolyToPoly() has not yet been implemented. Use ascii parsing or sm1 macros to reconstruct a polynomial.");
                    475:
                    476:   return(rob);
                    477: }
                    478:
                    479:
                    480:
                    481:
                    482:
                    483:
                    484:

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