[BACK]Return to gfspn.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / engine

Annotation of OpenXM_contrib2/asir2000/engine/gfspn.c, Revision 1.6

1.6     ! noro        1: /* $OpenXM: OpenXM_contrib2/asir2000/engine/gfspn.c,v 1.5 2001/10/09 01:36:13 noro Exp $ */
1.2       noro        2:
1.1       noro        3: #include "ca.h"
                      4: #include "base.h"
                      5:
1.4       noro        6: UM current_mod_gfsn;
1.1       noro        7:
1.5       noro        8: void setmod_gfsn(UM p)
1.1       noro        9: {
1.6     ! noro       10:   current_mod_gfsn = p;
1.1       noro       11: }
                     12:
1.5       noro       13: void getmod_gfsn(UM *up)
1.1       noro       14: {
1.6     ! noro       15:   *up = current_mod_gfsn;
1.1       noro       16: }
                     17:
1.5       noro       18: void simpgfsn(GFSN n,GFSN *r)
1.1       noro       19: {
1.6     ! noro       20:   UM t,q;
1.1       noro       21:
1.6     ! noro       22:   if ( !n )
        !            23:     *r = 0;
        !            24:   else if ( NID(n) != N_GFSN )
        !            25:     *r = n;
        !            26:   else {
        !            27:     t = UMALLOC(DEG(BDY(n)));
        !            28:     q = W_UMALLOC(DEG(BDY(n)));
        !            29:     cpyum(BDY(n),t);
        !            30:     DEG(t) = divsfum(t,current_mod_gfsn,q);
        !            31:     MKGFSN(t,*r);
        !            32:   }
1.1       noro       33: }
                     34:
1.4       noro       35: #define NZGFSN(a) ((a)&&(OID(a)==O_N)&&(NID(a)==N_GFSN))
1.1       noro       36:
1.5       noro       37: void ntogfsn(Obj a,GFSN *b)
1.1       noro       38: {
1.6     ! noro       39:   UM t;
        !            40:   GFS c;
1.1       noro       41:
1.6     ! noro       42:   if ( !a || (OID(a)==O_N && NID(a) == N_GFSN) )
        !            43:     *b = (GFSN)a;
        !            44:   else if ( OID(a) == O_N && (NID(a) == N_GFS || NID(a) == N_Q) ) {
        !            45:     ntogfs((Obj)a,&c);
        !            46:     if ( !b )
        !            47:       *b = 0;
        !            48:     else {
        !            49:       t = UMALLOC(0); ptosfum((P)c,t);
        !            50:       MKGFSN(t,*b);
        !            51:     }
        !            52:   } else
        !            53:     error("ntogfsn : invalid argument");
1.1       noro       54: }
                     55:
1.5       noro       56: void addgfsn(GFSN a,GFSN b,GFSN *c)
1.1       noro       57: {
1.6     ! noro       58:   UM t,q;
        !            59:   GFSN z;
        !            60:   int d;
        !            61:
        !            62:   ntogfsn((Obj)a,&z); a = z; ntogfsn((Obj)b,&z); b = z;
        !            63:   if ( !a )
        !            64:     *c = b;
        !            65:   else if ( !b )
        !            66:     *c = a;
        !            67:   else {
        !            68:     d = MAX(DEG(BDY(a)),DEG(BDY(b)));
        !            69:     t = UMALLOC(d);
        !            70:     q = W_UMALLOC(d);
        !            71:     addsfum(BDY(a),BDY(b),t);
        !            72:     DEG(t) = divsfum(t,current_mod_gfsn,q);
        !            73:     MKGFSN(t,z);
        !            74:     *c = (GFSN)z;
        !            75:   }
1.1       noro       76: }
                     77:
