Annotation of OpenXM_contrib2/asir2000/engine/EZ.c, Revision 1.1.1.1
1.1 noro 1: /* $OpenXM: OpenXM/src/asir99/engine/EZ.c,v 1.1.1.1 1999/11/10 08:12:26 noro Exp $ */
2: #include "ca.h"
3:
4: void ezgcdp(vl,p1,p2,pr)
5: VL vl;
6: P p1,p2;
7: P *pr;
8: {
9: P f1,f2;
10: Q c;
11:
12: if ( !p1 )
13: if ( !p2 )
14: *pr = 0;
15: else
16: *pr = p2;
17: else if ( !p2 )
18: *pr = p1;
19: else {
20: if ( !qpcheck((Obj)p1) || !qpcheck((Obj)p2) )
21: error("ezgcdp : invalid argument");
22: ptozp(p1,1,&c,&f1);
23: ptozp(p2,1,&c,&f2);
24: ezgcdpz(vl,f1,f2,pr);
25: }
26: }
27:
28: /*
29: * p1, p2 : integer coefficient
30: * returns gcd(pp(p1),pp(p2)) * gcd(cont(p1),cont(p2))
31: */
32:
33: void ezgcdpz(vl,p1,p2,pr)
34: VL vl;
35: P p1,p2,*pr;
36: {
37: P f1,f2,t,s,g,gcd;
38: P fc1,fc2,cont;
39: VL tvl,svl;
40: V v1,v2;
41: DCP dc,dc1,dc2;
42: N cn;
43: Q cq;
44: Q c1,c2,c;
45: P g1,g2;
46: P mgcd;
47: extern int nez;
48: P pm[2];
49:
50: if ( nez ) {
51: pm[0] = p1; pm[1] = p2; nezgcdnpz(vl,pm,2,pr); return;
52: }
53: monomialfctr(vl,p1,&f1,&dc1); p1 = f1;
54: monomialfctr(vl,p2,&f2,&dc2); p2 = f2;
55: for ( mgcd = (P)ONE; dc1; dc1 = NEXT(dc1) )
56: for ( v1 = VR(dc1->c), dc = dc2; dc; dc = NEXT(dc) )
57: if ( v1 == VR(dc->c) ) {
58: pwrp(vl,dc->c,cmpq(dc1->d,dc->d)>=0?dc->d:dc1->d,&t);
59: mulp(vl,mgcd,t,&s); mgcd = s; break;
60: }
61:
62: if ( NUM(p1) ) {
63: if ( NUM(p2) ) {
64: gcdn(NM((Q)p1),NM((Q)p2),&cn); NTOQ(cn,1,c);
65: } else {
66: ptozp(p2,1,&c2,&t);
67: gcdn(NM((Q)p1),NM(c2),&cn); NTOQ(cn,1,c);
68: }
69: mulp(vl,(P)c,mgcd,pr);
70: return;
71: } else if ( NUM(p2) ) {
72: ptozp(p1,1,&c1,&t);
73: gcdn(NM(c1),NM((Q)p2),&cn); NTOQ(cn,1,c);
74: mulp(vl,(P)c,mgcd,pr);
75: return;
76: }
77:
78: ptozp(p1,1,&c1,&g1); ptozp(p2,1,&c2,&g2);
79: gcdn(NM(c1),NM(c2),&cn); NTOQ(cn,1,cq);
80:
81: if ( ( v1 = VR(f1) ) != ( v2 = VR(f2) ) ) {
82: while ( v1 != VR(vl) && v2 != VR(vl) )
83: vl = NEXT(vl);
84: if ( v1 == VR(vl) ) {
85: pcp(vl,f1,&g,&fc1);
86: ezgcdpz(vl,fc1,f2,&t);
87: } else {
88: pcp(vl,f2,&g,&fc2);
89: ezgcdpz(vl,fc2,f1,&t);
90: }
91: mulp(vl,t,(P)cq,&s); mulp(vl,s,mgcd,pr);
92: return;
93: }
94:
95: pcp(vl,f1,&g1,&fc1); pcp(vl,f2,&g2,&fc2);
96: ezgcdpz(vl,fc1,fc2,&cont);
97: clctv(vl,g1,&tvl); clctv(vl,g2,&svl);
98: if ( !NEXT(tvl) && !NEXT(svl) ) {
99: uezgcdpz(vl,g1,g2,&t);
100: mulp(vl,t,cont,&s); mulp(vl,s,(P)cq,&t); mulp(vl,t,mgcd,pr);
101: return;
102: }
103:
104: if ( homdeg(g1) > homdeg(g2) ) {
105: t = g1; g1 = g2; g2 = t;
106: }
107: sqfrp(vl,g1,&dc);
108: for ( g = g2, gcd = (P)ONE; dc && !NUM(g); dc = NEXT(dc) ) {
109: if ( NUM(COEF(dc)) )
110: continue;
111: ezgcdpp(vl,dc,g,&t);
112: if ( NUM(t) )
113: continue;
114: mulp(vl,gcd,t,&s); gcd = s;
115: divsp(vl,g,t,&s); g = s;
116: }
117: mulp(vl,gcd,cont,&t); mulp(vl,t,(P)cq,&s); mulp(vl,s,mgcd,pr);
118: }
119:
120: void uezgcdpz(vl,p1,p2,pr)
121: VL vl;
122: P p1,p2,*pr;
123: {
124: P g1,g2,gcd,t,s,g;
125: DCP dc;
126: N cn;
127: Q c1,c2,cq;
128: P f1,f2;
129:
130: if ( NUM(p1) ) {
131: if ( NUM(p2) ) {
132: gcdn(NM((Q)p1),NM((Q)p2),&cn); NTOQ(cn,1,cq),*pr = (P)cq;
133: return;
134: } else {
135: ptozp(p2,1,&c2,&t);
136: gcdn(NM((Q)p1),NM(c2),&cn); NTOQ(cn,1,cq),*pr = (P)cq;
137: return;
138: }
139: } else if ( NUM(p2) ) {
140: ptozp(p1,1,&c1,&t);
141: gcdn(NM(c1),NM((Q)p2),&cn); NTOQ(cn,1,cq),*pr = (P)cq;
142: return;
143: }
144:
145: ptozp(p1,1,&c1,&f1); ptozp(p2,1,&c2,&f2);
146: gcdn(NM(c1),NM(c2),&cn); NTOQ(cn,1,cq);
147: if ( UDEG(f1) > UDEG(f2) ) {
148: g1 = f2; g2 = f1;
149: } else {
150: g1 = f1; g2 = f2;
151: }
152: usqp(g1,&dc);
153: for ( g = g2, gcd = (P)ONE; dc && !NUM(g); dc = NEXT(dc) ) {
154: if ( NUM(COEF(dc)) )
155: continue;
156: uezgcdpp(dc,g,&t);
157: if ( NUM(t) )
158: continue;
159: mulp(CO,gcd,t,&s); gcd = s;
160: divsp(CO,g,t,&s); g = s;
161: }
162: mulp(vl,gcd,(P)cq,pr);
163: }
164:
165: /*
166: dc : dc pair c^d
167: r = gcd(c^d,f)
168: */
169:
170: void ezgcdpp(vl,dc,f,r)
171: VL vl;
172: DCP dc;
173: P f;
174: P *r;
175: {
176: int k;
177: P g,h,t,s,gcd;
178:
179: if ( NUM(f) ) {
180: *r = (P)ONE;
181: return;
182: }
183: k = QTOS(DEG(dc)) - 1;
184: /* ezgcd1p(vl,COEF(dc),f,&gcd); */
185: ezgcdnp(vl,COEF(dc),&f,1,&gcd);
186: g = gcd; divsp(vl,f,gcd,&h);
187: for ( ; k > 0; k-- ) {
188: /* ezgcd1p(vl,g,h,&t); */
189: ezgcdnp(vl,g,&h,1,&t);
190: if ( NUM(t) )
191: break;
192: mulp(vl,gcd,t,&s); gcd = s;
193: divsp(vl,h,t,&s); h = s;
194: }
195: *r = gcd;
196: }
197:
198: void ezgcd1p(vl,p0,p1,gcdp)
199: VL vl;
200: P p0,p1;
201: P *gcdp;
202: {
203: VL nvl,tvl,vl0,vl1,vl2;
204: P f0,f1,t;
205:
206: clctv(vl,p0,&vl0); clctv(vl,p1,&vl1); mergev(vl,vl0,vl1,&vl2);
207: minchdegp(vl,p0,&tvl,&t); reordvar(vl2,tvl->v,&nvl);
208: reorderp(nvl,vl,p0,&f0); reorderp(nvl,vl,p1,&f1);
209: ezgcdnp(nvl,f0,&f1,1,&t);
210: reorderp(vl,nvl,t,gcdp);
211: }
212:
213: void uezgcdpp(dc,f,r)
214: DCP dc;
215: P f;
216: P *r;
217: {
218: int k;
219: P g,h,t,s,gcd;
220:
221: if ( NUM(f) ) {
222: *r = (P)ONE;
223: return;
224: }
225:
226: k = QTOS(DEG(dc)) - 1;
227: uezgcd1p(COEF(dc),f,&gcd);
228: g = gcd; divsp(CO,f,gcd,&h);
229: for ( ; k > 0; k-- ) {
230: uezgcd1p(g,h,&t);
231: if ( NUM(t) )
232: break;
233: mulp(CO,gcd,t,&s); gcd = s;
234: divsp(CO,h,t,&s); h = s;
235: }
236: *r = gcd;
237: }
238:
239: /*
240: * pr = gcd(p0,ps[0],...,ps[m-1])
241: *
242: * p0 is already square-free and primitive.
243: * ps[i] is at least primitive.
244: *
245: */
246:
247: void ezgcdnp(vl,p0,ps,m,pr)
248: VL vl;
249: int m;
250: P p0,*ps,*pr;
251: {
252: /* variables */
253: P p00,g,h,g0,h0,a0,b0;
254: P lp0,lgp0,lp00,lg,lg0,cbd,tq,t;
255: P *tps;
256: VL nvl1,nvl2,nvl,tvl;
257: V v;
258: int i,j,k,d0,dg,dg0,dmin;
259: VN vn0,vn1,vnt;
260: int nv,flag;
261:
262: /* set-up */
263: if ( NUM(p0) ) {
264: *pr = (P) ONE;
265: return;
266: }
267: for ( v = VR(p0), i = 0; i < m; i++ )
268: if ( NUM(ps[i]) || (v != VR(ps[i])) ) {
269: *pr = (P)ONE;
270: return;
271: }
272: tps = (P *) ALLOCA(m*sizeof(P));
273: for ( i = 0; i < m; i++ )
274: tps[i] = ps[i];
275: sortplist(tps,m);
276: /* deg(tps[0]) <= deg(tps[1]) <= ... */
277:
278: if ( !cmpq(DEG(DC(p0)),ONE) ) {
279: if ( divcheck(vl,tps,m,(P)ONE,p0) )
280: *pr = p0;
281: else
282: *pr = (P)ONE;
283: return;
284: }
285:
286: lp0 = LC(p0); lg = lp0; dmin = d0 = deg(v,p0);
287: clctv(vl,p0,&nvl);
288: for ( i = 0; i < m; i++ ) {
289: clctv(vl,tps[i],&nvl1); mergev(vl,nvl,nvl1,&nvl2);
290: nvl = nvl2;
291: ezgcdpz(nvl,lg,LC(tps[i]),&t); lg = t;
292: }
293:
294: mulp(nvl,p0,lg,&lgp0);
295: k = dbound(v,lgp0) + 1;
296: cbound(nvl,lgp0,(Q *)&cbd);
297: for ( nv = 0, tvl = nvl; tvl; tvl = NEXT(tvl), nv++ );
298: W_CALLOC(nv,struct oVN,vn0); W_CALLOC(nv,struct oVN,vnt);
299: W_CALLOC(nv,struct oVN,vn1);
300: for ( i = 0, tvl = NEXT(nvl); tvl; tvl = NEXT(tvl), i++ )
301: vn1[i].v = vn0[i].v = tvl->v;
302:
303: /* main loop */
304: for ( dg = deg(v,tps[0]) + 1; ; next(vn0) )
305: do {
306: for ( i = 0, j = 0; vn0[i].v; i++ )
307: if ( vn0[i].n ) vnt[j++].v = (V)i;
308: vnt[j].n = 0;
309:
310: /* find b s.t. LC(p0)(b), LC(tps[i])(b) != 0 */
311: mulsgn(vn0,vnt,j,vn1);
312: substvp(nvl,p0,vn1,&p00);
313: flag = (!zerovpchk(nvl,lp0,vn1) && sqfrchk(p00));
314: for ( i = 0; flag && (i < m); i++ )
315: flag &= (!zerovpchk(nvl,LC(tps[i]),vn1));
316: if ( !flag )
317: continue;
318:
319: /* substitute y -> b */
320: substvp(nvl,lg,vn1,&lg0);
321: lp00 = LC(p00);
322: /* extended-gcd in 1-variable */
323: uexgcdnp(nvl,p00,tps,m,vn1,(Q)cbd,&g0,&h0,&a0,&b0,(Q *)&tq);
324: if ( NUM(g0) ) {
325: *pr = (P)ONE;
326: return;
327: } else if ( dg > ( dg0 = deg(v,g0) ) ) {
328: dg = dg0;
329: if ( dg == d0 ) {
330: if ( divcheck(nvl,tps,m,lp0,p0) ) {
331: *pr = p0;
332: return;
333: }
334: } else if ( dg == deg(v,tps[0]) ) {
335: if ( divtpz(nvl,p0,tps[0],&t) &&
336: divcheck(nvl,tps+1,m-1,LC(tps[0]),tps[0]) ) {
337: *pr = tps[0];
338: return;
339: } else
340: break;
341: } else {
342: henmv(nvl,vn1,lgp0,g0,h0,a0,b0,
343: lg,lp0,lg0,lp00,(Q)tq,k,&g,&h);
344: if ( divtpz(nvl,lgp0,g,&t) &&
345: divcheck(nvl,tps,m,lg,g) ) {
346: pcp(nvl,g,pr,&t);
347: return;
348: }
349: }
350: }
351: } while ( !nextbin(vnt,j) );
352: }
353:
354: /*
355: f : sqfr
356: */
357:
358: void uezgcd1p(f,g,r)
359: P f,g;
360: P *r;
361: {
362: UM wf,wf1,wf2,wg,wg1,wgcd,wcof;
363: int d1,d2,dg,m,index,n;
364: ML list;
365: DCP dc;
366: P t;
367: Q c;
368:
369: if ( NUM(f) || NUM(g) ) {
370: *r = (P)ONE;
371: return;
372: }
373: ptozp(f,1,&c,&t); f = t; ptozp(g,1,&c,&t); g = t;
374: d1 = UDEG(f); d2 = UDEG(g);
375: n = MAX(d1,d2)+1;
376: wf = W_UMALLOC(n); wf1 = W_UMALLOC(n);
377: wf2 = W_UMALLOC(n); wg = W_UMALLOC(n);
378: wg1 = W_UMALLOC(n); wgcd = W_UMALLOC(n);
379: wcof = W_UMALLOC(n);
380:
381: for ( index = INDEX, dg = MIN(d1,d2)+1; ; ) {
382: m = sprime[index++];
383: if ( !rem(NM((Q)UCOEF(f)),m) || !rem(NM((Q)UCOEF(g)),m))
384: continue;
385: ptoum(m,f,wf); cpyum(wf,wf1);
386: diffum(m,wf1,wf2); gcdum(m,wf1,wf2,wgcd);
387: if ( DEG(wgcd) > 0 )
388: continue;
389: ptoum(m,g,wg); cpyum(wg,wg1); cpyum(wf,wf1);
390: gcdum(m,wf1,wg1,wgcd);
391: if ( dg <= DEG(wgcd) )
392: continue;
393: else
394: dg = DEG(wgcd);
395: if ( dg == 0 ) {
396: *r = (P)ONE;
397: return;
398: } else if ( dg == d1 ) {
399: if ( divtpz(CO,g,f,&t) ) {
400: *r = f;
401: return;
402: }
403: } else if ( dg == d2 ) {
404: if ( divtpz(CO,f,g,&t) ) {
405: *r = g;
406: return;
407: }
408: } else {
409: divum(m,wf,wgcd,wcof);
410: ezgcdhensel(f,m,wcof,wgcd,&list);
411: dtest(f,list,1,&dc);
412: if ( NEXT(dc) ) {
413: if ( divtpz(CO,g,COEF(dc),&t) ) {
414: *r = COEF(dc);
415: return;
416: }
417: }
418: }
419: }
420: }
421:
422: void uexgcdnp(vl,p1,ps,n,vn,cbd,g,h,a,b,q)
423: VL vl;
424: P p1;
425: P *ps;
426: int n;
427: VN vn;
428: Q cbd;
429: P *g,*h,*a,*b;
430: Q *q;
431: {
432: UM wg,wh,wg1,wh1,wgcd,wt;
433: P t,s,gcd,cof,gk,hk,ak,bk;
434: Q c,tq,bb,tq1,qk;
435: int mod,k,i,index,d;
436:
437: ptozp(p1,1,&c,&gcd);
438: for ( i = 0; i < n; i++ ) {
439: substvp(vl,ps[i],vn,&t);
440: uezgcd1p(gcd,t,&s);
441: if ( NUM(s) ) {
442: *g = (P)ONE; *h = p1; *a = 0; *b = (P)ONE;
443: return;
444: } else
445: gcd = s;
446: }
447:
448: if ( !dcomp(p1,gcd) ) {
449: *g = p1; *h = (P)ONE; *a = 0; *b = (P)ONE;
450: return;
451: }
452:
453: divsp(CO,p1,gcd,&cof);
454: d = UDEG(p1)+1;
455: wg = W_UMALLOC(d); wh = W_UMALLOC(d);
456: wg1 = W_UMALLOC(d); wh1 = W_UMALLOC(d);
457: wgcd = W_UMALLOC(d); wt = W_UMALLOC(d);
458: for ( index = INDEX; ; ) {
459: mod = sprime[index++];
460: if ( !rem(NM((Q)LC(p1)),mod) )
461: continue;
462: ptoum(mod,gcd,wg); ptoum(mod,cof,wh);
463: cpyum(wg,wg1); cpyum(wh,wh1);
464: gcdum(mod,wg,wh,wt); cpyum(wt,wgcd);
465: if ( DEG(wgcd) > 0 )
466: continue;
467: STOQ(mod,tq); addq(cbd,cbd,&bb);
468: for ( k = 1; cmpq(tq,bb) < 0; k++ ) {
469: mulq(tq,tq,&tq1); tq = tq1;
470: }
471: henzq(p1,gcd,wg1,cof,wh1,mod,k,&gk,&hk,&bk,&ak,&qk);
472: break;
473: }
474: *g = gk; *h = hk; *a = ak; *b = bk; *q = tq;
475: }
476:
477: void ezgcdhensel(f,mod,cof,gcd,listp)
478: P f;
479: int mod;
480: UM gcd,cof;
481: ML *listp;
482: {
483: register int i,j;
484: int q,n,bound;
485: int *p;
486: int **pp;
487: ML blist,clist,bqlist,cqlist,rlist;
488: UM *b;
489: LUM fl,tl;
490: LUM *l;
491: LUM LUMALLOC();
492:
493: blist = W_MLALLOC(2);
494: blist->n = 2; blist->mod = mod;
495: blist->c[0] = (pointer)cof; blist->c[1] = (pointer)gcd;
496: gcdgen(f,blist,&clist);
497: henprep(f,blist,clist,&bqlist,&cqlist);
498: n = bqlist->n; q = bqlist->mod;
499: bqlist->bound = cqlist->bound = bound = mignotte(q,f);
500:
501: if ( bound == 1 ) {
502: *listp = rlist = MLALLOC(n);
503: rlist->n = n;
504: rlist->mod = q;
505: rlist->bound = bound;
506:
507: for ( i = 0, b = (UM *)bqlist->c, l = (LUM *)rlist->c;
508: i < n; i++ ) {
509: tl = LUMALLOC(DEG(b[i]),1);
510: l[i] = tl;
511: p = COEF(b[i]);
512:
513: for ( j = 0, pp = COEF(tl);
514: j <= DEG(tl); j++ )
515: pp[j][0] = p[j];
516: }
517: } else {
518: W_LUMALLOC((int)UDEG(f),bound,fl);
519: ptolum(q,bound,f,fl);
520: henmain(fl,bqlist,cqlist,listp);
521: }
522: }
523:
524: void ezgcdnpz(vl,ps,m,pr)
525: VL vl;
526: P *ps,*pr;
527: int m;
528: {
529: P t,s,gcd;
530: P cont;
531: VL tvl,svl,nvl;
532: int i;
533: DCP dc;
534: N cn;
535: Q cq;
536: P *pl,*ppl,*pcl;
537: Q *cl;
538: V v;
539:
540: pl = (P *)ALLOCA((m+1)*sizeof(P));
541: cl = (Q *)ALLOCA((m+1)*sizeof(Q));
542: for ( i = 0; i < m; i++ )
543: ptozp(ps[i],1,&cl[i],&pl[i]);
544: for ( i = 1, cq = cl[0]; i < m; i++ ) {
545: gcdn(NM(cl[i]),NM(cq),&cn); NTOQ(cn,1,cq);
546: }
547: for ( i = 0; i < m; i++ )
548: if ( NUM(pl[i]) ) {
549: *pr = (P)cq;
550: return;
551: }
552:
553: for ( i = 0, nvl = 0; i < m; i++ ) {
554: clctv(vl,ps[i],&tvl); mergev(vl,nvl,tvl,&svl); nvl = svl;
555: }
556:
557: ppl = (P *)ALLOCA((m+1)*sizeof(P));
558: pcl = (P *)ALLOCA((m+1)*sizeof(P));
559: for ( i = 0, v = nvl->v; i < m; i++ )
560: if ( v == VR(pl[i]) )
561: pcp(nvl,pl[i],&ppl[i],&pcl[i]);
562: else {
563: ppl[i] = (P)ONE; pcl[i] = pl[i];
564: }
565: ezgcdnpz(nvl,pcl,m,&cont);
566:
567: for ( i = 0; i < m; i++ )
568: if ( NUM(ppl[i]) ) {
569: mulp(nvl,cont,(P)cq,pr);
570: return;
571: }
572: sortplist(ppl,m);
573: sqfrp(nvl,ppl[0],&dc);
574: for ( dc = NEXT(dc), gcd = (P)ONE; dc; dc = NEXT(dc) ) {
575: if ( NUM(COEF(dc)) )
576: continue;
577: ezgcdnpp(vl,dc,ppl+1,m-1,&t);
578: if ( NUM(t) )
579: continue;
580: mulp(vl,gcd,t,&s); gcd = s;
581: }
582: mulp(vl,gcd,cont,&t); mulp(vl,t,(P)cq,pr);
583: }
584:
585: void ezgcdnpp(vl,dc,pl,m,r)
586: VL vl;
587: DCP dc;
588: P *pl;
589: int m;
590: P *r;
591: {
592: int i,k;
593: P g,t,s,gcd;
594: P *pm;
595:
596: ezgcdnp(vl,COEF(dc),pl,m,&gcd);
597: if ( NUM(gcd) ) {
598: *r = (P)ONE;
599: return;
600: }
601: pm = (P *) ALLOCA((m+1)*sizeof(P));
602: for ( i = 0; i < m; i++ ) {
603: divsp(vl,pl[i],gcd,&pm[i]);
604: if ( NUM(pm[i]) ) {
605: *r = gcd;
606: return;
607: }
608: }
609: for ( g = gcd, k = QTOS(DEG(dc)) - 1; k > 0; k-- ) {
610: ezgcdnp(vl,g,pm,m,&t);
611: if ( NUM(t) )
612: break;
613: mulp(vl,gcd,t,&s); gcd = s;
614: for ( i = 0; i < m; i++ ) {
615: divsp(vl,pm[i],t,&s);
616: if ( NUM(s) ) {
617: *r = gcd;
618: return;
619: }
620: pm[i] = s;
621: }
622: }
623: *r = gcd;
624: }
625:
626: void pcp(vl,p,pp,c)
627: VL vl;
628: P p;
629: P *pp,*c;
630: {
631: P f,g,n;
632: DCP dc;
633: P *pl;
634: int i,m;
635: extern int nez;
636:
637: if ( NUM(p) ) {
638: *c = p;
639: *pp = (P)ONE;
640: } else {
641: for ( m = 0, dc = DC(p); dc; dc = NEXT(dc), m++ );
642: if ( m == 1 ) {
643: *c = COEF(DC(p));
644: divsp(vl,p,*c,pp);
645: return;
646: }
647: ptozp(p,1,(Q *)&n,&f);
648: pl = (P *)ALLOCA((m+1)*sizeof(P));
649: for ( i = 0, dc = DC(f); i < m; dc = NEXT(dc), i++ )
650: pl[i] = COEF(dc);
651: if ( nez )
652: nezgcdnpz(vl,pl,m,&g);
653: else
654: ezgcdnpz(vl,pl,m,&g);
655: mulp(vl,g,n,c); divsp(vl,f,g,pp);
656: }
657: }
658:
659: #if 0
660: pcp(vl,p,pp,c)
661: VL vl;
662: P p;
663: P *pp,*c;
664: {
665: P f,g,n,t;
666: DCP dc;
667:
668: if ( NUM(p) ) {
669: *c = p;
670: *pp = (P)ONE;
671: } else {
672: ptozp(p,1,&n,&f);
673: for ( g = LC(f), dc = NEXT(DC(f)); dc; dc = NEXT(dc) ) {
674: ezgcdpz(vl,g,COEF(dc),&t); g = t;
675: }
676: mulp(vl,g,n,c);
677: divsp(vl,f,g,pp);
678: }
679: }
680: #endif
681:
682: int divcheck(vl,ps,m,l,p)
683: VL vl;
684: int m;
685: P *ps,l,p;
686: {
687: int i;
688: P r,t;
689:
690: for ( i = 0; i < m; i++ ) {
691: mulp(vl,ps[i],l,&t);
692: if ( !divtpz(vl,t,p,&r) )
693: return ( 0 );
694: }
695: return ( 1 );
696: }
697:
698: void sortplist(plist,n)
699: P *plist;
700: int n;
701: {
702: int i,j;
703: P t;
704:
705: for ( i = 0; i < n; i++ )
706: for ( j = i + 1; j < n; j++ )
707: if ( cmpq(DEG(DC(plist[i])),DEG(DC(plist[j]))) > 0 ) {
708: t = plist[i]; plist[i] = plist[j]; plist[j] = t;
709: }
710: }
711:
712: int dcomp(p1,p2)
713: P p1,p2;
714: {
715: return ( cmpq(DEG(DC(p1)),DEG(DC(p2))) );
716: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>