Zhao Li on Wed, 04 May 2022 11:16:26 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: slow factor |
Dear Bill, Thank you. In practice we can restrict the input polynomial in the integer ring. This function works very well. But we found it failed for this polynomial. P = -400000*ieta + 3600000*ep*ieta + 4*ep*ieta^2 - 11300000*ep^2*ieta - 20*ep^2*ieta^2 + 15000000*ep^3*ieta + 33*ep^3*ieta^2 - 7200000*ep^4*ieta - 18*ep^4*ieta^2; We do not fully understand the reason yet. Cheers, Zhao Theoretical Physics Division Institute of High Energy Physics Chinese Academy of Sciences > On Apr 30, 2022, at 3:28 AM, Bill Allombert <Bill.Allombert@math.u-bordeaux.fr> wrote: > > On Sat, Apr 30, 2022 at 02:12:33AM +0800, Zhao Li wrote: >> Hi all, >> >> We are using GP for factoring the multivariate polynomial, which >> however could be extremely slow compared to Factor function in >> mathematica. > > Yes, this is very slow. In fact, this is not even really documented! > >> So we were wondering if there is any option to make factor more efficient in GP. > > Probably not... Over what ring do you want to factor ? > Your example is in Z[i][X,Y] (with i^2=-1). > > PARI do not have fast GCD code for such ring, so issquarefree(P) is very slow. > > You can try the following script which skip the issquarefree step: > > fact(P) = > { > my(x=variable(P),y=variable(Vec(P))); > my(d=poldegree(P,y)); > my(C=content(P),FC=factor(C)); > for(i=1,oo, > my(R=substpol(factor(subst(P/C,ieta,(x+i)^d)),(x+i)^d,ieta)); > R= matconcat([FC,R]~); > my(F=factorback(R)*C); > if(pollead(P)*F==pollead(F)*P, > return(R))); > } > > ? fact(P) > ? ## > *** last result computed in 8,564 ms. > > (which is slow but still usable). > > Cheers, > Bill