/** \brief 整系数多项式的整数根(不含重数). \param f 整系数多项式. \return 整根的list. \note 利用Zp中的根. */ void UniZRootZ_ByZp(std::vector<mpz_ptr> & rootlist,const poly_z & f) { static mpz_t A,B,p,z_temp,nA; mpz_init(A); mpz_init(B); mpz_init(p); mpz_init(z_temp); mpz_init(nA); UniMaxNormZ(A,f); uint n=f.size()-1; mpz_mul(B,A,A); mpz_add(B,B,A); mpz_mul_ui(B,B,2*n); mpz_add_ui(p,B,1); mpz_nextprime(p,p); poly_z fp,vi,ui; std::vector<mpz_ptr> ulist; uint totalroot=0; UniPolynomialMod(fp,f,p); UniZpRootZp(ulist,fp,p); mpz_mul_ui(nA,A,n); ui.resize(2); mpz_set_ui(ui[1],1); for(uint i=0; i<ulist.size(); i++) { if(mpz_cmpabs(ulist[i],A)<=0) { mpz_neg(ui[0],ulist[i]); UniDivZp(vi,fp,ui,p); UniMaxNormZ(z_temp,vi); if(mpz_cmp(z_temp,nA)<=0) { totalroot++; resize_z_list(rootlist,totalroot); mpz_set(rootlist[totalroot-1],ulist[i]); } } } mpz_clear(A); mpz_clear(B); mpz_clear(p); mpz_clear(z_temp); mpz_clear(nA); fp.resize(0); vi.resize(0); ui.resize(0); resize_z_list(ulist,0); std::sort(rootlist.begin(),rootlist.end(),mpz_ptr_less); return ; }
void UniEqlDegFacZp(std::vector<poly_z> & eqlfactorlist,const poly_z & f,mpz_ptr p,uint d,uint & current) { uint n=f.size()-1; if(n==d) { copy_poly_z(eqlfactorlist[current],f); current++; return ; } poly_z g,h; while(1) { UniEqlDegFacZp_Odd(g,f,p,d); if(g.size()>=d)break; } UniEqlDegFacZp(eqlfactorlist,g,p,d,current); UniDivZp(h,f,g,p); UniEqlDegFacZp(eqlfactorlist,h,p,d,current); g.resize(0);h.resize(0); return ; }