=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2018/include/ca.h,v retrieving revision 1.1 retrieving revision 1.9 diff -u -p -r1.1 -r1.9 --- OpenXM_contrib2/asir2018/include/ca.h 2018/09/19 06:00:58 1.1 +++ OpenXM_contrib2/asir2018/include/ca.h 2019/08/21 00:37:47 1.9 @@ -45,7 +45,7 @@ * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. * - * $OpenXM$ + * $OpenXM: OpenXM_contrib2/asir2018/include/ca.h,v 1.8 2019/03/28 06:46:03 ohara Exp $ */ #include #include @@ -197,10 +197,10 @@ typedef unsigned _int64 UL; #endif #if defined(__GNUC__) && SIZEOF_LONG == 8 -typedef __uint64_t U64; typedef __uint128_t U128; typedef __int64_t L64; typedef __int128_t L128; + #endif typedef struct oZ { @@ -535,6 +535,12 @@ typedef struct oDMM { struct oDMM *next; } *DMM; +typedef struct oDMMstack { + int rank,ordtype; + DMM *in; + struct oDMMstack *next; +} *DMMstack; + typedef struct oDL { int td; int d[1]; @@ -771,7 +777,7 @@ typedef unsigned int ModNum; #define COEF(p) ((p)->c) #define DEG(p) ((p)->d) #define CONT(a) ((a)->cont) -#define UDEG(f) QTOS(DEG(DC(f))) +#define UDEG(f) ZTOS(DEG(DC(f))) #define UCOEF(f) (COEF(DC(f))) #define LC(f) (NUM(f)?(f):COEF(DC(f))) @@ -896,6 +902,7 @@ bzero((char *)(q)->b,(w)*sizeof(unsigned int))) #define NEWVL(vl) ((vl)=(VL)MALLOC(sizeof(struct oVL))) #define NEWMP(m) ((m)=(MP)MALLOC(sizeof(struct oMP))) #define NEWDMM(m) ((m)=(DMM)MALLOC(sizeof(struct oDMM))) +#define NEWDMMstack(m) ((m)=(DMMstack)MALLOC(sizeof(struct oDMMstack))) #define NEWDLBUCKET(a) ((a)=(DLBUCKET)MALLOC(sizeof(struct oDLBUCKET))) #define NEWDPP(a) ((a)=(DP_pairs)MALLOC(sizeof(struct dp_pairs))) @@ -978,14 +985,14 @@ if(!(r)){NEWDMM(r);(c)=(r);}else{NEWDMM(NEXT(c));(c)=N #define DUPZ(p,q) (NEWZ(q),BDY(q)=BDY(p)) #define DUPQ(p,q) (NEWQ(q),BDY(q)=BDY(p)) -#define STOQ(n,q) ((!(n))?((q)=0):(NEWZ(q),mpz_set_si(BDY(q),n))) -#define UTOQ(n,q) ((!(n))?((q)=0):(NEWZ(q),mpz_set_ui(BDY(q),n))) +#define STOZ(n,q) ((!(n))?(void)((q)=0):(NEWZ(q),mpz_set_si(BDY(q),n))) +#define UTOZ(n,q) ((!(n))?(void)((q)=0):(NEWZ(q),mpz_set_ui(BDY(q),n))) /* for initializing static object */ -#define STOQ0(n,q) (OID(q)=O_N,NID(q)=N_Q,(q)->z=1,mpz_init(BDY(q)),mpz_set_si(BDY(q),n)) +#define STOZ0(n,q) (OID(q)=O_N,NID(q)=N_Q,(q)->z=1,mpz_init(BDY(q)),mpz_set_si(BDY(q),n)) #define STOLM0(n,q) (OID(q)=O_N,NID(q)=N_LM,mpz_init(BDY(q)),mpz_set_si(BDY(q),n)) -#define QTOS(q) (!(q)?0:((q)->z==1?mpz_get_si(BDY((Z)q)):(error("QTOS : invalid argument"),0))) +#define ZTOS(q) (!(q)?0:((q)->z==1?mpz_get_si(BDY((Z)q)):(error("ZTOS : invalid argument"),0))) #define LMTOS(q) (!(q)?0:mpz_get_si(BDY(q))) #define UTOMQ(a,b) ((a)?(NEWMQ(b),CONT(b)=(unsigned int)(a),(b)):((b)=0)) @@ -1021,6 +1028,8 @@ if(!(r)){NEWDMM(r);(c)=(r);}else{NEWDMM(NEXT(c));(c)=N #define UNIMQ(q) ((q)&&NUM(q)&&SFF(q)&&(CONT((MQ)q)==1)) #define MUNIMQ(q) ((q)&&NUM(q)&&SFF(q)&&(CONT((MQ)q)==-1)) #define EVENZ(n) ((!(n))||(INT(n)&&mpz_tstbit(((Z)(n))->body,0)==0)) +#define UNIMPZ(q) (mpz_cmp_si(q,1)==0) +#define MUNIMPZ(q) (mpz_cmp_si(q,-1)==0) /* special macros for private memory management */ @@ -1436,7 +1445,6 @@ int geldb(VL,P); int getchomdeg(V,P); int getdeg(V,P); int getlchomdeg(V,P,int *); -int get_lprime(int); int homdeg(P); unsigned int invm(unsigned int,int); int iscycm(P); @@ -2518,7 +2526,7 @@ int compnbp(VL vl,NBP p1,NBP p2); #define MPQTOQ(g,q) (!mpq_sgn(g)?((q)=0):(NEWQ(q),BDY(q)[0]=(g)[0],(q))) #define INTMPQ(a) (!mpz_cmp_ui(mpq_denref(a),1)) -#define INTQ(a) ((a)&&NUM(a)&&((Q)a)->z==1) +#define INTQ(a) ((a)&&NUM(a)&&RATN(a)&&((Q)a)->z==1) #define UNIQ(a) (INTQ(a)&&!mpz_cmp_si(BDY((Z)a),1)) #define MUNIQ(a) (INTQ(a)&&!mpz_cmp_si(BDY((Z)a),-1)) @@ -2530,6 +2538,13 @@ void *gc_realloc(void *p,size_t osize,size_t nsize); void gc_free(void *p,size_t size); void init_gmpq(); Q mpqtozq(mpq_t a); + +unsigned long mul64(unsigned long a,unsigned long b,unsigned long *c); +unsigned long mod64(unsigned long u,unsigned long l,unsigned long b); +unsigned long mulmod64(unsigned long a,unsigned long b,unsigned long m); +unsigned long muladdmod64(unsigned long a,unsigned long b,unsigned long c,unsigned long m); +unsigned long invmod64(unsigned long a,unsigned long m); + void addz(Z n1,Z n2,Z *nr); void subz(Z n1,Z n2,Z *nr); void mulz(Z n1,Z n2,Z *nr); @@ -2613,7 +2628,7 @@ void nd_det(int mod,MAT f,P *rp); void nd_gr(LIST f,LIST v,int m,int homo,int retdp,int f4,struct order_spec *ord,LIST *rp); void nd_gr_postproc(LIST f,LIST v,int m,struct order_spec *ord,int do_check,LIST *rp); void nd_gr_recompute_trace(LIST f,LIST v,int m,struct order_spec *ord,LIST tlist,LIST *rp); -void nd_gr_trace(LIST f,LIST v,int trace,int homo,int f4,struct order_spec *ord,LIST *rp); +void nd_gr_trace(LIST f,LIST v,int trace,int homo,int retdp,int f4,struct order_spec *ord,LIST *rp); void nd_nf_p(Obj f,LIST g,LIST v,int m,struct order_spec *ord,Obj *rp); void obj_algtodalg(Obj obj,Obj *r); void obj_dalgtoalg(Obj obj,Obj *r); @@ -2683,6 +2698,14 @@ void hextoz(char *hex,Z *np); void todouble(Obj,Obj *); void lmtolf(LM f,Z *b); + +#if SIZEOF_LONG == 8 +mp_limb_t get_lprime64(int index); +mp_limb_t **almat64(int,int); +mp_limb_t remqi64(Q n,mp_limb_t m); +int generic_gauss_elim64(MAT mat,MAT *nm,Z *dn,int **rindp,int **cindp); +int generic_gauss_elim_mod64(mp_limb_t **mat,int row,int col,mp_limb_t md,int *colstat); +#endif #if defined(VISUAL) || defined(__MINGW32__) void check_intr();