=================================================================== RCS file: /home/cvs/OpenXM_contrib/pari-2.2/src/basemath/Attic/bibli2.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -p -r1.1 -r1.2 --- OpenXM_contrib/pari-2.2/src/basemath/Attic/bibli2.c 2001/10/02 11:17:02 1.1 +++ OpenXM_contrib/pari-2.2/src/basemath/Attic/bibli2.c 2002/09/11 07:26:50 1.2 @@ -1,4 +1,4 @@ -/* $Id: bibli2.c,v 1.1 2001/10/02 11:17:02 noro Exp $ +/* $Id: bibli2.c,v 1.2 2002/09/11 07:26:50 noro Exp $ Copyright (C) 2000 The PARI group. @@ -20,6 +20,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, /** **/ /********************************************************************/ #include "pari.h" +extern GEN _ei(long n, long i); /********************************************************************/ /** **/ @@ -28,21 +29,22 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, /********************************************************************/ GEN -tayl(GEN x, long v, long precdl) +tayl(GEN x, long v, long precS) { - long tetpil,i,vx = gvar9(x), av=avma; + long i, vx = gvar9(x); + gpmem_t tetpil, av=avma; GEN p1,y; if (v <= vx) { - long p1[] = { evaltyp(t_SER)|m_evallg(2), 0 }; - p1[1] = evalvalp(precdl) | evalvarn(v); + long p1[] = { evaltyp(t_SER)|_evallg(2), 0 }; + p1[1] = evalvalp(precS) | evalvarn(v); return gadd(p1,x); } p1=cgetg(v+2,t_VEC); for (i=0; i MAXVARN) err(talker,"incorrect object in O()"); + m = n*gval(x,v); } return zeroser(v,m); } @@ -91,10 +91,12 @@ grando0(GEN x, long n, long do_clone) GEN tchebi(long n, long v) /* Assume 4*n < VERYBIGINT */ { - long av,k,l; + long k, l; + gpmem_t av; GEN q,a,r; if (v<0) v = 0; + if (n < 0) err(talker,"negative degree in tchebi"); if (n==0) return polun[v]; if (n==1) return polx[v]; @@ -131,10 +133,12 @@ GEN addshiftw(GEN x, GEN y, long d); GEN legendre(long n, long v) { - long av,tetpil,m,lim; + long m; + gpmem_t av, tetpil, lim; GEN p0,p1,p2; if (v<0) v = 0; + if (n < 0) err(talker,"negative degree in legendre"); if (n==0) return polun[v]; if (n==1) return polx[v]; @@ -160,7 +164,8 @@ legendre(long n, long v) GEN cyclo(long n, long v) { - long av=avma,tetpil,d,q,m; + long d, q, m; + gpmem_t av=avma, tetpil; GEN yn,yd; if (n<=0) err(arither2); @@ -249,98 +254,6 @@ roots_to_pol_r1r2(GEN a, long r1, long v) setlg(p1, k); return divide_conquer_prod(p1, gmul); } -/* finds an equation for the d-th degree subfield of Q(zeta_n). - * (Z/nZ)* must be cyclic. - */ -GEN -subcyclo(GEN nn, GEN dd, int v) -{ - long av=avma,tetpil,i,j,k,prec,q,d,p,pp,al,n,ex0,ex,aad,aa; - GEN a,z,pol,fa,powz,alpha; - - if (typ(dd)!=t_INT || signe(dd)<=0) err(typeer,"subcyclo"); - if (is_bigint(dd)) err(talker,"degree too large in subcyclo"); - if (typ(nn)!=t_INT || signe(nn)<=0) err(typeer,"subcyclo"); - if (v<0) v = 0; - d=itos(dd); if (d==1) return polx[v]; - if (is_bigint(nn)) err(impl,"subcyclo for huge cyclotomic fields"); - n = nn[2]; if ((n & 3) == 2) n >>= 1; - if (n == 1) err(talker,"degree does not divide phi(n) in subcyclo"); - fa = factor(stoi(n)); - p = itos(gmael(fa,1,1)); - al= itos(gmael(fa,2,1)); - if (lg((GEN)fa[1]) > 2 || (p==2 && al>2)) - err(impl,"subcyclo in non-cyclic case"); - if (d < n) - { - k = 1 + svaluation(d,p,&i); - if (k>TWOPOTBITS_IN_LONG); - if (prec>1; - for (i=2; i= 1, return bin, bin[k+1] = binomial(n, k) */ +GEN +vecbinome(long n) +{ + long d = (n + 1)/2, k; + GEN bin = cgetg(n+2, t_VEC), *C; + C = (GEN*)(bin + 1); /* C[k] = binomial(n, k) */ + C[0] = gun; + for (k=1; k <= d; k++) + { + gpmem_t av = avma; + C[k] = gerepileuptoint(av, diviiexact(mulsi(n-k+1, C[k-1]), stoi(k))); + } + for ( ; k <= n; k++) C[k] = C[n - k]; + return bin; +} + /********************************************************************/ /** **/ /** POLYNOMIAL INTERPOLATION **/ @@ -625,7 +554,8 @@ binome(GEN n, long k) GEN polint_i(GEN xa, GEN ya, GEN x, long n, GEN *ptdy) { - long av = avma,tetpil,i,m, ns=0, tx=typ(x); + long i, m, ns=0, tx=typ(x); + gpmem_t av = avma, tetpil; GEN den,ho,hp,w,y,c,d,dy; if (!xa) @@ -675,7 +605,7 @@ GEN polint(GEN xa, GEN ya, GEN x, GEN *ptdy) { long tx=typ(xa), ty, lx=lg(xa); - + if (ya) ty = typ(ya); else { ya = xa; ty = tx; xa = NULL; } if (! is_vec_t(tx) || ! is_vec_t(ty)) @@ -708,7 +638,7 @@ gtostr(GEN x) GEN gtoset(GEN x) { - ulong av; + gpmem_t av; long i,c,tx,lx; GEN y; @@ -744,9 +674,9 @@ setisset(GEN x) /* looks if y belongs to the set x and returns the index if yes, 0 if no */ long -setsearch(GEN x, GEN y, long flag) +gen_search(GEN x, GEN y, int flag, int (*cmp)(GEN,GEN)) { - long av = avma,lx,j,li,ri,fl, tx = typ(x); + long lx,j,li,ri,fl, tx = typ(x); if (tx==t_VEC) lx = lg(x); else @@ -756,22 +686,42 @@ setsearch(GEN x, GEN y, long flag) } if (lx==1) return flag? 1: 0; - if (typ(y) != t_STR) y = gtostr(y); li=1; ri=lx-1; do { - j = (ri+li)>>1; fl = gcmp((GEN)x[j],y); - if (!fl) { avma=av; return flag? 0: j; } + j = (ri+li)>>1; fl = cmp((GEN)x[j],y); + if (!fl) return flag? 0: j; if (fl<0) li=j+1; else ri=j-1; } while (ri>=li); - avma=av; if (!flag) return 0; + if (!flag) return 0; return (fl<0)? j+1: j; } + +long +setsearch(GEN x, GEN y, long flag) +{ + gpmem_t av = avma; + long res; + if (typ(y) != t_STR) y = gtostr(y); + res=gen_search(x,y,flag,gcmp); + avma=av; + return res; +} + +#if 0 GEN +gen_union(GEN x, GEN y, int (*cmp)(GEN,GEN)) +{ + if (typ(x) != t_VEC || typ(y) != t_VEC) err(talker,"not a set in setunion"); + +} +#endif + +GEN setunion(GEN x, GEN y) { - long av=avma,tetpil; + gpmem_t av=avma, tetpil; GEN z; if (typ(x) != t_VEC || typ(y) != t_VEC) err(talker,"not a set in setunion"); @@ -781,7 +731,8 @@ setunion(GEN x, GEN y) GEN setintersect(GEN x, GEN y) { - long av=avma,i,lx,c; + long i, lx, c; + gpmem_t av=avma; GEN z; if (!setisset(x) || !setisset(y)) err(talker,"not a set in setintersect"); @@ -792,16 +743,33 @@ setintersect(GEN x, GEN y) } GEN -setminus(GEN x, GEN y) +gen_setminus(GEN set1, GEN set2, int (*cmp)(GEN,GEN)) { - long av=avma,i,lx,c; - GEN z; + gpmem_t ltop=avma; + long find; + long i,j,k; + GEN diff=cgetg(lg(set1),t_VEC); + for(i=1,j=1,k=1; i < lg(set1); i++) + { + for(find=0; j < lg(set2); j++) + { + int s=cmp((GEN)set1[i],(GEN)set2[j]); + if (s<0) break ; + if (s>0) continue; + find=1; + } + if (!find) + diff[k++]=set1[i]; + } + setlg(diff,k); + return gerepilecopy(ltop,diff); +} +GEN +setminus(GEN x, GEN y) +{ if (!setisset(x) || !setisset(y)) err(talker,"not a set in setminus"); - lx=lg(x); z=cgetg(lx,t_VEC); c=1; - for (i=1; i2) | evallgefint(lx); x[0] = evaltyp(t_INT) | evallg(lx); - avma = (long)x; return x; + avma = (gpmem_t)x; return x; } long @@ -982,7 +950,7 @@ gettime(void) { return timer(); } GEN numtoperm(long n, GEN x) { - ulong av; + gpmem_t av; long i,a,r; GEN v,w; @@ -1005,7 +973,8 @@ numtoperm(long n, GEN x) GEN permtonum(GEN x) { - long av=avma, lx=lg(x)-1, n=lx, last, ind, tx = typ(x); + long lx=lg(x)-1, n=lx, last, ind, tx = typ(x); + gpmem_t av=avma; GEN ary,res; if (!is_vec_t(tx)) err(talker,"not a vector in permtonum"); @@ -1033,48 +1002,71 @@ permtonum(GEN x) /** MODREVERSE **/ /** **/ /********************************************************************/ +/* evaluate f(x) mod T */ +GEN +RX_RXQ_compo(GEN f, GEN x, GEN T) +{ + gpmem_t av = avma; + long l; + GEN y; + if (typ(f) != t_POL) return gcopy(f); + l = lgef(f)-1; y = (GEN)f[l]; + for (l--; l>=2; l--) + y = gres(gadd(gmul(y,x), (GEN)f[l]), T); + return gerepileupto(av, y); +} + +/* return (1,...a^l) mod T. Not memory clean */ GEN +RXQ_powers(GEN a, GEN T, long l) +{ + long i; + GEN v; + + if (typ(a) != t_POL) err(typeer,"RXQ_powers"); + l += 2; + v = cgetg(l,t_VEC); + v[1] = un; if (l == 2) return v; + + if (degpol(a) >= degpol(T)) a = gres(a, T); + v[2] = (long)a; + for (i=3; i>1)+1; + ir = lx-1; l = (ir>>1)+1; for(;;) { - if (l>1) - { l--; indxt = indx[l]; } + if (l > 1) indxt = indx[--l]; else { - indxt = indx[ir]; indx[ir]=indx[1]; ir--; - if (ir == 1) - { - indx[1] = indxt; - if (flag & cmp_C) - for (i=1; i 0) j++; - if (cmp(q,(GEN)x[indx[j]]) <= 0) break; + q = (GEN)x[indxt]; i = l; + for (j=i<<1; j<=ir; j<<=1) + { + if (j= 0) break; - indx[i]=indx[j]; i=j; - } - else - for (j=i<<1; j<=ir; j<<=1) - { - if (j= 0) break; + indx[i] = indx[j]; i = j; + } + indx[i] = indxt; + } + indx[1] = indxt; - indx[i]=indx[j]; i=j; - } - indx[i]=indxt; + if (flag & cmp_REV) + { /* reverse order */ + GEN indy = (GEN) gpmalloc(lx*sizeof(long)); + for (j=1; j