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

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

1.1     ! maekawa     1: /* resol.c */
        !             2: #include <stdio.h>
        !             3: #include "datatype.h"
        !             4: #include "extern2.h"
        !             5: #include "gradedset.h"
        !             6:
        !             7: #define lcomp_tower(f) ((f)==NULL? -1 : (f)->m->x[(f)->m->ringp->nn])
        !             8: /* returns leading component number of POLY f, which is equal to i of ee^i */
        !             9: static void shellForMonomialSyz(struct monomialSyz **p,int size);
        !            10: static struct arrayOfMonomialSyz schreyerSkelton0(struct arrayOfPOLY g,int i);
        !            11: static struct arrayOfMonomialSyz putMonomialSyz(struct arrayOfMonomialSyz a,
        !            12:                                                struct monomialSyz *s);
        !            13:
        !            14: struct monomialSyz *newMonomialSyz(void)
        !            15: {
        !            16:   struct monomialSyz *s;
        !            17:   s = (struct monomialSyz *)sGC_malloc(sizeof(struct monomialSyz));
        !            18:   if (s == NULL) errorGradedSet("newMonomialSyz(): no memory.");
        !            19:   s->i = s->j = -1;
        !            20:   s->deleted = 0;
        !            21:   s->a = POLYNULL;  s->b = POLYNULL;
        !            22:   return(s);
        !            23: }
        !            24:
        !            25: struct arrayOfMonomialSyz enlargeArrayOfMonomialSyz(struct arrayOfMonomialSyz pp)
        !            26: {
        !            27:   struct monomialSyz **newp;
        !            28:   int i;
        !            29:   int newlimit;
        !            30:   if (pp.limit <= 0) newlimit = 10; else newlimit = (pp.limit)*2;
        !            31:   newp = (struct monomialSyz **) sGC_malloc(sizeof(struct monomialSyz *)*newlimit);
        !            32:   if (newp == NULL) errorGradedSet("enlargeArrayOfMonomialSyz(): no memory.");
        !            33:   for (i=0; i< pp.size; i++) {
        !            34:     newp[i] = (pp.p)[i];
        !            35:   }
        !            36:   for (i=pp.size ; i<newlimit; i++) newp[i] = NULL;
        !            37:   pp.limit = newlimit;
        !            38:   pp.p = newp;
        !            39:   return(pp);
        !            40: }
        !            41:
        !            42:
        !            43: static struct arrayOfMonomialSyz schreyerSkelton0(struct arrayOfPOLY g,int i)
        !            44: /* return value will be changed by the next call of this function. */
        !            45: {
        !            46:   int m,j,k;
        !            47:   static int s_ij_size = 0;
        !            48:   static struct monomialSyz **s_ij = NULL;
        !            49:   struct monomialSyz *s;
        !            50:   struct spValue sv;
        !            51:   struct arrayOfMonomialSyz ans;
        !            52:
        !            53:   m = g.n;
        !            54:   if (m > s_ij_size) {
        !            55:     s_ij_size = m+1;
        !            56:     s_ij = (struct monomialSyz **)sGC_malloc(sizeof(struct monomialSyz *)*
        !            57:                                            s_ij_size);
        !            58:     if (s_ij == NULL) errorGradedSet("schreyerSkelton(): no memory");
        !            59:   }
        !            60:   for (j=i+1; j<m; j++) {
        !            61:     s_ij[j-i-1] = s = newMonomialSyz();
        !            62:     s->i = i; s->j = j;
        !            63:     if ((*isSameComponent)((g.array)[i],(g.array)[j])) {
        !            64:       s->deleted = 0;
        !            65:       sv = (*sp)((g.array)[i],(g.array)[j]);
        !            66:       s->a = sv.a; s->b = sv.b;
        !            67:     }else{
        !            68:       s->deleted = 1;
        !            69:     }
        !            70:   }
        !            71:   shellForMonomialSyz(s_ij,m-i-1);
        !            72:   for (j=0; j<m-i-1;j++) {
        !            73:     s = s_ij[j];
        !            74:     if (s->deleted != 1) {
        !            75:       for (k=j+1; k<m-i-1; k++) {
        !            76:        if (s_ij[k]->deleted != 1) {
        !            77:          if ((*isReducible)(s_ij[k]->a,s->a)) s_ij[k]->deleted = 1;
        !            78:        }
        !            79:       }
        !            80:     }
        !            81:   }
        !            82:   ans.size = m-i-1;
        !            83:   ans.limit = s_ij_size;
        !            84:   ans.p = s_ij;
        !            85:   return(ans);
        !            86: }
        !            87:
        !            88: static struct arrayOfMonomialSyz putMonomialSyz(struct arrayOfMonomialSyz a,
        !            89:                                                struct monomialSyz *s)
        !            90: {
        !            91:   if (a.limit <= a.size) {
        !            92:     a = enlargeArrayOfMonomialSyz(a);
        !            93:   }
        !            94:   (a.p)[a.size] = s;
        !            95:   a.size = a.size+1;
        !            96:   return(a);
        !            97: }
        !            98:
        !            99:
        !           100:
        !           101: struct arrayOfMonomialSyz schreyerSkelton(struct arrayOfPOLY g)
        !           102: {
        !           103:   int i,k,m;
        !           104:   struct arrayOfMonomialSyz ans;
        !           105:   struct arrayOfMonomialSyz ipart;
        !           106:   ans.size = 0;
        !           107:   ans.limit = 0;
        !           108:   ans.p = NULL;
        !           109:
        !           110:   m = g.n;
        !           111:   for (i=0;  i<m; i++ ) {
        !           112:     ipart = schreyerSkelton0(g,i);
        !           113:     for (k=0; k< ipart.size; k++) {
        !           114:       if ((ipart.p)[k]->deleted != 1) {
        !           115:        ans = putMonomialSyz(ans,(ipart.p)[k]);
        !           116:       }
        !           117:     }
        !           118:   }
        !           119:   shellForMonomialSyz(ans.p, ans.size);
        !           120:   return(ans);
        !           121: }
        !           122:
        !           123: static void shellForMonomialSyz(struct monomialSyz **p,int n)
        !           124: {
        !           125:   int gap, i, j, r;
        !           126:   struct monomialSyz *temp;
        !           127:   for (gap = n/2; gap > 0; gap /= 2) {
        !           128:     for (i = gap; i < n; i++) {
        !           129:       for (j = i - gap ; j >= 0; j -= gap) {
        !           130:        r = (*mmLarger)(p[j+gap]->a, p[j]->a);
        !           131:        if ( r >= 1) break;
        !           132:        temp = p[j];
        !           133:        p[j] = p[j+gap];
        !           134:        p[j+gap] = temp;
        !           135:       }
        !           136:     }
        !           137:   }
        !           138: }

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