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

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

1.1       maekawa     1: #include <stdio.h>
                      2: #include "datatype.h"
                      3: #include "extern2.h"
                      4: #include "gradedset.h"
                      5:
                      6: #define mymax(p,q) (p>q?p:q)
                      7:
                      8: static int DebugReduction = 0;
                      9:
                     10:
                     11: int isReducible_module(f,g)
                     12: POLY f;
                     13: POLY g;
                     14: {
                     15:   int n,i;
                     16:   MONOMIAL tf;
                     17:   MONOMIAL tg;
                     18:
                     19:   if (f ISZERO) return(0);
                     20:   if (g ISZERO) return(0);
                     21:
                     22:   checkRingIsR(f,g);
                     23:
                     24:   if (!(*isSameComponent)(f,g)) return(0);
                     25:   tf = f->m; tg = g->m; n = tf->ringp->n;
                     26:   for (i=0; i<n; i++) {
                     27:     if (tf->e[i].x < tg->e[i].x) return(0);
                     28:     if (tf->e[i].D < tg->e[i].D) return(0);
                     29:   }
                     30:   return(1);
                     31: }
                     32:
                     33:
                     34: int isSameComponent_x(f,g)
                     35: POLY f;
                     36: POLY g;
                     37: {
                     38:   static int nn,mm,ll,cc,n,m,l,c;
                     39:   static struct ring *cr = (struct ring *)NULL;
                     40:   MONOMIAL tf;
                     41:   MONOMIAL tg;
                     42:   int i;
                     43:
                     44:   if (f ISZERO) return(1);
                     45:   if (g ISZERO) return(1);
                     46:
                     47:   tf = f->m; tg = g->m;
                     48:   if (tf->ringp != cr) {
                     49:     n = tf->ringp->n;
                     50:     m = tf->ringp->m;
                     51:     l = tf->ringp->l;
                     52:     c = tf->ringp->c;
                     53:     nn = tf->ringp->nn;
                     54:     mm = tf->ringp->mm;
                     55:     ll = tf->ringp->ll;
                     56:     cc = tf->ringp->cc;
                     57:     cr = tf->ringp;
                     58:   }
                     59:   for (i=cc; i<c; i++) {
                     60:     if (tf->e[i].x != tg->e[i].x) return(0);
                     61:     if (tf->e[i].D != tg->e[i].D) return(0);
                     62:   }
                     63:   for (i=ll; i<l; i++) {
                     64:     if (tf->e[i].x != tg->e[i].x) return(0);
                     65:     /*if (tf->e[i].D != tg->e[i].D) return(0);*/
                     66:   }
                     67:   for (i=mm; i<m; i++) {
                     68:     if (tf->e[i].x != tg->e[i].x) return(0);
                     69:     /*if (tf->e[i].D != tg->e[i].D) return(0);*/
                     70:   }
                     71:   for (i=nn; i<n; i++) {
                     72:     if (tf->e[i].x != tg->e[i].x) return(0);
                     73:     /*if (tf->e[i].D != tg->e[i].D) return(0);*/
                     74:   }
                     75:   return(1);
                     76: }
                     77:
                     78: int isSameComponent_xd(f,g)
                     79: POLY f;
                     80: POLY g;
                     81: {
                     82:   static int nn,mm,ll,cc,n,m,l,c;
                     83:   static struct ring *cr = (struct ring *)NULL;
                     84:   MONOMIAL tf;
                     85:   MONOMIAL tg;
                     86:   int i;
                     87:
                     88:   if (f ISZERO) return(1);
                     89:   if (g ISZERO) return(1);
                     90:
                     91:   tf = f->m; tg = g->m;
                     92:   if (tf->ringp != cr) {
                     93:     n = tf->ringp->n;
                     94:     m = tf->ringp->m;
                     95:     l = tf->ringp->l;
                     96:     c = tf->ringp->c;
                     97:     nn = tf->ringp->nn;
                     98:     mm = tf->ringp->mm;
                     99:     ll = tf->ringp->ll;
                    100:     cc = tf->ringp->cc;
                    101:     cr = tf->ringp;
                    102:   }
                    103:   for (i=cc; i<c; i++) {
                    104:     if (tf->e[i].x != tg->e[i].x) return(0);
                    105:     if (tf->e[i].D != tg->e[i].D) return(0);
                    106:   }
                    107:   for (i=ll; i<l; i++) {
                    108:     if (tf->e[i].x != tg->e[i].x) return(0);
                    109:     if (tf->e[i].D != tg->e[i].D) return(0);
                    110:   }
                    111:   for (i=mm; i<m; i++) {
                    112:     if (tf->e[i].x != tg->e[i].x) return(0);
                    113:     if (tf->e[i].D != tg->e[i].D) return(0);
                    114:   }
                    115:   for (i=nn; i<n; i++) {
                    116:     if (tf->e[i].x != tg->e[i].x) return(0);
                    117:     if (tf->e[i].D != tg->e[i].D) return(0);
                    118:   }
                    119:   return(1);
                    120: }
                    121:
                    122:
                    123: POLY lcm_module(f,g)
                    124: POLY f;
                    125: POLY g;
                    126: {
                    127:   MONOMIAL tf,tg;
                    128:   MONOMIAL lcm;
                    129:   int n;
                    130:   int i;
                    131:
                    132:   tf = f->m; tg = g->m;
                    133:   if (!(*isSameComponent)(f,g)) return(ZERO);
                    134:   n = tf->ringp->n;
                    135:   lcm = newMonomial(tf->ringp);
                    136:   for (i=0; i<n; i++) {
                    137:     lcm->e[i].x = mymax(tf->e[i].x,tg->e[i].x);
                    138:     lcm->e[i].D = mymax(tf->e[i].D,tg->e[i].D);
                    139:   }
                    140:   return(newCell(intToCoeff(1,tf->ringp),lcm));
                    141: }
                    142:
                    143:
                    144: int grade_module1v(f)
                    145: POLY f;
                    146: {
                    147:   int r;
                    148:   int i;
                    149:   MONOMIAL tf;
                    150:   static int nn,mm,ll,cc,n,m,l,c;
                    151:   static struct ring *cr = (struct ring *)NULL;
                    152:
                    153:   if (f ISZERO) return(-1);
                    154:   tf = f->m;
                    155:   if (tf->ringp != cr) {
                    156:     n = tf->ringp->n;
                    157:     m = tf->ringp->m;
                    158:     l = tf->ringp->l;
                    159:     c = tf->ringp->c;
                    160:     nn = tf->ringp->nn;
                    161:     mm = tf->ringp->mm;
                    162:     ll = tf->ringp->ll;
                    163:     cc = tf->ringp->cc;
                    164:     cr = tf->ringp;
                    165:   }
                    166:
                    167:   r = 0;
                    168:   for (i=0; i<cc; i++) {
                    169:     r += tf->e[i].x;
                    170:     r += tf->e[i].D;
                    171:   }
                    172:   for (i=c; i<ll; i++) {
                    173:     r += tf->e[i].x;
                    174:     r += tf->e[i].D;
                    175:   }
                    176:   for (i=l; i<mm; i++) {
                    177:     r += tf->e[i].x;
                    178:     r += tf->e[i].D;
                    179:   }
                    180:   for (i=m; i<nn; i++) {
                    181:     r += tf->e[i].x;
                    182:     r += tf->e[i].D;
                    183:   }
                    184:   /*printf("%s --> %d\n",POLYToString(f,'*',1),r);*/
                    185:   return(r);
                    186: }
                    187:
                    188:
                    189: int grade_module1(f)
                    190: POLY f;
                    191: {
                    192:   int r;
                    193:   int i;
                    194:   MONOMIAL tf;
                    195:   static int nn,mm,ll,cc,n,m,l,c;
                    196:   static struct ring *cr = (struct ring *)NULL;
                    197:
                    198:   if (f ISZERO) return(-1);
                    199:   tf = f->m;
                    200:   if (tf->ringp != cr) {
                    201:     n = tf->ringp->n;
                    202:     m = tf->ringp->m;
                    203:     l = tf->ringp->l;
                    204:     c = tf->ringp->c;
                    205:     nn = tf->ringp->nn;
                    206:     mm = tf->ringp->mm;
                    207:     ll = tf->ringp->ll;
                    208:     cc = tf->ringp->cc;
                    209:     cr = tf->ringp;
                    210:   }
                    211:
                    212:   r = 0;
                    213:   for (i=0; i<n; i++) {
                    214:     r += tf->e[i].x;
                    215:     r += tf->e[i].D;
                    216:   }
                    217:   /*printf("%s --> %d\n",POLYToString(f,'*',1),r);*/
                    218:   return(r);
                    219: }
                    220:
                    221:
                    222:
                    223: int grade_firstvec(f)   /* grading by the first vector and h */
                    224: POLY f;
                    225: {
                    226:   int r;
                    227:   int i,k;
                    228:   int exp[2*N0];
                    229:   MONOMIAL tf;
                    230:   static int n;
                    231:   static int *order,*from,*to;
                    232:   static struct ring *cr = (struct ring *)NULL;
                    233:
                    234:   if (f ISZERO) return(-1);
                    235:   tf = f->m;
                    236:   if (tf->ringp != cr) {
                    237:     n = tf->ringp->n;
                    238:     order = tf->ringp->order;
                    239:     from = tf->ringp->from;
                    240:     to = tf->ringp->to;
                    241:   }
                    242:
                    243:   for (i=n-1,k=0; i>=0; i--,k++) {
                    244:     exp[k] = tf->e[i].x;
                    245:     exp[k+n] = tf->e[i].D;
                    246:   }
                    247:   r = exp[2*n-1]; /* degree of h */
                    248:   for (i=from[0]; i<to[0]; i++) {
                    249:     r += exp[i]*order[i];
                    250:   }
                    251:   /*printf("%s --> %d\n",POLYToString(f,'*',1),r);*/
                    252:   return(r);
                    253: }
                    254:
                    255: int eliminated(ff)
                    256: POLY ff;
                    257: {
                    258: #define RULEMAX 10
                    259:   int r;
                    260:   int i; int k;
                    261:   MONOMIAL tf;
                    262:   static int nn,mm,ll,cc,n,m,l,c;
                    263:   static struct ring *cr = (struct ring *)NULL;
                    264:   POLY f;
                    265:   POLY lRule[RULEMAX];
                    266:   POLY rRule[RULEMAX];
                    267:
                    268:   if (ff ISZERO) return(-1);
                    269:   tf = ff->m;
                    270:   if (tf->ringp != cr) {
                    271:     n = tf->ringp->n;
                    272:     m = tf->ringp->m;
                    273:     l = tf->ringp->l;
                    274:     c = tf->ringp->c;
                    275:     nn = tf->ringp->nn;
                    276:     mm = tf->ringp->mm;
                    277:     ll = tf->ringp->ll;
                    278:     cc = tf->ringp->cc;
                    279:     cr = tf->ringp;
                    280:   }
                    281:
                    282:   lRule[0] = cdd(1,0,1,ff->m->ringp);  /* h */
                    283:   rRule[0] = cxx(1,0,0,ff->m->ringp);  /* 1 */
                    284:   k = 1;
                    285:   if ( c-cc + l-ll + m-mm + n -nn >= RULEMAX-1){
                    286:     fprintf(stderr,"redm.c: RULEMAX is small.\n");
                    287:     exit(1);
                    288:   }
                    289:   for (i=cc; i<c; i++,k++) {
                    290:     lRule[k] = cdd(1,i,1,ff->m->ringp);
                    291:     rRule[k] = ZERO;
                    292:   }
                    293:   for (i=ll; i<l; i++,k++) {
                    294:     lRule[k] = cdd(1,i,1,ff->m->ringp);
                    295:     rRule[k] = cxx(1,0,0,ff->m->ringp); /* Qe = 1???? */
                    296:   }
                    297:   for (i=mm; i<m; i++,k++) {
                    298:     lRule[k] = cdd(1,i,1,ff->m->ringp);
                    299:     rRule[k] = cxx(1,0,0,ff->m->ringp); /* Ee = 1 */
                    300:   }
                    301:   for (i=nn; i<n; i++,k++) {
                    302:     lRule[k] = cdd(1,i,1,ff->m->ringp);
                    303:     rRule[k] = ZERO;   /* De = 0 */
                    304:   }
                    305:   f = replace(ff,lRule,rRule,k);
                    306:
                    307:
                    308:   if (f ISZERO) return(-1);
                    309:   for (i=cc; i<c; i++) {
                    310:     if (tf->e[i].x) return 0;
                    311:   }
                    312:   for (i=ll; i<l; i++) {
                    313:     if (tf->e[i].x) return 0;
                    314:   }
                    315:   for (i=mm; i<m; i++) {
                    316:     if (tf->e[i].x) return 0;
                    317:   }
                    318:   for (i=nn; i<n; i++) {
                    319:     if (tf->e[i].x) return 0;
                    320:   }
                    321:   return(1);
                    322: }
                    323:

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