=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/engine/H.c,v retrieving revision 1.5 retrieving revision 1.8 diff -u -p -r1.5 -r1.8 --- OpenXM_contrib2/asir2000/engine/H.c 2001/07/04 07:19:20 1.5 +++ OpenXM_contrib2/asir2000/engine/H.c 2013/11/29 08:21:29 1.8 @@ -45,47 +45,13 @@ * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. * - * $OpenXM: OpenXM_contrib2/asir2000/engine/H.c,v 1.4 2001/07/03 01:41:25 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/engine/H.c,v 1.7 2002/03/15 02:52:10 noro Exp $ */ #include "ca.h" #include "inline.h" #include "base.h" #include -void modfctrp(P,int,int,DCP *); -void gensqfrum(int,UM,struct oDUM *); -void srchum(int,UM,UM,UM); -UM *resberle(int,UM,UM *); -int substum(int,UM,int); -void ddd(int,UM,UM *); -void canzas(int,UM,int,UM *,UM *); -int divum(int,UM,UM,UM); -void randum(int,int,UM); -void pwrmodum(int,UM,int,UM,UM); -void spwrum(int,UM,UM *,UM,N,UM); -void spwrum0(int,UM,UM,N,UM); -void mulum(int,UM,UM,UM); -void mulsum(int,UM,int,UM); -void gcdum(int,UM,UM,UM); -void mult_mod_tab(UM,int,UM *,UM,int); -void make_qmat(UM,int,UM *,int ***); -void null_mod(int **,int,int,int *); -void null_to_sol(int **,int *,int,int,UM *); -void newddd(int,UM,UM *); -int irred_check(UM,int); -int berlekamp(UM,int,int,UM *,UM *); -int nfctr_mod(UM,int); -void minipoly_mod(int,UM,UM,UM); -int find_root(int,UM,int *); -void showum(UM); -void showumat(int **,int); - -void henmain2(LUM,UM,UM,UM,UM,int,int,LUM *); -void addtolum(int,int,LUM,LUM); -void clearlum(int,int,LUM); -void henprep2(int,int,int,UM,UM,UM,UM,UM,UM,UM); -void henprep(P,ML,ML,ML *,ML *); - #if 1 #define Mulum mulum #define Divum divum @@ -100,18 +66,7 @@ void henprep(P,ML,ML,ML *,ML *); LUM LUMALLOC(); -struct p_pair { - UM p0; - UM p1; - struct p_pair *next; -}; - -void lnf_mod(int,int,UM,UM,struct p_pair *,UM,UM); - -void berle(index,count,f,listp) -int index,count; -P f; -ML *listp; +void berle(int index,int count,P f,ML *listp) { UM wf,wf1,wf2,wfs,gcd; ML flist; @@ -153,9 +108,7 @@ ML *listp; ptr[i] = ( ptr[i] * hd ) % m; } -int berlecnt(mod,f) -register int mod; -UM f; +int berlecnt(int mod,UM f) { register int i,j,**c; int d,dr,n; @@ -183,10 +136,7 @@ UM f; /* XXX berlecntmain should not be used for large mod */ -int berlecntmain(mod,n,m,c) -register int mod; -int n,m; -register int **c; +int berlecntmain(int mod,int n,int m,int **c) { register int *p1,*p2,i,j,k,l,a; int *tmp,inv; @@ -212,10 +162,7 @@ register int **c; return ( cfs ); } -UM *berlemain(mod,f,fp) -register int mod; -UM f; -UM *fp; +UM *berlemain(int mod,UM f,UM *fp) { UM wg,ws,wf,f0,gcd,q; int n; @@ -244,10 +191,7 @@ UM *fp; return ( fp ); } -void hensel(index,count,f,listp) -int index,count; -P f; -ML *listp; +void hensel(int index,int count,P f,ML *listp) { register int i,j; int q,n,bound; @@ -284,20 +228,15 @@ ML *listp; } } -void hensel2(index,count,f,listp) -int index,count; -P f; -ML *listp; +void hensel2(int index,int count,P f,ML *listp) { register int i,j; int mod,q,n,bound,dx; - int *p; ML blist,clist,bqlist,cqlist,rlist; UM fm,qfm,gm,qgm,hm,qhm,qam,qbm,w; UM *b; LUM fl,tl; - LUM *l; - int dr,k; + int k; dx = UDEG(f); if ( dx == 1 ) { @@ -370,14 +309,10 @@ ML *listp; f = g0*h0 mod m -> f = gk*hk mod m^(bound), f is replaced by hk */ -void henmain2(f,g0,h0,a0,b0,m,bound,gp) -LUM f; -UM g0,h0,a0,b0; -int m,bound; -LUM *gp; +void henmain2(LUM f,UM g0,UM h0,UM a0,UM b0,int m,int bound,LUM *gp) { int n,dg,dh,i,k,j,dg1,dh1; - UM wu,wr,ws,wt,q,wh1,wg1,wc,wd,we,wz,w1,w2; + UM wu,wr,ws,wt,q,wh1,wg1,wc,wd,we,wz; LUM wb0,wb1,wb2,fk,gk,hk; n = DEG(f); dg = DEG(g0); dh = DEG(h0); @@ -425,6 +360,10 @@ LUM *gp; #if 1 fprintf(stderr,"."); #endif + +#if defined(VISUAL) + check_intr(); +#endif /* at this point, f = gk*hk mod y^k */ #if 0 @@ -510,9 +449,7 @@ LUM *gp; COEF(f)[i][j] = COEF(hk)[i][j]; } -void clearlum(n,bound,f) -int n,bound; -LUM f; +void clearlum(int n,int bound,LUM f) { int i; @@ -522,10 +459,7 @@ LUM f; /* g += f */ -void addtolum(m,bound,f,g) -int m,bound; -LUM f; -LUM g; +void addtolum(int m,int bound,LUM f,LUM g) { int n,i; @@ -534,10 +468,7 @@ LUM g; addpadic(m,bound,COEF(f)[i],COEF(g)[i]); } -void hsq(index,count,f,nindex,dcp) -int index,count,*nindex; -P f; -DCP *dcp; +void hsq(int index,int count,P f,int *nindex,DCP *dcp) { register int i,j,k; register int **pp,**fpp; @@ -663,9 +594,7 @@ DCP *dcp; *dcp = 0; } -void gcdgen(f,blist,clistp) -P f; -ML blist,*clistp; +void gcdgen(P f,ML blist,ML *clistp) { register int i; int n,d,mod,np; @@ -695,13 +624,10 @@ ML blist,*clistp; /* find a,b s.t. qa*qg+qb*qh=1 mod q, qg=g mod mod, qh=h mod mod */ /* q = mod^k */ -void henprep2(mod,q,k,f,g,h,qg,qh,qa,qb) -int mod,q,k; -UM f,g,h,qg,qh,qa,qb; +void henprep2(int mod,int q,int k,UM f,UM g,UM h,UM qg,UM qh,UM qa,UM qb) { int n; UM wg,wh,wa,wb; - UM wt,ws,wu; ML bl,cl,bql,cql; P ff; @@ -745,9 +671,7 @@ UM f,g,h,qg,qh,qa,qb; henprep(f,blist,clist,&bqlist,&cqlist); */ -void henprep(f,blist,clist,bqlistp,cqlistp) -P f; -ML blist,clist,*bqlistp,*cqlistp; +void henprep(P f,ML blist,ML clist,ML *bqlistp,ML *cqlistp) { register int i,j,k,*px,*py,*pz; int n,pmax,dr,tmp,p,p1,mod,np,b,q; @@ -828,9 +752,7 @@ ML blist,clist,*bqlistp,*cqlistp; henmain(fl,bqlist,cqlist,listp) */ -void henmain(f,bqlist,cqlist,listp) -LUM f; -ML bqlist,cqlist,*listp; +void henmain(LUM f,ML bqlist,ML cqlist,ML *listp) { register int i,j,k; int *px,*py; @@ -862,6 +784,9 @@ ML bqlist,cqlist,*listp; #if 0 fprintf(stderr,"."); #endif +#if defined(VISUAL) + check_intr(); +#endif mullum(mod,i+1,l[0],l[1],wb0); for ( j = 2; j < np; j++ ) { mullum(mod,i+1,l[j],wb0,wb1); @@ -895,12 +820,82 @@ ML bqlist,cqlist,*listp; #endif } +/* + henmain_incremental(fl,bqlist,cqlist,start) + fl = bqlist[0]*... mod q^start +*/ + +void henmain_incremental(LUM f,LUM *bqlist,ML cqlist, + int np, int mod, int start, int bound) +{ + register int i,j,k; + int *px,*py; + int **pp,**pp1; + int n,dr,tmp; + UM wt,wq0,wq,wr,wm,wm0,wa,q; + LUM wb0,wb1,tlum; + UM *b,*c; + LUM *l; + ML list; + + n = DEG(f); + W_LUMALLOC(n,bound,wb0); W_LUMALLOC(n,bound,wb1); + wt = W_UMALLOC(n); wq0 = W_UMALLOC(n); wq = W_UMALLOC(n); + wr = W_UMALLOC(n); wm = W_UMALLOC(2*n); wm0 = W_UMALLOC(2*n); + wa = W_UMALLOC(2*n); q = W_UMALLOC(2*n); + c = (UM *)cqlist->c; l = bqlist; + b = (UM *)ALLOCA(n*sizeof(UM)); + for ( i = 0; i < np; i++ ) { + j = DEG(l[i]); + b[i] = W_UMALLOC(j); + DEG(b[i]) = j; + for ( pp = COEF(l[i]), px = COEF(b[i]); j >= 0; j-- ) + px[j] = pp[j][0]; + } +#if 0 + fprintf(stderr,"bound=%d\n",bound); +#endif + for ( i = start; i < bound; i++ ) { +#if 0 + fprintf(stderr,"."); +#endif + mullum(mod,i+1,l[0],l[1],wb0); + for ( j = 2; j < np; j++ ) { + mullum(mod,i+1,l[j],wb0,wb1); + tlum = wb0; wb0 = wb1; wb1 = tlum; + } + for ( j = n, px = COEF(wt); j >= 0; j-- ) + px[j] = 0; + for ( j = n, pp = COEF(f), pp1 = COEF(wb0); j >= 0; j-- ) { + tmp = ( pp[j][i] - pp1[j][i] ) % mod; + COEF(wt)[j] = ( tmp < 0 ? tmp + mod : tmp ); + } + degum(wt,n); + for ( j = n, px = COEF(wq0); j >= 0; j-- ) + px[j] = 0; + for ( j = 1; j < np; j++ ) { + mulum(mod,wt,c[j],wm); dr = divum(mod,wm,b[j],q); + for ( k = DEG(q), px = COEF(wq0), py = COEF(q); k >= 0; k-- ) + px[k] = ( px[k] + py[k] ) % mod; + for ( k = dr, pp = COEF(l[j]), px = COEF(wm); k >= 0; k-- ) + pp[k][i] = px[k]; + } + degum(wq0,n); mulum(mod,wq0,b[0],wm); + mulum(mod,wt,c[0],wm0); addum(mod,wm,wm0,wa); + for ( j = DEG(wa), pp = COEF(l[0]), px = COEF(wa); j >= 0; j-- ) + pp[j][i] = px[j]; + for ( j = n, px = COEF(wq0); j >= 0; j-- ) + px[j] = 0; + } +#if 0 + fprintf(stderr,"\n"); +#endif +} + static double M; static int E; -int mignotte(q,f) -int q; -P f; +int mignotte(int q,P f) { int p; unsigned int *b; @@ -916,9 +911,7 @@ P f; return (int)ceil( (0.31*(E+UDEG(f)+1)+log10((double)M)) / log10((double)q) ); } -int mig(q,d,f) -int q,d; -P f; +int mig(int q,int d,P f) { int p; unsigned int *b; @@ -935,9 +928,7 @@ P f; return (int)ceil( (0.31*(E+d+1)+log10((double)M)) / log10((double)q) ); } -void sqad(man,exp) -unsigned int man; -int exp; +void sqad(unsigned int man,int exp) { int e,sqe; unsigned int t; @@ -973,10 +964,7 @@ int exp; } } -void ptolum(q,bound,f,fl) -int q,bound; -P f; -LUM fl; +void ptolum(int q,int bound,P f,LUM fl) { DCP dc; int i,j; @@ -991,7 +979,7 @@ LUM fl; c = pp[QTOS(DEG(dc))]; w = (unsigned int *)W_ALLOC(d); for ( i = 0; i < d; i++ ) w[i] = m[i]; - for ( i = 0; d >= 1; ) { + for ( i = 0; i < bound && d >= 1; ) { for ( j = d - 1, r = 0; j >= 0; j-- ) { DSAB(q,r,w[j],w[j],r) } @@ -1009,10 +997,7 @@ LUM fl; } } -void modfctrp(p,mod,flag,dcp) -P p; -int mod,flag; -DCP *dcp; +void modfctrp(P p,int mod,int flag,DCP *dcp) { int cm,n,i,j,k; DCP dc,dc0; @@ -1104,10 +1089,7 @@ DCP *dcp; NEXT(dc) = 0; *dcp = dc0; } -void gensqfrum(mod,p,dc) -int mod; -UM p; -struct oDUM *dc; +void gensqfrum(int mod,UM p,struct oDUM *dc) { int n,i,j,d; UM t,s,g,f,f1,b; @@ -1160,9 +1142,7 @@ struct oDUM *dc; } #if 0 -void srchum(mod,p1,p2,gr) -int mod; -UM p1,p2,gr; +void srchum(int mod,UM p1,UM p2,UM gr) { UM m,m1,m2,q,r,t,g1,g2; int lc,d,d1,d2,i,j,k,l,l1,l2,l3,tmp,adj; @@ -1232,10 +1212,7 @@ UM p1,p2,gr; } } -UM *resberle(mod,f,fp) -register int mod; -UM f; -UM *fp; +UM *resberle(int mod,UM f,UM *fp) { UM w,wg,ws,wf,f0,gcd,q,res; int n; @@ -1268,10 +1245,7 @@ UM *fp; return ( fp ); } -int substum(mod,p,a) -int mod; -UM p; -int a; +int substum(int mod,UM p,int a) { int i,j,s; int *c; @@ -1291,9 +1265,7 @@ int a; } #endif -void ddd(mod,f,r) -int mod; -UM f,*r; +void ddd(int mod,UM f,UM *r) { register int i,j; int d,n; @@ -1339,9 +1311,7 @@ UM f,*r; } #if 0 -void canzas(mod,f,d,base,r) -int mod; -UM f,*base,*r; +void canzas(int mod,UM f,int d,UM *base,UM *r) { UM t,s,u,w,g,o,q; N n1,n2,n3,n4,n5; @@ -1379,9 +1349,7 @@ UM f,*base,*r; } } #else -void canzas(mod,f,d,base,r) -int mod; -UM f,*base,*r; +void canzas(int mod,UM f,int d,UM *base,UM *r) { UM t,s,u,w,g,o,q; N n1,n2,n3,n4,n5; @@ -1420,9 +1388,7 @@ UM f,*base,*r; } #endif -void randum(mod,d,p) -int mod,d; -UM p; +void randum(int mod,int d,UM p) { unsigned int n; int i; @@ -1432,9 +1398,7 @@ UM p; COEF(p)[i] = ((unsigned int)random()) % mod; } -void pwrmodum(mod,p,e,f,pr) -int mod,e; -UM p,f,pr; +void pwrmodum(int mod,UM p,int e,UM f,UM pr) { UM wt,ws,q; @@ -1460,11 +1424,7 @@ UM p,f,pr; } } -void spwrum(mod,m,base,f,e,r) -int mod; -UM f,m,r; -UM *base; -N e; +void spwrum(int mod,UM m,UM *base,UM f,N e,UM r) { int a,n,i; N e1,an; @@ -1492,10 +1452,7 @@ N e; } } -void spwrum0(mod,m,f,e,r) -int mod; -UM f,m,r; -N e; +void spwrum0(int mod,UM m,UM f,N e,UM r) { UM t,s,q; N e1; @@ -1518,9 +1475,7 @@ N e; } #if 0 -void Mulum(mod,p1,p2,pr) -register int mod; -UM p1,p2,pr; +void Mulum(int mod,UM p1,UM p2,UM pr) { register int *pc1,*pcr; register int mul,i,j,d1,d2; @@ -1539,9 +1494,7 @@ UM p1,p2,pr; DEG(pr) = d1 + d2; } -void Mulsum(mod,p,n,pr) -register int mod,n; -UM p,pr; +void Mulsum(int mod,UM p,int n,UM pr) { register int *sp,*dp; register int i; @@ -1551,9 +1504,7 @@ UM p,pr; *dp = (*sp * n) % mod; } -int Divum(mod,p1,p2,pq) -register int mod; -UM p1,p2,pq; +int Divum(int mod,UM p1,UM p2,UM pq) { register int *pc1,*pct; register int tmp,i,j,inv; @@ -1589,9 +1540,7 @@ UM p1,p2,pq; return( i ); } -void Gcdum(mod,p1,p2,pr) -register int mod; -UM p1,p2,pr; +void Gcdum(int mod,UM p1,UM p2,UM pr) { register int *sp,*dp; register int i,inv; @@ -1618,10 +1567,7 @@ UM p1,p2,pr; } #endif -void mult_mod_tab(p,mod,tab,r,d) -UM p,r; -UM *tab; -int mod,d; +void mult_mod_tab(UM p,int mod,UM *tab,UM r,int d) { UM w,w1,c; int n,i; @@ -1639,11 +1585,7 @@ int mod,d; } } -void make_qmat(p,mod,tab,mp) -UM p; -int mod; -UM *tab; -int ***mp; +void make_qmat(UM p,int mod,UM *tab,int ***mp) { int n,i,j; int *c; @@ -1662,10 +1604,7 @@ int ***mp; mat[i][i] = (mat[i][i]+mod-1) % mod; } -void null_mod(mat,mod,n,ind) -int **mat; -int *ind; -int mod,n; +void null_mod(int **mat,int mod,int n,int *ind) { int i,j,l,s,h,inv; int *t,*u; @@ -1696,11 +1635,7 @@ int mod,n; } } -void null_to_sol(mat,ind,mod,n,r) -int **mat; -int *ind; -int mod,n; -UM *r; +void null_to_sol(int **mat,int *ind,int mod,int n,UM *r) { int i,j,k,l; int *c; @@ -1729,9 +1664,7 @@ null_mod(mat,mod,n,ind) null_to_sol(mat,ind,mod,n,r) */ -void newddd(mod,f,r) -int mod; -UM f,*r; +void newddd(int mod,UM f,UM *r) { register int i,j; int d,n; @@ -1774,9 +1707,7 @@ UM f,*r; r[j] = 0; } -int nfctr_mod(f,mod) -int mod; -UM f; +int nfctr_mod(UM f,int mod) { register int i,j; int d,n; @@ -1817,9 +1748,7 @@ UM f; return j; } -int irred_check(f,mod) -UM f; -int mod; +int irred_check(UM f,int mod) { register int i,j; int d,n; @@ -1862,10 +1791,7 @@ int mod; return 1; } -int berlekamp(p,mod,df,tab,r) -UM p; -int mod,df; -UM *tab,*r; +int berlekamp(UM p,int mod,int df,UM *tab,UM *r) { int n,i,j,k,nf,d,nr; int **mat; @@ -1911,11 +1837,12 @@ UM *tab,*r; } } } + /* NOTREACHED */ + error("berlekamp : cannot happen"); + return -1; } -void minipoly_mod(mod,f,p,mp) -int mod; -UM f,p,mp; +void minipoly_mod(int mod,UM f,UM p,UM mp) { struct p_pair *list,*l,*l1,*lprev; int n,d; @@ -1950,11 +1877,7 @@ UM f,p,mp; } } -void lnf_mod(mod,n,p0,p1,list,np0,np1) -int mod,n; -UM p0,p1; -struct p_pair *list; -UM np0,np1; +void lnf_mod(int mod,int n,UM p0,UM p1,struct p_pair *list,UM np0,UM np1) { int inv,h,d1; UM t0,t1,s0,s1; @@ -1974,10 +1897,7 @@ UM np0,np1; } } -int find_root(mod,p,root) -int mod; -UM p; -int *root; +int find_root(int mod,UM p,int *root) { UM *r; int i,j; @@ -1990,8 +1910,7 @@ int *root; return j; } -void showum(p) -UM p; +void showum(UM p) { int i; int *c; @@ -2002,9 +1921,7 @@ UM p; printf("\n"); } -void showumat(mat,n) -int **mat; -int n; +void showumat(int **mat,int n) { int i,j;