Xavier Roblot on Fri, 22 Jan 1999 15:53:11 -0500 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: nffactor() timing |
Igor Schein wrote: > > I define functions f and g as follows: > ? f(x)=x^16+x^12+x^5+1 > ? polredabs(f(x)) > x^16 - x^11 + x^4 + 1 > ? g(x)=x^16-x^11+x^4+1 > > Then I try all 4 possible combinations: > > nffactor(nfinit(g(y)),g(x)) > nffactor(nfinit(g(y)),f(x)) > > nffactor(nfinit(f(y)),g(x)) > nffactor(nfinit(f(y)),f(x)) > > The first two return the result in 12 seconds on Ultra-60. > The last two take forever ( I ran for 1.5 hours, then gave up). > "exposant considere" and precision keep doubling, and I don't know if > it'd ever finish. The precision must be increased when the exposant is doubled. This is corrected in the following patch, there were also some precision adjustements needed and a couple of typos. This should make it work. Xavier Roblot
*** ./src/modules/nffactor.c.orig Wed Dec 16 19:17:58 1998 --- ./src/modules/nffactor.c Fri Jan 22 15:43:37 1999 *************** *** 842,850 **** (long)C); k2=gmul2n(gmulgs(glog(gdivgs(gmul2n(C,2),n),DEFAULTPREC),n),-1); ! if (signe(k2)<0) k2=gun; ! if (fl) k2=mulrr(k2,dbltor(1.1)); ! minp=gmin(gexp(gmul2n(k2,-6),BIGDEFAULTPREC), maxp); minp=gceil(minp); --- 842,850 ---- (long)C); k2=gmul2n(gmulgs(glog(gdivgs(gmul2n(C,2),n),DEFAULTPREC),n),-1); ! if (!fl) k2=mulrr(k2,dbltor(1.1)); ! if (gcmp(k2, gun)<0) k2=gun; ! minp=gmin(gexp(gmul2n(k2,-6),BIGDEFAULTPREC), maxp); minp=gceil(minp); *************** *** 896,906 **** affir(mulii(absi(dk),gpui(p,k,0)),p2); p2=shifti(gceil(mplog(p2)),-1); ! #ifdef LONG_IS_64BIT ! newprec=max(DEFAULTPREC, (long)(itos(p2)*pariK1+4)); ! #else ! newprec=max(DEFAULTPREC, (long)(itos(p2)*pariK1+8)); ! #endif if (DEBUGLEVEL>=4) fprintferr("nouvelle precision : %ld\n",newprec); --- 896,902 ---- affir(mulii(absi(dk),gpui(p,k,0)),p2); p2=shifti(gceil(mplog(p2)),-1); ! newprec = MEDDEFAULTPREC + (long)(itos(p2)*pariK1); if (DEBUGLEVEL>=4) fprintferr("nouvelle precision : %ld\n",newprec); *************** *** 1257,1263 **** T2_matrix_pow(GEN nf, GEN T2, GEN pr, GEN C, GEN kmax, long prec) { long N,k,av=avma,av1,lim,DEBUG2=DEBUGLEVEL; ! GEN p1,p3,p,u,C2,rep; DEBUGLEVEL=0; k=itos(kmax); --- 1253,1259 ---- T2_matrix_pow(GEN nf, GEN T2, GEN pr, GEN C, GEN kmax, long prec) { long N,k,av=avma,av1,lim,DEBUG2=DEBUGLEVEL; ! GEN p1,p3,p2,p,u,C2,rep; DEBUGLEVEL=0; k=itos(kmax); *************** *** 1304,1310 **** --- 1300,1315 ---- if (test_mat(p3,p,C2,k,N)) break; + /* il faut augmenter la precision en meme temps */ + p2=cgetr(DEFAULTPREC); + affir(gpuigs(p,k),p2); + p2=shifti(gceil(mplog(p2)),-1); + prec += (long)(itos(p2)*pariK1); + T2=nf_init_t2(nf,prec); + if (DEBUG2>=4) + fprintferr("nouvelle precision : %ld\n",prec); k = k<<1; p1 = idealmullll(nf,p1,p1); + if (low_stack(lim, (av1+3*bot)>>2)) { if (DEBUGMEM>1) err(warnmem,"T2_matrix_pow");