=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/include/ca.h,v retrieving revision 1.38 retrieving revision 1.65 diff -u -p -r1.38 -r1.65 --- OpenXM_contrib2/asir2000/include/ca.h 2003/10/20 07:18:42 1.38 +++ OpenXM_contrib2/asir2000/include/ca.h 2006/04/16 00:51:14 1.65 @@ -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/include/ca.h,v 1.37 2003/07/09 07:11:09 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/include/ca.h,v 1.64 2006/03/16 10:08:21 noro Exp $ */ #include #include @@ -118,7 +118,17 @@ typedef void * pointer; #define O_GFMMAT 15 #define O_BYTEARRAY 16 #define O_QUOTE 17 +#define O_OPTLIST 18 +#define O_SYMBOL 19 +#define O_RANGE 20 +#define O_TB 21 +#define O_DPV 22 +#define O_QUOTEARG 23 #define O_VOID -1 +/* IMAT */ +#define O_IMAT 24 +/* IMAT */ +#define O_NBP 25 #define N_Q 0 #define N_R 1 @@ -131,11 +141,16 @@ typedef void * pointer; #define N_GFPN 8 #define N_GFS 9 #define N_GFSN 10 +#define N_DA 11 #define ORD_REVGRADLEX 0 #define ORD_GRADLEX 1 #define ORD_LEX 2 +typedef enum { + A_end=0,A_fnode,A_arf,A_int,A_str,A_internal,A_node,A_notimpl,A_func +} farg_type; + #if defined(LONG_IS_32BIT) #if defined(VISUAL) typedef _int64 L; @@ -154,6 +169,11 @@ typedef struct oN { unsigned int b[1]; } *N; +typedef struct oZ { + int p; + unsigned int b[1]; +} *Z; + typedef struct oUP2 { int w; unsigned int b[1]; @@ -236,6 +256,15 @@ typedef struct oGFPN { struct oUP *body; } *GFPN; +typedef struct oDAlg { + short id; + char nid; + char pad; + struct oDP *nm; + struct oQ *dn; +} *DAlg; + + typedef struct oNum { short id; char nid; @@ -298,6 +327,28 @@ typedef struct oGF2MAT { unsigned int **body; } *GF2MAT, *GFMMAT; +/* IMAT */ +#define IMATCH 64 + +typedef struct oIENT { + int cr; + int row, col; + pointer *body; +} IENT; + +typedef struct oIMATC { + pointer *fore; + pointer *next; + IENT ient[IMATCH]; +} *IMATC; + +typedef struct oIMAT { + short id; + int row, col, clen; + pointer *root; + pointer *toor; +} *IMAT; +/* IMAT */ typedef struct oLIST { short id; short pad; @@ -323,6 +374,13 @@ typedef struct oDP { struct oMP *body; } *DP; +typedef struct oDPV { + short id; + int len; + int sugar; + struct oDP **body; +} *DPV; + typedef struct oUSINT { short id; short pad; @@ -354,6 +412,63 @@ typedef struct oQUOTE { pointer body; } *QUOTE; +typedef struct oQUOTEARG { + short id; + short pad; + farg_type type; + pointer body; +} *QUOTEARG; + +typedef struct oOPTLIST { + short id; + short pad; + struct oNODE *body; +} *OPTLIST; + +typedef struct oSYMBOL { + short id; + short pad; + char *name; + int value; +} *SYMBOL; + +typedef struct oRANGE { + short id; + short pad; + struct oObj *start,*end; +} *RANGE; + +typedef struct oTB { + short id; + short pad; + int size,next; + char **body; +} *TB; + +typedef struct oNBP { + short id; + short pad; + struct oNODE *body; +} *NBP; + +/* non-commutative bivariate monomial */ + +typedef struct oNBM { + int d; + P c; + unsigned int *b; +} *NBM; + +#define NEWNBM(p) ((p)=(NBM)MALLOC(sizeof(struct oNBM))) +#define NEWNBMBDY(p,d) \ +((p)->b=(unsigned int *)MALLOC((((d)+31)/32)*sizeof(unsigned int))) +#define NEWNBP(p) ((p)=(NBP)MALLOC(sizeof(struct oNBP)),OID(p)=O_NBP) +#define MKNBP(p,b) (NEWNBP(p),BDY(p)=(b)) + +#define NBM_GET(a,j) (((a)[(j)>>5]&(1<<((j)&31)))?1:0) +#define NBM_SET(a,j) ((a)[(j)>>5]|=(1<<((j)&31))) +#define NBM_CLR(a,j) ((a)[(j)>>5]&=(~(1<<((j)&31)))) + typedef struct oObj { short id; short pad; @@ -484,6 +599,26 @@ struct order_pair { int order, length; }; +struct sparse_weight { + int pos, value; +}; + +#define IS_DENSE_WEIGHT 0 +#define IS_SPARSE_WEIGHT 1 +#define IS_BLOCK 2 + +struct weight_or_block { + int type; + int length; + union { + int *dense_weight; + struct sparse_weight *sparse_weight; + struct { + int order, start; + } block; + } body; +}; + struct order_spec { int id; Obj obj; @@ -498,9 +633,34 @@ struct order_spec { int row; int **matrix; } matrix; + struct { + int length; + struct weight_or_block *w_or_b; + } composite; } ord; }; +struct modorder_spec { + /* id : ORD_REVGRADLEX, ORD_GRADLEX, ORD_LEX */ + int id; + Obj obj; + int len; + int *degree_shift; +}; + +typedef struct oNumberField { + int n; + int psn; + int dim; + VL vl; + P *defpoly; + DP *mb; + DP *ps; + struct oDAlg *one; + NODE ind; + struct order_spec *spec; +} *NumberField; + /* structure for cputime */ struct oEGT { @@ -583,7 +743,7 @@ typedef unsigned int ModNum; #endif /* for setjmp/longjmp compatibility */ -#if defined(__CYGWIN__) +#if defined(__CYGWIN__) || defined(__x86_64) #define JMP_BUF sigjmp_buf #define SETJMP(x) sigsetjmp(x,~0) #define LONGJMP(x,y) siglongjmp(x,y) @@ -656,11 +816,17 @@ bzero((char *)(q)->b,(w)*sizeof(unsigned int))) #define NEWSTR(l) ((l)=(STRING)MALLOC(sizeof(struct oSTRING)),OID(l)=O_STR) #define NEWCOMP(c,n) ((c)=(COMP)MALLOC(sizeof(struct oCOMP)+((n)-1)*sizeof(Obj)),OID(c)=O_COMP) #define NEWDP(d) ((d)=(DP)MALLOC(sizeof(struct oDP)),OID(d)=O_DP) +#define NEWDPV(d) ((d)=(DPV)MALLOC(sizeof(struct oDPV)),OID(d)=O_DPV) #define NEWUSINT(u) ((u)=(USINT)MALLOC_ATOMIC(sizeof(struct oUSINT)),OID(u)=O_USINT) #define NEWERR(e) ((e)=(ERR)MALLOC(sizeof(struct oERR)),OID(e)=O_ERR) #define NEWMATHCAP(e) ((e)=(MATHCAP)MALLOC(sizeof(struct oMATHCAP)),OID(e)=O_MATHCAP) #define NEWBYTEARRAY(e) ((e)=(BYTEARRAY)MALLOC(sizeof(struct oBYTEARRAY)),OID(e)=O_BYTEARRAY) #define NEWQUOTE(e) ((e)=(QUOTE)MALLOC(sizeof(struct oQUOTE)),OID(e)=O_QUOTE) +#define NEWQUOTEARG(e) ((e)=(QUOTEARG)MALLOC(sizeof(struct oQUOTEARG)),OID(e)=O_QUOTEARG) +#define NEWOPTLIST(l) ((l)=(OPTLIST)MALLOC(sizeof(struct oOPTLIST)),OID(l)=O_OPTLIST) +#define NEWSYMBOL(l) ((l)=(SYMBOL)MALLOC(sizeof(struct oSYMBOL)),OID(l)=O_SYMBOL) +#define NEWRANGE(l) ((l)=(RANGE)MALLOC(sizeof(struct oRANGE)),OID(l)=O_RANGE) +#define NEWTB(l) ((l)=(TB)MALLOC(sizeof(struct oTB)),OID(l)=O_TB,(l)->size=256,(l)->next=0,(l)->body=(char **)MALLOC((l)->size*sizeof(char *))) #define NEWNODE(a) ((a)=(NODE)MALLOC(sizeof(struct oNODE))) #define NEWDC(dc) ((dc)=(DCP)MALLOC(sizeof(struct oDCP))) @@ -673,8 +839,13 @@ bzero((char *)(q)->b,(w)*sizeof(unsigned int))) #define NEWMAT(l) ((l)=(MAT)MALLOC(sizeof(struct oMAT)),OID(l)=O_MAT) #define NEWGF2MAT(l) ((l)=(GF2MAT)MALLOC(sizeof(struct oGF2MAT)),OID(l)=O_GF2MAT) #define NEWGFMMAT(l) ((l)=(GFMMAT)MALLOC(sizeof(struct oGF2MAT)),OID(l)=O_GFMMAT) +/* IMAT */ +#define NEWIMAT(l) ((l)=(IMAT)MALLOC(sizeof(struct oIMAT)),OID(l)=O_IMAT,l->clen=0,l->root=0,l->toor=0) +#define NEWIENT(l) ((l)=(IMATC)MALLOC(sizeof(struct oIMATC)),l->fore=0,l->next=0) +/* IMAT */ #define NEWReal(q) ((q)=(Real)MALLOC_ATOMIC(sizeof(struct oReal)),OID(q)=O_N,NID(q)=N_R) #define NEWAlg(r) ((r)=(Alg)MALLOC(sizeof(struct oAlg)),OID(r)=O_N,NID(r)=N_A) +#define NEWDAlg(r) ((r)=(DAlg)MALLOC(sizeof(struct oDAlg)),OID(r)=O_N,NID(r)=N_DA) #define NEWBF(q,l) ((q)=(BF)MALLOC_ATOMIC(TRUESIZE(oBF,(l)-1,long)),OID(q)=O_N,NID(q)=N_B) #define NEWC(r) ((r)=(C)MALLOC(sizeof(struct oC)),OID(r)=O_N,NID(r)=N_C) #define NEWLM(r) ((r)=(LM)MALLOC(sizeof(struct oLM)),OID(r)=O_N,NID(r)=N_LM) @@ -686,7 +857,7 @@ bzero((char *)(q)->b,(w)*sizeof(unsigned int))) ((d)=(DL)MALLOC_ATOMIC(TRUESIZE(oDL,(n)-1,int))) #define MKP(v,dc,p) \ -(!DEG(dc)?((p)=COEF(dc)):(NEWP(p),VR(p)=(v),DC(p)=(dc),(p))) +((!DEG(dc)&&!NEXT(dc))?((p)=COEF(dc)):(NEWP(p),VR(p)=(v),DC(p)=(dc),(p))) #define MKV(v,p) \ (NEWP(p),VR(p)=(v),NEWDC(DC(p)),\ DEG(DC(p))=ONE,COEF(DC(p))=(P)ONE,NEXT(DC(p))=0) @@ -706,6 +877,7 @@ DEG(DC(p))=ONE,COEF(DC(p))=(P)ONEM,NEXT(DC(p))=0) #define TOGFMMAT(r,c,b,m) (NEWGFMMAT(m),(m)->row=(r),(m)->col=(c),(m)->body=(b)) #define MKSTR(a,b) (NEWSTR(a),(a)->body=(char *)(b)) #define MKDP(n,m,d) (NEWDP(d),(d)->nv=(n),BDY(d)=(m)) +#define MKDPV(len,m,d) (NEWDPV(d),(d)->len=(len),BDY(d)=(m)) #define MKLM(b,l) (!(b)?(l)=0:(NEWLM(l),(l)->body=(b),(l))) #define MKGF2N(b,l) (!(b)?(l)=0:(NEWGF2N(l),(l)->body=(b),(l))) #define MKGFPN(b,l) (!(b)?(l)=0:(NEWGFPN(l),(l)->body=(b),(l))) @@ -713,8 +885,9 @@ DEG(DC(p))=ONE,COEF(DC(p))=(P)ONEM,NEXT(DC(p))=0) #define MKERR(e,b) (NEWERR(e),(e)->body=(Obj)(b)) #define MKMATHCAP(e,b) (NEWMATHCAP(e),(e)->body=(LIST)(b)) #define MKBYTEARRAY(m,l) \ -(NEWBYTEARRAY(m),(m)->len=(l),(m)->body=(char *)MALLOC_ATOMIC((l)),bzero((m)->body,(l))) +(NEWBYTEARRAY(m),(m)->len=(l),(m)->body=(unsigned char *)MALLOC_ATOMIC((l)),bzero((m)->body,(l))) #define MKQUOTE(q,b) (NEWQUOTE(q),(q)->body=(pointer)(b)) +#define MKQUOTEARG(q,t,b) (NEWQUOTEARG(q),(q)->type=(t),(q)->body=(pointer)(b)) #define NEXTDC(r,c) \ if(!(r)){NEWDC(r);(c)=(r);}else{NEWDC(NEXT(c));(c)=NEXT(c);} @@ -765,7 +938,14 @@ PL(NM(q))=1,BD(NM(q))[0]=(unsigned int)(n),DN(q)=0,(q) #define MKReal(a,b) (!(a)?((b)=0):(NEWReal(b),BDY(b)=(a),(b))) #define MKAlg(b,r) \ (!(b)?((r)=0):NUM(b)?((r)=(Alg)(b)):(NEWAlg(r),BDY(r)=(Obj)(b),(r))) +#define MKDAlg(dp,den,r) (NEWDAlg(r),(r)->nm = (dp),(r)->dn=(den)) +#define IMM_MAX 1073741823 +#define IMM_MIN -1073741823 + +#define SL(n) ((n)->p) +#define ZALLOC(d) ((Z)MALLOC_ATOMIC(TRUESIZE(oZ,(d)-1,int))) + #if defined(PARI) #define ToReal(a) (!(a)?(double)0.0:REAL(a)?BDY((Real)a):RATN(a)?RatnToReal((Q)a):BIGFLOAT(a)?rtodbl(BDY((BF)a)):0) #else @@ -776,6 +956,7 @@ PL(NM(q))=1,BD(NM(q))[0]=(unsigned int)(n),DN(q)=0,(q) #define NUM(p) (OID(p)==O_N) #define RAT(p) (OID(p)==O_R) #define RATN(a) (NID(a)==N_Q) +#define POLY(a) (!(a) ||(OID(a)<=O_P)) #define INT(q) (!(q)||(NUM(q)&&RATN((Num)q)&&!DN((Q)q))) #define REAL(a) (NID(a)==N_R) #define BIGFLOAT(a) (NID(a)==N_B) @@ -868,9 +1049,6 @@ extern const int sprime[]; extern int sprime[]; #endif -extern int lprime_size; -extern int *lprime; - extern void (*addnumt[])(); extern void (*subnumt[])(); extern void (*mulnumt[])(); @@ -981,6 +1159,7 @@ void square_rem_tab_up_gf2n(UP,UP *,UP *); void powertabup_gf2n(UP,UP,UP *); void find_root_gf2n(UP,GF2N *); +int cmpdl_composite(int,DL,DL); int cmpdl_matrix(int,DL,DL); int cmpdl_order_pair(int,DL,DL); int cmpdl_elim(int,DL,DL); @@ -1009,6 +1188,12 @@ void dtop(VL,VL,DP,P *); void ptod(VL,VL,P,DP *); void initd(struct order_spec *); +void adddv(VL,DPV,DPV,DPV *); +void subdv(VL,DPV,DPV,DPV *); +void muldv(VL,DP,DPV,DPV *); +void chsgndv(DPV,DPV *); +int compdv(VL,DPV,DPV); + void _printdp(DP); void _dp_sp_mod(DP,DP,int,DP *); void _dp_mod(DP,int,NODE,DP *); @@ -1134,7 +1319,7 @@ void copyn(N,int,int *); void kmulnmain(N,N,N *); int qcoefp(Obj); int qcoefr(Obj); -int get_allocwords(void); +long get_allocwords(void); double get_clock(void); void get_eg(struct oEGT *); void printtime(struct oEGT *,struct oEGT *,double); @@ -1342,6 +1527,14 @@ void chsgngfsn(GFSN,GFSN *); void pwrgfsn(GFSN,Q, GFSN *); int cmpgfsn(GFSN,GFSN); +void adddalg(DAlg,DAlg,DAlg *); +void subdalg(DAlg,DAlg,DAlg *); +void muldalg(DAlg,DAlg,DAlg *); +void divdalg(DAlg,DAlg,DAlg *); +void chsgndalg(DAlg,DAlg *); +void pwrdalg(DAlg,Q, DAlg *); +int cmpdalg(DAlg,DAlg); + void addalg(Num,Num,Num *); void addbf(Num,Num,Num *); void addcplx(Num,Num,Num *); @@ -1438,6 +1631,7 @@ void dtestroot(int,int,P,LUM,struct oDUM *,DCP *); void dtestroot1(int,int,P,LUM,P *); void dtestsq(int,int,P,LUM,P *); void dtestsql(P,ML,struct oDUM *,DCP *); +void ediffp(VL,P,V,P *); void estimatelc(VL,Q,DCP,VN,P *); void eucum(register int,UM,UM,UM,UM); void exthp(VL,P,int,P *); @@ -1662,6 +1856,7 @@ void savep(FILE *,P); void savegf2n(FILE *,GF2N); void savegfpn(FILE *,GFPN); void savegfs(FILE *,GFS); +void savedalg(FILE *,DAlg); void savelm(FILE *,LM); void savemi(FILE *,MQ); void savecplx(FILE *,C); @@ -1687,6 +1882,7 @@ void loadgf2n(FILE *,GF2N *); void loadgfpn(FILE *,GFPN *); void loadgfs(FILE *,GFS *); void loadgfsn(FILE *,GFSN *); +void loaddalg(FILE *,DAlg *); void loadlm(FILE *,LM *); void loadmi(FILE *,MQ *); void loadcplx(FILE *,C *); @@ -2277,7 +2473,7 @@ void resume_timer() ; void reset_engine() ; unsigned int get_asir_version() ; char *get_asir_distribution(); -void create_error(ERR *err,unsigned int serial,char *msg); +void create_error(ERR *err,unsigned int serial,char *msg,LIST trace); void init_lprime(); int get_lprime(int index); void create_new_lprimes(int index); @@ -2389,8 +2585,58 @@ int divtmp(VL vl,int mod,P p1,P p2,P *q); int divtdcmp(VL vl,int mod,P p1,P p2,P *q); void GC_gcollect(); +/* IMAT */ +void Pnewimat(NODE, IMAT *); +void PChsgnI(NODE, IMAT *); +void Pm2Im(NODE, IMAT *); +void PIm2m(NODE, MAT *); + +void AddMatI(VL, IMAT, IMAT, IMAT *); +void MulMatI(VL, IMAT, IMAT, IMAT *); +void MulMatG(VL, Obj, Obj, Obj *); +void MulrMatI(VL, Obj, Obj, Obj *); +void MulMatS(VL, IMAT, IMAT, IMAT *); +void PutIent(IMAT, int, int, Obj); +void GetIent(IMAT, int, int, Obj); +void GetIbody(IMAT, int, int, Obj *); +void ChsgnI(IMAT, IMAT *c); +void AppendIent(IMAT, int, int, Obj); +void MEnt(int, int, int, Obj, IENT *); +void GetForeIent(IMATC *, IENT *, int *); +void GetNextIent(IMATC *, IENT *, int *); +void SubMatI(VL, IMAT, IMAT, IMAT *); +/* IMAT */ + +Z stoz(int c); +Z utoz(unsigned int c); +Z qtoz(Q n); +Q ztoq(Z n); +Z chsgnz(Z n); +Z simpz(Z n); +Z dupz(Z n); +Z absz(Z n); +Z addz(Z n1,Z n2); +Z subz(Z n1,Z n2); +Z mulz(Z n1,Z n2); +Z divsz(Z n1,Z n2); +Z divz(Z n1,Z n2,Z *rem); +Z gcdz(Z n1,Z n2); +Z gcdz_cofactor(Z n1,Z n2,Z *c1,Z *c2); +Z estimate_array_gcdz(Z *a,int n); +Z array_gcdz(Z *a,int n); +void mkwcz(int k,int l,Z *t); +int remzi(Z n,int m); + + #if 0 && !defined(VISUAL) void bzero(const void *,int); void bcopy(const void *,void *,int); char *index(char *,int); #endif + +void chsgnnbp(NBP p,NBP *rp); +void subnbp(VL vl,NBP p1,NBP p2, NBP *rp); +void addnbp(VL vl,NBP p1,NBP p2, NBP *rp); +void mulnbp(VL vl,NBP p1,NBP p2, NBP *rp); +void pwrnbp(VL vl,NBP p1,Q n, NBP *rp); +int compnbp(VL vl,NBP p1,NBP p2);