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

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

1.1     ! maekawa     1: #include <stdio.h>
        !             2: #include "datatype.h"
        !             3: #include "stackm.h"
        !             4: #include "extern.h"
        !             5: #include "extern2.h"
        !             6:
        !             7:
        !             8: void KinitKan(void) {
        !             9:
        !            10:   extern int Msize;
        !            11:   extern struct ring SmallRing;
        !            12:   extern struct ring *CurrentRingp;
        !            13:   extern MP_INT *Mp_one;
        !            14:   extern MP_INT *Mp_zero;
        !            15:   extern MP_INT Mp_work_iiComb;
        !            16:   extern MP_INT Mp_work_iiPoch;
        !            17:   extern MP_INT Mp_work_iiPower;
        !            18:
        !            19:   static MP_INT Mp_One;
        !            20:   static MP_INT Mp_Zero;
        !            21:
        !            22:   extern struct coeff *UniversalZero;
        !            23:   extern struct coeff *UniversalOne;
        !            24:
        !            25:   int i;
        !            26:   static char *smallx[] = {"x","t"};
        !            27:   static char *smalld[] = {"h","T"};
        !            28:                            /* t  x  T  h */
        !            29:   static int smallOrder[] = { 1, 0, 0, 0,
        !            30:                               0, 1, 0, 0,
        !            31:                               0, 0, 1, 0,
        !            32:                               0, 0, 0, 1};
        !            33:
        !            34:   static int outputOrderForSmallRing[] = {1,0,3,2};
        !            35:   Msize = sizeof(struct monomial) - sizeof(struct monomialDummy);
        !            36:   if (Msize <= 0) errorPoly("Problem of your C-compiler??!!");
        !            37:
        !            38:   /* Define the CurrentRingp */
        !            39:   /* Define the SmallRingp */
        !            40:
        !            41:   SmallRing.p = 0;
        !            42:   SmallRing.n = SmallRing.m = SmallRing.l = SmallRing.c = 2;
        !            43:   SmallRing.nn = SmallRing.mm = SmallRing.ll = 2;
        !            44:   SmallRing.cc = 1;
        !            45:   SmallRing.x = smallx;
        !            46:   SmallRing.D = smalld;
        !            47:   SmallRing.order = smallOrder;
        !            48:   SmallRing.orderMatrixSize = 4;
        !            49:   setFromTo(&SmallRing);
        !            50:   SmallRing.next = (struct ring *)NULL;
        !            51:   SmallRing.multiplication = mpMult_poly;
        !            52:   SmallRing.schreyer = 0;
        !            53:   SmallRing.gbListTower = NULL;
        !            54:   SmallRing.outputOrder = outputOrderForSmallRing;
        !            55:   SmallRing.name = "SmallRingp";
        !            56:
        !            57:   CurrentRingp = &SmallRing;
        !            58:   initSyzRingp();
        !            59:
        !            60:   switch_init();
        !            61:   initT();  /* Initialize poly3.c */
        !            62:
        !            63:
        !            64: #ifndef NOGC
        !            65:   /* initialize MPZ */
        !            66:    mp_set_memory_functions(sGC_malloc,sGC_realloc2,sGC_free2);
        !            67: #endif
        !            68:
        !            69:   /* Msize is 8 on SUN gcc */
        !            70:
        !            71:   /* We have defined a ring. Let's initialize Nodes */
        !            72:
        !            73:   Mp_one = &Mp_One;
        !            74:   mpz_init(Mp_one); mpz_set_si(Mp_one,(long) 1);
        !            75:   Mp_zero = &Mp_Zero;
        !            76:   mpz_init(Mp_zero); mpz_set_si(Mp_zero,(long) 0);
        !            77:   mpz_init(&Mp_work_iiComb); mpz_init(&Mp_work_iiPoch);
        !            78:   mpz_init(&Mp_work_iiPower);
        !            79:
        !            80:   UniversalZero = intToCoeff(0,&SmallRing);
        !            81:   UniversalOne = intToCoeff(1,&SmallRing);
        !            82:
        !            83:   KdefaultPolyRing(KpoInteger(0));
        !            84: }
        !            85:
        !            86: #ifndef NOGC
        !            87: void *sGC_realloc2(void *p,size_t old,size_t new)
        !            88: {
        !            89:   return((void *)sGC_realloc(p,(int) new));
        !            90: }
        !            91: void sGC_free2(void *p,size_t size)
        !            92: {
        !            93:   /* Do nothing. */
        !            94: }
        !            95: #endif
        !            96:
        !            97:
        !            98: MONOMIAL newMonomial(ringp)
        !            99: struct ring *ringp;
        !           100: {
        !           101:   MONOMIAL f;
        !           102:   extern int Msize;
        !           103:   int i;
        !           104:   int n;
        !           105:   n = ringp->n;
        !           106:   f = (MONOMIAL) sGC_malloc(sizeof(struct smallMonomial)+n*Msize);
        !           107:   if (f == (MONOMIAL) NULL) errorPoly("No more memory.");
        !           108:   f->ringp = ringp;
        !           109:   for (i=0; i<n; i++) {
        !           110:     (f->e)[i].x = 0;
        !           111:     (f->e)[i].D = 0;  /* necessary?->Yes. */
        !           112:   }
        !           113:   return(f);
        !           114: }
        !           115:
        !           116:
        !           117: MONOMIAL monomialCopy(m)
        !           118: MONOMIAL m;
        !           119: {
        !           120:   extern int Msize;
        !           121:   MONOMIAL f;
        !           122:   int i;
        !           123:   int n;
        !           124:   n = m->ringp->n;
        !           125:   f = (MONOMIAL) sGC_malloc(sizeof(struct smallMonomial)+n*Msize);
        !           126:
        !           127:   if (f == (MONOMIAL) NULL) errorPoly("No more memory.");
        !           128:   f->ringp = m->ringp;
        !           129:   for (i=0; i<n; i++) {
        !           130:     (f->e)[i].x = (m->e)[i].x;
        !           131:     (f->e)[i].D = (m->e)[i].D;
        !           132:   }
        !           133:   return(f);
        !           134: }
        !           135:
        !           136:
        !           137: struct coeff *newCoeff() {
        !           138:   struct coeff *cp;
        !           139:   cp = (struct coeff *)sGC_malloc(sizeof (struct coeff));
        !           140:   if (cp == (struct coeff *)NULL) errorPoly("No more memory.");
        !           141:   cp->tag = UNKNOWN;
        !           142:   cp->p = -123; /* stupid value */
        !           143:   return(cp);
        !           144: }
        !           145:
        !           146: MP_INT *newMP_INT() {
        !           147:   MP_INT *ip;
        !           148:   ip = (MP_INT *)sGC_malloc(sizeof(MP_INT));
        !           149:   if (ip == (MP_INT *)NULL) errorPoly("No more memory.");
        !           150:   mpz_init(ip);
        !           151:   return(ip);
        !           152: }
        !           153:
        !           154: POLY newCell(c,mon)
        !           155: struct coeff *c;
        !           156: MONOMIAL mon;
        !           157: {
        !           158:   POLY ff;
        !           159:   ff = (POLY) sGC_malloc(sizeof(struct listPoly));
        !           160:   if (ff == POLYNULL) errorPoly("No more memory.");
        !           161:   ff->next = POLYNULL;
        !           162:   ff->coeffp = c;
        !           163:   ff->m = mon;
        !           164:   return(ff);
        !           165: }
        !           166:
        !           167: /* constructors */
        !           168: POLY cxx(c,i,k,ringp)
        !           169: int c,i,k;
        !           170: struct ring *ringp;
        !           171: /*  c x_i^k where p is the characteristic. */
        !           172: /* New cell, monomial and coeff. */
        !           173: {
        !           174:   POLY f;
        !           175:   int p;
        !           176:   p = ringp->p;
        !           177:   if (c == 0) return(POLYNULL);
        !           178:   f = pMalloc(ringp);
        !           179:   if (ringp->next == (struct ring *)NULL) {
        !           180:     if (p) {
        !           181:       f->coeffp->tag = INTEGER; f->coeffp->p = p;
        !           182:       f->coeffp->val.i = c % p;
        !           183:       if (f->coeffp->val.i == 0) return(POLYNULL);
        !           184:     }else{
        !           185:       f->coeffp->tag = MP_INTEGER; f->coeffp->p = 0;
        !           186:       f->coeffp->val.bigp = newMP_INT();
        !           187:       mpz_set_si(f->coeffp->val.bigp,(long) c);
        !           188:     }
        !           189:     f->m->e[i].x = k;
        !           190:     return(f);
        !           191:   }else{
        !           192:     f->coeffp->tag = POLY_COEFF; f->coeffp->p = p;
        !           193:     f->coeffp->val.f = cxx(c,0,0,ringp->next);
        !           194:     if (f->coeffp->val.f == POLYNULL) return(POLYNULL);
        !           195:     f->m->e[i].x = k;
        !           196:     return(f);
        !           197:   }
        !           198: }
        !           199:
        !           200: POLY bxx(c,i,k,ringp)
        !           201: MP_INT *c;
        !           202: int i,k;
        !           203: struct ring *ringp;
        !           204: /*  c x_i^k.  c is not copied. */
        !           205: {
        !           206: /* new cell, monomial, coeff. MP_INT c is not copied. */
        !           207:   POLY f;
        !           208:   int p;
        !           209:   p = ringp->p;
        !           210:   if (mpz_cmp_si(c,(long)0) == 0) return(POLYNULL);
        !           211:   f = pMalloc(ringp);
        !           212:   if (ringp->next == (struct ring *)NULL) {
        !           213:     if (p) {
        !           214:       f->coeffp->tag = INTEGER; f->coeffp->p = p;
        !           215:       f->coeffp->val.i = (int) mpz_get_si(c);
        !           216:       f->coeffp->val.i %= p;
        !           217:       if (f->coeffp->val.i == 0) return(POLYNULL);
        !           218:     }else{
        !           219:       f->coeffp->tag = MP_INTEGER; f->coeffp->p = 0;
        !           220:       f->coeffp->val.bigp = c;
        !           221:     }
        !           222:     f->m->e[i].x = k;
        !           223:     return(f);
        !           224:   }else{
        !           225:     warningPoly("cbb(): ringp->next is not NULL. Returns 0.");
        !           226:     return(POLYNULL);
        !           227:   }
        !           228: }
        !           229:
        !           230: POLY cdd(c,i,k,ringp)
        !           231: int c,i,k;
        !           232: struct ring *ringp;
        !           233: /*  c D_i^k where p is the characteristic. */
        !           234: /* New cell, monomial and coeff. */
        !           235: {
        !           236:   POLY f;
        !           237:   int p;
        !           238:   p = ringp->p;
        !           239:   if (c == 0) return(POLYNULL);
        !           240:   f = pMalloc(ringp);
        !           241:   if (ringp->next == (struct ring *)NULL) {
        !           242:     if (p) {
        !           243:       f->coeffp->tag = INTEGER; f->coeffp->p = p;
        !           244:       f->coeffp->val.i = c % p;
        !           245:       if (f->coeffp->val.i == 0) return(POLYNULL);
        !           246:     }else{
        !           247:       f->coeffp->tag = MP_INTEGER; f->coeffp->p = 0;
        !           248:       f->coeffp->val.bigp = newMP_INT();
        !           249:       mpz_set_si(f->coeffp->val.bigp,(long) c);
        !           250:     }
        !           251:     f->m->e[i].D = k;
        !           252:     return(f);
        !           253:   }else{
        !           254:     f->coeffp->tag = POLY_COEFF; f->coeffp->p = p;
        !           255:     f->coeffp->val.f = cdd(c,0,0,ringp->next);
        !           256:     if (f->coeffp->val.f == POLYNULL) return(POLYNULL);
        !           257:     f->m->e[i].D = k;
        !           258:     return(f);
        !           259:   }
        !           260:
        !           261: }
        !           262:
        !           263:
        !           264: POLY pCopy(f)
        !           265: POLY f;
        !           266: {
        !           267:   POLY node;
        !           268:   struct listPoly nod;
        !           269:   POLY h;
        !           270:   node = &nod;
        !           271:   if (f == POLYNULL) return(POLYNULL);
        !           272:   node->next = POLYNULL;
        !           273:   h = node;
        !           274:   while (f != POLYNULL) {
        !           275:     h->next = newCell(f->coeffp,f->m); /* shallow */
        !           276:     h = h->next;
        !           277:     f = f->next;
        !           278:   }
        !           279:   return(node->next);
        !           280: }
        !           281:
        !           282: POLY pcCopy(f)
        !           283: POLY f;
        !           284: {
        !           285:
        !           286:   POLY node;
        !           287:   struct listPoly nod;
        !           288:   POLY h;
        !           289:   struct coeff *c;
        !           290:   node = &nod;
        !           291:   if (f == POLYNULL) return(POLYNULL);
        !           292:   node->next = POLYNULL;
        !           293:   h = node;
        !           294:   while (f != POLYNULL) {
        !           295:     c = coeffCopy(f->coeffp);
        !           296:     h->next = newCell(c,f->m); /* poly and coeff. */
        !           297:     h = h->next;
        !           298:     f = f->next;
        !           299:   }
        !           300:   return(node->next);
        !           301: }
        !           302:
        !           303: POLY pmCopy(f)
        !           304: POLY f;
        !           305: {
        !           306:   POLY node;
        !           307:   struct listPoly nod;
        !           308:   POLY h;
        !           309:   struct coeff *c;
        !           310:   node = &nod;
        !           311:   if (f == POLYNULL) return(POLYNULL);
        !           312:   node->next = POLYNULL;
        !           313:   h = node;
        !           314:   while (f != POLYNULL) {
        !           315:     h->next = newCell(f->coeffp,monomialCopy(f->m));
        !           316:     h = h->next;
        !           317:     f = f->next;
        !           318:   }
        !           319:   return(node->next);
        !           320: }
        !           321:
        !           322: POLY pcmCopy(f)
        !           323: POLY f;
        !           324: {
        !           325:   POLY node;
        !           326:   struct listPoly nod;
        !           327:   POLY h;
        !           328:   struct coeff *c;
        !           329:   node = &nod;
        !           330:   if (f == POLYNULL) return(POLYNULL);
        !           331:   node->next = POLYNULL;
        !           332:   h = node;
        !           333:   while (f != POLYNULL) {
        !           334:     h->next = newCell(coeffCopy(f->coeffp),monomialCopy(f->m));
        !           335:     h = h->next;
        !           336:     f = f->next;
        !           337:   }
        !           338:   return(node->next);
        !           339: }
        !           340:
        !           341: POLY head(f)
        !           342: POLY f;
        !           343: {
        !           344:   if (f == ZERO) return(f);
        !           345:   else {
        !           346:     return(newCell(f->coeffp,f->m));
        !           347:   }
        !           348: }
        !           349:
        !           350: void errorPoly(str)
        !           351: char *str;
        !           352: {
        !           353:   fprintf(stderr,"Error(poly.c): %s\n",str);
        !           354:   exit(20);
        !           355: }
        !           356:
        !           357: void warningPoly(str)
        !           358: char *str;
        !           359: {
        !           360:   fprintf(stderr,"Warning(poly.c): %s\n",str);
        !           361: }
        !           362:
        !           363:
        !           364:
        !           365:
        !           366:
        !           367:
        !           368:
        !           369:
        !           370:
        !           371:
        !           372:

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