/* $OpenXM: OpenXM/src/kan96xx/Kan/kanExport0.c,v 1.28 2004/08/31 04:45:42 takayama Exp $ */ #include #include "datatype.h" #include "stackm.h" #include "extern.h" #include "extern2.h" #include "lookup.h" #include "matrix.h" #include "gradedset.h" #include "kclass.h" #define universalToPoly(un,rp) (isZero(un)?ZERO:coeffToPoly(un,rp)) static void checkDuplicateName(char *xvars[],char *dvars[],int n); static void yet() { fprintf(stderr,"Not implemented."); } int SerialCurrent = -1; /* Current Serial number of the recieved packet as server. */ int ReverseOutputOrder = 1; int WarningNoVectorVariable = 1; extern int QuoteMode; /** :arithmetic **/ struct object KooAdd(ob1,ob2) struct object ob1,ob2; { extern struct ring *CurrentRingp; struct object rob = NullObject; POLY r; int s,i; objectp f1,f2,g1,g2; struct object nn,dd; switch (Lookup[ob1.tag][ob2.tag]) { case SintegerSinteger: return(KpoInteger(ob1.lc.ival + ob2.lc.ival)); break; case SpolySpoly: r = ppAdd(ob1.lc.poly,ob2.lc.poly); rob.tag = Spoly; rob.lc.poly = r; return(rob); break; case SarraySarray: s = getoaSize(ob1); if (s != getoaSize(ob2)) { errorKan1("%s\n","Two arrays must have a same size."); } rob = newObjectArray(s); for (i=0; im->ringp),r); return(rob); break; case SpolySuniversalNumber: return(KooAdd(ob2,ob1)); break; case SuniversalNumberSinteger: rob.tag = SuniversalNumber; rob.lc.universalNumber = newUniversalNumber(0); nn.tag = SuniversalNumber; nn.lc.universalNumber = newUniversalNumber(KopInteger(ob2)); Cadd(rob.lc.universalNumber,ob1.lc.universalNumber,nn.lc.universalNumber); return(rob); break; case SintegerSuniversalNumber: rob.tag = SuniversalNumber; rob.lc.universalNumber = newUniversalNumber(0); nn.tag = SuniversalNumber; nn.lc.universalNumber = newUniversalNumber(KopInteger(ob1)); Cadd(rob.lc.universalNumber,nn.lc.universalNumber,ob2.lc.universalNumber); return(rob); break; case SrationalFunctionSrationalFunction: f1 = Knumerator(ob1); f2 = Kdenominator(ob1); g1 = Knumerator(ob2); g2 = Kdenominator(ob2); nn = KooAdd(KooMult(*g2,*f1),KooMult(*f2,*g1)); dd = KooMult(*f2,*g2); rob = KnewRationalFunction0(copyObjectp(&nn),copyObjectp(&dd)); KisInvalidRational(&rob); return(rob); break; case SpolySrationalFunction: /* f1 + g1/g2 = (g2 f1 + g1)/g2 */ case SuniversalNumberSrationalFunction: g1 = Knumerator(ob2); g2 = Kdenominator(ob2); nn = KooAdd(KooMult(*g2,ob1),*g1); rob = KnewRationalFunction0(copyObjectp(&nn),g2); KisInvalidRational(&rob); return(rob); break; case SrationalFunctionSpoly: case SrationalFunctionSuniversalNumber: return(KooAdd(ob2,ob1)); break; case SdoubleSdouble: return(KpoDouble( KopDouble(ob1) + KopDouble(ob2) )); break; case SdoubleSinteger: case SdoubleSuniversalNumber: case SdoubleSrationalFunction: return(KpoDouble( KopDouble(ob1) + toDouble0(ob2) ) ); break; case SintegerSdouble: case SuniversalNumberSdouble: case SrationalFunctionSdouble: return(KpoDouble( toDouble0(ob1) + KopDouble(ob2) ) ); break; case SclassSclass: case SclassSinteger: case SclassSpoly: case SclassSuniversalNumber: case SclassSrationalFunction: case SclassSdouble: case SpolySclass: case SintegerSclass: case SuniversalNumberSclass: case SrationalFunctionSclass: case SdoubleSclass: return(Kclass_ooAdd(ob1,ob2)); break; default: if (QuoteMode) { rob = addTree(ob1,ob2); }else{ warningKan("KooAdd() has not supported yet these objects.\n"); } break; } return(rob); } struct object KooSub(ob1,ob2) struct object ob1,ob2; { struct object rob = NullObject; POLY r; int s,i; objectp f1,f2,g1,g2; extern struct coeff *UniversalZero; struct object nn,dd; switch (Lookup[ob1.tag][ob2.tag]) { case SintegerSinteger: return(KpoInteger(ob1.lc.ival - ob2.lc.ival)); break; case SpolySpoly: r = ppSub(ob1.lc.poly,ob2.lc.poly); rob.tag = Spoly; rob.lc.poly = r; return(rob); break; case SarraySarray: s = getoaSize(ob1); if (s != getoaSize(ob2)) { errorKan1("%s\n","Two arrays must have a same size."); } rob = newObjectArray(s); for (i=0; im->ringp),r); return(rob); break; case SpolySuniversalNumber: rob.tag = Spoly; r = ob1.lc.poly; if (r ISZERO) { rob.tag = SuniversalNumber; rob.lc.universalNumber = newUniversalNumber(0); Csub(rob.lc.universalNumber,UniversalZero,ob2.lc.universalNumber); return(rob); /* returns universal number. */ } rob.lc.poly = ppSub(r,universalToPoly(ob2.lc.universalNumber,r->m->ringp)); return(rob); break; case SuniversalNumberSinteger: rob.tag = SuniversalNumber; rob.lc.universalNumber = newUniversalNumber(0); nn.tag = SuniversalNumber; nn.lc.universalNumber = newUniversalNumber(KopInteger(ob2)); Csub(rob.lc.universalNumber,ob1.lc.universalNumber,nn.lc.universalNumber); return(rob); break; case SintegerSuniversalNumber: rob.tag = SuniversalNumber; rob.lc.universalNumber = newUniversalNumber(0); nn.tag = SuniversalNumber; nn.lc.universalNumber = newUniversalNumber(KopInteger(ob1)); Csub(rob.lc.universalNumber,nn.lc.universalNumber,ob2.lc.universalNumber); return(rob); break; case SrationalFunctionSrationalFunction: f1 = Knumerator(ob1); f2 = Kdenominator(ob1); g1 = Knumerator(ob2); g2 = Kdenominator(ob2); nn = KooSub(KooMult(*g2,*f1),KooMult(*f2,*g1)); dd = KooMult(*f2,*g2); rob = KnewRationalFunction0(copyObjectp(&nn),copyObjectp(&dd)); KisInvalidRational(&rob); return(rob); break; case SpolySrationalFunction: /* f1 - g1/g2 = (g2 f1 - g1)/g2 */ case SuniversalNumberSrationalFunction: g1 = Knumerator(ob2); g2 = Kdenominator(ob2); nn = KooSub(KooMult(*g2,ob1),*g1); rob = KnewRationalFunction0(copyObjectp(&nn),g2); KisInvalidRational(&rob); return(rob); break; case SrationalFunctionSpoly: case SrationalFunctionSuniversalNumber: /* f1/f2 - ob2= (f1 - f2*ob2)/f2 */ f1 = Knumerator(ob1); f2 = Kdenominator(ob1); nn = KooSub(*f1,KooMult(*f2,ob2)); rob = KnewRationalFunction0(copyObjectp(&nn),f2); KisInvalidRational(&rob); return(rob); break; case SdoubleSdouble: return(KpoDouble( KopDouble(ob1) - KopDouble(ob2) )); break; case SdoubleSinteger: case SdoubleSuniversalNumber: case SdoubleSrationalFunction: return(KpoDouble( KopDouble(ob1) - toDouble0(ob2) ) ); break; case SintegerSdouble: case SuniversalNumberSdouble: case SrationalFunctionSdouble: return(KpoDouble( toDouble0(ob1) - KopDouble(ob2) ) ); break; default: if (QuoteMode) { rob = minusTree(ob1,ob2); }else{ warningKan("KooSub() has not supported yet these objects.\n"); } break; } return(rob); } struct object KooMult(ob1,ob2) struct object ob1,ob2; { struct object rob = NullObject; POLY r; int i,s; objectp f1,f2,g1,g2; struct object dd,nn; switch (Lookup[ob1.tag][ob2.tag]) { case SintegerSinteger: return(KpoInteger(ob1.lc.ival * ob2.lc.ival)); break; case SpolySpoly: r = ppMult(ob1.lc.poly,ob2.lc.poly); rob.tag = Spoly; rob.lc.poly = r; return(rob); break; case SarraySarray: return(KaoMult(ob1,ob2)); break; case SpolySarray: case SuniversalNumberSarray: case SrationalFunctionSarray: case SintegerSarray: s = getoaSize(ob2); rob = newObjectArray(s); for (i=0; im->ringp),r); return(rob); break; case SpolySuniversalNumber: return(KooMult(ob2,ob1)); break; case SuniversalNumberSinteger: rob.tag = SuniversalNumber; rob.lc.universalNumber = newUniversalNumber(0); nn.tag = SuniversalNumber; nn.lc.universalNumber = newUniversalNumber(KopInteger(ob2)); Cmult(rob.lc.universalNumber,ob1.lc.universalNumber,nn.lc.universalNumber); return(rob); break; case SintegerSuniversalNumber: rob.tag = SuniversalNumber; rob.lc.universalNumber = newUniversalNumber(0); nn.tag = SuniversalNumber; nn.lc.universalNumber = newUniversalNumber(KopInteger(ob1)); Cmult(rob.lc.universalNumber,nn.lc.universalNumber,ob2.lc.universalNumber); return(rob); break; case SrationalFunctionSrationalFunction: f1 = Knumerator(ob1); f2 = Kdenominator(ob1); g1 = Knumerator(ob2); g2 = Kdenominator(ob2); nn = KooMult(*f1,*g1); dd = KooMult(*f2,*g2); rob = KnewRationalFunction0(copyObjectp(&nn),copyObjectp(&dd)); KisInvalidRational(&rob); return(rob); break; case SpolySrationalFunction: /* ob1 g1/g2 */ case SuniversalNumberSrationalFunction: g1 = Knumerator(ob2); g2 = Kdenominator(ob2); nn = KooMult(ob1,*g1); rob = KnewRationalFunction0(copyObjectp(&nn),g2); KisInvalidRational(&rob); return(rob); break; case SrationalFunctionSpoly: case SrationalFunctionSuniversalNumber: /* f1*ob2/f2 */ f1 = Knumerator(ob1); f2 = Kdenominator(ob1); nn = KooMult(*f1,ob2); rob = KnewRationalFunction0(copyObjectp(&nn),f2); KisInvalidRational(&rob); return(rob); break; case SdoubleSdouble: return(KpoDouble( KopDouble(ob1) * KopDouble(ob2) )); break; case SdoubleSinteger: case SdoubleSuniversalNumber: case SdoubleSrationalFunction: return(KpoDouble( KopDouble(ob1) * toDouble0(ob2) ) ); break; case SintegerSdouble: case SuniversalNumberSdouble: case SrationalFunctionSdouble: return(KpoDouble( toDouble0(ob1) * KopDouble(ob2) ) ); break; default: if (QuoteMode) { rob = timesTree(ob1,ob2); }else{ warningKan("KooMult() has not supported yet these objects.\n"); } break; } return(rob); } struct object KoNegate(obj) struct object obj; { struct object rob = NullObject; extern struct ring SmallRing; struct object tob; switch(obj.tag) { case Sinteger: rob = obj; rob.lc.ival = -rob.lc.ival; break; case Spoly: rob.tag = Spoly; rob.lc.poly = ppSub(ZERO,obj.lc.poly); break; case SuniversalNumber: rob.tag = SuniversalNumber; rob.lc.universalNumber = coeffNeg(obj.lc.universalNumber,&SmallRing); break; case SrationalFunction: rob.tag = SrationalFunction; tob = KoNegate(*(Knumerator(obj))); Knumerator(rob) = copyObjectp( &tob); Kdenominator(rob) = Kdenominator(obj); break; case Sdouble: rob = KpoDouble( - toDouble0(obj) ); break; default: if (QuoteMode) { rob = unaryminusTree(obj); }else{ warningKan("KoNegate() has not supported yet these objects.\n"); } break; } return(rob); } struct object KoInverse(obj) struct object obj; { struct object rob = NullObject; extern struct coeff *UniversalOne; objectp onep; struct object tob; switch(obj.tag) { case Spoly: tob.tag = SuniversalNumber; tob.lc.universalNumber = UniversalOne; onep = copyObjectp(& tob); rob = KnewRationalFunction0(onep,copyObjectp(&obj)); KisInvalidRational(&rob); break; case SuniversalNumber: tob.tag = SuniversalNumber; tob.lc.universalNumber = UniversalOne; onep = copyObjectp(& tob); rob = KnewRationalFunction0(onep,copyObjectp(&obj)); KisInvalidRational(&rob); break; case SrationalFunction: rob = obj; Knumerator(rob) = Kdenominator(obj); Kdenominator(rob) = Knumerator(obj); KisInvalidRational(&rob); break; default: warningKan("KoInverse() has not supported yet these objects.\n"); break; } return(rob); } static int isVector(ob) struct object ob; { int i,n; n = getoaSize(ob); for (i=0; i scalar.*/ rsize = getoaSize(aa); if (rsize != getoaSize(bb)) { errorKan1("%s\n","KaoMult(vector,vector). The size of the vectors must be the same."); } if (r1 != 0) { ob1 = getoa(aa,0); if (ob1.tag == Spoly) { rob.tag = Spoly; rob.lc.poly = ZERO; }else if (ob1.tag == Sinteger) { rob.tag = Sinteger; rob.lc.ival = 0; }else { rob.tag = SuniversalNumber; rob.lc.universalNumber = intToCoeff(0,&SmallRing); } }else{ rob.tag = Spoly; rob.lc.poly = ZERO; } for (i=0; i vector */ /* (m n) (m2=n) */ n = getoaSize(getoa(aa,0)); if (isMatrix(aa,m,n) == 0) { errorKan1("%s\n","KaoMult(matrix,vector). The left object is not matrix."); }else if (n != m2) { errorKan1("%s\n","KaoMult(). Invalid matrix and vector sizes for mult."); } else ; rob = newObjectArray(m); for (i=0; i vector */ tob = newObjectArray(1); getoa(tob,0) = aa; /* [aa] * bb and strip [ ] */ tob = KooMult(tob,bb); return(getoa(tob,0)); } else ; /* continue: matrix X matrix case. */ /* end of new code */ if (getoa(aa,0).tag != Sarray || getoa(bb,0).tag != Sarray) { errorKan1("%s\n","KaoMult(). Matrix must be given."); } n = getoaSize(getoa(aa,0)); n2 = getoaSize(getoa(bb,0)); if (n != m2) errorKan1("%s\n","KaoMult(). Invalid matrix size for mult. ((p,q)X(q,r)"); r1 = isMatrix(aa,m,n); r2 = isMatrix(bb,m2,n2); if (r1 == -1 || r2 == -1) { /* Object multiplication. Elements are not polynomials. */ struct object ofik,ogkj,otmp; rob = newObjectArray(m); for (i=0; i 0)); break; default: warningKan("KoIsPositive() has not supported yet these objects.\n"); break; } return(rob); } struct object KooGreater(obj1,obj2) struct object obj1; struct object obj2; { struct object ob; int tt; if (obj1.tag != obj2.tag) { errorKan1("%s\n","You cannot compare different kinds of objects."); } switch(obj1.tag) { case 0: return(KpoInteger(1)); /* case of NullObject */ break; case Sinteger: if (obj1.lc.ival > obj2.lc.ival) return(KpoInteger(1)); else return(KpoInteger(0)); break; case Sstring: case Sdollar: if (strcmp(obj1.lc.str, obj2.lc.str)>0) return(KpoInteger(1)); else return(KpoInteger(0)); break; case Spoly: if ((*mmLarger)(obj1.lc.poly,obj2.lc.poly) == 1) return(KpoInteger(1)); else return(KpoInteger(0)); break; case SuniversalNumber: tt = coeffGreater(obj1.lc.universalNumber,obj2.lc.universalNumber); if (tt > 0) return(KpoInteger(1)); else return(KpoInteger(0)); break; case Sdouble: if ( KopDouble(obj1) > KopDouble(obj2) ) return(KpoInteger(1)); else return(KpoInteger(0)); break; case Sarray: { int i,m1,m2; struct object rr; m1 = getoaSize(obj1); m2 = getoaSize(obj2); for (i=0; i< (m1>m2?m2:m1); i++) { rr=KooGreater(getoa(obj1,i),getoa(obj2,i)); if (KopInteger(rr) == 1) return rr; rr=KooGreater(getoa(obj2,i),getoa(obj1,i)); if (KopInteger(rr) == 1) return KpoInteger(0); } if (m1 > m2) return KpoInteger(1); else return KpoInteger(0); } break; default: errorKan1("%s\n","KooGreater() has not supported these objects yet."); break; } } struct object KooLess(obj1,obj2) struct object obj1; struct object obj2; { struct object ob; int tt; if (obj1.tag != obj2.tag) { errorKan1("%s\n","You cannot compare different kinds of objects."); } switch(obj1.tag) { case 0: return(KpoInteger(1)); /* case of NullObject */ break; case Sinteger: if (obj1.lc.ival < obj2.lc.ival) return(KpoInteger(1)); else return(KpoInteger(0)); break; case Sstring: case Sdollar: if (strcmp(obj1.lc.str, obj2.lc.str)<0) return(KpoInteger(1)); else return(KpoInteger(0)); break; case Spoly: if ((*mmLarger)(obj2.lc.poly,obj1.lc.poly) == 1) return(KpoInteger(1)); else return(KpoInteger(0)); break; case SuniversalNumber: tt = coeffGreater(obj1.lc.universalNumber,obj2.lc.universalNumber); if (tt < 0) return(KpoInteger(1)); else return(KpoInteger(0)); break; case Sdouble: if ( KopDouble(obj1) < KopDouble(obj2) ) return(KpoInteger(1)); else return(KpoInteger(0)); break; case Sarray: { int i,m1,m2; struct object rr; m1 = getoaSize(obj1); m2 = getoaSize(obj2); for (i=0; i< (m1>m2?m2:m1); i++) { rr=KooLess(getoa(obj1,i),getoa(obj2,i)); if (KopInteger(rr) == 1) return rr; rr=KooLess(getoa(obj2,i),getoa(obj1,i)); if (KopInteger(rr) == 1) return KpoInteger(0); } if (m1 < m2) return KpoInteger(1); else return KpoInteger(0); } break; default: errorKan1("%s\n","KooLess() has not supported these objects yet."); break; } } /* :conversion */ struct object KdataConversion(obj,key) struct object obj; char *key; { char tmps[128]; /* Assume that double is not more than 128 digits */ char intstr[100]; /* Assume that int is not more than 100 digits */ struct object rob; extern struct ring *CurrentRingp; extern struct ring SmallRing; int flag; struct object rob1,rob2; char *s; int i; double f; double f2; /* reports the data type */ if (key[0] == 't' || key[0] =='e') { if (strcmp(key,"type?")==0) { rob = KpoInteger(obj.tag); return(rob); }else if (strcmp(key,"type??")==0) { if (obj.tag != Sclass) { rob = KpoInteger(obj.tag); }else { rob = KpoInteger(ectag(obj)); } return(rob); }else if (strcmp(key,"error")==0) { rob = KnewErrorPacketObj(obj); return(rob); } } switch(obj.tag) { case Snull: if (strcmp(key,"integer") == 0) { rob = KpoInteger(0); return(rob); }else if (strcmp(key,"universalNumber") == 0) { rob.tag = SuniversalNumber; rob.lc.universalNumber = intToCoeff(obj.lc.ival,&SmallRing); return(rob); }else if (strcmp(key,"poly") == 0) { rob = KpoPOLY(ZERO); }else{ warningKan("Sorry. The data conversion from null to this data type has not supported yet.\n"); } break; case Sinteger: if (strcmp(key,"string") == 0) { /* ascii code */ rob.tag = Sdollar; rob.lc.str = (char *)sGC_malloc(2); if (rob.lc.str == (char *)NULL) errorKan1("%s","No more memory.\n"); (rob.lc.str)[0] = obj.lc.ival; (rob.lc.str)[1] = '\0'; return(rob); }else if (strcmp(key,"integer")==0) { return(obj); }else if (strcmp(key,"poly") == 0) { rob.tag = Spoly; rob.lc.poly = cxx(obj.lc.ival,0,0,CurrentRingp); return(rob); }else if (strcmp(key,"dollar") == 0) { rob.tag = Sdollar; sprintf(intstr,"%d",obj.lc.ival); rob.lc.str = (char *)sGC_malloc(strlen(intstr)+2); if (rob.lc.str == (char *)NULL) errorKan1("%s","No more memory.\n"); strcpy(rob.lc.str,intstr); return(rob); }else if (strcmp(key,"universalNumber")==0) { rob = KintToUniversalNumber(obj.lc.ival); return(rob); }else if (strcmp(key,"double") == 0) { rob = KpoDouble((double) (obj.lc.ival)); return(rob); }else if (strcmp(key,"null") == 0) { rob = NullObject; return(rob); }else{ warningKan("Sorry. This type of data conversion has not supported yet.\n"); } break; case Sdollar: if (strcmp(key,"dollar") == 0 || strcmp(key,"string")==0) { rob = obj; return(rob); }else if (strcmp(key,"literal") == 0) { rob.tag = Sstring; s = (char *) sGC_malloc(sizeof(char)*(strlen(obj.lc.str)+3)); if (s == (char *) NULL) { errorKan1("%s\n","No memory."); } s[0] = '/'; strcpy(&(s[1]),obj.lc.str); rob.lc.str = &(s[1]); /* set the hashing value. */ rob2 = lookupLiteralString(s); rob.rc.op = rob2.lc.op; return(rob); }else if (strcmp(key,"poly")==0) { rob.tag = Spoly; rob.lc.poly = stringToPOLY(obj.lc.str,CurrentRingp); return(rob); }else if (strcmp(key,"array")==0) { rob = newObjectArray(strlen(obj.lc.str)); for (i=0; i ' ' && flag == 0) flag=1; else if ((obj.lc.str)[i] <= ' ' && flag == 1) flag = 2; else if ((obj.lc.str)[i] > ' ' && flag == 2) flag=3; } if (flag == 3) errorKan1("KdataConversion(): %s","The data for the double contains blanck(s)"); /* Read the double. */ if (sscanf(obj.lc.str,"%lf",&f) <= 0) { errorKan1("KdataConversion(): %s","It cannot be translated to double."); } rob = KpoDouble(f); return(rob); }else if (strcmp(key,"null") == 0) { rob = NullObject; return(rob); }else{ warningKan("Sorry. This type of data conversion has not supported yet.\n"); } break; case Sarray: if (strcmp(key,"array") == 0) { return(rob); }else if (strcmp(key,"list") == 0) { rob = *( arrayToList(obj) ); return(rob); }else if (strcmp(key,"arrayOfPOLY")==0) { rob = KpoArrayOfPOLY(arrayToArrayOfPOLY(obj)); return(rob); }else if (strcmp(key,"matrixOfPOLY")==0) { rob = KpoMatrixOfPOLY(arrayToMatrixOfPOLY(obj)); return(rob); }else if (strcmp(key,"gradedPolySet")==0) { rob = KpoGradedPolySet(arrayToGradedPolySet(obj)); return(rob); }else if (strcmp(key,"null") == 0) { rob = NullObject; return(rob); }else { { /* Automatically maps the elements. */ int n,i; n = getoaSize(obj); rob = newObjectArray(n); for (i=0; icoeffp))); } }else if (strcmp(key,"string")==0 || strcmp(key,"dollar")==0) { rob.tag = Sdollar; rob.lc.str = KPOLYToString(KopPOLY(obj)); return(rob); }else if (strcmp(key,"array") == 0) { return( POLYToArray(KopPOLY(obj))); }else if (strcmp(key,"map")==0) { return(KringMap(obj)); }else if (strcmp(key,"universalNumber")==0) { if (obj.lc.poly == ZERO) { rob.tag = SuniversalNumber; rob.lc.universalNumber = newUniversalNumber(0); } else { if (obj.lc.poly->coeffp->tag == MP_INTEGER) { rob.tag = SuniversalNumber; rob.lc.universalNumber = newUniversalNumber2(obj.lc.poly->coeffp->val.bigp); }else { rob = NullObject; warningKan("Coefficient is not MP_INT."); } } return(rob); }else if (strcmp(key,"ring")==0) { if (obj.lc.poly ISZERO) { warningKan("Zero polynomial does not have the ring structure field.\n"); }else{ rob.tag = Sring; rob.lc.ringp = (obj.lc.poly)->m->ringp; return(rob); } }else if (strcmp(key,"null") == 0) { rob = NullObject; return(rob); }else{ warningKan("Sorry. This type of data conversion has not supported yet.\n"); } break; case SarrayOfPOLY: if (strcmp(key,"array")==0) { rob = arrayOfPOLYToArray(KopArrayOfPOLYp(obj)); return(rob); }else{ warningKan("Sorry. This type of data conversion has not supported yet.\n"); } break; case SmatrixOfPOLY: if (strcmp(key,"array")==0) { rob = matrixOfPOLYToArray(KopMatrixOfPOLYp(obj)); return(rob); }else if (strcmp(key,"null") == 0) { rob = NullObject; return(rob); }else{ warningKan("Sorry. This type of data conversion has not supported yet.\n"); } break; case Slist: if (strcmp(key,"array") == 0) { rob = listToArray(&obj); return(rob); } break; case SuniversalNumber: if ((strcmp(key,"universalNumber")==0) || (strcmp(key,"numerator")==0)) { rob = obj; return(rob); }else if (strcmp(key,"integer")==0) { rob = KpoInteger(coeffToInt(obj.lc.universalNumber)); return(rob); }else if (strcmp(key,"poly")==0) { rob = KpoPOLY(universalToPoly(obj.lc.universalNumber,CurrentRingp)); return(rob); }else if (strcmp(key,"string")==0 || strcmp(key,"dollar")==0) { rob.tag = Sdollar; rob.lc.str = coeffToString(obj.lc.universalNumber); return(rob); }else if (strcmp(key,"null") == 0) { rob = NullObject; return(rob); }else if (strcmp(key,"double") == 0) { rob = KpoDouble( toDouble0(obj) ); return(rob); }else if (strcmp(key,"denominator") == 0) { rob = KintToUniversalNumber(1); return(rob); }else{ warningKan("Sorry. This type of data conversion of universalNumber has not supported yet.\n"); } break; case SrationalFunction: if (strcmp(key,"rationalFunction")==0) { return(rob); } if (strcmp(key,"numerator")==0) { rob = *(Knumerator(obj)); return(rob); }else if (strcmp(key,"denominator")==0) { rob = *(Kdenominator(obj)); return(rob); }else if (strcmp(key,"string")==0 || strcmp(key,"dollar")==0) { rob1 = KdataConversion(*(Knumerator(obj)),"string"); rob2 = KdataConversion(*(Kdenominator(obj)),"string"); s = sGC_malloc(sizeof(char)*( strlen(rob1.lc.str) + strlen(rob2.lc.str) + 10)); if (s == (char *)NULL) errorKan1("%s\n","KdataConversion(): No memory"); sprintf(s,"(%s)/(%s)",rob1.lc.str,rob2.lc.str); rob.tag = Sdollar; rob.lc.str = s; return(rob); }else if (strcmp(key,"cancel")==0) { warningKan("Sorry. Data conversion <> of rationalFunction has not supported yet.\n"); return(obj); }else if (strcmp(key,"null") == 0) { rob = NullObject; return(rob); }else if (strcmp(key,"double") == 0) { rob = KpoDouble( toDouble0(obj) ); return(rob); }else{ warningKan("Sorry. This type of data conversion of rationalFunction has not supported yet.\n"); } break; case Sdouble: if (strcmp(key,"integer") == 0) { rob = KpoInteger( (int) KopDouble(obj)); return(rob); } else if (strcmp(key,"universalNumber") == 0) { rob.tag = SuniversalNumber; rob.lc.universalNumber = intToCoeff((int) KopDouble(obj),&SmallRing); return(rob); }else if ((strcmp(key,"string") == 0) || (strcmp(key,"dollar") == 0)) { sprintf(tmps,"%f",KopDouble(obj)); s = sGC_malloc(strlen(tmps)+2); if (s == (char *)NULL) errorKan1("%s\n","KdataConversion(): No memory"); strcpy(s,tmps); rob.tag = Sdollar; rob.lc.str = s; return(rob); }else if (strcmp(key,"double")==0) { return(obj); }else if (strcmp(key,"null") == 0) { rob = NullObject; return(rob); }else { warningKan("Sorry. This type of data conversion of rationalFunction has not supported yet.\n"); } break; case Sring: if (strcmp(key,"orderMatrix")==0) { rob = oGetOrderMatrix(KopRingp(obj)); return(rob); }else if (strcmp(key,"oxRingStructure")==0) { rob = oRingToOXringStructure(KopRingp(obj)); return(rob); }else{ warningKan("Sorryl This type of data conversion of ringp has not supported yet.\n"); } break; default: warningKan("Sorry. This type of data conversion has not supported yet.\n"); } return(NullObject); } /* cf. macro to_int */ struct object Kto_int(struct object ob) { int n,i; struct object otmp; struct object rob; if (ob.tag == SuniversalNumber) return KdataConversion(ob,"integer"); if (ob.tag == Sarray) { n = getoaSize(ob); rob = newObjectArray(n); for (i=0; in; a = aa->array; r = newObjectArray(size); for (j=0; jm; n = pmat->n; mat = pmat->mat; r = newObjectArray(m); for (i=0; in = size; ap->array = a; return(ap); } struct matrixOfPOLY *arrayToMatrixOfPOLY(oa) struct object oa; { POLY *a; int m; int n; int i,j; struct matrixOfPOLY *ma; struct object tmp,tmp2; if (oa.tag != Sarray) errorKan1("KarrayToMatrixOfPOLY(): %s", "Argument is not array\n"); m = getoaSize(oa); tmp = getoa(oa,0); if (tmp.tag != Sarray) errorKan1("arrayToMatrixOfPOLY():%s ", "Argument is not array\n"); n = getoaSize(tmp); a = (POLY *)sGC_malloc(sizeof(POLY)*(m*n)); for (i=0; im = m; ma->n = n; ma->mat = a; return(ma); } /* :misc */ /* :ring :kan */ int objArrayToOrderMatrix(oA,order,n,oasize) struct object oA; int order[]; int n; int oasize; { int size; int k,j; struct object tmpOa; struct object obj; if (oA.tag != Sarray) { warningKan("The argument should be of the form [ [...] [...] ... [...]]."); return(-1); } size = getoaSize(oA); if (size != oasize) { warningKan("The row size of the array is wrong."); return(-1); } for (k=0; kn; c = CurrentRingp->c; l = CurrentRingp->l; if (oA.tag != Sarray) { warningKan("The argument should be of the form [ [...] [...] ... [...]]."); return(-1); } oasize = getoaSize(oA); order = (int *)sGC_malloc(sizeof(int)*((2*n)*oasize+1)); if (order == (int *)NULL) errorKan1("%s\n","KsetOrderByObjArray(): No memory."); if (objArrayToOrderMatrix(oA,order,n,oasize) == -1) { return(-1); } setOrderByMatrix(order,n,c,l,oasize); /* Set order to the current ring. */ return(0); } static int checkRelations(c,l,m,n,cc,ll,mm,nn) int c,l,m,n,cc,ll,mm,nn; { if (!(1<=c && c<=l && l<=m && m<=n)) return(1); if (!(cc<=ll && ll<=mm && mm<=nn && nn <= n)) return(1); if (!(ccn = n; newRingp->m = m; newRingp->l = l; newRingp->c = c; newRingp->nn = nn; newRingp->mm = mm; newRingp->ll = ll; newRingp->cc = cc; newRingp->x = xvars; newRingp->D = dvars; /* You don't need to set order and orderMatrixSize here. It was set by setOrder(). */ setFromTo(newRingp); newRingp->p = p; newRingp->next = nextRing; newRingp->multiplication = mpMult; /* These values should will be reset if the optional value is given. */ newRingp->schreyer = 0; newRingp->gbListTower = NULL; newRingp->outputOrder = outputVars; newRingp->weightedHomogenization = 0; newRingp->degreeShiftSize = 0; newRingp->degreeShiftN = 0; newRingp->degreeShift = NULL; if (ob5.tag != Sarray || (getoaSize(ob5) % 2) != 0) { errorKan1("%s\n","[(keyword) value (keyword) value ....] should be given."); } for (i=0; i < getoaSize(ob5); i += 2) { if (getoa(ob5,i).tag == Sdollar) { if (strcmp(KopString(getoa(ob5,i)),"mpMult") == 0) { if (getoa(ob5,i+1).tag != Sdollar) { errorKan1("%s\n","A keyword should be given. (mpMult)"); } fmp_mult_saved = F_mpMult; mpMultName = KopString(getoa(ob5,i+1)); switch_function("mpMult",mpMultName); /* Note that this cause a global effect. It will be done again. */ newRingp->multiplication = mpMult; switch_function("mpMult",fmp_mult_saved); } else if (strcmp(KopString(getoa(ob5,i)),"coefficient ring") == 0) { if (getoa(ob5,i+1).tag != Sring) { errorKan1("%s\n","The pointer to a ring should be given. (coefficient ring)"); } nextRing = KopRingp(getoa(ob5,i+1)); newRingp->next = nextRing; } else if (strcmp(KopString(getoa(ob5,i)),"valuation") == 0) { errorKan1("%s\n","Not implemented. (valuation)"); } else if (strcmp(KopString(getoa(ob5,i)),"characteristic") == 0) { if (getoa(ob5,i+1).tag != Sinteger) { errorKan1("%s\n","A integer should be given. (characteristic)"); } p = KopInteger(getoa(ob5,i+1)); newRingp->p = p; } else if (strcmp(KopString(getoa(ob5,i)),"schreyer") == 0) { if (getoa(ob5,i+1).tag != Sinteger) { errorKan1("%s\n","A integer should be given. (schreyer)"); } newRingp->schreyer = KopInteger(getoa(ob5,i+1)); } else if (strcmp(KopString(getoa(ob5,i)),"gbListTower") == 0) { if (getoa(ob5,i+1).tag != Slist) { errorKan1("%s\n","A list should be given (gbListTower)."); } newRingp->gbListTower = newObject(); *((struct object *)(newRingp->gbListTower)) = getoa(ob5,i+1); } else if (strcmp(KopString(getoa(ob5,i)),"ringName") == 0) { if (getoa(ob5,i+1).tag != Sdollar) { errorKan1("%s\n","A name should be given. (ringName)"); } ringName = KopString(getoa(ob5,i+1)); } else if (strcmp(KopString(getoa(ob5,i)),"weightedHomogenization") == 0) { if (getoa(ob5,i+1).tag != Sinteger) { errorKan1("%s\n","A integer should be given. (weightedHomogenization)"); } newRingp->weightedHomogenization = KopInteger(getoa(ob5,i+1)); } else if (strcmp(KopString(getoa(ob5,i)),"degreeShift") == 0) { if (getoa(ob5,i+1).tag != Sarray) { errorKan1("%s\n","An array of array should be given. (degreeShift)"); } { struct object ods; struct object ods2; int dssize,k,j,nn; ods=getoa(ob5,i+1); if ((getoaSize(ods) < 1) || (getoa(ods,0).tag != Sarray)) { errorKan1("%s\n", "An array of array should be given. (degreeShift)"); } nn = getoaSize(ods); dssize = getoaSize(getoa(ods,0)); newRingp->degreeShiftSize = dssize; newRingp->degreeShiftN = nn; newRingp->degreeShift = (int *) sGC_malloc(sizeof(int)*(dssize*nn+1)); if (newRingp->degreeShift == NULL) errorKan1("%s\n","No more memory."); for (j=0; jdegreeShift)[j*dssize+k] = coeffToInt(getoa(ods2,k).lc.universalNumber); }else{ (newRingp->degreeShift)[j*dssize+k] = KopInteger(getoa(ods2,k)); } } } } switch_function("grade","module1v"); /* Warning: grading is changed to module1v!! */ } else { errorKan1("%s\n","Unknown keyword to set_up_ring@"); } }else{ errorKan1("%s\n","A keyword enclosed by braces have to be given."); } } newRingp->name = ringName; if (AvoidTheSameRing) { aa = isTheSameRing(rstack,rp,newRingp); if (aa < 0) { /* This ring has never been defined. */ CurrentRingp = newRingp; /* Install it to the RingStack */ if (rp n; ox = ob; if (getoaSize(ox) != 2*n) { 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."); } xvars = (char **)sGC_malloc(sizeof(char *)*n); dvars = (char **)sGC_malloc(sizeof(char *)*n); if (xvars == NULL || dvars == NULL) { errorKan1("%s\n","KsetVariableNames(): no more memory."); } for (i=0; i<2*n; i++) { otmp = getoa(ox,i); if(otmp.tag != Sdollar) { errorKan1("%s\n","KsetVariableNames(): elements must be strings."); } if (i < n) { xvars[i] = KopString(otmp); }else{ dvars[i-n] = KopString(otmp); } } checkDuplicateName(xvars,dvars,n); rp->x = xvars; rp->D = dvars; return(ob); } void KshowRing(ringp) struct ring *ringp; { showRing(1,ringp); } struct object KswitchFunction(ob1,ob2) struct object ob1,ob2; { char *ans ; struct object rob; int needWarningForAvoidTheSameRing = 0; extern int AvoidTheSameRing; if ((ob1.tag != Sdollar) || (ob2.tag != Sdollar)) { errorKan1("%s\n","$function$ $name$ switch_function\n"); } if (AvoidTheSameRing && needWarningForAvoidTheSameRing) { if (strcmp(KopString(ob1),"mmLarger") == 0 || strcmp(KopString(ob1),"mpMult") == 0 || strcmp(KopString(ob1),"monomialAdd") == 0 || strcmp(KopString(ob1),"isSameComponent") == 0) { fprintf(stderr,",switch_function ==> %s ",KopString(ob1)); warningKan("switch_function might cause a trouble under AvoidTheSameRing == 1.\n"); } } if (AvoidTheSameRing) { if (strcmp(KopString(ob1),"mmLarger") == 0 && strcmp(KopString(ob2),"matrix") != 0) { fprintf(stderr,"mmLarger = %s",KopString(ob2)); errorKan1("%s\n","mmLarger can set only to matrix under AvoidTheSameRing == 1."); } } ans = switch_function(ob1.lc.str,ob2.lc.str); if (ans == NULL) { rob = NullObject; }else{ rob = KpoString(ans); } return(rob); } void KprintSwitchStatus(void) { print_switch_status(); } struct object KoReplace(of,rule) struct object of; struct object rule; { struct object rob; POLY f; POLY lRule[N0*2]; POLY rRule[N0*2]; POLY r; int i; int n; struct object trule; if (rule.tag != Sarray) { errorKan1("%s\n"," KoReplace(): The second argument must be array."); } n = getoaSize(rule); if (of.tag == Spoly) { }else if (of.tag ==Sclass && ectag(of) == CLASSNAME_recursivePolynomial) { return(KreplaceRecursivePolynomial(of,rule)); }else{ errorKan1("%s\n"," KoReplace(): The first argument must be a polynomial."); } f = KopPOLY(of); if (f ISZERO) { }else{ if (n >= 2*(f->m->ringp->n)) { errorKan1("%s\n"," KoReplace(): too many rules for replacement. "); } } for (i=0; im->ringp == CurrentRingp) return(obj); if (f->m->ringp == CurrentRingp->next) { r = newCell(newCoeff(),newMonomial(CurrentRingp)); r->coeffp->tag = POLY_COEFF; r->coeffp->val.f = f; return(KpoPOLY(r)); }else if (f->m->ringp == SyzRingp) { return(KpoPOLY(f->coeffp->val.f)); } errorKan1("%s\n","The ring map is not defined in this case."); } struct object Ksp(ob1,ob2) struct object ob1,ob2; { struct spValue sv; struct object rob,cob; POLY f; if (ob1.tag != Spoly || ob2.tag != Spoly) errorKan1("%s\n","Ksp(): The arguments must be polynomials."); sv = (*sp)(ob1.lc.poly,ob2.lc.poly); f = ppAddv(ppMult(sv.a,KopPOLY(ob1)), ppMult(sv.b,KopPOLY(ob2))); rob = newObjectArray(2); cob = newObjectArray(2); putoa(rob,1,KpoPOLY(f)); putoa(cob,0,KpoPOLY(sv.a)); putoa(cob,1,KpoPOLY(sv.b)); putoa(rob,0,cob); return(rob); } struct object Khead(ob) struct object ob; { if (ob.tag != Spoly) errorKan1("%s\n","Khead(): The argument should be a polynomial."); return(KpoPOLY(head( KopPOLY(ob)))); } /* :eval */ struct object Keval(obj) struct object obj; { char *key; int size; struct object rob; rob = NullObject; if (obj.tag != Sarray) errorKan1("%s\n","[$key$ arguments] eval"); if (getoaSize(obj) < 1) errorKan1("%s\n","[$key$ arguments] eval"); if (getoa(obj,0).tag != Sdollar) errorKan1("%s\n","[$key$ arguments] eval"); key = getoa(obj,0).lc.str; size = getoaSize(obj); return(rob); } /* :Utilities */ char *KremoveSpace(str) char str[]; { int size; int start; int end; char *s; int i; size = strlen(str); for (start = 0; start <= size; start++) { if (str[start] > ' ') break; } for (end = size-1; end >= 0; end--) { if (str[end] > ' ') break; } if (start > end) return((char *) NULL); s = (char *) sGC_malloc(sizeof(char)*(end-start+2)); if (s == (char *)NULL) errorKan1("%s\n","removeSpace(): No more memory."); for (i=0; i< end-start+1; i++) s[i] = str[i+start]; s[end-start+1] = '\0'; return(s); } struct object KtoRecords(ob) struct object ob; { struct object obj; struct object tmp; int i; int size; char **argv; obj = NullObject; switch(ob.tag) { case Sdollar: break; default: errorKan1("%s","Argument of KtoRecords() must be a string enclosed by dollars.\n"); break; } size = strlen(ob.lc.str)+3; argv = (char **) sGC_malloc((size+1)*sizeof(char *)); if (argv == (char **)NULL) errorKan1("%s","No more memory.\n"); size = KtoArgvbyCurryBrace(ob.lc.str,argv,size); if (size < 0) errorKan1("%s"," KtoRecords(): You have an error in the argument.\n"); obj = newObjectArray(size); for (i=0; i nothing (argc=0) {x}----> x (argc=1) {x,y} --> x y (argc=2) {ab, y, z } --> ab y z (argc=3) [[ab],c,d] --> [ab] c d */ { int argc; int n; int i; int k; char *a; char *ident; int level = 0; int comma; if (str == (char *)NULL) { fprintf(stderr,"You use NULL string to toArgvbyCurryBrace()\n"); return(0); } n = strlen(str); a = (char *) sGC_malloc(sizeof(char)*(n+3)); a[0]=' '; strcpy(&(a[1]),str); n = strlen(a); a[0] = '\0'; comma = -1; for (i=1; i ' ')) comma = 0; } if (comma == -1) return(0); argc=0; for (i=0; i limit) return(-argc); k = 0; for (i=0; i= limit) errorKan1("%s\n","KtoArgvbyCurryBraces(): k>=limit."); } } argc = k; /*for (i=0; i ' ')) { wc++; inblank = 0; }else if ((!inblank) && (s[i] <= ' ')) { inblank = 1; } } argv = (char **) sGC_malloc(sizeof(char *)*(wc+2)); argv[0] = NULL; inblank = 1; wc = 0; for (i=0; i ' ')) { argv[wc] = &(s[i]); argv[wc+1]=NULL; wc++; inblank = 0; }else if ((inblank == 0) && (s[i] <= ' ')) { inblank = 1; s[i] = 0; }else if (inblank && (s[i] <= ' ')) { s[i] = 0; } } rob = newObjectArray(wc); for (i=0; itag != SrationalFunction) return(0); if (KisZeroObject(Kdenominator(*op))) { errorKan1("%s\n","KisInvalidRational(): zero division. You have f/0."); } if (KisZeroObject(Knumerator(*op))) { op->tag = SuniversalNumber; op->lc.universalNumber = UniversalZero; } return(0); } struct object KgbExtension(struct object obj) { char *key; int size; struct object keyo; struct object rob = NullObject; struct object obj1,obj2,obj3; POLY f1; POLY f2; POLY f3; POLY f; int m,i; struct pairOfPOLY pf; struct coeff *cont; if (obj.tag != Sarray) errorKan1("%s\n","KgbExtension(): The argument must be an array."); size = getoaSize(obj); if (size < 1) errorKan1("%s\n","KgbExtension(): Empty array."); keyo = getoa(obj,0); if (keyo.tag != Sdollar) errorKan1("%s\n","KgbExtension(): No key word."); key = KopString(keyo); /* branch by the key word. */ if (strcmp(key,"isReducible")==0) { if (size != 3) errorKan1("%s\n","[(isReducible) poly1 poly2] gbext."); obj1 = getoa(obj,1); obj2 = getoa(obj,2); if (obj1.tag != Spoly || obj2.tag != Spoly) errorKan1("%s\n","[(isReducible) poly1 poly2] gb."); f1 = KopPOLY(obj1); f2 = KopPOLY(obj2); rob = KpoInteger((*isReducible)(f1,f2)); }else if (strcmp(key,"lcm") == 0) { if (size != 3) errorKan1("%s\n","[(lcm) poly1 poly2] gb."); obj1 = getoa(obj,1); obj2 = getoa(obj,2); if (obj1.tag != Spoly || obj2.tag != Spoly) errorKan1("%s\n","[(lcm) poly1 poly2] gbext."); f1 = KopPOLY(obj1); f2 = KopPOLY(obj2); rob = KpoPOLY((*lcm)(f1,f2)); }else if (strcmp(key,"grade")==0) { if (size != 2) errorKan1("%s\n","[(grade) poly1 ] gbext."); obj1 = getoa(obj,1); if (obj1.tag != Spoly) errorKan1("%s\n","[(grade) poly1 ] gbext."); f1 = KopPOLY(obj1); rob = KpoInteger((*grade)(f1)); }else if (strcmp(key,"mod")==0) { if (size != 3) errorKan1("%s\n","[(mod) poly num] gbext"); obj1 = getoa(obj,1); obj2 = getoa(obj,2); if (obj1.tag != Spoly || obj2.tag != SuniversalNumber) { errorKan1("%s\n","The datatype of the argument mismatch: [(mod) polynomial universalNumber] gbext"); } rob = KpoPOLY( modulopZ(KopPOLY(obj1),KopUniversalNumber(obj2)) ); }else if (strcmp(key,"tomodp")==0) { /* The ring must be a ring of characteristic p. */ if (size != 3) errorKan1("%s\n","[(tomod) poly ring] gbext"); obj1 = getoa(obj,1); obj2 = getoa(obj,2); if (obj1.tag != Spoly || obj2.tag != Sring) { errorKan1("%s\n","The datatype of the argument mismatch: [(tomod) polynomial ring] gbext"); } rob = KpoPOLY( modulop(KopPOLY(obj1),KopRingp(obj2)) ); }else if (strcmp(key,"tomod0")==0) { /* Ring must be a ring of characteristic 0. */ if (size != 3) errorKan1("%s\n","[(tomod0) poly ring] gbext"); obj1 = getoa(obj,1); obj2 = getoa(obj,2); if (obj1.tag != Spoly || obj2.tag != Sring) { errorKan1("%s\n","The datatype of the argument mismatch: [(tomod0) polynomial ring] gbext"); } errorKan1("%s\n","It has not been implemented."); rob = KpoPOLY( POLYNULL ); }else if (strcmp(key,"divByN")==0) { if (size != 3) errorKan1("%s\n","[(divByN) poly num] gbext"); obj1 = getoa(obj,1); obj2 = getoa(obj,2); if (obj1.tag != Spoly || obj2.tag != SuniversalNumber) { errorKan1("%s\n","The datatype of the argument mismatch: [(divByN) polynomial universalNumber] gbext"); } pf = quotientByNumber(KopPOLY(obj1),KopUniversalNumber(obj2)); rob = newObjectArray(2); putoa(rob,0,KpoPOLY(pf.first)); putoa(rob,1,KpoPOLY(pf.second)); }else if (strcmp(key,"isConstant")==0) { if (size != 2) errorKan1("%s\n","[(isConstant) poly ] gbext bool"); obj1 = getoa(obj,1); if (obj1.tag != Spoly) { errorKan1("%s\n","The datatype of the argument mismatch: [(isConstant) polynomial] gbext"); } return(KpoInteger(isConstant(KopPOLY(obj1)))); }else if (strcmp(key,"isConstantAll")==0) { if (size != 2) errorKan1("%s\n","[(isConstantAll) poly ] gbext bool"); obj1 = getoa(obj,1); if (obj1.tag != Spoly) { errorKan1("%s\n","The datatype of the argument mismatch: [(isConstantAll) polynomial] gbext"); } return(KpoInteger(isConstantAll(KopPOLY(obj1)))); }else if (strcmp(key,"schreyerSkelton") == 0) { if (size != 2) errorKan1("%s\n","[(schreyerSkelton) array_of_poly ] gbext array"); obj1 = getoa(obj,1); return(KschreyerSkelton(obj1)); }else if (strcmp(key,"lcoeff") == 0) { if (size != 2) errorKan1("%s\n","[(lcoeff) poly] gbext poly"); obj1 = getoa(obj,1); if (obj1.tag != Spoly) errorKan1("%s\n","[(lcoeff) poly] gbext poly"); f = KopPOLY(obj1); if (f == POLYNULL) return(KpoPOLY(f)); return(KpoPOLY( newCell(coeffCopy(f->coeffp),newMonomial(f->m->ringp)))); }else if (strcmp(key,"lmonom") == 0) { if (size != 2) errorKan1("%s\n","[(lmonom) poly] gbext poly"); obj1 = getoa(obj,1); if (obj1.tag != Spoly) errorKan1("%s\n","[(lmonom) poly] gbext poly"); f = KopPOLY(obj1); if (f == POLYNULL) return(KpoPOLY(f)); return(KpoPOLY( newCell(intToCoeff(1,f->m->ringp),monomialCopy(f->m)))); }else if (strcmp(key,"toes") == 0) { if (size != 2) errorKan1("%s\n","[(toes) array] gbext poly"); obj1 = getoa(obj,1); if (obj1.tag != Sarray) errorKan1("%s\n","[(toes) array] gbext poly"); return(KvectorToSchreyer_es(obj1)); }else if (strcmp(key,"toe_") == 0) { if (size != 2) errorKan1("%s\n","[(toe_) array] gbext poly"); obj1 = getoa(obj,1); if (obj1.tag == Spoly) return(obj1); if (obj1.tag != Sarray) errorKan1("%s\n","[(toe_) array] gbext poly"); return(KpoPOLY(arrayToPOLY(obj1))); }else if (strcmp(key,"isOrdered") == 0) { if (size != 2) errorKan1("%s\n","[(isOrdered) poly] gbext poly"); obj1 = getoa(obj,1); if (obj1.tag != Spoly) errorKan1("%s\n","[(isOrdered) poly] gbext poly"); return(KisOrdered(obj1)); }else if (strcmp(key,"reduceContent")==0) { if (size != 2) errorKan1("%s\n","[(reduceContent) poly1 ] gbext."); obj1 = getoa(obj,1); if (obj1.tag != Spoly) errorKan1("%s\n","[(reduceContent) poly1 ] gbext."); f1 = KopPOLY(obj1); rob = newObjectArray(2); f1 = reduceContentOfPoly(f1,&cont); putoa(rob,0,KpoPOLY(f1)); if (f1 == POLYNULL) { putoa(rob,1,KpoPOLY(f1)); }else{ putoa(rob,1,KpoPOLY(newCell(cont,newMonomial(f1->m->ringp)))); } }else if (strcmp(key,"ord_ws_all")==0) { if (size != 3) errorKan1("%s\n","[(ord_ws_all) fv wv] gbext"); obj1 = getoa(obj,1); obj2 = getoa(obj,2); rob = KordWsAll(obj1,obj2); }else if (strcmp(key,"exponents")==0) { if (size == 3) { obj1 = getoa(obj,1); obj2 = getoa(obj,2); rob = KgetExponents(obj1,obj2); }else if (size == 2) { obj1 = getoa(obj,1); obj2 = KpoInteger(2); rob = KgetExponents(obj1,obj2); }else{ errorKan1("%s\n","[(exponents) f type] gbext"); } }else { errorKan1("%s\n","gbext : unknown tag."); } return(rob); } struct object KmpzExtension(struct object obj) { char *key; int size; struct object keyo; struct object rob = NullObject; struct object obj0,obj1,obj2,obj3; MP_INT *f; MP_INT *g; MP_INT *h; MP_INT *r0; MP_INT *r1; MP_INT *r2; int gi; extern struct ring *SmallRingp; if (obj.tag != Sarray) errorKan1("%s\n","KmpzExtension(): The argument must be an array."); size = getoaSize(obj); if (size < 1) errorKan1("%s\n","KmpzExtension(): Empty array."); keyo = getoa(obj,0); if (keyo.tag != Sdollar) errorKan1("%s\n","KmpzExtension(): No key word."); key = KopString(keyo); /* branch by the key word. */ if (strcmp(key,"gcd")==0) { if (size != 3) errorKan1("%s\n","[(gcd) universalNumber universalNumber] mpzext."); obj1 = getoa(obj,1); obj2 = getoa(obj,2); if (obj1.tag != SuniversalNumber) { obj1 = KdataConversion(obj1,"universalNumber"); } if (obj2.tag != SuniversalNumber) { obj2 = KdataConversion(obj2,"universalNumber"); } if (obj1.tag != SuniversalNumber || obj2.tag != SuniversalNumber) errorKan1("%s\n","[(gcd) universalNumber universalNumber] mpzext."); if (! is_this_coeff_MP_INT(obj1.lc.universalNumber) || ! is_this_coeff_MP_INT(obj2.lc.universalNumber)) { errorKan1("%s\n","[(gcd) universalNumber universalNumber] mpzext."); } f = coeff_to_MP_INT(obj1.lc.universalNumber); g = coeff_to_MP_INT(obj2.lc.universalNumber); r1 = newMP_INT(); mpz_gcd(r1,f,g); rob.tag = SuniversalNumber; rob.lc.universalNumber = mpintToCoeff(r1,SmallRingp); }else if (strcmp(key,"tdiv_qr")==0) { if (size != 3) errorKan1("%s\n","[(tdiv_qr) universalNumber universalNumber] mpzext."); obj1 = getoa(obj,1); obj2 = getoa(obj,2); if (obj1.tag != SuniversalNumber) { obj1 = KdataConversion(obj1,"universalNumber"); } if (obj2.tag != SuniversalNumber) { obj2 = KdataConversion(obj2,"universalNumber"); } if (obj1.tag != SuniversalNumber || obj2.tag != SuniversalNumber) errorKan1("%s\n","[(tdiv_qr) universalNumber universalNumber] mpzext."); if (! is_this_coeff_MP_INT(obj1.lc.universalNumber) || ! is_this_coeff_MP_INT(obj2.lc.universalNumber)) { errorKan1("%s\n","[(tdiv_qr) universalNumber universalNumber] mpzext."); } f = coeff_to_MP_INT(obj1.lc.universalNumber); g = coeff_to_MP_INT(obj2.lc.universalNumber); r1 = newMP_INT(); r2 = newMP_INT(); mpz_tdiv_qr(r1,r2,f,g); obj1.tag = SuniversalNumber; obj1.lc.universalNumber = mpintToCoeff(r1,SmallRingp); obj2.tag = SuniversalNumber; obj2.lc.universalNumber = mpintToCoeff(r2,SmallRingp); rob = newObjectArray(2); putoa(rob,0,obj1); putoa(rob,1,obj2); } else if (strcmp(key,"cancel")==0) { if (size != 2) { errorKan1("%s\n","[(cancel) universalNumber/universalNumber] mpzext."); } obj0 = getoa(obj,1); if (obj0.tag == SuniversalNumber) return(obj0); if (obj0.tag != SrationalFunction) { errorKan1("%s\n","[(cancel) universalNumber/universalNumber] mpzext."); return(obj0); } obj1 = *(Knumerator(obj0)); obj2 = *(Kdenominator(obj0)); if (obj1.tag != SuniversalNumber || obj2.tag != SuniversalNumber) { errorKan1("%s\n","[(cancel) universalNumber/universalNumber] mpzext."); return(obj0); } if (! is_this_coeff_MP_INT(obj1.lc.universalNumber) || ! is_this_coeff_MP_INT(obj2.lc.universalNumber)) { errorKan1("%s\n","[(cancel) universalNumber/universalNumber] mpzext."); } f = coeff_to_MP_INT(obj1.lc.universalNumber); g = coeff_to_MP_INT(obj2.lc.universalNumber); r0 = newMP_INT(); r1 = newMP_INT(); r2 = newMP_INT(); mpz_gcd(r0,f,g); mpz_divexact(r1,f,r0); mpz_divexact(r2,g,r0); obj1.tag = SuniversalNumber; obj1.lc.universalNumber = mpintToCoeff(r1,SmallRingp); obj2.tag = SuniversalNumber; obj2.lc.universalNumber = mpintToCoeff(r2,SmallRingp); rob = KnewRationalFunction0(copyObjectp(&obj1),copyObjectp(&obj2)); KisInvalidRational(&rob); }else if (strcmp(key,"sqrt")==0 || strcmp(key,"com")==0) { /* One arg functions */ if (size != 2) errorKan1("%s\n","[key num] mpzext"); obj1 = getoa(obj,1); if (obj1.tag != SuniversalNumber) { obj1 = KdataConversion(obj1,"universalNumber"); } if (obj1.tag != SuniversalNumber) errorKan1("%s\n","[key num] mpzext : num must be a universalNumber."); if (! is_this_coeff_MP_INT(obj1.lc.universalNumber)) errorKan1("%s\n","[key num] mpzext : num must be a universalNumber."); f = coeff_to_MP_INT(obj1.lc.universalNumber); if (strcmp(key,"sqrt")==0) { r1 = newMP_INT(); mpz_sqrt(r1,f); }else if (strcmp(key,"com")==0) { r1 = newMP_INT(); mpz_com(r1,f); } rob.tag = SuniversalNumber; rob.lc.universalNumber = mpintToCoeff(r1,SmallRingp); }else if (strcmp(key,"probab_prime_p")==0 || strcmp(key,"and") == 0 || strcmp(key,"ior")==0) { /* Two args functions */ if (size != 3) errorKan1("%s\n","[key num1 num2] mpzext."); obj1 = getoa(obj,1); obj2 = getoa(obj,2); if (obj1.tag != SuniversalNumber) { obj1 = KdataConversion(obj1,"universalNumber"); } if (obj2.tag != SuniversalNumber) { obj2 = KdataConversion(obj2,"universalNumber"); } if (obj1.tag != SuniversalNumber || obj2.tag != SuniversalNumber) errorKan1("%s\n","[key num1 num2] mpzext."); if (! is_this_coeff_MP_INT(obj1.lc.universalNumber) || ! is_this_coeff_MP_INT(obj2.lc.universalNumber)) { errorKan1("%s\n","[key num1 num2] mpzext."); } f = coeff_to_MP_INT(obj1.lc.universalNumber); g = coeff_to_MP_INT(obj2.lc.universalNumber); if (strcmp(key,"probab_prime_p")==0) { gi = (int) mpz_get_si(g); if (mpz_probab_prime_p(f,gi)) { rob = KpoInteger(1); }else { rob = KpoInteger(0); } }else if (strcmp(key,"and")==0) { r1 = newMP_INT(); mpz_and(r1,f,g); rob.tag = SuniversalNumber; rob.lc.universalNumber = mpintToCoeff(r1,SmallRingp); }else if (strcmp(key,"ior")==0) { r1 = newMP_INT(); mpz_ior(r1,f,g); rob.tag = SuniversalNumber; rob.lc.universalNumber = mpintToCoeff(r1,SmallRingp); } }else if (strcmp(key,"powm")==0) { /* three args */ if (size != 4) errorKan1("%s\n","[key num1 num2 num3] mpzext"); obj1 = getoa(obj,1); obj2 = getoa(obj,2); obj3 = getoa(obj,3); if (obj1.tag != SuniversalNumber) { obj1 = KdataConversion(obj1,"universalNumber"); } if (obj2.tag != SuniversalNumber) { obj2 = KdataConversion(obj2,"universalNumber"); } if (obj3.tag != SuniversalNumber) { obj3 = KdataConversion(obj3,"universalNumber"); } if (obj1.tag != SuniversalNumber || obj2.tag != SuniversalNumber || obj3.tag != SuniversalNumber ) { errorKan1("%s\n","[key num1 num2 num3] mpzext : num1, num2 and num3 must be universalNumbers."); } if (! is_this_coeff_MP_INT(obj1.lc.universalNumber) || ! is_this_coeff_MP_INT(obj2.lc.universalNumber) || ! is_this_coeff_MP_INT(obj3.lc.universalNumber)) { errorKan1("%s\n","[key num1 num2 num3] mpzext : num1, num2 and num3 must be universalNumbers."); } f = coeff_to_MP_INT(obj1.lc.universalNumber); g = coeff_to_MP_INT(obj2.lc.universalNumber); h = coeff_to_MP_INT(obj3.lc.universalNumber); if (mpz_sgn(g) < 0) errorKan1("%s\n","[(powm) base exp mod] mpzext : exp must not be negative."); r1 = newMP_INT(); mpz_powm(r1,f,g,h); rob.tag = SuniversalNumber; rob.lc.universalNumber = mpintToCoeff(r1,SmallRingp); } else if (strcmp(key,"lcm")==0) { if (size != 3) errorKan1("%s\n","[(lcm) universalNumber universalNumber] mpzext."); obj1 = getoa(obj,1); obj2 = getoa(obj,2); if (obj1.tag != SuniversalNumber) { obj1 = KdataConversion(obj1,"universalNumber"); } if (obj2.tag != SuniversalNumber) { obj2 = KdataConversion(obj2,"universalNumber"); } if (obj1.tag != SuniversalNumber || obj2.tag != SuniversalNumber) errorKan1("%s\n","[lcm num1 num2] mpzext."); if (! is_this_coeff_MP_INT(obj1.lc.universalNumber) || ! is_this_coeff_MP_INT(obj2.lc.universalNumber)) { errorKan1("%s\n","[(lcm) universalNumber universalNumber] mpzext."); } f = coeff_to_MP_INT(obj1.lc.universalNumber); g = coeff_to_MP_INT(obj2.lc.universalNumber); r1 = newMP_INT(); mpz_lcm(r1,f,g); rob.tag = SuniversalNumber; rob.lc.universalNumber = mpintToCoeff(r1,SmallRingp); }else { errorKan1("%s\n","mpzExtension(): Unknown tag."); } return(rob); } /** : context */ struct object KnewContext(struct object superObj,char *name) { struct context *cp; struct object ob; if (superObj.tag != Sclass) { errorKan1("%s\n","The argument of KnewContext must be a Class.Context"); } if (superObj.lc.ival != CLASSNAME_CONTEXT) { errorKan1("%s\n","The argument of KnewContext must be a Class.Context"); } cp = newContext0((struct context *)(superObj.rc.voidp),name); ob.tag = Sclass; ob.lc.ival = CLASSNAME_CONTEXT; ob.rc.voidp = cp; return(ob); } struct object KcreateClassIncetance(struct object ob1, struct object ob2, struct object ob3) { /* [class-tag super-obj] size [class-tag] cclass */ struct object ob4; int size,size2,i; struct object ob5; struct object rob; if (ob1.tag != Sarray) errorKan1("%s\n","cclass: The first argument must be an array."); if (getoaSize(ob1) < 1) errorKan1("%s\n","cclass: The first argument must be [class-tag ....]."); ob4 = getoa(ob1,0); if (ectag(ob4) != CLASSNAME_CONTEXT) errorKan1("%s\n","cclass: The first argument must be [class-tag ....]."); if (ob2.tag != Sinteger) errorKan1("%s\n","cclass: The second argument must be an integer."); size = KopInteger(ob2); if (size < 1) errorKan1("%s\n","cclass: The size must be > 0."); if (ob3.tag != Sarray) errorKan1("%s\n","cclass: The third argument must be an array."); if (getoaSize(ob3) < 1) errorKan1("%s\n","cclass: The third argument must be [class-tag]."); ob5 = getoa(ob3,0); if (ectag(ob5) != CLASSNAME_CONTEXT) errorKan1("%s\n","cclass: The third argument must be [class-tag]."); rob = newObjectArray(size); putoa(rob,0,ob5); if (getoaSize(ob1) < size) size2 = getoaSize(ob1); else size2 = size; for (i=1; i 0? a:-a); s = (char *) sGC_malloc(a+1); if (s == (char *)NULL) { errorKan1("%s\n","no more memory."); } return(s); } struct object KdefaultPolyRing(struct object ob) { struct object rob; int i,j,k,n; struct object ob1,ob2,ob3,ob4,ob5; struct object t1; char *s1; extern struct ring *CurrentRingp; static struct ring *a[N0]; rob = NullObject; if (ob.tag != Sinteger) { errorKan1("%s\n","KdefaultPolyRing(): the argument must be integer."); } n = KopInteger(ob); if (n <= 0) { /* initializing */ for (i=0; i>. It is also aborted.\n",GotoLabel); GotoP = 0; } stdOperandStack(); contextControl(CCRESTORE); /* fprintf(stderr,"Now. Long jump!\n"); */ #if defined(__CYGWIN__) siglongjmp(EnvOfStackMachine,1); #else longjmp(EnvOfStackMachine,1); #endif } warningKan(str) char *str; { extern int WarningMessageMode; extern int Strict; char tmpc[1024]; if (WarningMessageMode == 1 || WarningMessageMode == 2) { sprintf(tmpc,"\nWARNING(kanExport[0|1].c): "); if (strlen(str) < 900) { strcat(tmpc,str); } pushErrorStack(KnewErrorPacket(SerialCurrent,-1,tmpc)); } if (WarningMessageMode != 1) { fprintf(stderr,"\nWARNING(kanExport[0|1].c): "); fprintf(stderr,str); fprintf(stderr,"\n"); } /* if (Strict) errorKan1("%s\n"," "); */ if (Strict) errorKan1("%s\n",str); return(0); } warningKanNoStrictMode(str) char *str; { extern int Strict; int t; t = Strict; Strict = 0; warningKan(str); Strict = t; return(0); }