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 UniSubFC(poly_fc & r,poly_fc & f,poly_fc & g) { int sf=f.size(),sg=g.size(),ms=std::min<int>(sf,sg); r.resize(std::max<int>(sf,sg)); for(int i=0;i<ms;i++)mpfc_sub(r[i],f[i],g[i]); if(sf<sg) { for(int i=ms;i<sg;i++)mpfc_neg(r[i],g[i]); } else { for(int i=ms;i<sf;i++)mpfc_set(r[i],f[i]); } if(sf==sg)r.normalize(); return ; }
inline complexAP complexAP::operator -(complexAP c) { complexAP tmp; mpfc_sub(&tmp.value, &value, &c.value); return tmp; }
inline bool complexAP::operator ==(complexAP c) { complexAP tmp; mpfc_sub(&tmp.value, &value, &c.value); return mpfc_is_zero(&tmp.value); }
void subtract(elem &result, elem a, elem b) const { mpfc_sub(&result,&a,&b); }