=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2018/engine/Q.c,v retrieving revision 1.18 retrieving revision 1.22 diff -u -p -r1.18 -r1.22 --- OpenXM_contrib2/asir2018/engine/Q.c 2020/10/04 03:14:09 1.18 +++ OpenXM_contrib2/asir2018/engine/Q.c 2022/04/03 01:30:27 1.22 @@ -1,5 +1,6 @@ -/* $OpenXM: OpenXM_contrib2/asir2018/engine/Q.c,v 1.17 2020/01/09 01:47:41 noro Exp $ */ +/* $OpenXM: OpenXM_contrib2/asir2018/engine/Q.c,v 1.21 2021/10/08 07:27:05 noro Exp $ */ #include "ca.h" +#include "parse.h" #include "gmp.h" #include "base.h" #include "inline.h" @@ -97,8 +98,11 @@ void dnq(Q q,Z *r) int sgnq(Q q) { if ( !q ) return 0; - else if ( q->z ) return mpz_sgn(BDY((Z)q)); - else return mpz_sgn(mpq_numref(BDY(q))); + else if ( q->z ) { + int sgn; + sgn = mpz_sgn(BDY((Z)q)); + return sgn; + } else return mpz_sgn(mpq_numref(BDY(q))); } Q mpqtozq(mpq_t a) @@ -392,6 +396,8 @@ int cmpz(Z q1,Z q2) else if ( sgn < 0 ) return -1; else return 0; } + /* XXX */ + return 0; } void gcdz(Z n1,Z n2,Z *nq) @@ -669,6 +675,10 @@ void pwrq(Q n1,Q n,Q *nr) nm[0] = mpq_denref(BDY(n1))[0]; dn[0] = mpq_numref(BDY(n1))[0]; } + if ( mpz_sgn(dn)<0 ) { + mpz_neg(nm,nm); + mpz_neg(dn,dn); + } } else { if ( n1->z ) { nm[0] = BDY((Z)n1)[0]; @@ -787,10 +797,10 @@ void lgp(P p,Z *g,Z *l) if ( NUM(p) ) { if ( ((Q)p)->z ) { - MPZTOZ(BDY((Z)p),*g); + absz((Z)p,g); *l = ONE; } else { - MPZTOZ(mpq_numref(BDY((Q)p)),*g); + MPZTOZ(mpq_numref(BDY((Q)p)),g1); absz(g1,g); MPZTOZ(mpq_denref(BDY((Q)p)),*l); } } else { @@ -2267,7 +2277,7 @@ int generic_gauss_elim_hensel64(MAT mat,MAT *nmmat,Z * for ( j = 0, bi = b[i], wi = wc[i]; j < ri; j++ ) wi[j] = mpz_fdiv_ui(bi[j],md); /* wc = A^(-1)wc; wc is not normalized */ - solve_by_lu_mod64(w,rank,md,wc,ri,0); + solve_by_lu_mod64(w,rank,md,(mp_limb_signed_t **)wc,ri,0); /* x += q*wc */ for ( i = 0; i < rank; i++ ) for ( j = 0, wi = wc[i]; j < ri; j++ )