void UniMulFC(poly_fc & r,poly_fc & f,poly_fc & g) { uint sa=f.size(),sb=g.size(); if(sa==0||sb==0) { r.resize(0); return ; } uint sx = sa+sb-1; r.resize(sx); int i, j, jmin, jmax; static mpfc_t t, accum; mpfc_init(t); mpfc_init(accum); for (i = 0; i < sx; i++) { jmin = std::max<int>(0, i-sb+1); jmax = std::min<int>(sa-1, i); mpfc_set_ui(accum,0); for (j = jmin; j <= jmax; j++) { mpfc_mul(t, f[j], g[i-j]); mpfc_add(accum, accum, t); } mpfc_set(r[i], accum); } mpfc_clear(t); mpfc_clear(accum); }
void ComplexInitialize() { FC_DEFAULT_PREC=100; mpf_init(mpfc_mpf_temp[0]); mpf_init(mpfc_mpf_temp[1]); mpf_init(mpfc_mpf_temp[2]); mpf_init(mpfc_mpf_temp[3]); mpfc_init(mpfc_one);mpfc_set_ui(mpfc_one,1); mpfc_init(mpfc_zero);mpfc_set_ui(mpfc_zero,0); return ; }
void UniDivFC(poly_fc & q,poly_fc & f,poly_fc & g) { poly_fc r; int k,n; r.resize(f.size()); for(int i=0;i<f.size();i++)mpfc_set(r[i],f[i]); n=g.size()-1; k=r.size()-g.size(); if(k<0) { q.resize(0);return; } q.resize(k+1); mpfc_t t; mpfc_init(t); do { mpfc_div(q[k],r[n+k],g[n]); if(!mpfc_iszero(q[k])) { for(int i=0;i<n;i++) { uint j=n+k-1-i; mpfc_mul(t,q[k],g[j-k]); mpfc_sub(r[j],r[j],t); } } } while (k--); mpfc_clear(t); r.resize(0); }
void poly_fc::resize(uint n) { uint m=this->rep.size(); if(n>m) { this->rep.resize(n); for(uint i=m;i<n;i++) { this->rep[i]=new mpfc; mpfc_init(this->rep[i]); } } else if(n<m) { for(uint i=n;i<m;i++) { mpfc_clear(this->rep[i]); delete this->rep[i]; } this->rep.resize(n); } return ; }
void init() { mpfc_init(&value,53); }
void set_zero(elem &result) const { mpfc_init(&result, R->get_precision()); mpfc_set_si(&result, 0); }