=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/builtin/algnum.c,v retrieving revision 1.12 retrieving revision 1.15 diff -u -p -r1.12 -r1.15 --- OpenXM_contrib2/asir2000/builtin/algnum.c 2005/08/02 07:16:41 1.12 +++ OpenXM_contrib2/asir2000/builtin/algnum.c 2017/08/31 02:36:20 1.15 @@ -45,7 +45,7 @@ * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. * - * $OpenXM: OpenXM_contrib2/asir2000/builtin/algnum.c,v 1.11 2005/07/11 00:24:02 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/builtin/algnum.c,v 1.14 2013/11/17 17:34:59 ohara Exp $ */ #include "ca.h" #include "parse.h" @@ -146,12 +146,28 @@ void Pdalgtodp(NODE arg,LIST *r) void Pdptodalg(NODE arg,DAlg *r) { - DP d; + DP d,nm,nm1; + MP m; + Q c,a; DAlg t; - + d = (DP)ARG0(arg); - MKDAlg(d,ONE,t); - simpdalg(t,r); + if ( !d ) *r = 0; + else { + for ( m = BDY(d); m; m = NEXT(m) ) + if ( !INT((Q)m->c) ) break; + if ( !m ) { + MKDAlg(d,(Q)ONE,t); + } else { + dp_ptozp(d,&nm); + divq((Q)BDY(d)->c,(Q)BDY(nm)->c,&c); + NTOQ(NM(c),SGN(c),a); + muldc(CO,nm,(Obj)a,&nm1); + NTOQ(DN(c),1,a); + MKDAlg(nm1,a,t); + } + simpdalg(t,r); + } } void Pdalgtoup(NODE arg,LIST *r) @@ -193,7 +209,7 @@ void Pget_field_generator(NODE arg,DAlg *r) NEWDL(dl,n); for ( i = 0; i < n; i++ ) dl->d[i] = 0; dl->d[index] = 1; dl->td = 1; - NEWMP(m); m->dl = dl; m->c = (P)ONE; NEXT(m) = 0; + NEWMP(m); m->dl = dl; m->c = (Obj)ONE; NEXT(m) = 0; MKDP(n,m,d); MKDAlg(d,ONE,*r); } @@ -203,7 +219,7 @@ void Pinv_or_split_dalg(NODE arg,Obj *rp) { NODE gen,t,nd0,nd; LIST list; - int l,i,j,k,n; + int l,i,j,n; DP *ps,*ps1,*psw; NumberField nf; DAlg inv; @@ -239,7 +255,7 @@ void Pinv_or_split_dalg(NODE arg,Obj *rp) for ( ; i >= 0; i-- ) { NEXTNODE(nd0,nd); BDY(nd) = (pointer)psw[i]; } - for ( ; t; t = NEXT(t), k++ ) { + for ( ; t; t = NEXT(t) ) { NEXTNODE(nd0,nd); BDY(nd) = BDY(t); } NEXT(nd) = 0; @@ -726,13 +742,13 @@ void invalg_le(Alg a,LIST *r) for ( i = 0, t = rev0, mp0 = 0; i < len; i++, t = NEXT(t) ) if ( solmat[i][0] ) { NEXTMP(mp0,mp); - mp->c = (P)solmat[i][0]; + mp->c = (Obj)solmat[i][0]; mp->dl = BDY((DP)BDY(t))->dl; } NEXT(mp) = 0; MKDP(n,mp0,u); dp_ptozp(u,&u1); divq((Q)BDY(u)->c,(Q)BDY(u1)->c,&cont); - dtop(ALG,vl,u1,&ap); + dtop(ALG,vl,u1,(Obj *)&ap); MKAlg(ap,inv); mulq(dnsol,(Q)dn,&c1); mulq(c1,c,&c2);