Annotation of OpenXM_contrib2/asir2000/builtin/algnum.c, Revision 1.1.1.1
1.1 noro 1: /* $OpenXM: OpenXM/src/asir99/builtin/algnum.c,v 1.1.1.1 1999/11/10 08:12:25 noro Exp $ */
2: #include "ca.h"
3: #include "parse.h"
4:
5: void Pdefpoly(), Pnewalg(), Pmainalg(), Palgtorat(), Prattoalg(), Pgetalg();
6: void Palg(), Palgv(), Pgetalgtree();
7:
8: #if defined(THINK_C)
9: void mkalg(P,Alg *);
10: int cmpalgp(P,P);
11: void algptop(P,P *);
12: void algtorat(Num,Obj *);
13: void rattoalg(Obj,Alg *);
14: void ptoalgp(P,P *);
15: #else
16: void mkalg();
17: int cmpalgp();
18: void algptop();
19: void algtorat();
20: void rattoalg();
21: void ptoalgp();
22: void clctalg();
23: #endif
24:
25: struct ftab alg_tab[] = {
26: {"defpoly",Pdefpoly,1},
27: {"newalg",Pnewalg,1},
28: {"mainalg",Pmainalg,1},
29: {"algtorat",Palgtorat,1},
30: {"rattoalg",Prattoalg,1},
31: {"getalg",Pgetalg,1},
32: {"getalgtree",Pgetalgtree,1},
33: {"alg",Palg,1},
34: {"algv",Palgv,1},
35: {0,0,0},
36: };
37:
38: static int UCN,ACNT;
39:
40: void Pnewalg(arg,rp)
41: NODE arg;
42: Alg *rp;
43: {
44: P p;
45: VL vl;
46: P c;
47:
48: p = (P)ARG0(arg);
49: if ( !p || OID(p) != O_P )
50: error("newalg : invalid argument");
51: clctv(CO,p,&vl);
52: if ( NEXT(vl) )
53: error("newalg : invalid argument");
54: c = COEF(DC(p));
55: if ( !NUM(c) || !RATN(c) )
56: error("newalg : invalid argument");
57: mkalg(p,rp);
58: }
59:
60: void mkalg(p,r)
61: P p;
62: Alg *r;
63: {
64: VL vl,mvl,nvl;
65: V a,tv;
66: char buf[BUFSIZ];
67: char *name;
68: P x,t,s;
69: Num c;
70: DCP dc,dcr,dcr0;
71:
72: for ( vl = ALG; vl; vl = NEXT(vl) )
73: if ( !cmpalgp(p,(P)vl->v->attr) ) {
74: a = vl->v; break;
75: }
76: if ( !vl ) {
77: NEWVL(vl); NEXT(vl) = ALG; ALG = vl;
78: NEWV(a); vl->v = a;
79: sprintf(buf,"#%d",ACNT++);
80: name = (char *)MALLOC(strlen(buf)+1);
81: strcpy(name,buf); NAME(a) = name;
82:
83: for ( dc = DC(p), dcr0 = 0; dc; dc = NEXT(dc) ) {
84: NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc); c = (Num)COEF(dc);
85: if ( NID(c) != N_A )
86: COEF(dcr) = (P)c;
87: else
88: COEF(dcr) = (P)BDY(((Alg)c));
89: }
90: NEXT(dcr) = 0; MKP(a,dcr0,t); a->attr = (pointer)t;
91:
92: sprintf(buf,"t%s",name); makevar(buf,&s);
93:
94: if ( NEXT(ALG) ) {
95: tv = (V)NEXT(ALG)->v->priv;
96: for ( vl = CO; NEXT(NEXT(vl)); vl = NEXT(vl) );
97: nvl = NEXT(vl); NEXT(vl) = 0;
98: for ( vl = CO; NEXT(vl) && (NEXT(vl)->v != tv); vl = NEXT(vl) );
99: mvl = NEXT(vl); NEXT(vl) = nvl; NEXT(nvl) = mvl;
100: }
101:
102: a->priv = (pointer)VR(s); VR(s)->priv = (pointer)a;
103: }
104: MKV(a,x); MKAlg(x,*r);
105: }
106:
107: int cmpalgp(p,defp)
108: P p,defp;
109: {
110: DCP dc,dcd;
111: P t;
112:
113: for ( dc = DC(p), dcd = DC(defp); dc && dcd;
114: dc = NEXT(dc), dcd = NEXT(dcd) ) {
115: if ( cmpq(DEG(dc),DEG(dcd)) )
116: break;
117: t = NID((Num)COEF(dc)) == N_A ? (P)BDY((Alg)COEF(dc)) : COEF(dc);
118: if ( compp(ALG,t,COEF(dcd)) )
119: break;
120: }
121: if ( dc || dcd )
122: return 1;
123: else
124: return 0;
125: }
126:
127: void Pdefpoly(arg,rp)
128: NODE arg;
129: P *rp;
130: {
131: asir_assert(ARG0(arg),O_N,"defpoly");
132: algptop((P)VR((P)BDY((Alg)ARG0(arg)))->attr,rp);
133: }
134:
135: void Pmainalg(arg,r)
136: NODE arg;
137: Alg *r;
138: {
139: Num c;
140: V v;
141: P b;
142:
143: c = (Num)(ARG0(arg));
144: if ( NID(c) <= N_R )
145: *r = 0;
146: else {
147: v = VR((P)BDY((Alg)c)); MKV(v,b); MKAlg(b,*r);
148: }
149: }
150:
151: void Palgtorat(arg,rp)
152: NODE arg;
153: Obj *rp;
154: {
155: asir_assert(ARG0(arg),O_N,"algtorat");
156: algtorat((Num)ARG0(arg),rp);
157: }
158:
159: void Prattoalg(arg,rp)
160: NODE arg;
161: Alg *rp;
162: {
163: asir_assert(ARG0(arg),O_R,"rattoalg");
164: rattoalg((Obj)ARG0(arg),rp);
165: }
166:
167: void Pgetalg(arg,rp)
168: NODE arg;
169: LIST *rp;
170: {
171: Obj t;
172: P p;
173: VL vl;
174: Num a;
175: Alg b;
176: NODE n0,n;
177:
178: if ( !(a = (Num)ARG0(arg)) || NID(a) <= N_R )
179: vl = 0;
180: else {
181: t = BDY((Alg)a);
182: switch ( OID(t) ) {
183: case O_P: case O_R:
184: clctvr(ALG,t,&vl); break;
185: default:
186: vl = 0; break;
187: }
188: }
189: for ( n0 = 0; vl; vl = NEXT(vl) ) {
190: NEXTNODE(n0,n); MKV(vl->v,p); MKAlg(p,b); BDY(n) = (pointer)b;
191: }
192: if ( n0 )
193: NEXT(n) = 0;
194: MKLIST(*rp,n0);
195: }
196:
197: void Pgetalgtree(arg,rp)
198: NODE arg;
199: LIST *rp;
200: {
201: Obj t;
202: P p;
203: VL vl,vl1,vl2;
204: Num a;
205: Alg b;
206: NODE n0,n;
207:
208: if ( !(a = (Num)ARG0(arg)) || NID(a) <= N_R )
209: vl = 0;
210: else {
211: t = BDY((Alg)a);
212: switch ( OID(t) ) {
213: case O_P:
214: clctalg(t,&vl); break;
215: case O_R:
216: clctalg(NM((R)t),&vl1);
217: clctalg(DN((R)t),&vl2);
218: mergev(ALG,vl1,vl2,&vl); break;
219: default:
220: vl = 0; break;
221: }
222: }
223: for ( n0 = 0; vl; vl = NEXT(vl) ) {
224: NEXTNODE(n0,n); MKV(vl->v,p); MKAlg(p,b); BDY(n) = (pointer)b;
225: }
226: if ( n0 )
227: NEXT(n) = 0;
228: MKLIST(*rp,n0);
229: }
230:
231: void clctalg(p,vl)
232: P p;
233: VL *vl;
234: {
235: int n,i;
236: VL tvl;
237: VN vn,vn1;
238: P d;
239: DCP dc;
240:
241: for ( n = 0, tvl = ALG; tvl; tvl = NEXT(tvl), n++ );
242: vn = (VN) ALLOCA((n+1)*sizeof(struct oVN));
243: for ( i = n-1, tvl = ALG; tvl; tvl = NEXT(tvl), i-- ) {
244: vn[i].v = tvl->v;
245: vn[i].n = 0;
246: }
247: markv(vn,n,p);
248: for ( i = n-1; i >= 0; i-- ) {
249: if ( !vn[i].n )
250: continue;
251: d = (P)vn[i].v->attr;
252: for ( dc = DC(d); dc; dc = NEXT(dc) )
253: markv(vn,i,COEF(dc));
254: }
255: vn1 = (VN) ALLOCA((n+1)*sizeof(struct oVN));
256: for ( i = 0; i < n; i++ ) {
257: vn1[i].v = vn[n-1-i].v; vn1[i].n = vn[n-1-i].n;
258: }
259: vntovl(vn1,n,vl);
260: }
261:
262: void Palg(arg,rp)
263: NODE arg;
264: Alg *rp;
265: {
266: Q a;
267: VL vl;
268: P x;
269: int n;
270:
271: a = (Q)ARG0(arg);
272: if ( a && (OID(a) != O_N || NID(a) != N_Q || !INT(a)) )
273: *rp = 0;
274: else {
275: n = ACNT-QTOS(a)-1;
276: for ( vl = ALG; vl && n; vl = NEXT(vl), n-- );
277: if ( vl ) {
278: MKV(vl->v,x); MKAlg(x,*rp);
279: } else
280: *rp = 0;
281: }
282: }
283:
284: void Palgv(arg,rp)
285: NODE arg;
286: Obj *rp;
287: {
288: Q a;
289: VL vl;
290: P x;
291: int n;
292: Alg b;
293:
294: a = (Q)ARG0(arg);
295: if ( a && (OID(a) != O_N || NID(a) != N_Q || !INT(a)) )
296: *rp = 0;
297: else {
298: n = ACNT-QTOS(a)-1;
299: for ( vl = ALG; vl && n; vl = NEXT(vl), n-- );
300: if ( vl ) {
301: MKV(vl->v,x); MKAlg(x,b); algtorat((Num)b,rp);
302: } else
303: *rp = 0;
304: }
305: }
306:
307: void algptop(p,r)
308: P p,*r;
309: {
310: DCP dc,dcr,dcr0;
311:
312: if ( NUM(p) )
313: *r = (P)p;
314: else {
315: for ( dc = DC(p), dcr0 = 0; dc; dc = NEXT(dc) ) {
316: NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc);
317: algptop(COEF(dc),&COEF(dcr));
318: }
319: NEXT(dcr) = 0; MKP((V)(VR(p)->priv),dcr0,*r);
320: }
321: }
322:
323: void algtorat(n,r)
324: Num n;
325: Obj *r;
326: {
327: Obj obj;
328: P nm,dn;
329:
330: if ( !n || NID(n) <= N_R )
331: *r = (Obj)n;
332: else {
333: obj = BDY((Alg)n);
334: if ( ID(obj) <= O_P )
335: algptop((P)obj,(P *)r);
336: else {
337: algptop(NM((R)obj),&nm); algptop(DN((R)obj),&dn);
338: divr(CO,(Obj)nm,(Obj)dn,r);
339: }
340: }
341: }
342:
343: void rattoalg(obj,n)
344: Obj obj;
345: Alg *n;
346: {
347: P nm,dn;
348: Obj t;
349:
350: if ( !obj || ID(obj) == O_N )
351: *n = (Alg)obj;
352: else if ( ID(obj) == O_P ) {
353: ptoalgp((P)obj,(P *)&t); MKAlg(t,*n);
354: } else {
355: ptoalgp(NM((R)obj),&nm); ptoalgp(DN((R)obj),&dn);
356: divr(ALG,(Obj)nm,(Obj)dn,&t); MKAlg(t,*n);
357: }
358: }
359:
360: void ptoalgp(p,r)
361: P p,*r;
362: {
363: DCP dc,dcr,dcr0;
364:
365: if ( NUM(p) )
366: *r = (P)p;
367: else {
368: for ( dc = DC(p), dcr0 = 0; dc; dc = NEXT(dc) ) {
369: NEXTDC(dcr0,dcr); DEG(dcr) = DEG(dc);
370: ptoalgp(COEF(dc),&COEF(dcr));
371: }
372: NEXT(dcr) = 0; MKP((V)(VR(p)->priv),dcr0,*r);
373: }
374: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>