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

Annotation of OpenXM/src/kan96xx/Kan/kanExport0.c, Revision 1.1.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: #define universalToPoly(un,rp) (isZero(un)?ZERO:coeffToPoly(un,rp))
                     12:
                     13: static void checkDuplicateName(char *xvars[],char *dvars[],int n);
                     14:
                     15: static void yet() { fprintf(stderr,"Not implemented."); }
                     16:
                     17: int SerialCurrent = -1;  /* Current Serial number of the recieved packet as server. */
                     18:
                     19: int ReverseOutputOrder = 1;
                     20: int WarningNoVectorVariable = 1;
                     21:
                     22: /** :arithmetic **/
                     23: struct object KooAdd(ob1,ob2)
                     24: struct object ob1,ob2;
                     25: {
                     26:   extern struct ring *CurrentRingp;
                     27:   struct object rob = NullObject;
                     28:   POLY r;
                     29:   int s,i;
                     30:   objectp f1,f2,g1,g2;
                     31:   struct object nn,dd;
                     32:
                     33:   switch (Lookup[ob1.tag][ob2.tag]) {
                     34:   case SintegerSinteger:
                     35:     return(KpoInteger(ob1.lc.ival + ob2.lc.ival));
                     36:     break;
                     37:   case SpolySpoly:
                     38:     r = ppAdd(ob1.lc.poly,ob2.lc.poly);
                     39:     rob.tag = Spoly; rob.lc.poly = r;
                     40:     return(rob);
                     41:     break;
                     42:   case SarraySarray:
                     43:     s = getoaSize(ob1);
                     44:     if (s != getoaSize(ob2)) {
                     45:       errorKan1("%s\n","Two arrays must have a same size.");
                     46:     }
                     47:     rob = newObjectArray(s);
                     48:     for (i=0; i<s; i++) {
                     49:       putoa(rob,i,KooAdd(getoa(ob1,i),getoa(ob2,i)));
                     50:     }
                     51:     return(rob);
                     52:     break;
                     53:   case SuniversalNumberSuniversalNumber:
                     54:     rob.tag = SuniversalNumber;
                     55:     rob.lc.universalNumber = newUniversalNumber(0);
                     56:     Cadd(rob.lc.universalNumber,ob1.lc.universalNumber,ob2.lc.universalNumber);
                     57:     return(rob);
                     58:     break;
                     59:   case SuniversalNumberSpoly:
                     60:     rob.tag = Spoly;
                     61:     r = ob2.lc.poly;
                     62:     if (r ISZERO) {
                     63:       /*warningKan("KooAdd(universalNumber,0 polynomial) cannot determine the ring for the result. Assume the current ring.");
                     64:         rob.lc.poly = universalToPoly(ob1.lc.universalNumber,CurrentRingp);*/
                     65:       rob = ob1;
                     66:       return(rob); /* returns universal number. */
                     67:     }
                     68:     rob.lc.poly = ppAdd(universalToPoly(ob1.lc.universalNumber,r->m->ringp),r);
                     69:     return(rob);
                     70:     break;
                     71:   case SpolySuniversalNumber:
                     72:     return(KooAdd(ob2,ob1));
                     73:     break;
                     74:   case SuniversalNumberSinteger:
                     75:     rob.tag = SuniversalNumber;
                     76:     rob.lc.universalNumber = newUniversalNumber(0);
                     77:     nn.tag = SuniversalNumber;
                     78:     nn.lc.universalNumber = newUniversalNumber(KopInteger(ob2));
                     79:     Cadd(rob.lc.universalNumber,ob1.lc.universalNumber,nn.lc.universalNumber);
                     80:     return(rob);
                     81:     break;
                     82:   case SintegerSuniversalNumber:
                     83:     rob.tag = SuniversalNumber;
                     84:     rob.lc.universalNumber = newUniversalNumber(0);
                     85:     nn.tag = SuniversalNumber;
                     86:     nn.lc.universalNumber = newUniversalNumber(KopInteger(ob1));
                     87:     Cadd(rob.lc.universalNumber,nn.lc.universalNumber,ob2.lc.universalNumber);
                     88:     return(rob);
                     89:     break;
                     90:
                     91:   case SrationalFunctionSrationalFunction:
                     92:     f1 = Knumerator(ob1);
                     93:     f2 = Kdenominator(ob1);
                     94:     g1 = Knumerator(ob2);
                     95:     g2 = Kdenominator(ob2);
                     96:     nn = KooAdd(KooMult(*g2,*f1),KooMult(*f2,*g1));
                     97:     dd = KooMult(*f2,*g2);
                     98:     rob = KnewRationalFunction0(copyObjectp(&nn),copyObjectp(&dd));
                     99:     KisInvalidRational(&rob);
                    100:     return(rob);
                    101:     break;
                    102:   case SpolySrationalFunction:  /* f1 + g1/g2 = (g2 f1 + g1)/g2 */
                    103:   case SuniversalNumberSrationalFunction:
                    104:     g1 = Knumerator(ob2);
                    105:     g2 = Kdenominator(ob2);
                    106:     nn = KooAdd(KooMult(*g2,ob1),*g1);
                    107:     rob = KnewRationalFunction0(copyObjectp(&nn),g2);
                    108:     KisInvalidRational(&rob);
                    109:     return(rob);
                    110:     break;
                    111:   case SrationalFunctionSpoly:
                    112:   case SrationalFunctionSuniversalNumber:
                    113:     return(KooAdd(ob2,ob1));
                    114:     break;
                    115:   case SdoubleSdouble:
                    116:     return(KpoDouble( KopDouble(ob1) + KopDouble(ob2) ));
                    117:     break;
                    118:   case SdoubleSinteger:
                    119:   case SdoubleSuniversalNumber:
                    120:   case SdoubleSrationalFunction:
                    121:     return(KpoDouble( KopDouble(ob1) + toDouble0(ob2) ) );
                    122:     break;
                    123:   case SintegerSdouble:
                    124:   case SuniversalNumberSdouble:
                    125:   case SrationalFunctionSdouble:
                    126:     return(KpoDouble( toDouble0(ob1) + KopDouble(ob2) ) );
                    127:     break;
                    128:   case SclassSclass:
                    129:   case SclassSinteger:
                    130:   case SclassSpoly:
                    131:   case SclassSuniversalNumber:
                    132:   case SclassSrationalFunction:
                    133:   case SclassSdouble:
                    134:   case SpolySclass:
                    135:   case SintegerSclass:
                    136:   case SuniversalNumberSclass:
                    137:   case SrationalFunctionSclass:
                    138:   case SdoubleSclass:
                    139:     return(Kclass_ooAdd(ob1,ob2));
                    140:     break;
                    141:
                    142:
                    143:   default:
                    144:     warningKan("KooAdd() has not supported yet these objects.\n");
                    145:     break;
                    146:   }
                    147:   return(rob);
                    148: }
                    149:
                    150: struct object KooSub(ob1,ob2)
                    151: struct object ob1,ob2;
                    152: {
                    153:   struct object rob = NullObject;
                    154:   POLY r;
                    155:   int s,i;
                    156:   objectp f1,f2,g1,g2;
                    157:   extern struct coeff *UniversalZero;
                    158:   struct object nn,dd;
                    159:
                    160:   switch (Lookup[ob1.tag][ob2.tag]) {
                    161:   case SintegerSinteger:
                    162:     return(KpoInteger(ob1.lc.ival - ob2.lc.ival));
                    163:     break;
                    164:   case SpolySpoly:
                    165:     r = ppSub(ob1.lc.poly,ob2.lc.poly);
                    166:     rob.tag = Spoly; rob.lc.poly = r;
                    167:     return(rob);
                    168:     break;
                    169:   case SarraySarray:
                    170:     s = getoaSize(ob1);
                    171:     if (s != getoaSize(ob2)) {
                    172:       errorKan1("%s\n","Two arrays must have a same size.");
                    173:     }
                    174:     rob = newObjectArray(s);
                    175:     for (i=0; i<s; i++) {
                    176:       putoa(rob,i,KooSub(getoa(ob1,i),getoa(ob2,i)));
                    177:     }
                    178:     return(rob);
                    179:     break;
                    180:   case SuniversalNumberSuniversalNumber:
                    181:     rob.tag = SuniversalNumber;
                    182:     rob.lc.universalNumber = newUniversalNumber(0);
                    183:     Csub(rob.lc.universalNumber,ob1.lc.universalNumber,ob2.lc.universalNumber);
                    184:     return(rob);
                    185:     break;
                    186:
                    187:   case SuniversalNumberSpoly:
                    188:     rob.tag = Spoly;
                    189:     r = ob2.lc.poly;
                    190:     if (r ISZERO) {
                    191:       rob = ob1;
                    192:       return(rob); /* returns universal number. */
                    193:     }
                    194:     rob.lc.poly = ppSub(universalToPoly(ob1.lc.universalNumber,r->m->ringp),r);
                    195:     return(rob);
                    196:     break;
                    197:   case SpolySuniversalNumber:
                    198:     rob.tag = Spoly;
                    199:     r = ob1.lc.poly;
                    200:     if (r ISZERO) {
                    201:       rob.tag = SuniversalNumber;
                    202:       rob.lc.universalNumber = newUniversalNumber(0);
                    203:       Csub(rob.lc.universalNumber,UniversalZero,ob2.lc.universalNumber);
                    204:       return(rob); /* returns universal number. */
                    205:     }
                    206:     rob.lc.poly = ppSub(r,universalToPoly(ob2.lc.universalNumber,r->m->ringp));
                    207:     return(rob);
                    208:     break;
                    209:
                    210:   case SuniversalNumberSinteger:
                    211:     rob.tag = SuniversalNumber;
                    212:     rob.lc.universalNumber = newUniversalNumber(0);
                    213:     nn.tag = SuniversalNumber;
                    214:     nn.lc.universalNumber = newUniversalNumber(KopInteger(ob2));
                    215:     Csub(rob.lc.universalNumber,ob1.lc.universalNumber,nn.lc.universalNumber);
                    216:     return(rob);
                    217:     break;
                    218:   case SintegerSuniversalNumber:
                    219:     rob.tag = SuniversalNumber;
                    220:     rob.lc.universalNumber = newUniversalNumber(0);
                    221:     nn.tag = SuniversalNumber;
                    222:     nn.lc.universalNumber = newUniversalNumber(KopInteger(ob1));
                    223:     Csub(rob.lc.universalNumber,nn.lc.universalNumber,ob2.lc.universalNumber);
                    224:     return(rob);
                    225:     break;
                    226:
                    227:   case SrationalFunctionSrationalFunction:
                    228:     f1 = Knumerator(ob1);
                    229:     f2 = Kdenominator(ob1);
                    230:     g1 = Knumerator(ob2);
                    231:     g2 = Kdenominator(ob2);
                    232:     nn = KooSub(KooMult(*g2,*f1),KooMult(*f2,*g1));
                    233:     dd = KooMult(*f2,*g2);
                    234:     rob = KnewRationalFunction0(copyObjectp(&nn),copyObjectp(&dd));
                    235:     KisInvalidRational(&rob);
                    236:     return(rob);
                    237:     break;
                    238:   case SpolySrationalFunction:  /* f1 - g1/g2 = (g2 f1 - g1)/g2 */
                    239:   case SuniversalNumberSrationalFunction:
                    240:     g1 = Knumerator(ob2);
                    241:     g2 = Kdenominator(ob2);
                    242:     nn = KooSub(KooMult(*g2,ob1),*g1);
                    243:     rob = KnewRationalFunction0(copyObjectp(&nn),g2);
                    244:     KisInvalidRational(&rob);
                    245:     return(rob);
                    246:     break;
                    247:   case SrationalFunctionSpoly:
                    248:   case SrationalFunctionSuniversalNumber: /* f1/f2 - ob2= (f1 - f2*ob2)/f2 */
                    249:     f1 = Knumerator(ob1);
                    250:     f2 = Kdenominator(ob1);
                    251:     nn = KooSub(*f1,KooMult(*f2,ob2));
                    252:     rob = KnewRationalFunction0(copyObjectp(&nn),f2);
                    253:     KisInvalidRational(&rob);
                    254:     return(rob);
                    255:     break;
                    256:
                    257:   case SdoubleSdouble:
                    258:     return(KpoDouble( KopDouble(ob1) - KopDouble(ob2) ));
                    259:     break;
                    260:   case SdoubleSinteger:
                    261:   case SdoubleSuniversalNumber:
                    262:   case SdoubleSrationalFunction:
                    263:     return(KpoDouble( KopDouble(ob1) - toDouble0(ob2) ) );
                    264:     break;
                    265:   case SintegerSdouble:
                    266:   case SuniversalNumberSdouble:
                    267:   case SrationalFunctionSdouble:
                    268:     return(KpoDouble( toDouble0(ob1) - KopDouble(ob2) ) );
                    269:     break;
                    270:
                    271:   default:
                    272:     warningKan("KooSub() has not supported yet these objects.\n");
                    273:     break;
                    274:   }
                    275:   return(rob);
                    276: }
                    277:
                    278: struct object KooMult(ob1,ob2)
                    279: struct object ob1,ob2;
                    280: {
                    281:   struct object rob = NullObject;
                    282:   POLY r;
                    283:   int i,s;
                    284:   objectp f1,f2,g1,g2;
                    285:   struct object dd,nn;
                    286:
                    287:
                    288:   switch (Lookup[ob1.tag][ob2.tag]) {
                    289:   case SintegerSinteger:
                    290:     return(KpoInteger(ob1.lc.ival * ob2.lc.ival));
                    291:     break;
                    292:   case SpolySpoly:
                    293:     r = ppMult(ob1.lc.poly,ob2.lc.poly);
                    294:     rob.tag = Spoly; rob.lc.poly = r;
                    295:     return(rob);
                    296:     break;
                    297:   case SarraySarray:
                    298:     return(KaoMult(ob1,ob2));
                    299:     break;
                    300:   case SpolySarray:
                    301:   case SuniversalNumberSarray:
                    302:   case SrationalFunctionSarray:
                    303:   case SintegerSarray:
                    304:     s = getoaSize(ob2);
                    305:     rob = newObjectArray(s);
                    306:     for (i=0; i<s; i++) {
                    307:       putoa(rob,i,KooMult(ob1,getoa(ob2,i)));
                    308:     }
                    309:     return(rob);
                    310:     break;
                    311:
                    312:   case SarraySpoly:
                    313:   case SarraySuniversalNumber:
                    314:   case SarraySrationalFunction:
                    315:   case SarraySinteger:
                    316:     s = getoaSize(ob1);
                    317:     rob = newObjectArray(s);
                    318:     for (i=0; i<s; i++) {
                    319:       putoa(rob,i,KooMult(getoa(ob1,i),ob2));
                    320:     }
                    321:     return(rob);
                    322:     break;
                    323:
                    324:
                    325:   case SuniversalNumberSuniversalNumber:
                    326:     rob.tag = SuniversalNumber;
                    327:     rob.lc.universalNumber = newUniversalNumber(0);
                    328:     Cmult(rob.lc.universalNumber,ob1.lc.universalNumber,ob2.lc.universalNumber);
                    329:     return(rob);
                    330:     break;
                    331:
                    332:   case SuniversalNumberSpoly:
                    333:     r = ob2.lc.poly;
                    334:     if (r ISZERO) {
                    335:       rob.tag = SuniversalNumber;
                    336:       rob.lc.universalNumber = newUniversalNumber(0);
                    337:       return(rob); /* returns universal number. */
                    338:     }
                    339:     if (isZero(ob1.lc.universalNumber)) {
                    340:       rob.tag = Spoly;
                    341:       rob.lc.poly = ZERO;
                    342:       return(rob);
                    343:     }
                    344:     rob.tag = Spoly;
                    345:     rob.lc.poly = ppMult(universalToPoly(ob1.lc.universalNumber,r->m->ringp),r);
                    346:     return(rob);
                    347:     break;
                    348:   case SpolySuniversalNumber:
                    349:     return(KooMult(ob2,ob1));
                    350:     break;
                    351:
                    352:   case SuniversalNumberSinteger:
                    353:     rob.tag = SuniversalNumber;
                    354:     rob.lc.universalNumber = newUniversalNumber(0);
                    355:     nn.tag = SuniversalNumber;
                    356:     nn.lc.universalNumber = newUniversalNumber(KopInteger(ob2));
                    357:     Cmult(rob.lc.universalNumber,ob1.lc.universalNumber,nn.lc.universalNumber);
                    358:     return(rob);
                    359:     break;
                    360:   case SintegerSuniversalNumber:
                    361:     rob.tag = SuniversalNumber;
                    362:     rob.lc.universalNumber = newUniversalNumber(0);
                    363:     nn.tag = SuniversalNumber;
                    364:     nn.lc.universalNumber = newUniversalNumber(KopInteger(ob1));
                    365:     Cmult(rob.lc.universalNumber,nn.lc.universalNumber,ob2.lc.universalNumber);
                    366:     return(rob);
                    367:     break;
                    368:
                    369:   case SrationalFunctionSrationalFunction:
                    370:     f1 = Knumerator(ob1);
                    371:     f2 = Kdenominator(ob1);
                    372:     g1 = Knumerator(ob2);
                    373:     g2 = Kdenominator(ob2);
                    374:     nn = KooMult(*f1,*g1);
                    375:     dd = KooMult(*f2,*g2);
                    376:     rob = KnewRationalFunction0(copyObjectp(&nn),copyObjectp(&dd));
                    377:     KisInvalidRational(&rob);
                    378:     return(rob);
                    379:     break;
                    380:   case SpolySrationalFunction:  /* ob1 g1/g2 */
                    381:   case SuniversalNumberSrationalFunction:
                    382:     g1 = Knumerator(ob2);
                    383:     g2 = Kdenominator(ob2);
                    384:     nn = KooMult(ob1,*g1);
                    385:     rob = KnewRationalFunction0(copyObjectp(&nn),g2);
                    386:     KisInvalidRational(&rob);
                    387:     return(rob);
                    388:     break;
                    389:   case SrationalFunctionSpoly:
                    390:   case SrationalFunctionSuniversalNumber: /* f1*ob2/f2 */
                    391:     f1 = Knumerator(ob1);
                    392:     f2 = Kdenominator(ob1);
                    393:     nn = KooMult(*f1,ob2);
                    394:     rob = KnewRationalFunction0(copyObjectp(&nn),f2);
                    395:     KisInvalidRational(&rob);
                    396:     return(rob);
                    397:     break;
                    398:
                    399:   case SdoubleSdouble:
                    400:     return(KpoDouble( KopDouble(ob1) * KopDouble(ob2) ));
                    401:     break;
                    402:   case SdoubleSinteger:
                    403:   case SdoubleSuniversalNumber:
                    404:   case SdoubleSrationalFunction:
                    405:     return(KpoDouble( KopDouble(ob1) * toDouble0(ob2) ) );
                    406:     break;
                    407:   case SintegerSdouble:
                    408:   case SuniversalNumberSdouble:
                    409:   case SrationalFunctionSdouble:
                    410:     return(KpoDouble( toDouble0(ob1) * KopDouble(ob2) ) );
                    411:     break;
                    412:
                    413:   default:
                    414:     warningKan("KooMult() has not supported yet these objects.\n");
                    415:     break;
                    416:   }
                    417:   return(rob);
                    418: }
                    419:
                    420:
                    421:
                    422: struct object KoNegate(obj)
                    423: struct object obj;
                    424: {
                    425:   struct object rob = NullObject;
                    426:   extern struct ring SmallRing;
                    427:   struct object tob;
                    428:   switch(obj.tag) {
                    429:   case Sinteger:
                    430:     rob = obj;
                    431:     rob.lc.ival = -rob.lc.ival;
                    432:     break;
                    433:   case Spoly:
                    434:     rob.tag = Spoly;
                    435:     rob.lc.poly = ppSub(ZERO,obj.lc.poly);
                    436:     break;
                    437:   case SuniversalNumber:
                    438:     rob.tag = SuniversalNumber;
                    439:     rob.lc.universalNumber = coeffNeg(obj.lc.universalNumber,&SmallRing);
                    440:     break;
                    441:   case SrationalFunction:
                    442:     rob.tag = SrationalFunction;
                    443:     tob = KoNegate(*(Knumerator(obj)));
                    444:     Knumerator(rob) = copyObjectp( &tob);
                    445:     Kdenominator(rob) = Kdenominator(obj);
                    446:     break;
                    447:
                    448:   case Sdouble:
                    449:     rob = KpoDouble( - toDouble0(obj) );
                    450:     break;
                    451:
                    452:   default:
                    453:     warningKan("KoNegate() has not supported yet these objects.\n");
                    454:     break;
                    455:   }
                    456:   return(rob);
                    457: }
                    458:
                    459: struct object KoInverse(obj)
                    460: struct object obj;
                    461: {
                    462:   struct object rob = NullObject;
                    463:   extern struct coeff *UniversalOne;
                    464:   objectp onep;
                    465:   struct object tob;
                    466:   switch(obj.tag) {
                    467:   case Spoly:
                    468:     tob.tag = SuniversalNumber;
                    469:     tob.lc.universalNumber = UniversalOne;
                    470:     onep = copyObjectp(& tob);
                    471:     rob = KnewRationalFunction0(onep,copyObjectp(&obj));
                    472:     KisInvalidRational(&rob);
                    473:     break;
                    474:   case SuniversalNumber:
                    475:     tob.tag = SuniversalNumber;
                    476:     tob.lc.universalNumber = UniversalOne;
                    477:     onep = copyObjectp(& tob);
                    478:     rob = KnewRationalFunction0(onep,copyObjectp(&obj));
                    479:     KisInvalidRational(&rob);
                    480:     break;
                    481:   case SrationalFunction:
                    482:     rob = obj;
                    483:     Knumerator(rob) = Kdenominator(obj);
                    484:     Kdenominator(rob) = Knumerator(obj);
                    485:     KisInvalidRational(&rob);
                    486:     break;
                    487:   default:
                    488:     warningKan("KoInverse() has not supported yet these objects.\n");
                    489:     break;
                    490:   }
                    491:   return(rob);
                    492: }
                    493:
                    494:
                    495: static int isVector(ob)
                    496: struct object ob;
                    497: {
                    498:   int i,n;
                    499:   n = getoaSize(ob);
                    500:   for (i=0; i<n; i++) {
                    501:     if (getoa(ob,i).tag == Sarray) return(0);
                    502:   }
                    503:   return(1);
                    504: }
                    505:
                    506: static int isMatrix(ob,m,n)
                    507: struct object ob;
                    508: int m,n;
                    509: {
                    510:   int i,j;
                    511:   for (i=0; i<m; i++) {
                    512:     if (getoa(ob,i).tag != Sarray) return(0);
                    513:     if (getoaSize(getoa(ob,i)) != n) return(0);
                    514:     for (j=0; j<n; j++) {
                    515:       if (getoa(getoa(ob,i),j).tag != Spoly) return(-1);
                    516:     }
                    517:   }
                    518:   return(1);
                    519: }
                    520:
                    521:
                    522: struct object KaoMult(aa,bb)
                    523: struct object aa,bb;
                    524: /* aa and bb is assumed to be array. */
                    525: {
                    526:   int m,n,m2,n2;
                    527:   int i,j,k;
                    528:   POLY tmp;
                    529:   POLY fik;
                    530:   POLY gkj;
                    531:   struct object rob;
                    532:   int r1,r2;
                    533:   int rsize;
                    534:   struct object tob;
                    535:   struct object ob1;
                    536:   extern struct ring SmallRing;
                    537:
                    538:   m = getoaSize(aa); m2 = getoaSize(bb);
                    539:   if (m == 0 || m2 == 0) errorKan1("%s\n","KaoMult(). Invalid matrix size.");
                    540:
                    541:   /*  new code for vector x vector,... etc */
                    542:   r1 = isVector(aa); r2 = isVector(bb);
                    543:   if (r1 && r2 ) { /* vector X vector ---> scalar.*/
                    544:     rsize = getoaSize(aa);
                    545:     if (rsize != getoaSize(bb)) {
                    546:       errorKan1("%s\n","KaoMult(vector,vector). The size of the vectors must be the same.");
                    547:     }
                    548:     if (r1 != 0) {
                    549:       ob1 = getoa(aa,0);
                    550:       if (ob1.tag == Spoly) {
                    551:        rob.tag = Spoly; rob.lc.poly = ZERO;
                    552:       }else if (ob1.tag == Sinteger) {
                    553:        rob.tag = Sinteger; rob.lc.ival = 0;
                    554:       }else {
                    555:        rob.tag = SuniversalNumber;
                    556:        rob.lc.universalNumber = intToCoeff(0,&SmallRing);
                    557:       }
                    558:     }else{
                    559:       rob.tag = Spoly; rob.lc.poly = ZERO;
                    560:     }
                    561:     for (i=0; i<rsize; i++) {
                    562:       rob = KooAdd(rob,KooMult(getoa(aa,i),getoa(bb,i)));
                    563:     }
                    564:     return(rob);
                    565:   } else if (r1 == 0 && r2 ) { /* matrix X vector ---> vector */
                    566:                                /* (m n) (m2=n) */
                    567:     n = getoaSize(getoa(aa,0));
                    568:     if (isMatrix(aa,m,n) == 0) {
                    569:       errorKan1("%s\n","KaoMult(matrix,vector). The left object is not matrix.");
                    570:     }else if (n != m2) {
                    571:       errorKan1("%s\n","KaoMult(). Invalid matrix and vector sizes for mult.");
                    572:     } else ;
                    573:     rob = newObjectArray(m);
                    574:     for (i=0; i<m; i++) {
                    575:       getoa(rob,i) = KooMult(getoa(aa,i),bb);
                    576:     }
                    577:     return(rob);
                    578:   }else if (r1 && r2 == 0) { /* vector X matrix ---> vector */
                    579:     tob = newObjectArray(1);
                    580:     getoa(tob,0) = aa;  /* [aa] * bb and strip [ ] */
                    581:     tob = KooMult(tob,bb);
                    582:     return(getoa(tob,0));
                    583:   } else ; /* continue: matrix X matrix case. */
                    584:   /* end of new code */
                    585:
                    586:   if (getoa(aa,0).tag != Sarray || getoa(bb,0).tag != Sarray) {
                    587:     errorKan1("%s\n","KaoMult(). Matrix must be given.");
                    588:   }
                    589:   n = getoaSize(getoa(aa,0));
                    590:   n2 = getoaSize(getoa(bb,0));
                    591:   if (n != m2) errorKan1("%s\n","KaoMult(). Invalid matrix size for mult. ((p,q)X(q,r)");
                    592:   r1 = isMatrix(aa,m,n); r2 = isMatrix(bb,m2,n2);
                    593:   if (r1 == -1 || r2 == -1) {
                    594:     /* Object multiplication. Elements are not polynomials. */
                    595:     struct object ofik,ogkj,otmp;
                    596:     rob = newObjectArray(m);
                    597:     for (i=0; i<m; i++) {
                    598:       getoa(rob,i) = newObjectArray(n2);
                    599:     }
                    600:     for (i=0; i<m; i++) {
                    601:       for (j=0; j<n2; j++) {
                    602:        ofik = getoa(getoa(aa,i),0);
                    603:        ogkj = getoa(getoa(bb,0),j);
                    604:        otmp = KooMult( ofik, ogkj);
                    605:        for (k=1; k<n; k++) {
                    606:          ofik = getoa(getoa(aa,i),k);
                    607:          ogkj = getoa(getoa(bb,k),j);
                    608:          otmp = KooAdd(otmp, KooMult( ofik, ogkj));
                    609:        }
                    610:        getoa(getoa(rob,i),j) = otmp;
                    611:       }
                    612:     }
                    613:     return(rob);
                    614:     /*errorKan1("%s\n","KaoMult().Elements of the matrix must be polynomials.");*/
                    615:   }
                    616:   if (r1 == 0 || r2 == 0)
                    617:     errorKan1("%s\n","KaoMult(). Invalid matrix form for mult.");
                    618:
                    619:   rob = newObjectArray(m);
                    620:   for (i=0; i<m; i++) {
                    621:     getoa(rob,i) = newObjectArray(n2);
                    622:   }
                    623:   for (i=0; i<m; i++) {
                    624:     for (j=0; j<n2; j++) {
                    625:       tmp = ZERO;
                    626:       for (k=0; k<n; k++) {
                    627:        fik = KopPOLY(getoa(getoa(aa,i),k));
                    628:        gkj = KopPOLY(getoa(getoa(bb,k),j));
                    629:        tmp = ppAdd(tmp, ppMult( fik, gkj));
                    630:       }
                    631:       getoa(getoa(rob,i),j) = KpoPOLY(tmp);
                    632:     }
                    633:   }
                    634:   return(rob);
                    635: }
                    636:
                    637: struct object KooDiv(ob1,ob2)
                    638: struct object ob1,ob2;
                    639: {
                    640:   struct object rob = NullObject;
                    641:   switch (Lookup[ob1.tag][ob2.tag]) {
                    642:   case SintegerSinteger:
                    643:     return(KpoInteger((ob1.lc.ival) / (ob2.lc.ival)));
                    644:     break;
                    645:   case SuniversalNumberSuniversalNumber:
                    646:     rob.tag = SuniversalNumber;
                    647:     rob.lc.universalNumber = newUniversalNumber(0);
                    648:     universalNumberDiv(rob.lc.universalNumber,ob1.lc.universalNumber,
                    649:                       ob2.lc.universalNumber);
                    650:     return(rob);
                    651:     break;
                    652:
                    653:
                    654:   default:
                    655:     warningKan("KooDiv() has not supported yet these objects.\n");
                    656:     break;
                    657:   }
                    658:   return(rob);
                    659: }
                    660:
                    661: /* :relation */
                    662: KooEqualQ(obj1,obj2)
                    663: struct object obj1;
                    664: struct object obj2;
                    665: {
                    666:   struct object ob;
                    667:   int i;
                    668:   if (obj1.tag != obj2.tag) {
                    669:     warningKan("KooEqualQ(ob1,ob2): the datatypes of ob1 and ob2  are not same. Returns false (0).\n");
                    670:     return(0);
                    671:   }
                    672:   switch(obj1.tag) {
                    673:     case 0:
                    674:       return(1); /* case of NullObject */
                    675:       break;
                    676:     case Sinteger:
                    677:       if (obj1.lc.ival == obj2.lc.ival) return(1);
                    678:       else return(0);
                    679:       break;
                    680:     case Sstring:
                    681:     case Sdollar:
                    682:       if (strcmp(obj1.lc.str, obj2.lc.str)==0) return(1);
                    683:       else return(0);
                    684:       break;
                    685:     case Spoly:
                    686:       ob = KooSub(obj1,obj2);
                    687:       if (KopPOLY(ob) == ZERO) return(1);
                    688:       else return(0);
                    689:     case Sarray:
                    690:       if (getoaSize(obj1) != getoaSize(obj2)) return(0);
                    691:       for (i=0; i< getoaSize(obj1); i++) {
                    692:        if (KooEqualQ(getoa(obj1,i),getoa(obj2,i))) { ; }
                    693:        else { return(0); }
                    694:       }
                    695:       return(1);
                    696:     case Slist:
                    697:       if (KooEqualQ(*(obj1.lc.op),*(obj2.lc.op))) {
                    698:        if (isNullList(obj1.rc.op)) {
                    699:          if (isNullList(obj2.rc.op)) return(1);
                    700:          else return(0);
                    701:        }else{
                    702:          if (isNullList(obj2.rc.op)) return(0);
                    703:          return(KooEqualQ(*(obj1.rc.op),*(obj2.rc.op)));
                    704:        }
                    705:       }else{
                    706:        return(0);
                    707:       }
                    708:       break;
                    709:     case SuniversalNumber:
                    710:       return(coeffEqual(obj1.lc.universalNumber,obj2.lc.universalNumber));
                    711:       break;
                    712:     case Sring:
                    713:       return(KopRingp(obj1) == KopRingp(obj2));
                    714:       break;
                    715:     case Sclass:
                    716:       return(KclassEqualQ(obj1,obj2));
                    717:       break;
                    718:     case Sdouble:
                    719:       return(KopDouble(obj1) == KopDouble(obj2));
                    720:       break;
                    721:     default:
                    722:       errorKan1("%s\n","KooEqualQ() has not supported these objects yet.");
                    723:       break;
                    724:     }
                    725: }
                    726:
                    727:
                    728: struct object KoIsPositive(ob1)
                    729: struct object ob1;
                    730: {
                    731:   struct object rob = NullObject;
                    732:   switch (ob1.tag) {
                    733:   case Sinteger:
                    734:     return(KpoInteger(ob1.lc.ival > 0));
                    735:     break;
                    736:   default:
                    737:     warningKan("KoIsPositive() has not supported yet these objects.\n");
                    738:     break;
                    739:   }
                    740:   return(rob);
                    741: }
                    742:
                    743: struct object KooGreater(obj1,obj2)
                    744: struct object obj1;
                    745: struct object obj2;
                    746: {
                    747:   struct object ob;
                    748:   int tt;
                    749:   if (obj1.tag != obj2.tag) {
                    750:     errorKan1("%s\n","You cannot compare different kinds of objects.");
                    751:   }
                    752:   switch(obj1.tag) {
                    753:     case 0:
                    754:       return(KpoInteger(1)); /* case of NullObject */
                    755:       break;
                    756:     case Sinteger:
                    757:       if (obj1.lc.ival > obj2.lc.ival) return(KpoInteger(1));
                    758:       else return(KpoInteger(0));
                    759:       break;
                    760:     case Sstring:
                    761:     case Sdollar:
                    762:       if (strcmp(obj1.lc.str, obj2.lc.str)>0) return(KpoInteger(1));
                    763:       else return(KpoInteger(0));
                    764:       break;
                    765:     case Spoly:
                    766:       if ((*mmLarger)(obj1.lc.poly,obj2.lc.poly) == 1) return(KpoInteger(1));
                    767:       else return(KpoInteger(0));
                    768:       break;
                    769:     case SuniversalNumber:
                    770:       tt = coeffGreater(obj1.lc.universalNumber,obj2.lc.universalNumber);
                    771:       if (tt > 0) return(KpoInteger(1));
                    772:       else return(KpoInteger(0));
                    773:       break;
                    774:     case Sdouble:
                    775:       if ( KopDouble(obj1) > KopDouble(obj2) ) return(KpoInteger(1));
                    776:       else return(KpoInteger(0));
                    777:       break;
                    778:     default:
                    779:       errorKan1("%s\n","KooGreater() has not supported these objects yet.");
                    780:       break;
                    781:     }
                    782: }
                    783:
                    784: struct object KooLess(obj1,obj2)
                    785: struct object obj1;
                    786: struct object obj2;
                    787: {
                    788:   struct object ob;
                    789:   int tt;
                    790:   if (obj1.tag != obj2.tag) {
                    791:     errorKan1("%s\n","You cannot compare different kinds of objects.");
                    792:   }
                    793:   switch(obj1.tag) {
                    794:     case 0:
                    795:       return(KpoInteger(1)); /* case of NullObject */
                    796:       break;
                    797:     case Sinteger:
                    798:       if (obj1.lc.ival < obj2.lc.ival) return(KpoInteger(1));
                    799:       else return(KpoInteger(0));
                    800:       break;
                    801:     case Sstring:
                    802:     case Sdollar:
                    803:       if (strcmp(obj1.lc.str, obj2.lc.str)<0) return(KpoInteger(1));
                    804:       else return(KpoInteger(0));
                    805:       break;
                    806:     case Spoly:
                    807:       if ((*mmLarger)(obj2.lc.poly,obj1.lc.poly) == 1) return(KpoInteger(1));
                    808:       else return(KpoInteger(0));
                    809:       break;
                    810:     case SuniversalNumber:
                    811:       tt = coeffGreater(obj1.lc.universalNumber,obj2.lc.universalNumber);
                    812:       if (tt < 0) return(KpoInteger(1));
                    813:       else return(KpoInteger(0));
                    814:       break;
                    815:     case Sdouble:
                    816:       if ( KopDouble(obj1) < KopDouble(obj2) ) return(KpoInteger(1));
                    817:       else return(KpoInteger(0));
                    818:       break;
                    819:     default:
                    820:       errorKan1("%s\n","KooLess() has not supported these objects yet.");
                    821:       break;
                    822:     }
                    823: }
                    824:
                    825: /* :conversion */
                    826:
                    827: struct object KdataConversion(obj,key)
                    828: struct object obj;
                    829: char *key;
                    830: {
                    831:   char tmps[128]; /* Assume that double is not more than 128 digits */
                    832:   char intstr[100]; /* Assume that int is not more than 100 digits */
                    833:   struct object rob;
                    834:   extern struct ring *CurrentRingp;
                    835:   extern struct ring SmallRing;
                    836:   int flag;
                    837:   struct object rob1,rob2;
                    838:   char *s;
                    839:   int i;
                    840:   /* reports the data type */
                    841:   if (key[0] == 't' || key[0] =='e') {
                    842:     if (strcmp(key,"type?")==0) {
                    843:       rob = KpoInteger(obj.tag);
                    844:       return(rob);
                    845:     }else if (strcmp(key,"type??")==0) {
                    846:       if (obj.tag != Sclass) {
                    847:        rob = KpoInteger(obj.tag);
                    848:       }else {
                    849:        rob = KpoInteger(ectag(obj));
                    850:       }
                    851:       return(rob);
                    852:     }else if (strcmp(key,"error")==0) {
                    853:       rob = KnewErrorPacketObj(obj);
                    854:       return(rob);
                    855:     }
                    856:   }
                    857:   switch(obj.tag) {
                    858:   case Snull:
                    859:     if (strcmp(key,"integer") == 0) {
                    860:       rob = KpoInteger(0);
                    861:       return(rob);
                    862:     }else if (strcmp(key,"universalNumber") == 0) {
                    863:       rob.tag = SuniversalNumber;
                    864:       rob.lc.universalNumber = intToCoeff(obj.lc.ival,&SmallRing);
                    865:       return(rob);
                    866:     }else if (strcmp(key,"poly") == 0) {
                    867:       rob = KpoPOLY(ZERO);
                    868:     }else{
                    869:       warningKan("Sorry. The data conversion from null to this data type has not supported yet.\n");
                    870:     }
                    871:     break;
                    872:   case Sinteger:
                    873:     if (strcmp(key,"string") == 0) { /* ascii code */
                    874:       rob.tag = Sdollar;
                    875:       rob.lc.str = (char *)sGC_malloc(2);
                    876:       if (rob.lc.str == (char *)NULL) errorKan1("%s","No more memory.\n");
                    877:       (rob.lc.str)[0] = obj.lc.ival; (rob.lc.str)[1] = '\0';
                    878:       return(rob);
                    879:     }else if (strcmp(key,"integer")==0) {
                    880:       return(obj);
                    881:     }else if (strcmp(key,"poly") == 0) {
                    882:       rob.tag = Spoly;
                    883:       rob.lc.poly = cxx(obj.lc.ival,0,0,CurrentRingp);
                    884:       return(rob);
                    885:     }else if (strcmp(key,"dollar") == 0) {
                    886:       rob.tag = Sdollar;
                    887:       sprintf(intstr,"%d",obj.lc.ival);
                    888:       rob.lc.str = (char *)sGC_malloc(strlen(intstr)+2);
                    889:       if (rob.lc.str == (char *)NULL) errorKan1("%s","No more memory.\n");
                    890:       strcpy(rob.lc.str,intstr);
                    891:       return(rob);
                    892:     }else if (strcmp(key,"universalNumber")==0) {
                    893:       rob.tag = SuniversalNumber;
                    894:       rob.lc.universalNumber = intToCoeff(obj.lc.ival,&SmallRing);
                    895:       return(rob);
                    896:     }else if (strcmp(key,"double") == 0) {
                    897:       rob = KpoDouble((double) (obj.lc.ival));
                    898:       return(rob);
                    899:     }else if (strcmp(key,"null") == 0) {
                    900:       rob = NullObject;
                    901:       return(rob);
                    902:     }else{
                    903:       warningKan("Sorry. This type of data conversion has not supported yet.\n");
                    904:     }
                    905:     break;
                    906:   case Sdollar:
                    907:     if (strcmp(key,"dollar") == 0 || strcmp(key,"string")==0) {
                    908:       rob = obj;
                    909:       return(rob);
                    910:     }else if (strcmp(key,"literal") == 0) {
                    911:       rob.tag = Sstring;
                    912:       s = (char *) sGC_malloc(sizeof(char)*(strlen(obj.lc.str)+3));
                    913:       if (s == (char *) NULL)   {
                    914:        errorKan1("%s\n","No memory.");
                    915:       }
                    916:       s[0] = '/';
                    917:       strcpy(&(s[1]),obj.lc.str);
                    918:       rob.lc.str = &(s[1]);
                    919:       /* set the hashing value. */
                    920:       rob2 = lookupLiteralString(s);
                    921:       rob.rc.op = rob2.lc.op;
                    922:       return(rob);
                    923:     }else if (strcmp(key,"poly")==0) {
                    924:       rob.tag = Spoly;
                    925:       rob.lc.poly = stringToPOLY(obj.lc.str,CurrentRingp);
                    926:       return(rob);
                    927:     }else if (strcmp(key,"array")==0) {
                    928:       rob = newObjectArray(strlen(obj.lc.str));
                    929:       for (i=0; i<strlen(obj.lc.str); i++) {
                    930:        putoa(rob,i,KpoInteger((obj.lc.str)[i]));
                    931:       }
                    932:       return(rob);
                    933:     }else if (strcmp(key,"universalNumber") == 0) {
                    934:       rob.tag = SuniversalNumber;
                    935:       rob.lc.universalNumber = stringToUniversalNumber(obj.lc.str,&flag);
                    936:       if (flag == -1) errorKan1("KdataConversion(): %s",
                    937:                                  "It's not number.\n");
                    938:       return(rob);
                    939:     }else if (strcmp(key,"null") == 0) {
                    940:       rob = NullObject;
                    941:       return(rob);
                    942:     }else{
                    943:       warningKan("Sorry. This type of data conversion has not supported yet.\n");
                    944:     }
                    945:     break;
                    946:   case Sarray:
                    947:     if (strcmp(key,"array") == 0) {
                    948:       return(rob);
                    949:     }else if (strcmp(key,"list") == 0) {
                    950:       rob = *( arrayToList(obj) );
                    951:       return(rob);
                    952:     }else if (strcmp(key,"arrayOfPOLY")==0) {
                    953:       rob = KpoArrayOfPOLY(arrayToArrayOfPOLY(obj));
                    954:       return(rob);
                    955:     }else if (strcmp(key,"matrixOfPOLY")==0) {
                    956:       rob = KpoMatrixOfPOLY(arrayToMatrixOfPOLY(obj));
                    957:       return(rob);
                    958:     }else if (strcmp(key,"gradedPolySet")==0) {
                    959:       rob = KpoGradedPolySet(arrayToGradedPolySet(obj));
                    960:       return(rob);
                    961:     }else if (strcmp(key,"null") == 0) {
                    962:       rob = NullObject;
                    963:       return(rob);
                    964:     }else {
                    965:       warningKan("Sorry. This type of data conversion has not supported yet.\n");
                    966:     }
                    967:     break;
                    968:   case Spoly:
                    969:     if (strcmp(key,"poly")==0) {
                    970:       return(rob);
                    971:     }else if (strcmp(key,"integer")==0) {
                    972:       if (obj.lc.poly == ZERO) return(KpoInteger(0));
                    973:       else {
                    974:        return(KpoInteger(coeffToInt(obj.lc.poly->coeffp)));
                    975:       }
                    976:     }else if (strcmp(key,"string")==0 || strcmp(key,"dollar")==0) {
                    977:       rob.tag = Sdollar;
                    978:       rob.lc.str = KPOLYToString(KopPOLY(obj));
                    979:       return(rob);
                    980:     }else if (strcmp(key,"array") == 0) {
                    981:       return( POLYToArray(KopPOLY(obj)));
                    982:     }else if (strcmp(key,"map")==0) {
                    983:       return(KringMap(obj));
                    984:     }else if (strcmp(key,"universalNumber")==0) {
                    985:       if (obj.lc.poly == ZERO) {
                    986:        rob.tag = SuniversalNumber;
                    987:        rob.lc.universalNumber = newUniversalNumber(0);
                    988:       } else {
                    989:        if (obj.lc.poly->coeffp->tag == MP_INTEGER) {
                    990:          rob.tag = SuniversalNumber;
                    991:          rob.lc.universalNumber = newUniversalNumber2(obj.lc.poly->coeffp->val.bigp);
                    992:        }else {
                    993:          rob = NullObject;
                    994:          warningKan("Coefficient is not MP_INT.");
                    995:        }
                    996:       }
                    997:       return(rob);
                    998:     }else if (strcmp(key,"ring")==0) {
                    999:       if (obj.lc.poly ISZERO) {
                   1000:        warningKan("Zero polynomial does not have the ring structure field.\n");
                   1001:       }else{
                   1002:        rob.tag = Sring;
                   1003:        rob.lc.ringp = (obj.lc.poly)->m->ringp;
                   1004:        return(rob);
                   1005:       }
                   1006:     }else if (strcmp(key,"null") == 0) {
                   1007:       rob = NullObject;
                   1008:       return(rob);
                   1009:     }else{
                   1010:       warningKan("Sorry. This type of data conversion has not supported yet.\n");
                   1011:     }
                   1012:     break;
                   1013:   case SarrayOfPOLY:
                   1014:     if (strcmp(key,"array")==0) {
                   1015:       rob = arrayOfPOLYToArray(KopArrayOfPOLYp(obj));
                   1016:       return(rob);
                   1017:     }else{
                   1018:       warningKan("Sorry. This type of data conversion has not supported yet.\n");
                   1019:     }
                   1020:     break;
                   1021:   case SmatrixOfPOLY:
                   1022:     if (strcmp(key,"array")==0) {
                   1023:       rob = matrixOfPOLYToArray(KopMatrixOfPOLYp(obj));
                   1024:       return(rob);
                   1025:     }else if (strcmp(key,"null") == 0) {
                   1026:       rob = NullObject;
                   1027:       return(rob);
                   1028:     }else{
                   1029:       warningKan("Sorry. This type of data conversion has not supported yet.\n");
                   1030:     }
                   1031:     break;
                   1032:   case Slist:
                   1033:     if (strcmp(key,"array") == 0) {
                   1034:       rob = listToArray(&obj);
                   1035:       return(rob);
                   1036:     }
                   1037:     break;
                   1038:   case SuniversalNumber:
                   1039:     if (strcmp(key,"universalNumber")==0) {
                   1040:       return(rob);
                   1041:     }else if (strcmp(key,"integer")==0) {
                   1042:       rob = KpoInteger(coeffToInt(obj.lc.universalNumber));
                   1043:       return(rob);
                   1044:     }else if (strcmp(key,"poly")==0) {
                   1045:       rob = KpoPOLY(universalToPoly(obj.lc.universalNumber,CurrentRingp));
                   1046:       return(rob);
                   1047:     }else if (strcmp(key,"string")==0 || strcmp(key,"dollar")==0) {
                   1048:       rob.tag = Sdollar;
                   1049:       rob.lc.str = coeffToString(obj.lc.universalNumber);
                   1050:       return(rob);
                   1051:     }else if (strcmp(key,"null") == 0) {
                   1052:       rob = NullObject;
                   1053:       return(rob);
                   1054:     }else if (strcmp(key,"double") == 0) {
                   1055:       rob = KpoDouble( toDouble0(obj) );
                   1056:       return(rob);
                   1057:     }else{
                   1058:       warningKan("Sorry. This type of data conversion of universalNumber has not supported yet.\n");
                   1059:     }
                   1060:     break;
                   1061:   case SrationalFunction:
                   1062:     if (strcmp(key,"rationalFunction")==0) {
                   1063:       return(rob);
                   1064:     } if (strcmp(key,"numerator")==0) {
                   1065:       rob = *(Knumerator(obj));
                   1066:       return(rob);
                   1067:     }else if  (strcmp(key,"denominator")==0) {
                   1068:       rob = *(Kdenominator(obj));
                   1069:       return(rob);
                   1070:     }else if  (strcmp(key,"string")==0 || strcmp(key,"dollar")==0) {
                   1071:       rob1 = KdataConversion(*(Knumerator(obj)),"string");
                   1072:       rob2 = KdataConversion(*(Kdenominator(obj)),"string");
                   1073:       s = sGC_malloc(sizeof(char)*( strlen(rob1.lc.str) + strlen(rob2.lc.str) + 10));
                   1074:       if (s == (char *)NULL) errorKan1("%s\n","KdataConversion(): No memory");
                   1075:       sprintf(s,"(%s)/(%s)",rob1.lc.str,rob2.lc.str);
                   1076:       rob.tag = Sdollar;
                   1077:       rob.lc.str = s;
                   1078:       return(rob);
                   1079:     }else if  (strcmp(key,"cancel")==0) {
                   1080:       warningKan("Sorry. Data conversion <<cancel>> of rationalFunction has not supported yet.\n");
                   1081:       return(obj);
                   1082:     }else if (strcmp(key,"null") == 0) {
                   1083:       rob = NullObject;
                   1084:       return(rob);
                   1085:     }else if (strcmp(key,"double") == 0) {
                   1086:       rob = KpoDouble( toDouble0(obj) );
                   1087:       return(rob);
                   1088:     }else{
                   1089:       warningKan("Sorry. This type of data conversion of rationalFunction has not supported yet.\n");
                   1090:     }
                   1091:     break;
                   1092:   case Sdouble:
                   1093:     if (strcmp(key,"integer") == 0) {
                   1094:       rob = KpoInteger( (int) KopDouble(obj));
                   1095:       return(rob);
                   1096:     } else if (strcmp(key,"universalNumber") == 0) {
                   1097:       rob.tag = SuniversalNumber;
                   1098:       rob.lc.universalNumber = intToCoeff((int) KopDouble(obj),&SmallRing);
                   1099:       return(rob);
                   1100:     }else if ((strcmp(key,"string") == 0) || (strcmp(key,"dollar") == 0)) {
                   1101:       sprintf(tmps,"%f",KopDouble(obj));
                   1102:       s = sGC_malloc(strlen(tmps)+2);
                   1103:       if (s == (char *)NULL) errorKan1("%s\n","KdataConversion(): No memory");
                   1104:       strcpy(s,tmps);
                   1105:       rob.tag = Sdollar;
                   1106:       rob.lc.str = s;
                   1107:       return(rob);
                   1108:     }else if (strcmp(key,"double")==0) {
                   1109:       return(obj);
                   1110:     }else if (strcmp(key,"null") == 0) {
                   1111:       rob = NullObject;
                   1112:       return(rob);
                   1113:     }else {
                   1114:       warningKan("Sorry. This type of data conversion of rationalFunction has not supported yet.\n");
                   1115:     }
                   1116:     break;
                   1117:   case Sring:
                   1118:     if (strcmp(key,"orderMatrix")==0) {
                   1119:       rob = oGetOrderMatrix(KopRingp(obj));
                   1120:       return(rob);
                   1121:     }else{
                   1122:       warningKan("Sorryl This type of data conversion of ringp has not supported yet.\n");
                   1123:     }
                   1124:     break;
                   1125:   default:
                   1126:     warningKan("Sorry. This type of data conversion has not supported yet.\n");
                   1127:   }
                   1128:   return(NullObject);
                   1129: }
                   1130:
                   1131: /* conversion functions between primitive data and objects.
                   1132:    If it's not time critical, it is recommended to use these functions */
                   1133: struct object KpoInteger(k)
                   1134: int k;
                   1135: {
                   1136:   struct object obj;
                   1137:   obj.tag = Sinteger;
                   1138:   obj.lc.ival = k; obj.rc.ival = 0;
                   1139:   return(obj);
                   1140: }
                   1141: struct object KpoString(s)
                   1142: char *s;
                   1143: {
                   1144:   struct object obj;
                   1145:   obj.tag = Sdollar;
                   1146:   obj.lc.str = s; obj.rc.ival = 0;
                   1147:   return(obj);
                   1148: }
                   1149: struct object KpoPOLY(f)
                   1150: POLY f;
                   1151: {
                   1152:   struct object obj;
                   1153:   obj.tag = Spoly;
                   1154:   obj.lc.poly = f; obj.rc.ival = 0;
                   1155:   return(obj);
                   1156: }
                   1157: struct object KpoArrayOfPOLY(ap)
                   1158: struct arrayOfPOLY *ap ;
                   1159: {
                   1160:   struct object obj;
                   1161:   obj.tag = SarrayOfPOLY;
                   1162:   obj.lc.arrayp = ap; obj.rc.ival = 0;
                   1163:   return(obj);
                   1164: }
                   1165:
                   1166: struct object KpoMatrixOfPOLY(mp)
                   1167: struct matrixOfPOLY *mp ;
                   1168: {
                   1169:   struct object obj;
                   1170:   obj.tag = SmatrixOfPOLY;
                   1171:   obj.lc.matrixp = mp; obj.rc.ival = 0;
                   1172:   return(obj);
                   1173: }
                   1174:
                   1175: struct object KpoRingp(ringp)
                   1176: struct ring *ringp;
                   1177: {
                   1178:   struct object obj;
                   1179:   obj.tag = Sring;
                   1180:   obj.lc.ringp = ringp;
                   1181:   return(obj);
                   1182: }
                   1183:
                   1184: /*** conversion 2. Data conversions on arrays and matrices. ****/
                   1185: struct object arrayOfPOLYToArray(aa)
                   1186: struct arrayOfPOLY *aa;
                   1187: {
                   1188:   POLY *a;
                   1189:   int size;
                   1190:   struct object r;
                   1191:   int j;
                   1192:   struct object tmp;
                   1193:
                   1194:   size = aa->n; a = aa->array;
                   1195:   r = newObjectArray(size);
                   1196:   for (j=0; j<size; j++) {
                   1197:     tmp.tag = Spoly;
                   1198:     tmp.lc.poly= a[j];
                   1199:     putoa(r,j,tmp);
                   1200:   }
                   1201:   return( r );
                   1202: }
                   1203:
                   1204: struct object matrixOfPOLYToArray(pmat)
                   1205: struct matrixOfPOLY *pmat;
                   1206: {
                   1207:   struct object r;
                   1208:   struct object tmp;
                   1209:   int i,j;
                   1210:   int m,n;
                   1211:   POLY *mat;
                   1212:   struct arrayOfPOLY ap;
                   1213:
                   1214:   m = pmat->m; n = pmat->n; mat = pmat->mat;
                   1215:   r = newObjectArray(m);
                   1216:   for (i=0; i<m; i++) {
                   1217:     ap.n = n; ap.array = &(mat[ind(i,0)]);
                   1218:     tmp = arrayOfPOLYToArray(&ap);
                   1219:     /* ind() is the macro defined in matrix.h. */
                   1220:     putoa(r,i,tmp);
                   1221:   }
                   1222:   return(r);
                   1223: }
                   1224:
                   1225: struct arrayOfPOLY *arrayToArrayOfPOLY(oa)
                   1226: struct object oa;
                   1227: {
                   1228:   POLY *a;
                   1229:   int size;
                   1230:   int i;
                   1231:   struct object tmp;
                   1232:   struct arrayOfPOLY *ap;
                   1233:
                   1234:   if (oa.tag != Sarray) errorKan1("KarrayToArrayOfPOLY(): %s",
                   1235:                                  "Argument is not array\n");
                   1236:   size = getoaSize(oa);
                   1237:   a = (POLY *)sGC_malloc(sizeof(POLY)*size);
                   1238:   for (i=0; i<size; i++) {
                   1239:     tmp = getoa(oa,i);
                   1240:     if (tmp.tag != Spoly) errorKan1("KarrayToArrayOfPOLY():%s ",
                   1241:                                    "element must be polynomial.\n");
                   1242:     a[i] = tmp.lc.poly;
                   1243:   }
                   1244:   ap = (struct arrayOfPOLY *)sGC_malloc(sizeof(struct arrayOfPOLY));
                   1245:   ap->n = size;
                   1246:   ap->array = a;
                   1247:   return(ap);
                   1248: }
                   1249:
                   1250: struct matrixOfPOLY *arrayToMatrixOfPOLY(oa)
                   1251: struct object oa;
                   1252: {
                   1253:   POLY *a;
                   1254:   int m;
                   1255:   int n;
                   1256:   int i,j;
                   1257:   struct matrixOfPOLY *ma;
                   1258:
                   1259:   struct object tmp,tmp2;
                   1260:   if (oa.tag != Sarray) errorKan1("KarrayToMatrixOfPOLY(): %s",
                   1261:                                  "Argument is not array\n");
                   1262:   m = getoaSize(oa);
                   1263:   tmp = getoa(oa,0);
                   1264:   if (tmp.tag != Sarray) errorKan1("arrayToMatrixOfPOLY():%s ",
                   1265:                                  "Argument is not array\n");
                   1266:   n = getoaSize(tmp);
                   1267:   a = (POLY *)sGC_malloc(sizeof(POLY)*(m*n));
                   1268:   for (i=0; i<m; i++) {
                   1269:     tmp = getoa(oa,i);
                   1270:     if (tmp.tag != Sarray) errorKan1("arrayToMatrixOfPOLY(): %s",
                   1271:                                     "element must be array.\n");
                   1272:     for (j=0; j<n; j++) {
                   1273:       tmp2 = getoa(tmp,j);
                   1274:       if (tmp2.tag != Spoly) errorKan1("arrayToMatrixOfPOLY(): %s",
                   1275:                                       "element must be a polynomial.\n");
                   1276:       a[ind(i,j)] = tmp2.lc.poly;
                   1277:       /* we use the macro ind here.  Be careful of using m and n. */
                   1278:     }
                   1279:   }
                   1280:   ma = (struct matrixOfPOLY *)sGC_malloc(sizeof(struct matrixOfPOLY));
                   1281:   ma->m = m; ma->n = n;
                   1282:   ma->mat = a;
                   1283:   return(ma);
                   1284: }
                   1285:
                   1286: /* :misc */
                   1287:
                   1288: /* :ring    :kan */
                   1289: int objArrayToOrderMatrix(oA,order,n,oasize)
                   1290: struct object oA;
                   1291: int order[];
                   1292: int n;
                   1293: int oasize;
                   1294: {
                   1295:   int size;
                   1296:   int k,j;
                   1297:   struct object tmpOa;
                   1298:   struct object obj;
                   1299:   if (oA.tag != Sarray) {
                   1300:     warningKan("The argument should be of the form [ [...] [...] ... [...]].");
                   1301:     return(-1);
                   1302:   }
                   1303:   size = getoaSize(oA);
                   1304:   if (size != oasize) {
                   1305:     warningKan("The row size of the array is wrong.");
                   1306:     return(-1);
                   1307:   }
                   1308:   for (k=0; k<size; k++) {
                   1309:     tmpOa = getoa(oA,k);
                   1310:     if (tmpOa.tag != Sarray) {
                   1311:       warningKan("The argument should be of the form [ [...] [...] ... [...]].");
                   1312:       return(-1);
                   1313:     }
                   1314:     if (getoaSize(tmpOa) != 2*n) {
                   1315:       warningKan("The column size of the array is wrong.");
                   1316:       return(-1);
                   1317:     }
                   1318:     for (j=0; j<2*n; j++) {
                   1319:       obj = getoa(tmpOa,j);
                   1320:       order[k*2*n+j] = obj.lc.ival;
                   1321:     }
                   1322:   }
                   1323:   return(0);
                   1324: }
                   1325:
                   1326: int KsetOrderByObjArray(oA)
                   1327: struct object oA;
                   1328: {
                   1329:   int *order;
                   1330:   int n,c,l, oasize;
                   1331:   extern struct ring *CurrentRingp;
                   1332:   extern int AvoidTheSameRing;
                   1333:   /* n,c,l must be set in the CurrentRing */
                   1334:   if (AvoidTheSameRing) {
                   1335:     errorKan1("%s\n","KsetOrderByObjArray(): You cannot change the order matrix when AvoidTheSameRing == 1.");
                   1336:   }
                   1337:   n = CurrentRingp->n;
                   1338:   c = CurrentRingp->c;
                   1339:   l = CurrentRingp->l;
                   1340:   if (oA.tag != Sarray) {
                   1341:     warningKan("The argument should be of the form [ [...] [...] ... [...]].");
                   1342:     return(-1);
                   1343:   }
                   1344:   oasize = getoaSize(oA);
                   1345:   order = (int *)sGC_malloc(sizeof(int)*((2*n)*oasize+1));
                   1346:   if (order == (int *)NULL) errorKan1("%s\n","KsetOrderByObjArray(): No memory.");
                   1347:   if (objArrayToOrderMatrix(oA,order,n,oasize) == -1) {
                   1348:     return(-1);
                   1349:   }
                   1350:   setOrderByMatrix(order,n,c,l,oasize); /* Set order to the current ring. */
                   1351:   return(0);
                   1352: }
                   1353:
                   1354: static int checkRelations(c,l,m,n,cc,ll,mm,nn)
                   1355: int c,l,m,n,cc,ll,mm,nn;
                   1356: {
                   1357:   if (!(1<=c && c<=l && l<=m && m<=n)) return(1);
                   1358:   if (!(cc<=ll && ll<=mm && mm<=nn && nn <= n)) return(1);
                   1359:   if (!(cc<c || ll < l || mm < m || nn < n)) {
                   1360:     if (WarningNoVectorVariable) {
                   1361:       warningKan("Ring definition: there is no variable to represent vectors.\n");
                   1362:     }
                   1363:   }
                   1364:   if (!(cc<=c && ll <= l && mm <= m && nn <= n)) return(1);
                   1365:   return(0);
                   1366: }
                   1367:
                   1368: struct object KgetOrderMatrixOfCurrentRing()
                   1369: {
                   1370:   extern struct ring *CurrentRingp;
                   1371:   return(oGetOrderMatrix(CurrentRingp));
                   1372: }
                   1373:
                   1374:
                   1375: int KsetUpRing(ob1,ob2,ob3,ob4,ob5)
                   1376: struct object ob1,ob2,ob3,ob4,ob5;
                   1377: /* ob1 = [x(0), ..., x(n-1)];
                   1378:    ob2 = [D(0), ..., D(n-1)];
                   1379:    ob3 = [p,c,l,m,n,cc,ll,mm,nn,next];
                   1380:    ob4 = Order matrix
                   1381:    ob5 = [(keyword) value (keyword) value ....]
                   1382: */
                   1383: #define RP_LIMIT 500
                   1384: {
                   1385:   int i;
                   1386:   struct object ob;
                   1387:   int c,l,m,n;
                   1388:   int cc,ll,mm,nn;
                   1389:   int p;
                   1390:   char **xvars;
                   1391:   char **dvars;
                   1392:   int *outputVars;
                   1393:   int *order;
                   1394:   static int rp = 0;
                   1395:   static struct ring *rstack[RP_LIMIT];
                   1396:
                   1397:   extern struct ring *CurrentRingp;
                   1398:   struct ring *newRingp;
                   1399:   int ob3Size;
                   1400:   struct ring *nextRing;
                   1401:   int oasize;
                   1402:   static int ringSerial = 0;
                   1403:   char *ringName = NULL;
                   1404:   int aa;
                   1405:   extern int AvoidTheSameRing;
                   1406:   extern char *F_mpMult;
                   1407:   char *fmp_mult_saved;
                   1408:   char *mpMultName = NULL;
                   1409:   struct object rob;
                   1410:   struct ring *savedCurrentRingp;
                   1411:
                   1412:   /* To get the ring structure. */
                   1413:   if (ob1.tag == Snull) {
                   1414:     rob = newObjectArray(rp);
                   1415:     for (i=0; i<rp; i++) {
                   1416:       putoa(rob,i,KpoRingp(rstack[i]));
                   1417:     }
                   1418:     KSpush(rob);
                   1419:     return(0);
                   1420:   }
                   1421:
                   1422:   if (ob3.tag != Sarray) errorKan1("%s\n","Error in the 3rd argument. You need to give 4 arguments.");
                   1423:   ob3Size = getoaSize(ob3);
                   1424:   if (ob3Size != 9 && ob3Size != 10)
                   1425:     errorKan1("%s\n","Error in the 3rd argument.");
                   1426:   for (i=0; i<9; i++) {
                   1427:     ob = getoa(ob3,i);
                   1428:     if (ob.tag != Sinteger) errorKan1("%s\n","The 3rd argument should be a list of integers.");
                   1429:   }
                   1430:   if (ob3Size == 10) {
                   1431:     ob = getoa(ob3,9);
                   1432:     if (ob.tag != Sring)
                   1433:       errorKan1("%s\n","The last arguments of the 3rd argument must be a pointer to a ring.");
                   1434:     nextRing = KopRingp(ob);
                   1435:   } else {
                   1436:     nextRing = (struct ring *)NULL;
                   1437:   }
                   1438:
                   1439:   p = getoa(ob3,0).lc.ival;
                   1440:   c = getoa(ob3,1).lc.ival;  l = getoa(ob3,2).lc.ival;
                   1441:   m = getoa(ob3,3).lc.ival;  n = getoa(ob3,4).lc.ival;
                   1442:   cc = getoa(ob3,5).lc.ival;  ll = getoa(ob3,6).lc.ival;
                   1443:   mm = getoa(ob3,7).lc.ival;  nn = getoa(ob3,8).lc.ival;
                   1444:   if (checkRelations(c,l,m,n,cc,ll,mm,nn,n)) {
                   1445:     errorKan1("%s\n","1<=c<=l<=m<=n and cc<=c<=ll<=l<=mm<=m<=nn<=n \nand (cc<c or ll < l or mm < m or nn < n)  must be satisfied.");
                   1446:   }
                   1447:   if (getoaSize(ob2) != n || getoaSize(ob1) != n) {
                   1448:     errorKan1("%s\n","Error in the 1st or 2nd arguments.");
                   1449:   }
                   1450:   for (i=0; i<n; i++) {
                   1451:     if (getoa(ob1,i).tag != Sdollar || getoa(ob2,i).tag != Sdollar) {
                   1452:       errorKan1("%s\n","Error in the 1st or 2nd arguments.");
                   1453:     }
                   1454:   }
                   1455:   xvars = (char **) sGC_malloc(sizeof(char *)*n);
                   1456:   dvars = (char **) sGC_malloc(sizeof(char *)*n);
                   1457:   if (xvars == (char **)NULL || dvars == (char **)NULL) {
                   1458:     fprintf(stderr,"No more memory.\n");
                   1459:     exit(15);
                   1460:   }
                   1461:   for (i=0; i<n; i++) {
                   1462:     xvars[i] = getoa(ob1,i).lc.str;
                   1463:     dvars[i] = getoa(ob2,i).lc.str;
                   1464:   }
                   1465:   checkDuplicateName(xvars,dvars,n);
                   1466:
                   1467:   outputVars = (int *)sGC_malloc(sizeof(int)*n*2);
                   1468:   if (outputVars == NULL) {
                   1469:     fprintf(stderr,"No more memory.\n");
                   1470:     exit(15);
                   1471:   }
                   1472:   if (ReverseOutputOrder) {
                   1473:     for (i=0; i<n; i++) outputVars[i] = n-i-1;
                   1474:     for (i=0; i<n; i++) outputVars[n+i] = 2*n-i-1;
                   1475:   }else{
                   1476:     for (i=0; i<2*n; i++) {
                   1477:       outputVars[i] = i;
                   1478:     }
                   1479:   }
                   1480:
                   1481:   oasize = getoaSize(ob4);
                   1482:   order = (int *)sGC_malloc(sizeof(int)*((2*n)*oasize+1));
                   1483:   if (order == (int *)NULL) errorKan1("%s\n","No memory.");
                   1484:   if (objArrayToOrderMatrix(ob4,order,n,oasize) == -1) {
                   1485:     errorKan1("%s\n","Errors in the 4th matrix (order matrix).");
                   1486:   }
                   1487:   /* It's better to check the consistency of the order matrix here. */
                   1488:   savedCurrentRingp = CurrentRingp;
                   1489:
                   1490:   newRingp = (struct ring *)sGC_malloc(sizeof(struct ring));
                   1491:   if (newRingp == NULL) errorKan1("%s\n","No more memory.");
                   1492:   /* Generate the new ring before calling setOrder...(). */
                   1493:   *newRingp = *CurrentRingp;
                   1494:   CurrentRingp = newRingp;  /* Push the current ring. */
                   1495:   setOrderByMatrix(order,n,c,l,oasize); /* set order to the CurrentRing. */
                   1496:   CurrentRingp = savedCurrentRingp; /* recover it. */
                   1497:
                   1498:
                   1499:   /* Set the default name of the ring */
                   1500:   ringName = (char *)sGC_malloc(16);
                   1501:   sprintf(ringName,"ring%05d",ringSerial);
                   1502:   ringSerial++;
                   1503:
                   1504:   /* Set the current ring */
                   1505:   newRingp->n = n; newRingp->m = m; newRingp->l = l; newRingp->c = c;
                   1506:   newRingp->nn = nn; newRingp->mm = mm; newRingp->ll = ll;
                   1507:   newRingp->cc = cc;
                   1508:   newRingp->x = xvars;
                   1509:   newRingp->D = dvars;
                   1510:   /* You don't need to set order and orderMatrixSize here.
                   1511:      It was set by setOrder(). */
                   1512:   setFromTo(newRingp);
                   1513:
                   1514:   newRingp->p = p;
                   1515:   newRingp->next = nextRing;
                   1516:   newRingp->multiplication = mpMult;
                   1517:   /* These values  should will be reset if the optional value is given. */
                   1518:   newRingp->schreyer = 0;
                   1519:   newRingp->gbListTower = NULL;
                   1520:   newRingp->outputOrder = outputVars;
                   1521:
                   1522:   if (ob5.tag != Sarray || (getoaSize(ob5) % 2) != 0) {
                   1523:     errorKan1("%s\n","[(keyword) value (keyword) value ....] should be given.");
                   1524:   }
                   1525:   for (i=0; i < getoaSize(ob5); i += 2) {
                   1526:     if (getoa(ob5,i).tag == Sdollar) {
                   1527:       if (strcmp(KopString(getoa(ob5,i)),"mpMult") == 0) {
                   1528:        if (getoa(ob5,i+1).tag != Sdollar) {
                   1529:          errorKan1("%s\n","A keyword should be given. (mpMult)");
                   1530:        }
                   1531:        fmp_mult_saved = F_mpMult;
                   1532:        mpMultName = KopString(getoa(ob5,i+1));
                   1533:        switch_function("mpMult",mpMultName);
                   1534:        /* Note that this cause a global effect. It will be done again. */
                   1535:        newRingp->multiplication = mpMult;
                   1536:        switch_function("mpMult",fmp_mult_saved);
                   1537:       } else if (strcmp(KopString(getoa(ob5,i)),"coefficient ring") == 0) {
                   1538:        if (getoa(ob5,i+1).tag != Sring) {
                   1539:          errorKan1("%s\n","The pointer to a ring should be given. (coefficient ring)");
                   1540:        }
                   1541:        nextRing = KopRingp(getoa(ob5,i+1));
                   1542:        newRingp->next = nextRing;
                   1543:       } else if (strcmp(KopString(getoa(ob5,i)),"valuation") == 0) {
                   1544:        errorKan1("%s\n","Not implemented. (valuation)");
                   1545:       } else if (strcmp(KopString(getoa(ob5,i)),"characteristic") == 0) {
                   1546:        if (getoa(ob5,i+1).tag != Sinteger) {
                   1547:          errorKan1("%s\n","A integer should be given. (characteristic)");
                   1548:        }
                   1549:        p = KopInteger(getoa(ob5,i+1));
                   1550:        newRingp->p = p;
                   1551:       } else if (strcmp(KopString(getoa(ob5,i)),"schreyer") == 0) {
                   1552:        if (getoa(ob5,i+1).tag != Sinteger) {
                   1553:          errorKan1("%s\n","A integer should be given. (schreyer)");
                   1554:        }
                   1555:        newRingp->schreyer = KopInteger(getoa(ob5,i+1));
                   1556:       } else if (strcmp(KopString(getoa(ob5,i)),"gbListTower") == 0) {
                   1557:        if (getoa(ob5,i+1).tag != Slist) {
                   1558:          errorKan1("%s\n","A list should be given (gbListTower).");
                   1559:        }
                   1560:        newRingp->gbListTower = newObject();
                   1561:        *((struct object *)(newRingp->gbListTower)) = getoa(ob5,i+1);
                   1562:       } else if (strcmp(KopString(getoa(ob5,i)),"ringName") == 0) {
                   1563:        if (getoa(ob5,i+1).tag != Sdollar) {
                   1564:          errorKan1("%s\n","A name should be given. (ringName)");
                   1565:        }
                   1566:        ringName = KopString(getoa(ob5,i+1));
                   1567:       } else {
                   1568:        errorKan1("%s\n","Unknown keyword to set_up_ring@");
                   1569:       }
                   1570:     }else{
                   1571:       errorKan1("%s\n","A keyword enclosed by braces have to be given.");
                   1572:     }
                   1573:   }
                   1574:
                   1575:   newRingp->name = ringName;
                   1576:
                   1577:
                   1578:   if (AvoidTheSameRing) {
                   1579:     aa = isTheSameRing(rstack,rp,newRingp);
                   1580:     if (aa < 0) {
                   1581:       /* This ring has never been defined. */
                   1582:       CurrentRingp = newRingp;
                   1583:       /* Install it to the RingStack */
                   1584:       if (rp <RP_LIMIT) {
                   1585:        rstack[rp] = CurrentRingp; rp++; /* Save the previous ringp */
                   1586:       }else{
                   1587:        rp = 0;
                   1588:        errorKan1("%s\n","You have defined too many rings. Check the value of RP_LIMIT.");
                   1589:       }
                   1590:     }else{
                   1591:       /* This ring has been defined. */
                   1592:       /* Discard the newRingp */
                   1593:       CurrentRingp = rstack[aa];
                   1594:       ringSerial--;
                   1595:     }
                   1596:   }else{
                   1597:     CurrentRingp = newRingp;
                   1598:     /* Install it to the RingStack */
                   1599:     if (rp <RP_LIMIT) {
                   1600:       rstack[rp] = CurrentRingp; rp++; /* Save the previous ringp */
                   1601:     }else{
                   1602:       rp = 0;
                   1603:       errorKan1("%s\n","You have defined too many rings. Check the value of RP_LIMIT.");
                   1604:     }
                   1605:   }
                   1606:   if (mpMultName != NULL) {
                   1607:     switch_function("mpMult",mpMultName);
                   1608:   }
                   1609:
                   1610:   initSyzRingp();
                   1611:
                   1612:   return(0);
                   1613: }
                   1614:
                   1615:
                   1616: struct object KsetVariableNames(struct object ob,struct ring *rp)
                   1617: {
                   1618:   int n,i;
                   1619:   struct object ox;
                   1620:   struct object otmp;
                   1621:   char **xvars;
                   1622:   char **dvars;
                   1623:   if (ob.tag  != Sarray) {
                   1624:     errorKan1("%s\n","KsetVariableNames(): the argument must be of the form [(x) (y) (z) ...]");
                   1625:   }
                   1626:   n = rp->n;
                   1627:   ox = ob;
                   1628:   if (getoaSize(ox) != 2*n) {
                   1629:     errorKan1("%s\n","KsetVariableNames(): 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.");
                   1630:   }
                   1631:   xvars = (char **)sGC_malloc(sizeof(char *)*n);
                   1632:   dvars = (char **)sGC_malloc(sizeof(char *)*n);
                   1633:   if (xvars == NULL || dvars == NULL) {
                   1634:     errorKan1("%s\n","KsetVariableNames(): no more memory.");
                   1635:   }
                   1636:   for (i=0; i<2*n; i++) {
                   1637:     otmp = getoa(ox,i);
                   1638:     if(otmp.tag != Sdollar) {
                   1639:       errorKan1("%s\n","KsetVariableNames(): elements must be strings.");
                   1640:     }
                   1641:     if (i < n) {
                   1642:       xvars[i] = KopString(otmp);
                   1643:     }else{
                   1644:       dvars[i-n] = KopString(otmp);
                   1645:     }
                   1646:   }
                   1647:   checkDuplicateName(xvars,dvars,n);
                   1648:   rp->x = xvars;
                   1649:   rp->D = dvars;
                   1650:   return(ob);
                   1651: }
                   1652:
                   1653:
                   1654:
                   1655: void KshowRing(ringp)
                   1656: struct ring *ringp;
                   1657: {
                   1658:   showRing(1,ringp);
                   1659: }
                   1660:
                   1661: struct object KswitchFunction(ob1,ob2)
                   1662: struct object ob1,ob2;
                   1663: {
                   1664:   char *ans ;
                   1665:   struct object rob;
                   1666:   int needWarningForAvoidTheSameRing = 0;
                   1667:   extern int AvoidTheSameRing;
                   1668:   if ((ob1.tag != Sdollar) || (ob2.tag != Sdollar)) {
                   1669:     errorKan1("%s\n","$function$ $name$ switch_function\n");
                   1670:   }
                   1671:   if (AvoidTheSameRing && needWarningForAvoidTheSameRing) {
                   1672:     if (strcmp(KopString(ob1),"mmLarger") == 0 ||
                   1673:         strcmp(KopString(ob1),"mpMult") == 0 ||
                   1674:         strcmp(KopString(ob1),"monomialAdd") == 0 ||
                   1675:         strcmp(KopString(ob1),"isSameComponent") == 0) {
                   1676:       fprintf(stderr,",switch_function ==> %s ",KopString(ob1));
                   1677:       warningKan("switch_function might cause a trouble under AvoidTheSameRing == 1.\n");
                   1678:     }
                   1679:   }
                   1680:   if (AvoidTheSameRing) {
                   1681:     if (strcmp(KopString(ob1),"mmLarger") == 0 &&
                   1682:        strcmp(KopString(ob2),"matrix") != 0) {
                   1683:       fprintf(stderr,"mmLarger = %s",KopString(ob2));
                   1684:       errorKan1("%s\n","mmLarger can set only to matrix under AvoidTheSameRing == 1.");
                   1685:     }
                   1686:   }
                   1687:
                   1688:   ans = switch_function(ob1.lc.str,ob2.lc.str);
                   1689:   if (ans == NULL) {
                   1690:     rob = NullObject;
                   1691:   }else{
                   1692:     rob = KpoString(ans);
                   1693:   }
                   1694:   return(rob);
                   1695:
                   1696: }
                   1697:
                   1698: void KprintSwitchStatus(void)
                   1699: {
                   1700:   print_switch_status();
                   1701: }
                   1702:
                   1703: struct object KoReplace(of,rule)
                   1704: struct object of;
                   1705: struct object rule;
                   1706: {
                   1707:   struct object rob;
                   1708:   POLY f;
                   1709:   POLY lRule[N0*2];
                   1710:   POLY rRule[N0*2];
                   1711:   POLY r;
                   1712:   int i;
                   1713:   int n;
                   1714:   struct object trule;
                   1715:
                   1716:
                   1717:   if (rule.tag != Sarray) {
                   1718:     errorKan1("%s\n"," KoReplace(): The second argument must be array.");
                   1719:   }
                   1720:   n = getoaSize(rule);
                   1721:
                   1722:   if (of.tag != Spoly) {
                   1723:     errorKan1("%s\n"," KoReplace(): The first argument must be a polynomial.");
                   1724:   }
                   1725:   f = KopPOLY(of);
                   1726:
                   1727:   if (f ISZERO) {
                   1728:   }else{
                   1729:     if (n >= 2*(f->m->ringp->n)) {
                   1730:       errorKan1("%s\n"," KoReplace(): too many rules for replacement. ");
                   1731:     }
                   1732:   }
                   1733:
                   1734:   for (i=0; i<n; i++) {
                   1735:     trule = getoa(rule,i);
                   1736:     if (trule.tag != Sarray) {
                   1737:       errorKan1("%s\n"," KoReplace(): The second argument must be of the form [[a b] [c d] ....].");
                   1738:     }
                   1739:     if (getoaSize(trule) != 2) {
                   1740:       errorKan1("%s\n"," KoReplace(): The second argument must be of the form [[a b] [c d] ....].");
                   1741:     }
                   1742:
                   1743:     if (getoa(trule,0).tag != Spoly) {
                   1744:       errorKan1("%s\n"," KoReplace(): The second argument must be of the form [[a b] [c d] ....] where a,b,c,d,... are polynomials.");
                   1745:     }
                   1746:     if (getoa(trule,1).tag != Spoly) {
                   1747:       errorKan1("%s\n"," KoReplace(): The second argument must be of the form [[a b] [c d] ....] where a,b,c,d,... are polynomials.");
                   1748:     }
                   1749:
                   1750:     lRule[i] = KopPOLY(getoa(trule,0));
                   1751:     rRule[i] = KopPOLY(getoa(trule,1));
                   1752:   }
                   1753:
                   1754:   r = replace(f,lRule,rRule,n);
                   1755:   rob.tag = Spoly; rob.lc.poly = r;
                   1756:
                   1757:   return(rob);
                   1758: }
                   1759:
                   1760:
                   1761: struct object Kparts(f,v)
                   1762: struct object f;
                   1763: struct object v;
                   1764: {
                   1765:   POLY ff;
                   1766:   POLY vv;
                   1767:   struct object obj;
                   1768:   struct matrixOfPOLY *co;
                   1769:   /* check the data type */
                   1770:   if (f.tag != Spoly || v.tag != Spoly)
                   1771:     errorKan1("%s\n","arguments of Kparts() must have polynomial as arguments.");
                   1772:
                   1773:   co = parts(KopPOLY(f),KopPOLY(v));
                   1774:   obj = matrixOfPOLYToArray(co);
                   1775:   return(obj);
                   1776: }
                   1777:
                   1778: struct object Kparts2(f,v)
                   1779: struct object f;
                   1780: struct object v;
                   1781: {
                   1782:   POLY ff;
                   1783:   POLY vv;
                   1784:   struct object obj;
                   1785:   struct matrixOfPOLY *co;
                   1786:   /* check the data type */
                   1787:   if (f.tag != Spoly || v.tag != Spoly)
                   1788:     errorKan1("%s\n","arguments of Kparts2() must have polynomial as arguments.");
                   1789:
                   1790:   obj = parts2(KopPOLY(f),KopPOLY(v));
                   1791:   return(obj);
                   1792: }
                   1793:
                   1794:
                   1795: struct object Kdegree(ob1,ob2)
                   1796: struct object ob1,ob2;
                   1797: {
                   1798:   if (ob1.tag != Spoly || ob2.tag != Spoly)
                   1799:     errorKan1("%s\n","The arguments must be polynomials.");
                   1800:
                   1801:   return(KpoInteger(pDegreeWrtV(KopPOLY(ob1),KopPOLY(ob2))));
                   1802: }
                   1803:
                   1804: struct object KringMap(obj)
                   1805: struct object obj;
                   1806: {
                   1807:   extern struct ring *CurrentRingp;
                   1808:   extern struct ring *SyzRingp;
                   1809:   POLY f;
                   1810:   POLY r;
                   1811:   if (obj.tag != Spoly)
                   1812:     errorKan1("%s\n","The argments must be polynomial.");
                   1813:   f = KopPOLY(obj);
                   1814:   if (f ISZERO) return(obj);
                   1815:   if (f->m->ringp == CurrentRingp) return(obj);
                   1816:   if (f->m->ringp == CurrentRingp->next) {
                   1817:     r = newCell(newCoeff(),newMonomial(CurrentRingp));
                   1818:     r->coeffp->tag = POLY_COEFF;
                   1819:     r->coeffp->val.f = f;
                   1820:     return(KpoPOLY(r));
                   1821:   }else if (f->m->ringp == SyzRingp) {
                   1822:     return(KpoPOLY(f->coeffp->val.f));
                   1823:   }
                   1824:   errorKan1("%s\n","The ring map is not defined in this case.");
                   1825: }
                   1826:
                   1827:
                   1828: struct object Ksp(ob1,ob2)
                   1829: struct object ob1,ob2;
                   1830: {
                   1831:   struct spValue sv;
                   1832:   struct object rob,cob;
                   1833:   POLY f;
                   1834:   if (ob1.tag != Spoly || ob2.tag != Spoly)
                   1835:     errorKan1("%s\n","Ksp(): The arguments must be polynomials.");
                   1836:   sv = (*sp)(ob1.lc.poly,ob2.lc.poly);
                   1837:   f = ppAddv(ppMult(sv.a,KopPOLY(ob1)),
                   1838:             ppMult(sv.b,KopPOLY(ob2)));
                   1839:   rob = newObjectArray(2);
                   1840:   cob = newObjectArray(2);
                   1841:   putoa(rob,1,KpoPOLY(f));
                   1842:   putoa(cob,0,KpoPOLY(sv.a));
                   1843:   putoa(cob,1,KpoPOLY(sv.b));
                   1844:   putoa(rob,0,cob);
                   1845:   return(rob);
                   1846: }
                   1847:
                   1848: struct object Khead(ob)
                   1849: struct object ob;
                   1850: {
                   1851:   if (ob.tag != Spoly) errorKan1("%s\n","Khead(): The argument should be a polynomial.");
                   1852:   return(KpoPOLY(head( KopPOLY(ob))));
                   1853: }
                   1854:
                   1855:
                   1856: /* :eval */
                   1857: struct object Keval(obj)
                   1858: struct object obj;
                   1859: {
                   1860:   char *key;
                   1861:   int size;
                   1862:   struct object rob;
                   1863:   rob = NullObject;
                   1864:
                   1865:   if (obj.tag != Sarray)
                   1866:     errorKan1("%s\n","[$key$ arguments] eval");
                   1867:   if (getoaSize(obj) < 1)
                   1868:     errorKan1("%s\n","[$key$ arguments] eval");
                   1869:   if (getoa(obj,0).tag != Sdollar)
                   1870:     errorKan1("%s\n","[$key$ arguments] eval");
                   1871:   key = getoa(obj,0).lc.str;
                   1872:   size = getoaSize(obj);
                   1873:
                   1874:
                   1875:   return(rob);
                   1876: }
                   1877:
                   1878: /* :Utilities */
                   1879: char *KremoveSpace(str)
                   1880: char str[];
                   1881: {
                   1882:   int size;
                   1883:   int start;
                   1884:   int end;
                   1885:   char *s;
                   1886:   int i;
                   1887:
                   1888:   size = strlen(str);
                   1889:   for (start = 0; start <= size; start++) {
                   1890:     if (str[start] > ' ') break;
                   1891:   }
                   1892:   for (end = size-1; end >= 0; end--) {
                   1893:     if (str[end] > ' ') break;
                   1894:   }
                   1895:   if (start > end) return((char *) NULL);
                   1896:   s = (char *) sGC_malloc(sizeof(char)*(end-start+2));
                   1897:   if (s == (char *)NULL) errorKan1("%s\n","removeSpace(): No more memory.");
                   1898:   for (i=0; i< end-start+1; i++)
                   1899:     s[i] = str[i+start];
                   1900:   s[end-start+1] = '\0';
                   1901:   return(s);
                   1902: }
                   1903:
                   1904: struct object KtoRecords(ob)
                   1905: struct object ob;
                   1906: {
                   1907:   struct object obj;
                   1908:   struct object tmp;
                   1909:   int i;
                   1910:   int size;
                   1911:   char **argv;
                   1912:
                   1913:   obj = NullObject;
                   1914:   switch(ob.tag) {
                   1915:   case Sdollar: break;
                   1916:   default:
                   1917:     errorKan1("%s","Argument of KtoRecords() must be a string enclosed by dollars.\n");
                   1918:     break;
                   1919:   }
                   1920:   size = strlen(ob.lc.str)+3;
                   1921:   argv = (char **) sGC_malloc((size+1)*sizeof(char *));
                   1922:   if (argv == (char **)NULL)
                   1923:     errorKan1("%s","No more memory.\n");
                   1924:   size = KtoArgvbyCurryBrace(ob.lc.str,argv,size);
                   1925:   if (size < 0)
                   1926:     errorKan1("%s"," KtoRecords(): You have an error in the argument.\n");
                   1927:
                   1928:   obj = newObjectArray(size);
                   1929:   for (i=0; i<size; i++) {
                   1930:     tmp.tag = Sdollar;
                   1931:     tmp.lc.str = argv[i];
                   1932:     (obj.rc.op)[i] = tmp;
                   1933:   }
                   1934:   return(obj);
                   1935: }
                   1936:
                   1937: int KtoArgvbyCurryBrace(str,argv,limit)
                   1938: char *str;
                   1939: char *argv[];
                   1940: int limit;
                   1941: /* This function returns argc */
                   1942: /* decompose into tokens by the separators
                   1943:    { }, [ ], and characters of which code is less than SPACE.
                   1944:    Example.   { }  ---> nothing            (argc=0)
                   1945:               {x}----> x                   (argc=1)
                   1946:               {x,y} --> x   y              (argc=2)
                   1947:              {ab, y, z } --> ab   y   z   (argc=3)
                   1948:               [[ab],c,d]  --> [ab] c   d
                   1949: */
                   1950: {
                   1951:   int argc;
                   1952:   int n;
                   1953:   int i;
                   1954:   int k;
                   1955:   char *a;
                   1956:   char *ident;
                   1957:   int level = 0;
                   1958:   int comma;
                   1959:
                   1960:   if (str == (char *)NULL) {
                   1961:     fprintf(stderr,"You use NULL string to toArgvbyCurryBrace()\n");
                   1962:     return(0);
                   1963:   }
                   1964:
                   1965:   n = strlen(str);
                   1966:   a = (char *) sGC_malloc(sizeof(char)*(n+3));
                   1967:   a[0]=' ';
                   1968:   strcpy(&(a[1]),str);
                   1969:   n = strlen(a); a[0] = '\0';
                   1970:   comma = -1;
                   1971:   for (i=1; i<n; i++) {
                   1972:     if (a[i] == '{' || a[i] == '[') level++;
                   1973:     if (level <= 1 && ( a[i] == ',')) {a[i] = '\0'; ++comma;}
                   1974:     if (level <= 1 && (a[i]=='{' || a[i]=='}' || a[i]=='[' || a[i]==']'))
                   1975:       a[i] = '\0';
                   1976:     if (a[i] == '}' || a[i] == ']') level--;
                   1977:     if ((level <= 1) && (comma == -1) && ( a[i] > ' ')) comma = 0;
                   1978:   }
                   1979:
                   1980:   if (comma == -1) return(0);
                   1981:
                   1982:   argc=0;
                   1983:   for (i=0; i<n; i++) {
                   1984:     if ((a[i] == '\0') && (a[i+1] != '\0')) ++argc;
                   1985:   }
                   1986:   if (argc > limit) return(-argc);
                   1987:
                   1988:   k = 0;
                   1989:   for (i=0; i<n; i++) {
                   1990:     if ((a[i] == '\0') && (a[i+1] != '\0')) {
                   1991:       ident = (char *) sGC_malloc(sizeof(char)*( strlen(&(a[i+1])) + 3));
                   1992:       strcpy(ident,&(a[i+1]));
                   1993:       argv[k] = KremoveSpace(ident);
                   1994:       if (argv[k] != (char *)NULL) k++;
                   1995:       if (k >= limit) errorKan1("%s\n","KtoArgvbyCurryBraces(): k>=limit.");
                   1996:     }
                   1997:   }
                   1998:   argc = k;
                   1999:   /*for (i=0; i<argc; i++) fprintf(stderr,"%d %s\n",i,argv[i]);*/
                   2000:   return(argc);
                   2001: }
                   2002:
                   2003:
                   2004: static void checkDuplicateName(xvars,dvars,n)
                   2005: char *xvars[];
                   2006: char *dvars[];
                   2007: int n;
                   2008: {
                   2009:   int i,j;
                   2010:   char *names[N0*2];
                   2011:   for (i=0; i<n; i++) {
                   2012:     names[i] = xvars[i]; names[i+n] = dvars[i];
                   2013:   }
                   2014:   n = 2*n;
                   2015:   for (i=0; i<n; i++) {
                   2016:     for (j=i+1; j<n; j++) {
                   2017:       if (strcmp(names[i],names[j]) == 0) {
                   2018:        fprintf(stderr,"\n%d=%s, %d=%s\n",i,names[i],j,names[j]);
                   2019:        errorKan1("%s\n","Duplicate definition of the name above in SetUpRing().");
                   2020:       }
                   2021:     }
                   2022:   }
                   2023: }
                   2024:
                   2025:
                   2026:
                   2027:
                   2028: struct object KooDiv2(ob1,ob2)
                   2029: struct object ob1,ob2;
                   2030: {
                   2031:   struct object rob = NullObject;
                   2032:   POLY f;
                   2033:   extern struct ring *CurrentRingp;
                   2034:   int s,i;
                   2035:   double d;
                   2036:
                   2037:   switch (Lookup[ob1.tag][ob2.tag]) {
                   2038:   case SpolySpoly:
                   2039:   case SuniversalNumberSuniversalNumber:
                   2040:   case SuniversalNumberSpoly:
                   2041:   case SpolySuniversalNumber:
                   2042:     rob = KnewRationalFunction0(copyObjectp(&ob1),copyObjectp(&ob2));
                   2043:     KisInvalidRational(&rob);
                   2044:     return(rob);
                   2045:     break;
                   2046:   case SarraySpoly:
                   2047:   case SarraySuniversalNumber:
                   2048:   case SarraySrationalFunction:
                   2049:     s = getoaSize(ob1);
                   2050:     rob = newObjectArray(s);
                   2051:     for (i=0; i<s; i++) {
                   2052:       putoa(rob,i,KooDiv2(getoa(ob1,i),ob2));
                   2053:     }
                   2054:     return(rob);
                   2055:     break;
                   2056:   case SpolySrationalFunction:
                   2057:   case SrationalFunctionSpoly:
                   2058:   case SrationalFunctionSrationalFunction:
                   2059:   case SuniversalNumberSrationalFunction:
                   2060:   case SrationalFunctionSuniversalNumber:
                   2061:     rob = KoInverse(ob2);
                   2062:     rob = KooMult(ob1,rob);
                   2063:     return(rob);
                   2064:     break;
                   2065:
                   2066:   case SdoubleSdouble:
                   2067:     d = KopDouble(ob2);
                   2068:     if (d == 0.0) errorKan1("%s\n","KooDiv2, Division by zero.");
                   2069:     return(KpoDouble( KopDouble(ob1) / d ));
                   2070:     break;
                   2071:   case SdoubleSinteger:
                   2072:   case SdoubleSuniversalNumber:
                   2073:   case SdoubleSrationalFunction:
                   2074:     d = toDouble0(ob2);
                   2075:     if (d == 0.0) errorKan1("%s\n","KooDiv2, Division by zero.");
                   2076:     return(KpoDouble( KopDouble(ob1) / d) );
                   2077:     break;
                   2078:   case SintegerSdouble:
                   2079:   case SuniversalNumberSdouble:
                   2080:   case SrationalFunctionSdouble:
                   2081:     d = KopDouble(ob2);
                   2082:     if (d == 0.0) errorKan1("%s\n","KooDiv2, Division by zero.");
                   2083:     return(KpoDouble( toDouble0(ob1) / d ) );
                   2084:     break;
                   2085:
                   2086:   default:
                   2087:     warningKan("KooDiv2() has not supported yet these objects.\n");
                   2088:     break;
                   2089:   }
                   2090:   return(rob);
                   2091: }
                   2092: /* Template
                   2093:   case SrationalFunctionSrationalFunction:
                   2094:     warningKan("Koo() has not supported yet these objects.\n");
                   2095:     return(rob);
                   2096:     break;
                   2097:   case SpolySrationalFunction:
                   2098:     warningKan("Koo() has not supported yet these objects.\n");
                   2099:     return(rob);
                   2100:     break;
                   2101:   case SrationalFunctionSpoly:
                   2102:     warningKan("Koo() has not supported yet these objects.\n");
                   2103:     return(rob);
                   2104:     break;
                   2105:   case SuniversalNumberSrationalFunction:
                   2106:     warningKan("Koo() has not supported yet these objects.\n");
                   2107:     return(rob);
                   2108:     break;
                   2109:   case SrationalFunctionSuniversalNumber:
                   2110:     warningKan("Koo() has not supported yet these objects.\n");
                   2111:     return(rob);
                   2112:     break;
                   2113: */
                   2114:
                   2115: int KisInvalidRational(op)
                   2116: objectp op;
                   2117: {
                   2118:   extern struct coeff *UniversalZero;
                   2119:   if (op->tag != SrationalFunction) return(0);
                   2120:   if (KisZeroObject(Kdenominator(*op))) {
                   2121:     errorKan1("%s\n","KisInvalidRational(): zero division. You have f/0.");
                   2122:   }
                   2123:   if (KisZeroObject(Knumerator(*op))) {
                   2124:     op->tag = SuniversalNumber;
                   2125:     op->lc.universalNumber = UniversalZero;
                   2126:   }
                   2127:   return(0);
                   2128: }
                   2129:
                   2130: struct object KgbExtension(struct object obj)
                   2131: {
                   2132:   char *key;
                   2133:   int size;
                   2134:   struct object keyo;
                   2135:   struct object rob = NullObject;
                   2136:   struct object obj1,obj2,obj3;
                   2137:   POLY f1;
                   2138:   POLY f2;
                   2139:   POLY f3;
                   2140:   POLY f;
                   2141:   int m,i;
                   2142:   struct pairOfPOLY pf;
                   2143:
                   2144:   if (obj.tag != Sarray) errorKan1("%s\n","KgbExtension(): The argument must be an array.");
                   2145:   size = getoaSize(obj);
                   2146:   if (size < 1) errorKan1("%s\n","KgbExtension(): Empty array.");
                   2147:   keyo = getoa(obj,0);
                   2148:   if (keyo.tag != Sdollar) errorKan1("%s\n","KgbExtension(): No key word.");
                   2149:   key = KopString(keyo);
                   2150:
                   2151:   /* branch by the key word. */
                   2152:   if (strcmp(key,"isReducible")==0) {
                   2153:     if (size != 3) errorKan1("%s\n","[(isReducible)  poly1 poly2] gbext.");
                   2154:     obj1 = getoa(obj,1);
                   2155:     obj2 = getoa(obj,2);
                   2156:     if (obj1.tag != Spoly || obj2.tag != Spoly)
                   2157:       errorKan1("%s\n","[(isReducible)  poly1 poly2] gb.");
                   2158:     f1 = KopPOLY(obj1);
                   2159:     f2 = KopPOLY(obj2);
                   2160:     rob = KpoInteger((*isReducible)(f1,f2));
                   2161:   }else if (strcmp(key,"lcm") == 0) {
                   2162:     if (size != 3) errorKan1("%s\n","[(lcm)  poly1 poly2] gb.");
                   2163:     obj1 = getoa(obj,1);
                   2164:     obj2 = getoa(obj,2);
                   2165:     if (obj1.tag != Spoly || obj2.tag != Spoly)
                   2166:       errorKan1("%s\n","[(lcm)  poly1 poly2] gbext.");
                   2167:     f1 = KopPOLY(obj1);
                   2168:     f2 = KopPOLY(obj2);
                   2169:     rob = KpoPOLY((*lcm)(f1,f2));
                   2170:   }else if (strcmp(key,"grade")==0) {
                   2171:     if (size != 2) errorKan1("%s\n","[(grade)  poly1 ] gbext.");
                   2172:     obj1 = getoa(obj,1);
                   2173:     if (obj1.tag != Spoly)
                   2174:       errorKan1("%s\n","[(grade)  poly1 ] gbext.");
                   2175:     f1 = KopPOLY(obj1);
                   2176:     rob = KpoInteger((*grade)(f1));
                   2177:   }else if (strcmp(key,"mod")==0) {
                   2178:     if (size != 3) errorKan1("%s\n","[(mod) poly num] gbext");
                   2179:     obj1 = getoa(obj,1);
                   2180:     obj2 = getoa(obj,2);
                   2181:     if (obj1.tag != Spoly || obj2.tag != SuniversalNumber) {
                   2182:       errorKan1("%s\n","The datatype of the argument mismatch: [(mod) polynomial  universalNumber] gbext");
                   2183:     }
                   2184:     rob = KpoPOLY( modulopZ(KopPOLY(obj1),KopUniversalNumber(obj2)) );
                   2185:   }else if (strcmp(key,"tomodp")==0) {
                   2186:     /* The ring must be a ring of characteristic p. */
                   2187:     if (size != 3) errorKan1("%s\n","[(tomod) poly ring] gbext");
                   2188:     obj1 = getoa(obj,1);
                   2189:     obj2 = getoa(obj,2);
                   2190:     if (obj1.tag != Spoly || obj2.tag != Sring) {
                   2191:       errorKan1("%s\n","The datatype of the argument mismatch: [(tomod) polynomial  ring] gbext");
                   2192:     }
                   2193:     rob = KpoPOLY( modulop(KopPOLY(obj1),KopRingp(obj2)) );
                   2194:   }else if (strcmp(key,"tomod0")==0) {
                   2195:     /* Ring must be a ring of characteristic 0. */
                   2196:     if (size != 3) errorKan1("%s\n","[(tomod0) poly ring] gbext");
                   2197:     obj1 = getoa(obj,1);
                   2198:     obj2 = getoa(obj,2);
                   2199:     if (obj1.tag != Spoly || obj2.tag != Sring) {
                   2200:       errorKan1("%s\n","The datatype of the argument mismatch: [(tomod0) polynomial  ring] gbext");
                   2201:     }
                   2202:     errorKan1("%s\n","It has not been implemented.");
                   2203:     rob = KpoPOLY( POLYNULL );
                   2204:   }else if (strcmp(key,"divByN")==0) {
                   2205:     if (size != 3) errorKan1("%s\n","[(divByN) poly num] gbext");
                   2206:     obj1 = getoa(obj,1);
                   2207:     obj2 = getoa(obj,2);
                   2208:     if (obj1.tag != Spoly || obj2.tag != SuniversalNumber) {
                   2209:       errorKan1("%s\n","The datatype of the argument mismatch: [(divByN) polynomial  universalNumber] gbext");
                   2210:     }
                   2211:     pf =  quotientByNumber(KopPOLY(obj1),KopUniversalNumber(obj2));
                   2212:     rob  = newObjectArray(2);
                   2213:     putoa(rob,0,KpoPOLY(pf.first));
                   2214:     putoa(rob,1,KpoPOLY(pf.second));
                   2215:   }else if (strcmp(key,"isConstant")==0) {
                   2216:     if (size != 2) errorKan1("%s\n","[(isConstant) poly ] gbext bool");
                   2217:     obj1 = getoa(obj,1);
                   2218:     if (obj1.tag != Spoly) {
                   2219:       errorKan1("%s\n","The datatype of the argument mismatch: [(isConstant) polynomial] gbext");
                   2220:     }
                   2221:     return(KpoInteger(isConstant(KopPOLY(obj1))));
                   2222:   }else if (strcmp(key,"schreyerSkelton") == 0) {
                   2223:     if (size != 2) errorKan1("%s\n","[(schreyerSkelton) array_of_poly ] gbext array");
                   2224:     obj1 = getoa(obj,1);
                   2225:     return(KschreyerSkelton(obj1));
                   2226:   }else if (strcmp(key,"lcoeff") == 0) {
                   2227:     if (size != 2) errorKan1("%s\n","[(lcoeff) poly] gbext poly");
                   2228:     obj1 = getoa(obj,1);
                   2229:     if (obj1.tag != Spoly) errorKan1("%s\n","[(lcoeff) poly] gbext poly");
                   2230:     f = KopPOLY(obj1);
                   2231:     if (f == POLYNULL) return(KpoPOLY(f));
                   2232:     return(KpoPOLY( newCell(coeffCopy(f->coeffp),newMonomial(f->m->ringp))));
                   2233:   }else if (strcmp(key,"lmonom") == 0) {
                   2234:     if (size != 2) errorKan1("%s\n","[(lmonom) poly] gbext poly");
                   2235:     obj1 = getoa(obj,1);
                   2236:     if (obj1.tag != Spoly) errorKan1("%s\n","[(lmonom) poly] gbext poly");
                   2237:     f = KopPOLY(obj1);
                   2238:     if (f == POLYNULL) return(KpoPOLY(f));
                   2239:     return(KpoPOLY( newCell(intToCoeff(1,f->m->ringp),monomialCopy(f->m))));
                   2240:   }else if (strcmp(key,"toes") == 0) {
                   2241:     if (size != 2) errorKan1("%s\n","[(toes) array] gbext poly");
                   2242:     obj1 = getoa(obj,1);
                   2243:     if (obj1.tag != Sarray) errorKan1("%s\n","[(toes) array] gbext poly");
                   2244:     return(KvectorToSchreyer_es(obj1));
                   2245:   }else if (strcmp(key,"isOrdered") == 0) {
                   2246:     if (size != 2) errorKan1("%s\n","[(isOrdered) poly] gbext poly");
                   2247:     obj1 = getoa(obj,1);
                   2248:     if (obj1.tag != Spoly) errorKan1("%s\n","[(isOrdered) poly] gbext poly");
                   2249:     return(KisOrdered(obj1));
                   2250:   }else {
                   2251:     errorKan1("%s\n","gbext : unknown tag.");
                   2252:   }
                   2253:   return(rob);
                   2254: }
                   2255:
                   2256: struct object KmpzExtension(struct object obj)
                   2257: {
                   2258:   char *key;
                   2259:   int size;
                   2260:   struct object keyo;
                   2261:   struct object rob = NullObject;
                   2262:   struct object obj0,obj1,obj2,obj3;
                   2263:   MP_INT *f;
                   2264:   MP_INT *g;
                   2265:   MP_INT *h;
                   2266:   MP_INT *r0;
                   2267:   MP_INT *r1;
                   2268:   MP_INT *r2;
                   2269:   int gi;
                   2270:   extern struct ring *SmallRingp;
                   2271:
                   2272:
                   2273:   if (obj.tag != Sarray) errorKan1("%s\n","KmpzExtension(): The argument must be an array.");
                   2274:   size = getoaSize(obj);
                   2275:   if (size < 1) errorKan1("%s\n","KmpzExtension(): Empty array.");
                   2276:   keyo = getoa(obj,0);
                   2277:   if (keyo.tag != Sdollar) errorKan1("%s\n","KmpzExtension(): No key word.");
                   2278:   key = KopString(keyo);
                   2279:
                   2280:   /* branch by the key word. */
                   2281:   if (strcmp(key,"gcd")==0) {
                   2282:     if (size != 3) errorKan1("%s\n","[(gcd)  universalNumber universalNumber] mpzext.");
                   2283:     obj1 = getoa(obj,1);
                   2284:     obj2 = getoa(obj,2);
                   2285:     if (obj1.tag != SuniversalNumber || obj2.tag != SuniversalNumber)
                   2286:       errorKan1("%s\n","[(gcd)  universalNumber universalNumber] mpzext.");
                   2287:     if (! is_this_coeff_MP_INT(obj1.lc.universalNumber) ||
                   2288:        ! is_this_coeff_MP_INT(obj2.lc.universalNumber)) {
                   2289:       errorKan1("%s\n","[(gcd)  universalNumber universalNumber] mpzext.");
                   2290:     }
                   2291:     f = coeff_to_MP_INT(obj1.lc.universalNumber);
                   2292:     g = coeff_to_MP_INT(obj2.lc.universalNumber);
                   2293:     r1 = newMP_INT();
                   2294:     mpz_gcd(r1,f,g);
                   2295:     rob.tag = SuniversalNumber;
                   2296:     rob.lc.universalNumber = mpintToCoeff(r1,SmallRingp);
                   2297:   }else if (strcmp(key,"tdiv_qr")==0) {
                   2298:     if (size != 3) errorKan1("%s\n","[(tdiv_qr)  universalNumber universalNumber] mpzext.");
                   2299:     obj1 = getoa(obj,1);
                   2300:     obj2 = getoa(obj,2);
                   2301:     if (obj1.tag != SuniversalNumber || obj2.tag != SuniversalNumber)
                   2302:       errorKan1("%s\n","[(tdiv_qr)  universalNumber universalNumber] mpzext.");
                   2303:     if (! is_this_coeff_MP_INT(obj1.lc.universalNumber) ||
                   2304:        ! is_this_coeff_MP_INT(obj2.lc.universalNumber)) {
                   2305:       errorKan1("%s\n","[(tdiv_qr)  universalNumber universalNumber] mpzext.");
                   2306:     }
                   2307:     f = coeff_to_MP_INT(obj1.lc.universalNumber);
                   2308:     g = coeff_to_MP_INT(obj2.lc.universalNumber);
                   2309:     r1 = newMP_INT();
                   2310:     r2 = newMP_INT();
                   2311:     mpz_tdiv_qr(r1,r2,f,g);
                   2312:     obj1.tag = SuniversalNumber;
                   2313:     obj1.lc.universalNumber = mpintToCoeff(r1,SmallRingp);
                   2314:     obj2.tag = SuniversalNumber;
                   2315:     obj2.lc.universalNumber = mpintToCoeff(r2,SmallRingp);
                   2316:     rob = newObjectArray(2);
                   2317:     putoa(rob,0,obj1); putoa(rob,1,obj2);
                   2318:   } else if (strcmp(key,"cancel")==0) {
                   2319:     if (size != 2) {
                   2320:       errorKan1("%s\n","[(cancel)  universalNumber/universalNumber] mpzext.");
                   2321:     }
                   2322:     obj0 = getoa(obj,1);
                   2323:     if (obj0.tag == SuniversalNumber) return(obj0);
                   2324:     if (obj0.tag != SrationalFunction) {
                   2325:       errorKan1("%s\n","[(cancel)  universalNumber/universalNumber] mpzext.");
                   2326:       return(obj0);
                   2327:     }
                   2328:     obj1 = *(Knumerator(obj0));
                   2329:     obj2 = *(Kdenominator(obj0));
                   2330:     if (obj1.tag != SuniversalNumber || obj2.tag != SuniversalNumber) {
                   2331:       errorKan1("%s\n","[(cancel)  universalNumber/universalNumber] mpzext.");
                   2332:       return(obj0);
                   2333:     }
                   2334:     if (! is_this_coeff_MP_INT(obj1.lc.universalNumber) ||
                   2335:        ! is_this_coeff_MP_INT(obj2.lc.universalNumber)) {
                   2336:       errorKan1("%s\n","[(cancel)  universalNumber/universalNumber] mpzext.");
                   2337:     }
                   2338:     f = coeff_to_MP_INT(obj1.lc.universalNumber);
                   2339:     g = coeff_to_MP_INT(obj2.lc.universalNumber);
                   2340:
                   2341:     r0 = newMP_INT();
                   2342:     r1 = newMP_INT();
                   2343:     r2 = newMP_INT();
                   2344:     mpz_gcd(r0,f,g);
                   2345:     mpz_divexact(r1,f,r0);
                   2346:     mpz_divexact(r2,g,r0);
                   2347:     obj1.tag = SuniversalNumber;
                   2348:     obj1.lc.universalNumber = mpintToCoeff(r1,SmallRingp);
                   2349:     obj2.tag = SuniversalNumber;
                   2350:     obj2.lc.universalNumber = mpintToCoeff(r2,SmallRingp);
                   2351:
                   2352:     rob = KnewRationalFunction0(copyObjectp(&obj1),copyObjectp(&obj2));
                   2353:     KisInvalidRational(&rob);
                   2354:   }else if (strcmp(key,"sqrt")==0 ||
                   2355:            strcmp(key,"com")==0) {
                   2356:     /*  One arg functions  */
                   2357:     if (size != 2) errorKan1("%s\n","[key num] mpzext");
                   2358:     obj1 = getoa(obj,1);
                   2359:     if (obj1.tag != SuniversalNumber)
                   2360:       errorKan1("%s\n","[key num] mpzext : num must be a universalNumber.");
                   2361:     if (! is_this_coeff_MP_INT(obj1.lc.universalNumber))
                   2362:       errorKan1("%s\n","[key num] mpzext : num must be a universalNumber.");
                   2363:     f = coeff_to_MP_INT(obj1.lc.universalNumber);
                   2364:     if (strcmp(key,"sqrt")==0) {
                   2365:       r1 = newMP_INT();
                   2366:       mpz_sqrt(r1,f);
                   2367:     }else if (strcmp(key,"com")==0) {
                   2368:       r1 = newMP_INT();
                   2369:       mpz_com(r1,f);
                   2370:     }
                   2371:     rob.tag = SuniversalNumber;
                   2372:     rob.lc.universalNumber = mpintToCoeff(r1,SmallRingp);
                   2373:   }else if (strcmp(key,"probab_prime_p")==0 ||
                   2374:            strcmp(key,"and") == 0 ||
                   2375:            strcmp(key,"ior")==0) {
                   2376:     /* Two args functions */
                   2377:     if (size != 3) errorKan1("%s\n","[key  num1 num2] mpzext.");
                   2378:     obj1 = getoa(obj,1);
                   2379:     obj2 = getoa(obj,2);
                   2380:     if (obj1.tag != SuniversalNumber || obj2.tag != SuniversalNumber)
                   2381:       errorKan1("%s\n","[key num1 num2] mpzext.");
                   2382:     if (! is_this_coeff_MP_INT(obj1.lc.universalNumber) ||
                   2383:        ! is_this_coeff_MP_INT(obj2.lc.universalNumber)) {
                   2384:       errorKan1("%s\n","[key  num1 num2] mpzext.");
                   2385:     }
                   2386:     f = coeff_to_MP_INT(obj1.lc.universalNumber);
                   2387:     g = coeff_to_MP_INT(obj2.lc.universalNumber);
                   2388:     if (strcmp(key,"probab_prime_p")==0) {
                   2389:       gi = (int) mpz_get_si(g);
                   2390:       if (mpz_probab_prime_p(f,gi)) {
                   2391:        rob = KpoInteger(1);
                   2392:       }else {
                   2393:        rob = KpoInteger(0);
                   2394:       }
                   2395:     }else if (strcmp(key,"and")==0) {
                   2396:       r1 = newMP_INT();
                   2397:       mpz_and(r1,f,g);
                   2398:       rob.tag = SuniversalNumber;
                   2399:       rob.lc.universalNumber = mpintToCoeff(r1,SmallRingp);
                   2400:     }else if (strcmp(key,"ior")==0) {
                   2401:       r1 = newMP_INT();
                   2402:       mpz_ior(r1,f,g);
                   2403:       rob.tag = SuniversalNumber;
                   2404:       rob.lc.universalNumber = mpintToCoeff(r1,SmallRingp);
                   2405:     }
                   2406:
                   2407:   }else if (strcmp(key,"powm")==0) {
                   2408:     /* three args */
                   2409:     if (size != 4) errorKan1("%s\n","[key num1 num2 num3] mpzext");
                   2410:     obj1 = getoa(obj,1); obj2 = getoa(obj,2); obj3 = getoa(obj,3);
                   2411:     if (obj1.tag != SuniversalNumber ||
                   2412:         obj2.tag != SuniversalNumber ||
                   2413:         obj3.tag != SuniversalNumber ) {
                   2414:       errorKan1("%s\n","[key num1 num2 num3] mpzext : num1, num2 and num3 must be universalNumbers.");
                   2415:     }
                   2416:     if (! is_this_coeff_MP_INT(obj1.lc.universalNumber) ||
                   2417:        ! is_this_coeff_MP_INT(obj2.lc.universalNumber) ||
                   2418:        ! is_this_coeff_MP_INT(obj3.lc.universalNumber)) {
                   2419:       errorKan1("%s\n","[key num1 num2 num3] mpzext : num1, num2 and num3 must be universalNumbers.");
                   2420:     }
                   2421:     f = coeff_to_MP_INT(obj1.lc.universalNumber);
                   2422:     g = coeff_to_MP_INT(obj2.lc.universalNumber);
                   2423:     h = coeff_to_MP_INT(obj3.lc.universalNumber);
                   2424:     if (mpz_sgn(g) < 0) errorKan1("%s\n","[(powm) base exp mod] mpzext : exp must not be negative.");
                   2425:     r1 = newMP_INT();
                   2426:     mpz_powm(r1,f,g,h);
                   2427:     rob.tag = SuniversalNumber;
                   2428:     rob.lc.universalNumber = mpintToCoeff(r1,SmallRingp);
                   2429:   }else {
                   2430:     errorKan1("%s\n","mpzExtension(): Unknown tag.");
                   2431:   }
                   2432:   return(rob);
                   2433: }
                   2434:
                   2435:
                   2436: /** : context   */
                   2437: struct object KnewContext(struct object superObj,char *name) {
                   2438:   struct context *cp;
                   2439:   struct object ob;
                   2440:   if (superObj.tag != Sclass) {
                   2441:     errorKan1("%s\n","The argument of KnewContext must be a Class.Context");
                   2442:   }
                   2443:   if (superObj.lc.ival != CLASSNAME_CONTEXT) {
                   2444:     errorKan1("%s\n","The argument of KnewContext must be a Class.Context");
                   2445:   }
                   2446:   cp = newContext0((struct context *)(superObj.rc.voidp),name);
                   2447:   ob.tag = Sclass;
                   2448:   ob.lc.ival = CLASSNAME_CONTEXT;
                   2449:   ob.rc.voidp = cp;
                   2450:   return(ob);
                   2451: }
                   2452:
                   2453: struct object KcreateClassIncetance(struct object ob1,
                   2454:                                    struct object ob2,
                   2455:                                    struct object ob3)
                   2456: {
                   2457:   /* [class-tag super-obj] size [class-tag]  cclass */
                   2458:   struct object ob4;
                   2459:   int size,size2,i;
                   2460:   struct object ob5;
                   2461:   struct object rob;
                   2462:
                   2463:   if (ob1.tag != Sarray)
                   2464:     errorKan1("%s\n","cclass: The first argument must be an array.");
                   2465:   if (getoaSize(ob1) < 1)
                   2466:     errorKan1("%s\n","cclass: The first argument must be [class-tag ....].");
                   2467:   ob4 = getoa(ob1,0);
                   2468:   if (ectag(ob4) != CLASSNAME_CONTEXT)
                   2469:     errorKan1("%s\n","cclass: The first argument must be [class-tag ....].");
                   2470:
                   2471:   if (ob2.tag != Sinteger)
                   2472:     errorKan1("%s\n","cclass: The second argument must be an integer.");
                   2473:   size = KopInteger(ob2);
                   2474:   if (size < 1)
                   2475:     errorKan1("%s\n","cclass: The size must be > 0.");
                   2476:
                   2477:   if (ob3.tag != Sarray)
                   2478:     errorKan1("%s\n","cclass: The third argument must be an array.");
                   2479:   if (getoaSize(ob3) < 1)
                   2480:     errorKan1("%s\n","cclass: The third argument must be [class-tag].");
                   2481:   ob5 = getoa(ob3,0);
                   2482:   if (ectag(ob5) != CLASSNAME_CONTEXT)
                   2483:     errorKan1("%s\n","cclass: The third argument must be [class-tag].");
                   2484:
                   2485:   rob = newObjectArray(size);
                   2486:   putoa(rob,0,ob5);
                   2487:   if (getoaSize(ob1) < size) size2 = getoaSize(ob1);
                   2488:   else size2 = size;
                   2489:   for (i=1; i<size2; i++) {
                   2490:     putoa(rob,i,getoa(ob1,i));
                   2491:   }
                   2492:   for (i=size2; i<size; i++) {
                   2493:     putoa(rob,i,NullObject);
                   2494:   }
                   2495:   return(rob);
                   2496: }
                   2497:
                   2498:
                   2499: struct object KpoDouble(double a) {
                   2500:   struct object rob;
                   2501:   rob.tag = Sdouble;
                   2502:   /* rob.lc.dbl = (double *)sGC_malloc_atomic(sizeof(double)); */
                   2503:   rob.lc.dbl = (double *)sGC_malloc(sizeof(double));
                   2504:   if (rob.lc.dbl == (double *)NULL) {
                   2505:     fprintf(stderr,"No memory.\n"); exit(10);
                   2506:   }
                   2507:   *(rob.lc.dbl) = a;
                   2508:   return(rob);
                   2509: }
                   2510:
                   2511: double toDouble0(struct object ob) {
                   2512:   double r;
                   2513:   int r3;
                   2514:   struct object ob2;
                   2515:   struct object ob3;
                   2516:   switch(ob.tag) {
                   2517:   case Sinteger:
                   2518:     return( (double) (KopInteger(ob)) );
                   2519:   case SuniversalNumber:
                   2520:     return((double) coeffToInt(ob.lc.universalNumber));
                   2521:   case SrationalFunction:
                   2522:     /* The argument is assumed to be a rational number. */
                   2523:     ob2 = newObjectArray(2);  ob3 = KpoString("cancel");
                   2524:     putoa(ob2,0,ob3); putoa(ob2,1,ob);
                   2525:     ob = KmpzExtension(ob2);
                   2526:     ob2 = *Knumerator(ob);  ob3 = *Kdenominator(ob);
                   2527:     r3 =  coeffToInt(ob3.lc.universalNumber);
                   2528:     if (r3  == 0) {
                   2529:       errorKan1("%s\n","toDouble0(): Division by zero.");
                   2530:       break;
                   2531:     }
                   2532:     r = ((double) coeffToInt(ob2.lc.universalNumber)) / ((double)r3);
                   2533:     return(r);
                   2534:   case Sdouble:
                   2535:     return( KopDouble(ob) );
                   2536:   default:
                   2537:     errorKan1("%s\n","toDouble0(): This type of conversion is not supported.");
                   2538:     break;
                   2539:   }
                   2540:   return(0.0);
                   2541: }
                   2542:
                   2543: struct object KpoGradedPolySet(struct gradedPolySet *grD) {
                   2544:   struct object rob;
                   2545:   rob.tag = Sclass;
                   2546:   rob.lc.ival = CLASSNAME_GradedPolySet;
                   2547:   rob.rc.voidp = (void *) grD;
                   2548:   return(rob);
                   2549: }
                   2550:
                   2551: static char *getspace0(int a) {
                   2552:   char *s;
                   2553:   a = (a > 0? a:-a);
                   2554:   s = (char *) sGC_malloc(a+1);
                   2555:   if (s == (char *)NULL) {
                   2556:     errorKan1("%s\n","no more memory.");
                   2557:   }
                   2558:   return(s);
                   2559: }
                   2560: struct object KdefaultPolyRing(struct object ob) {
                   2561:   struct object rob;
                   2562:   int i,j,k,n;
                   2563:   struct object ob1,ob2,ob3,ob4,ob5;
                   2564:   struct object t1;
                   2565:   char *s1;
                   2566:   extern struct ring *CurrentRingp;
                   2567:   static struct ring *a[N0];
                   2568:
                   2569:   rob = NullObject;
                   2570:   if (ob.tag != Sinteger) {
                   2571:     errorKan1("%s\n","KdefaultPolyRing(): the argument must be integer.");
                   2572:   }
                   2573:   n = KopInteger(ob);
                   2574:   if (n <= 0) {
                   2575:     /* initializing */
                   2576:     for (i=0; i<N0; i++) {
                   2577:       a[i] = (struct ring*) NULL;
                   2578:     }
                   2579:     return(rob);
                   2580:   }
                   2581:
                   2582:   if ( a[n] != (struct ring*)NULL) return(KpoRingp(a[n]));
                   2583:
                   2584:   /* Let's construct ring of polynomials of 2n variables  */
                   2585:   /* x variables */
                   2586:   ob1 = newObjectArray(n);
                   2587:   for (i=0; i<n; i++) {
                   2588:     s1 = getspace0(1+ ((n-i)/10) + 1);
                   2589:     sprintf(s1,"x%d",n-i);
                   2590:     putoa(ob1,i,KpoString(s1));
                   2591:   }
                   2592:   ob2 = newObjectArray(n);
                   2593:   s1 = getspace0(1);
                   2594:   sprintf(s1,"h");
                   2595:   putoa(ob2,0,KpoString(s1));
                   2596:   for (i=1; i<n; i++) {
                   2597:     s1 = getspace0(1+((n+n-i)/10)+1);
                   2598:     sprintf(s1,"x%d",n+n-i);
                   2599:     putoa(ob2,i,KpoString(s1));
                   2600:   }
                   2601:
                   2602:   ob3 = newObjectArray(9);
                   2603:   putoa(ob3,0,KpoInteger(0));
                   2604:   for (i=1; i<9; i++) {
                   2605:     putoa(ob3,i,KpoInteger(n));
                   2606:   }
                   2607:
                   2608:   ob4 = newObjectArray(2*n);
                   2609:   t1 = newObjectArray(2*n);
                   2610:   for (i=0; i<2*n; i++) {
                   2611:     putoa(t1,i,KpoInteger(1));
                   2612:   }
                   2613:   putoa(ob4,0,t1);
                   2614:   for (i=1; i<2*n; i++) {
                   2615:     t1 = newObjectArray(2*n);
                   2616:     for (j=0; j<2*n; j++) {
                   2617:       putoa(t1,j,KpoInteger(0));
                   2618:       if (j == (2*n-i)) {
                   2619:        putoa(t1,j,KpoInteger(-1));
                   2620:       }
                   2621:     }
                   2622:     putoa(ob4,i,t1);
                   2623:   }
                   2624:
                   2625:   ob5 = newObjectArray(2);
                   2626:   putoa(ob5,0,KpoString("mpMult"));
                   2627:   putoa(ob5,1,KpoString("poly"));
                   2628:
                   2629:   KsetUpRing(ob1,ob2,ob3,ob4,ob5);
                   2630:   a[n] = CurrentRingp;
                   2631:   return(KpoRingp(a[n]));
                   2632: }
                   2633:
                   2634:
                   2635:
                   2636:
                   2637:
                   2638: /******************************************************************
                   2639:      error handler
                   2640: ******************************************************************/
                   2641:
                   2642: errorKan1(str,message)
                   2643: char *str;
                   2644: char *message;
                   2645: {
                   2646:   extern char *GotoLabel;
                   2647:   extern int GotoP;
                   2648:   extern int ErrorMessageMode;
                   2649:   char tmpc[1024];
                   2650:   if (ErrorMessageMode == 1 || ErrorMessageMode == 2) {
                   2651:     sprintf(tmpc,"\nERROR(kanExport[0|1].c): ");
                   2652:     if (strlen(message) < 900) {
                   2653:       strcat(tmpc,message);
                   2654:     }
                   2655:     pushErrorStack(KnewErrorPacket(SerialCurrent,-1,tmpc));
                   2656:   }
                   2657:   if (ErrorMessageMode != 1) {
                   2658:     fprintf(stderr,"\nERROR(kanExport[0|1].c): ");
                   2659:     fprintf(stderr,str,message);
                   2660:   }
                   2661:   /* fprintf(stderr,"Hello "); */
                   2662:   if (GotoP) {
                   2663:     /* fprintf(stderr,"Hello. GOTO "); */
                   2664:     fprintf(Fstack,"The interpreter was looking for the label <<%s>>. It is also aborted.\n",GotoLabel);
                   2665:     GotoP = 0;
                   2666:   }
                   2667:   stdOperandStack(); contextControl(CCRESTORE);
                   2668:   /* fprintf(stderr,"Now. Long jump!\n"); */
                   2669:   longjmp(EnvOfStackMachine,1);
                   2670: }
                   2671:
                   2672: warningKan(str)
                   2673: char *str;
                   2674: {
                   2675:   extern int WarningMessageMode;
                   2676:   extern int Strict;
                   2677:   char tmpc[1024];
                   2678:   if (WarningMessageMode == 1 || WarningMessageMode == 2) {
                   2679:     sprintf(tmpc,"\nWARNING(kanExport[0|1].c): ");
                   2680:     if (strlen(str) < 900) {
                   2681:       strcat(tmpc,str);
                   2682:     }
                   2683:     pushErrorStack(KnewErrorPacket(SerialCurrent,-1,tmpc));
                   2684:   }
                   2685:   if (WarningMessageMode != 1) {
                   2686:     fprintf(stderr,"\nWARNING(kanExport[0|1].c): ");
                   2687:     fprintf(stderr,str);
                   2688:     fprintf(stderr,"\n");
                   2689:   }
                   2690:   /* if (Strict) errorKan1("%s\n"," "); */
                   2691:   if (Strict) errorKan1("%s\n",str);
                   2692:   return(0);
                   2693: }
                   2694:
                   2695:
                   2696:
                   2697:

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