Annotation of OpenXM_contrib2/asir2000/engine/poly.c, Revision 1.1
1.1 ! noro 1: void D_ADDP(vl,p1,p2,pr)
! 2: VL vl;
! 3: P p1,p2,*pr;
! 4: {
! 5: register DCP dc1,dc2,dcr0,dcr;
! 6: V v1,v2;
! 7: P t;
! 8:
! 9: if ( !p1 )
! 10: *pr = p2;
! 11: else if ( !p2 )
! 12: *pr = p1;
! 13: else if ( NUM(p1) )
! 14: if ( NUM(p2) )
! 15: ADDNUM(p1,p2,pr);
! 16: else
! 17: ADDPQ(p2,p1,pr);
! 18: else if ( NUM(p2) )
! 19: ADDPQ(p1,p2,pr);
! 20: else if ( ( v1 = VR(p1) ) == ( v2 = VR(p2) ) ) {
! 21: for ( dc1 = DC(p1), dc2 = DC(p2), dcr0 = 0; dc1 && dc2; )
! 22: switch ( cmpq(DEG(dc1),DEG(dc2)) ) {
! 23: case 0:
! 24: ADDP(vl,COEF(dc1),COEF(dc2),&t);
! 25: if ( t ) {
! 26: NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc1); COEF(dcr) = t;
! 27: }
! 28: dc1 = NEXT(dc1); dc2 = NEXT(dc2); break;
! 29: case 1:
! 30: NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc1); COEF(dcr) = COEF(dc1);
! 31: dc1 = NEXT(dc1); break;
! 32: case -1:
! 33: NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc2); COEF(dcr) = COEF(dc2);
! 34: dc2 = NEXT(dc2); break;
! 35: }
! 36: if ( !dcr0 )
! 37: if ( dc1 )
! 38: dcr0 = dc1;
! 39: else if ( dc2 )
! 40: dcr0 = dc2;
! 41: else {
! 42: *pr = 0;
! 43: return;
! 44: }
! 45: else
! 46: if ( dc1 )
! 47: NEXT(dcr) = dc1;
! 48: else if ( dc2 )
! 49: NEXT(dcr) = dc2;
! 50: else
! 51: NEXT(dcr) = 0;
! 52: MKP(v1,dcr0,*pr);
! 53: } else {
! 54: while ( v1 != VR(vl) && v2 != VR(vl) )
! 55: vl = NEXT(vl);
! 56: if ( v1 == VR(vl) )
! 57: ADDPTOC(vl,p1,p2,pr);
! 58: else
! 59: ADDPTOC(vl,p2,p1,pr);
! 60: }
! 61: }
! 62:
! 63: void D_ADDPQ(p,q,pr)
! 64: P p,q,*pr;
! 65: {
! 66: DCP dc,dcr,dcr0;
! 67: P t;
! 68:
! 69: if ( NUM(p) )
! 70: ADDNUM(p,q,pr);
! 71: else {
! 72: dc = DC(p);
! 73: for ( dcr0 = 0; dc && cmpq(DEG(dc),0) > 0; dc = NEXT(dc) ) {
! 74: NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); COEF(dcr) = COEF(dc);
! 75: }
! 76: if ( !dc ) {
! 77: NEXTDC(dcr0,dcr);
! 78: DEG(dcr) = 0; COEF(dcr) = q; NEXT(dcr) = 0;
! 79: } else if ( !DEG(dc) ) {
! 80: ADDPQ(COEF(dc),q,&t);
! 81: if ( t ) {
! 82: NEXTDC(dcr0,dcr);
! 83: DEG(dcr) = 0; COEF(dcr) = t;
! 84: }
! 85: NEXT(dcr) = NEXT(dc);
! 86: } else {
! 87: NEXTDC(dcr0,dcr);
! 88: DEG(dcr) = 0; COEF(dcr) = q; NEXT(dcr) = dc;
! 89: }
! 90: MKP(VR(p),dcr0,*pr);
! 91: }
! 92: }
! 93:
! 94: void D_ADDPTOC(vl,p,c,pr)
! 95: VL vl;
! 96: P p,c,*pr;
! 97: {
! 98: DCP dc,dcr,dcr0;
! 99: P t;
! 100:
! 101: for ( dcr0 = 0, dc = DC(p); dc && cmpq(DEG(dc),0) > 0; dc = NEXT(dc) ) {
! 102: NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); COEF(dcr) = COEF(dc);
! 103: }
! 104: if ( !dc ) {
! 105: NEXTDC(dcr0,dcr);
! 106: DEG(dcr) = 0; COEF(dcr) = c; NEXT(dcr) = 0;
! 107: } else if ( !DEG(dc) ) {
! 108: ADDP(vl,COEF(dc),c,&t);
! 109: if ( t ) {
! 110: NEXTDC(dcr0,dcr);
! 111: DEG(dcr) = 0; COEF(dcr) = t;
! 112: }
! 113: NEXT(dcr) = NEXT(dc);
! 114: } else {
! 115: NEXTDC(dcr0,dcr);
! 116: DEG(dcr) = 0; COEF(dcr) = c; NEXT(dcr) = dc;
! 117: }
! 118: MKP(VR(p),dcr0,*pr);
! 119: }
! 120:
! 121: void D_SUBP(vl,p1,p2,pr)
! 122: VL vl;
! 123: P p1,p2,*pr;
! 124: {
! 125: P t;
! 126:
! 127: if ( !p2 )
! 128: *pr = p1;
! 129: else {
! 130: CHSGNP(p2,&t); ADDP(vl,p1,t,pr);
! 131: }
! 132: }
! 133:
! 134: void D_MULP(vl,p1,p2,pr)
! 135: VL vl;
! 136: P p1,p2,*pr;
! 137: {
! 138: register DCP dc,dct,dcr,dcr0;
! 139: V v1,v2;
! 140: P t,s,u;
! 141: int n1,n2;
! 142:
! 143: if ( !p1 || !p2 ) *pr = 0;
! 144: else if ( NUM(p1) )
! 145: MULPQ(p2,p1,pr);
! 146: else if ( NUM(p2) )
! 147: MULPQ(p1,p2,pr);
! 148: else if ( ( v1 = VR(p1) ) == ( v2 = VR(p2) ) ) {
! 149: for ( dc = DC(p1), n1 = 0; dc; dc = NEXT(dc), n1++ );
! 150: for ( dc = DC(p2), n2 = 0; dc; dc = NEXT(dc), n2++ );
! 151: if ( n1 > n2 )
! 152: for ( dc = DC(p2), s = 0; dc; dc = NEXT(dc) ) {
! 153: for ( dcr0 = 0, dct = DC(p1); dct; dct = NEXT(dct) ) {
! 154: NEXTDC(dcr0,dcr); MULP(vl,COEF(dct),COEF(dc),&COEF(dcr));
! 155: addq(DEG(dct),DEG(dc),&DEG(dcr));
! 156: }
! 157: NEXT(dcr) = 0; MKP(v1,dcr0,t);
! 158: ADDP(vl,s,t,&u); s = u; t = u = 0;
! 159: }
! 160: else
! 161: for ( dc = DC(p1), s = 0; dc; dc = NEXT(dc) ) {
! 162: for ( dcr0 = 0, dct = DC(p2); dct; dct = NEXT(dct) ) {
! 163: NEXTDC(dcr0,dcr); MULP(vl,COEF(dct),COEF(dc),&COEF(dcr));
! 164: addq(DEG(dct),DEG(dc),&DEG(dcr));
! 165: }
! 166: NEXT(dcr) = 0; MKP(v1,dcr0,t);
! 167: ADDP(vl,s,t,&u); s = u; t = u = 0;
! 168: }
! 169: *pr = s;
! 170: } else {
! 171: while ( v1 != VR(vl) && v2 != VR(vl) )
! 172: vl = NEXT(vl);
! 173: if ( v1 == VR(vl) )
! 174: MULPC(vl,p1,p2,pr);
! 175: else
! 176: MULPC(vl,p2,p1,pr);
! 177: }
! 178: }
! 179:
! 180: void D_MULPQ(p,q,pr)
! 181: P p,q,*pr;
! 182: {
! 183: DCP dc,dcr,dcr0;
! 184: P t;
! 185:
! 186: if (!p || !q)
! 187: *pr = 0;
! 188: else if ( Uniq(q) )
! 189: *pr = p;
! 190: else if ( NUM(p) )
! 191: MULNUM(p,q,pr);
! 192: else {
! 193: for ( dcr0 = 0, dc = DC(p); dc; dc = NEXT(dc) ) {
! 194: MULPQ(COEF(dc),q,&t);
! 195: if ( t ) {
! 196: NEXTDC(dcr0,dcr); COEF(dcr) = t; DEG(dcr) = DEG(dc);
! 197: }
! 198: }
! 199: if ( dcr0 ) {
! 200: NEXT(dcr) = 0; MKP(VR(p),dcr0,*pr);
! 201: } else
! 202: *pr = 0;
! 203: }
! 204: }
! 205:
! 206: void D_MULPC(vl,p,c,pr)
! 207: VL vl;
! 208: P p,c,*pr;
! 209: {
! 210: DCP dc,dcr,dcr0;
! 211: P t;
! 212:
! 213: if ( NUM(c) )
! 214: MULPQ(p,c,pr);
! 215: else {
! 216: for ( dcr0 = 0, dc = DC(p); dc; dc = NEXT(dc) ) {
! 217: MULP(vl,COEF(dc),c,&t);
! 218: if ( t ) {
! 219: NEXTDC(dcr0,dcr); COEF(dcr) = t; DEG(dcr) = DEG(dc);
! 220: }
! 221: }
! 222: if ( dcr0 ) {
! 223: NEXT(dcr) = 0; MKP(VR(p),dcr0,*pr);
! 224: } else
! 225: *pr = 0;
! 226: }
! 227: }
! 228:
! 229: void D_PWRP(vl,p,q,pr)
! 230: VL vl;
! 231: P p,*pr;
! 232: Q q;
! 233: {
! 234: DCP dc,dcr;
! 235: int n,i;
! 236: P *x,*y;
! 237: P t,s,u;
! 238: DCP dct;
! 239: P *pt;
! 240:
! 241: if ( !q ) {
! 242: *pr = (P)One;
! 243: } else if ( !p )
! 244: *pr = 0;
! 245: else if ( UNIQ(q) )
! 246: *pr = p;
! 247: else if ( NUM(p) )
! 248: PWRNUM(p,q,pr);
! 249: else {
! 250: dc = DC(p);
! 251: if ( !NEXT(dc) ) {
! 252: NEWDC(dcr);
! 253: PWRP(vl,COEF(dc),q,&COEF(dcr)); mulq(DEG(dc),q,&DEG(dcr));
! 254: NEXT(dcr) = 0; MKP(VR(p),dcr,*pr);
! 255: } else if ( !INT(q) ) {
! 256: error("pwrp: can't calculate fractional power."); *pr = 0;
! 257: } else if ( PL(NM(q)) == 1 ) {
! 258: n = QTOS(q); x = (P *)ALLOCA((n+1)*sizeof(pointer));
! 259: NEWDC(dct); DEG(dct) = DEG(dc); COEF(dct) = COEF(dc);
! 260: NEXT(dct) = 0; MKP(VR(p),dct,t);
! 261: for ( i = 0, u = (P)One; i < n; i++ ) {
! 262: x[i] = u; MULP(vl,u,t,&s); u = s;
! 263: }
! 264: x[n] = u; y = (P *)ALLOCA((n+1)*sizeof(pointer));
! 265:
! 266: MKP(VR(p),NEXT(dc),t);
! 267: for ( i = 0, u = (P)One; i < n; i++ ) {
! 268: y[i] = u; MULP(vl,u,t,&s); u = s;
! 269: }
! 270: y[n] = u;
! 271: pt = (P *)ALLOCA((n+1)*sizeof(pointer)); MKBC(n,pt);
! 272: for ( i = 0, u = 0; i <= n; i++ ) {
! 273: MULP(vl,x[i],y[n-i],&t); MULP(vl,t,pt[i],&s);
! 274: ADDP(vl,u,s,&t); u = t;
! 275: }
! 276: *pr = u;
! 277: } else {
! 278: error("exponent too big");
! 279: *pr = 0;
! 280: }
! 281: }
! 282: }
! 283:
! 284: void D_CHSGNP(p,pr)
! 285: P p,*pr;
! 286: {
! 287: register DCP dc,dcr,dcr0;
! 288: P t;
! 289:
! 290: if ( !p )
! 291: *pr = NULL;
! 292: else if ( NUM(p) ) {
! 293: #if defined(_PA_RISC1_1) || defined(__alpha) || defined(mips) || defined(_IBMR2)
! 294: #ifdef FBASE
! 295: chsgnnum((Num)p,(Num *)pr);
! 296: #else
! 297: MQ mq;
! 298:
! 299: NEWMQ(mq); CONT(mq)=mod-CONT((MQ)p); *pr = (P)mq;
! 300: #endif
! 301: #else
! 302: CHSGNNUM(p,t); *pr = t;
! 303: #endif
! 304: } else {
! 305: for ( dcr0 = 0, dc = DC(p); dc; dc = NEXT(dc) ) {
! 306: NEXTDC(dcr0,dcr); CHSGNP(COEF(dc),&COEF(dcr)); DEG(dcr) = DEG(dc);
! 307: }
! 308: NEXT(dcr) = 0; MKP(VR(p),dcr0,*pr);
! 309: }
! 310: }
! 311:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>