1.5       noro       78: void subgfsn(GFSN a,GFSN b,GFSN *c)
1.1       noro       79: {
1.6     ! noro       80:   UM t,q;
        !            81:   GFSN z;
        !            82:   int d;
        !            83:
        !            84:   ntogfsn((Obj)a,&z); a = z; ntogfsn((Obj)b,&z); b = z;
        !            85:   if ( !a )
        !            86:     chsgngfsn(b,c);
        !            87:   else if ( !b )
        !            88:     *c = a;
        !            89:   else {
        !            90:     d = MAX(DEG(BDY(a)),DEG(BDY(b)));
        !            91:     t = UMALLOC(d);
        !            92:     q = W_UMALLOC(d);
        !            93:     subsfum(BDY(a),BDY(b),t);
        !            94:     DEG(t) = divsfum(t,current_mod_gfsn,q);
        !            95:     MKGFSN(t,*c);
        !            96:   }
1.1       noro       97: }
                     98:
                     99: extern int up_lazy;
                    100:
1.5       noro      101: void mulgfsn(GFSN a,GFSN b,GFSN *c)
1.1       noro      102: {
1.6     ! noro      103:   UM t,q;
        !           104:   GFSN z;
        !           105:   int d;
        !           106:
        !           107:   ntogfsn((Obj)a,&z); a = z; ntogfsn((Obj)b,&z); b = z;
        !           108:   if ( !a || !b )
        !           109:     *c = 0;
        !           110:   else {
        !           111:     d = DEG(BDY(a))+DEG(BDY(b));
        !           112:     t = UMALLOC(d);
        !           113:     q = W_UMALLOC(d);
        !           114:     mulsfum(BDY(a),BDY(b),t);
        !           115:     DEG(t) = divsfum(t,current_mod_gfsn,q);
        !           116:     MKGFSN(t,*c);
        !           117:   }
1.1       noro      118: }
                    119:
1.5       noro      120: void divgfsn(GFSN a,GFSN b,GFSN *c)
1.1       noro      121: {
1.6     ! noro      122:   GFSN z;
        !           123:   int d;
        !           124:   UM wb,wc,wd,we,t,q;
        !           125:
        !           126:   ntogfsn((Obj)a,&z); a = z; ntogfsn((Obj)b,&z); b = z;
        !           127:   if ( !b )
        !           128:     error("divgfsn: division by 0");
        !           129:   else if ( !a )
        !           130:     *c = 0;
        !           131:   else {
        !           132:     wb = W_UMALLOC(DEG(BDY(b))); cpyum(BDY(b),wb);
        !           133:     d = DEG(current_mod_gfsn);
        !           134:     wc = W_UMALLOC(d); cpyum(current_mod_gfsn,wc);
        !           135:     wd = W_UMALLOC(2*d); we = W_UMALLOC(2*d);
        !           136:     /* wd*wb+we*wc=1 */
        !           137:     eucsfum(wb,wc,wd,we);
        !           138:     d = DEG(BDY(a))+DEG(wd);
        !           139:     t = UMALLOC(d);
        !           140:     q = W_UMALLOC(d);
        !           141:     mulsfum(BDY(a),wd,t);
        !           142:     DEG(t) = divsfum(t,current_mod_gfsn,q);
        !           143:     MKGFSN(t,*c);
        !           144:   }
1.1       noro      145: }
                    146:
1.5       noro      147: void invgfsn(GFSN b,GFSN *c)
1.1       noro      148: {
1.6     ! noro      149:   GFSN z;
        !           150:   int d;
        !           151:   UM wb,wc,wd,we,t;
        !           152:
        !           153:   ntogfsn((Obj)b,&z); b = z;
        !           154:   if ( !b )
        !           155:     error("divgfsn: division by 0");
        !           156:   else {
        !           157:     wb = W_UMALLOC(DEG(BDY(b))); cpyum(BDY(b),wb);
        !           158:     d = DEG(current_mod_gfsn);
        !           159:     wc = W_UMALLOC(d); cpyum(current_mod_gfsn,wc);
        !           160:     wd = W_UMALLOC(2*d); we = W_UMALLOC(2*d);
        !           161:     /* wd*wb+we*wc=1 */
        !           162:     eucsfum(wb,wc,wd,we);
        !           163:     d = DEG(wd);
        !           164:     t = UMALLOC(d);
        !           165:     cpyum(wd,t);
        !           166:     MKGFSN(t,*c);
        !           167:   }
1.1       noro      168: }
                    169:
