Пример #1
0
/**
\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 ;
}
Пример #2
0
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 ;
}