=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/engine/D.c,v retrieving revision 1.3 retrieving revision 1.5 diff -u -p -r1.3 -r1.5 --- OpenXM_contrib2/asir2000/engine/D.c 2000/08/22 05:04:03 1.3 +++ OpenXM_contrib2/asir2000/engine/D.c 2002/03/15 02:52:10 1.5 @@ -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/engine/D.c,v 1.2 2000/08/21 08:31:24 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/engine/D.c,v 1.4 2001/06/07 04:54:39 noro Exp $ */ #include "ca.h" @@ -338,9 +338,7 @@ N number,*root; for ( index = 0, num = number; ; index++ ) { if ( n == 1 ) goto TAIL; - p = lprime[index]; - if ( !p ) - error("nthrootn : lprime[] exhausted."); + p = get_lprime(index); if ( !(num0 = rem(num,p)) ) continue; STON(n,n1); STON(p-1,n2); gcdn(n1,n2,&gcd); @@ -470,6 +468,62 @@ Q *qp; for ( i = 0, ptr = BD(n); i < PL(n); i++ ) ptr[i] = c[i]; bnton(mod,n,&tn); NTOQ(tn,sgn,*qp); + } +} + +void padictoq_unsigned(int,int,int *,Q *); + +void lumtop_unsigned(v,mod,bound,f,g) +V v; +int mod; +int bound; +LUM f; +P *g; +{ + DCP dc,dc0; + int **l; + int i; + Q q; + + for ( dc0 = NULL, i = DEG(f), l = COEF(f); i >= 0; i-- ) { + padictoq_unsigned(mod,bound,l[i],&q); + if ( q ) { + NEXTDC(dc0,dc); + if ( i ) + STOQ(i,DEG(dc)); + else + DEG(dc) = 0; + COEF(dc) = (P)q; + } + } + if ( !dc0 ) + *g = 0; + else { + NEXT(dc) = 0; MKP(v,dc0,*g); + } +} + +void padictoq_unsigned(mod,bound,p,qp) +int mod,bound,*p; +Q *qp; +{ + register int h,i,t; + int br,sgn; + unsigned int *ptr; + N n,tn; + int *c; + + c = W_ALLOC(bound); + for ( i = 0; i < bound; i++ ) + c[i] = p[i]; + for ( i = bound - 1; ( i >= 0 ) && ( c[i] == 0 ); i--); + if ( i == -1 ) + *qp = 0; + else { + n = NALLOC(i+1); PL(n) = i+1; + for ( i = 0, ptr = BD(n); i < PL(n); i++ ) + ptr[i] = c[i]; + bnton(mod,n,&tn); NTOQ(tn,1,*qp); } }