1.5       noro      170: void chsgngfsn(GFSN a,GFSN *c)
1.1       noro      171: {
1.6     ! noro      172:   GFSN z;
        !           173:   int d;
        !           174:   struct oUM zero;
        !           175:   UM t;
        !           176:
        !           177:   ntogfsn((Obj)a,&z); a = z;
        !           178:   if ( !a )
        !           179:     *c = 0;
        !           180:   else {
        !           181:     d = DEG(BDY(a));
        !           182:     t = UMALLOC(d);
        !           183:     DEG(&zero) = -1;
        !           184:     subsfum(&zero,BDY(a),t);
        !           185:     MKGFSN(t,*c);
        !           186:   }
1.1       noro      187: }
                    188:
1.5       noro      189: void pwrgfsn(GFSN a,Q b,GFSN *c)
1.1       noro      190: {
1.6     ! noro      191:   GFSN z;
        !           192:   UM t,x,y,q;
        !           193:   int d,k;
        !           194:   N e;
        !           195:
        !           196:   ntogfsn((Obj)a,&z); a = z;
        !           197:   if ( !b ) {
        !           198:     t = UMALLOC(0); DEG(t) = 0; COEF(t)[0] = _onesf();
        !           199:     MKGFSN(t,*c);
        !           200:   } else if ( !a )
        !           201:     *c = 0;
        !           202:   else {
        !           203:     d = DEG(current_mod_gfsn);
        !           204:
        !           205:     /* y = 1 */
        !           206:     y = UMALLOC(d); DEG(y) = 0; COEF(y)[0] = _onesf();
        !           207:
        !           208:     t = W_UMALLOC(2*d); q = W_UMALLOC(2*d);
        !           209:
        !           210:     /* x = simplify(a) */
        !           211:     x = W_UMALLOC(DEG(BDY(a))); cpyum(BDY(a),x);
        !           212:     DEG(x) = divsfum(x,current_mod_gfsn,q);
        !           213:     if ( DEG(x) < 0 ) {
        !           214:       *c = 0;
        !           215:     } else {
        !           216:       e = NM(b);
        !           217:       for ( k = n_bits(e)-1; k >= 0; k-- ) {
        !           218:         mulsfum(y,y,t);
        !           219:         DEG(t) = divsfum(t,current_mod_gfsn,q);
        !           220:         cpyum(t,y);
        !           221:         if ( e->b[k/32] & (1<<(k%32)) ) {
        !           222:           mulsfum(y,x,t);
        !           223:           DEG(t) = divsfum(t,current_mod_gfsn,q);
        !           224:           cpyum(t,y);
        !           225:         }
        !           226:       }
        !           227:       MKGFSN(y,*c);
        !           228:     }
        !           229:   }
1.1       noro      230: }
                    231:
1.5       noro      232: int cmpgfsn(GFSN a,GFSN b)
1.1       noro      233: {
1.6     ! noro      234:   GFSN z;
1.1       noro      235:
1.6     ! noro      236:   ntogfsn((Obj)a,&z); a = z; ntogfsn((Obj)b,&z); b = z;
        !           237:   if ( !a )
        !           238:     if ( !b )
        !           239:       return 0;
        !           240:     else
        !           241:       return -1;
        !           242:   else if ( !b )
        !           243:       return 1;
        !           244:   else
        !           245:     return compsfum(BDY(a),BDY(b));
1.1       noro      246: }
                    247:
1.5       noro      248: void randomgfsn(GFSN *r)
1.1       noro      249: {
1.6     ! noro      250:   int d;
        !           251:   UM t;
1.1       noro      252:
1.6     ! noro      253:   if ( !current_mod_gfsn )
        !           254:     error("randomgfsn : current_mod_gfsn is not set");
        !           255:   d = DEG(current_mod_gfsn);
        !           256:   t = UMALLOC(d-1);
        !           257:   randsfum(d,t);
        !           258:   degum(t,d-1);
        !           259:   if ( DEG(t) < 0 )
        !           260:     *r = 0;
        !           261:   else {
        !           262:     MKGFSN(t,*r);
        !           263:   }
1.1       noro      264: }

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