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>