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

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

1.1     ! maekawa     1: #include <stdio.h>
        !             2: #include "datatype.h"
        !             3: #include "extern2.h"
        !             4:
        !             5: int Homogenize = 1;
        !             6:
        !             7: #define I(i,j) (i*N0+j)
        !             8: #define LSIZE 5000
        !             9: static int V[N0];  /* index of variables */
        !            10: static struct coeff ** CList;
        !            11: static int *EList;
        !            12: static int *DList;
        !            13: static int *MList;
        !            14: static int *Mark;
        !            15: static int Lsize;
        !            16: static int Plist;
        !            17: static int Maxv;
        !            18: static POLY *RList;
        !            19: static POLY *RListRoot;
        !            20: static struct coeff *Tc = (struct coeff *)NULL;
        !            21:      /* It is initialized in mpMult_diff() */
        !            22:
        !            23: void initT(void) {
        !            24:   int i;
        !            25:   Lsize = LSIZE;
        !            26:   CList = (struct coeff **)sGC_malloc(sizeof(struct coeff *)*Lsize);
        !            27:   EList = (int *)sGC_malloc(sizeof(int)*Lsize);
        !            28:   Mark = (int *)sGC_malloc(sizeof(int)*Lsize);
        !            29:   /* The following line causes the warning 'needed to allocate blacklisted..'
        !            30:   DList = (int *)sGC_malloc(sizeof(int)*Lsize*N0);
        !            31:   MList = (int *)sGC_malloc(sizeof(int)*Lsize*N0);
        !            32:   */
        !            33:   DList = (int *)malloc(sizeof(int)*Lsize*N0);
        !            34:   MList = (int *)malloc(sizeof(int)*Lsize*N0);
        !            35:
        !            36:   RList = (POLY *)sGC_malloc(sizeof(POLY)*Lsize);
        !            37:   RListRoot = (POLY *)sGC_malloc(sizeof(POLY)*Lsize);
        !            38:   for (i=0; i<Lsize; i++)
        !            39:     RListRoot[i] = newCell((struct coeff *)NULL,(MONOMIAL)NULL);
        !            40: }
        !            41:
        !            42: void makeTable(c,e,ringp)
        !            43: struct coeff *c; /* read only */
        !            44: struct exps e[];
        !            45: struct ring *ringp;
        !            46: {
        !            47:   int i,j,k,p,q,deg,m,n;
        !            48:   m = ringp->m; n = ringp->n;
        !            49:   /* initialize */
        !            50:   Maxv = 0; Plist = 1; deg = 0;
        !            51:   for (i=m; i<n; i++) {
        !            52:     if (e[i].D != 0) {
        !            53:       V[Maxv] = i;
        !            54:       DList[I(0,Maxv)] = e[i].D;
        !            55:       MList[I(0,Maxv)] = 0;
        !            56:       deg += e[i].D;
        !            57:       Maxv++;
        !            58:     }
        !            59:   }
        !            60:   CList[0] = coeffCopy(c);
        !            61:   EList[0] = deg*2; Mark[0] = 0;
        !            62:
        !            63:   for (i=0; i<Maxv; i++) {
        !            64:     k = Plist;
        !            65:     /* Copy j-th row to k-th row and modify it. */
        !            66:     for (j=0; j<Plist; j++) {
        !            67:       for (q=1; q<=DList[I(j,i)]; q++) {
        !            68:        for (p=0; p<Maxv; p++) { /* copy */
        !            69:          DList[I(k,p)] = DList[I(j,p)];
        !            70:          MList[I(k,p)] = MList[I(j,p)];
        !            71:        }
        !            72:        /* modify */
        !            73:        DList[I(k,i)] -= q;
        !            74:        MList[I(k,i)] += q;
        !            75:
        !            76:        CiiComb(Tc,DList[I(j,i)],q);
        !            77:        /* Tc->val.bigp is read only. */
        !            78:        CList[k] = coeffCopy(Tc);
        !            79:        Cmult(CList[k],CList[k],CList[j]);
        !            80:        /*CList[k] = normalize(CList[j]*BiiComb(DList[I(j,i)],q));*/
        !            81:
        !            82:        EList[k] = EList[j]-2*q;
        !            83:        Mark[k] = 0;
        !            84:        k++;
        !            85:        if (k>= Lsize) {
        !            86:          errorPoly("makeTable(): Lsize is not large enough.\n");
        !            87:        }
        !            88:       }
        !            89:     }
        !            90:     Plist = k;
        !            91:   }
        !            92: }
        !            93:
        !            94: void monomialMult_diff(e,f)
        !            95: struct exps e[];
        !            96: POLY f;
        !            97: /* (e) * f = [Plist] monomials  */
        !            98: {
        !            99:
        !           100:   int n,k,c,l,q,i,m;
        !           101:   struct coeff *a;
        !           102:   struct monomial tmp;
        !           103:   struct ring *ringp;
        !           104:   POLY mm;
        !           105:
        !           106:   tmp.ringp = ringp = f->m->ringp;
        !           107:   n = ringp->n; c = ringp->c; l = ringp->l; m = ringp->m;
        !           108:   for (k=Plist-1; k>=0; k--) {
        !           109:     /* coeff */
        !           110:     a = coeffCopy(CList[k]);
        !           111:     Cmult(a,a,f->coeffp);
        !           112:     if (isZero(a)) goto no;
        !           113:     /* initialize tmp */
        !           114:     for (i=0; i<n; i++) {
        !           115:       tmp.e[i] = f->m->e[i];
        !           116:     }
        !           117:     if (Homogenize) {
        !           118:       tmp.e[0].D += EList[k]; /* homogenization.
        !           119:                                 e[0].D will be added later. */
        !           120:     }
        !           121:
        !           122:     /* from m to n:  Differential variables. */
        !           123:     for (i=0; i<Maxv; i++) {
        !           124:       CiiPoch(Tc,tmp.e[V[i]].x,DList[I(k,i)]);
        !           125:       /* Tc->val.bigp is read only */
        !           126:       Cmult(a,a,Tc);
        !           127:       /*printf("k=%d V[i]=%d a=%s\n",k,V[i],coeffToString(a));*/
        !           128:       if (isZero(a)) goto no;
        !           129:       tmp.e[V[i]].D += MList[I(k,i)]; /* monomial add */
        !           130:       tmp.e[V[i]].x -= DList[I(k,i)]; /* differentiate */
        !           131:     }
        !           132:
        !           133:
        !           134:     /* difference variables are commutative */
        !           135:
        !           136:     /* q-variables. Compute q before updating tmp.e[i]. */
        !           137:     if (l-c > 0) {
        !           138:       q =0;
        !           139:       for (i=c; i<l; i++) {
        !           140:        q += (e[i].D)*(tmp.e[i].x);  /* Don't repeat these things. */
        !           141:        tmp.e[i].D += e[i].D;
        !           142:       }
        !           143:       /*printf("l=%d, q=%d\n",l,q);*/
        !           144:       if (ringp->next == (struct ring *)NULL) {
        !           145:        tmp.e[0].x += q;
        !           146:       }else{
        !           147:        Cmult(a,a,polyToCoeff(cxx(1,0,q,ringp->next),ringp));
        !           148:                              /* x[0]^q */
        !           149:       }
        !           150:     }
        !           151:
        !           152:     /* Update tmp.e[i].x */
        !           153:     for (i=0; i<n; i++) {
        !           154:       tmp.e[i].x += e[i].x;
        !           155:     }
        !           156:
        !           157:
        !           158:     /* commutative variables */
        !           159:     for (i=0; i<c; i++) {
        !           160:       tmp.e[i].D += e[i].D;
        !           161:     }
        !           162:     /* Difference variables */
        !           163:     for (i=l; i<m; i++) {
        !           164:       tmp.e[i].D += e[i].D;
        !           165:     }
        !           166:     /***** x_i ----> x_i + e[i].D h  Substitution and homogenization */
        !           167:     /*** They will be done in mpMult_diff() */
        !           168:
        !           169:     mm = newCell(a,monomialCopy(&tmp));
        !           170:     RList[k]->next = mm;
        !           171:     RList[k] = RList[k]->next;
        !           172:   no: ;
        !           173:   }
        !           174: }
        !           175:
        !           176: /* Note that you cannot call mpMult_diff recursively. */
        !           177: /* Note also that mpMult_diff assumes coefficients and Dx commutes each other*/
        !           178: POLY mpMult_diff(POLY f,POLY g)
        !           179: {
        !           180:   int k;
        !           181:   POLY r,temp;
        !           182:
        !           183:   /* printf("mpMult_diff(%s,%s)\n",POLYToString(f,'*',1),POLYToString(g,'*',1)); */
        !           184:
        !           185:   if (f == POLYNULL || g == POLYNULL) return(POLYNULL);
        !           186:   checkRing(f,g);
        !           187:   Tc = coeffCopy(f->coeffp);
        !           188:
        !           189:   if (isConstant(f)) return(cpMult(f->coeffp,g));
        !           190:
        !           191:   makeTable(f->coeffp,f->m->e,f->m->ringp);
        !           192:   /* outputTable(); */
        !           193:   for (k=0; k<Plist; k++) {
        !           194:     RList[k] = RListRoot[k];
        !           195:     RList[k]->next = POLYNULL;
        !           196:   }
        !           197:
        !           198:   while (g != POLYNULL) {
        !           199:     monomialMult_diff(f->m->e,g);
        !           200:     g = g->next;
        !           201:   }
        !           202:   r = POLYNULL;
        !           203:   for (k=0; k<Plist; k++) {
        !           204:     temp = RListRoot[k]->next;
        !           205:     r = ppAddv(r,temp);
        !           206:   }
        !           207:
        !           208:
        !           209:   /***** x_i ----> x_i + e[i].D h  Substitution and homogenization
        !           210:          for difference variables */
        !           211:   /*** They are implemented in _difference, but slow.*/
        !           212:
        !           213:   return(r);
        !           214: }
        !           215:
        !           216: POLY mpMult_difference(POLY f,POLY g)
        !           217: {
        !           218:   POLY r;
        !           219:   int m,l;
        !           220:   POLY lRule[N0];
        !           221:   POLY rRule[N0];
        !           222:   int size;
        !           223:   int i;
        !           224:
        !           225:   if (f == POLYNULL || g == POLYNULL) return(POLYNULL);
        !           226:   checkRing(f,g);
        !           227:   m = f->m->ringp->m;
        !           228:   l = f->m->ringp->l;
        !           229:
        !           230:   r = mpMult_diff(f,g);
        !           231:
        !           232:   /***** x_i ----> x_i + e[i].D h  Substitution and homogenization
        !           233:          for difference variables */
        !           234:   size = 0;
        !           235:   for (i=l; i<m; i++) {
        !           236:     if (f->m->e[i].D) {
        !           237:       lRule[size] = cxx(1,i,1,f->m->ringp);
        !           238:       if (Homogenize) {
        !           239:        rRule[size] = ppAdd(cxx(1,i,1,f->m->ringp),cdd(f->m->e[i].D,0,1,f->m->ringp));
        !           240:                            /* x_i               + e[i].D  h */
        !           241:       }else{
        !           242:        rRule[size] = ppAdd(cxx(1,i,1,f->m->ringp),cdd(f->m->e[i].D,0,0,f->m->ringp));
        !           243:                            /* x_i               + e[i].D   */
        !           244:       }
        !           245:       size++;
        !           246:     }
        !           247:   }
        !           248:
        !           249:   /* It's a dirty trick. */
        !           250:   r = replace_poly(r,lRule,rRule,size);
        !           251:
        !           252:   return(r);
        !           253: }
        !           254:
        !           255: outputTable() {
        !           256:   int i,j;
        !           257:   printf("Maxv = %d Plist=%d\n",Maxv,Plist);
        !           258:   for (i=0; i<Maxv; i++) printf("%5d",V[i]);
        !           259:   printf("\n------ DList --------------\n");
        !           260:   for (i=0; i<Plist; i++) {
        !           261:     for (j=0; j<Maxv; j++) {
        !           262:       printf("%5d",DList[I(i,j)]);
        !           263:     }
        !           264:     putchar('\n');
        !           265:   }
        !           266:   printf("\n--------- MList ------------\n");
        !           267:   for (i=0; i<Plist; i++) {
        !           268:     for (j=0; j<Maxv; j++) {
        !           269:       printf("%5d",MList[I(i,j)]);
        !           270:     }
        !           271:     printf(" |  e=%5d M=%1d c=%s\n",EList[i],Mark[i],coeffToString(CList[i]));
        !           272:   }
        !           273: }

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