void Polynomial::operator-=(const Polynomial &p) { if(p.terms.empty())return; //added May 7 2005 if(p.getSugar()>sugar)sugar=p.getSugar(); // fast subtraction //TimerScope ts(&polynomialTimer); TermMap::iterator i=terms.lower_bound(p.terms.begin()->first); for(TermMap::const_iterator j=p.terms.begin();j!=p.terms.end();j++) { while(i!=terms.end() && (terms.value_comp()(*i,*j)))i++; if(i==terms.end()) { terms.insert(i,TermMap::value_type(j->first,-j->second)); } else { if(!terms.value_comp()(*j,*i)) { // they must be equal FieldElement c=i->second-j->second; if(c.isZero()) { // if(i->fist.exponent==marked.exponent)marked=Term); TermMap::iterator oldI=i; i++; terms.erase(oldI); } else { i->second=c; } } else { terms.insert(i,TermMap::value_type(j->first,-j->second)); } } } // slow subtraction /* for(TermMap::const_iterator i=p.terms.begin();i!=p.terms.end();i++) { if(terms.count(i->first)==1) { terms[i->first]=terms[i->first]-i->second; if(terms[i->first].isZero())terms.erase(i->first); } else terms[i->first]=-i->second; } */ }
void Polynomial::madd(const Term &m, const Polynomial &p) { if(p.terms.empty())return; //added May 7 2005 int sugar2=p.getSugar()+m.m.exponent.sum(); if(sugar2>sugar)sugar=sugar2; TermMap::iterator i=terms.lower_bound(Monomial(theRing,p.terms.begin()->first.exponent+m.m.exponent)); for(TermMap::const_iterator j=p.terms.begin();j!=p.terms.end();j++) { while(i!=terms.end() && TermMapCompare()(i->first,Monomial(theRing,j->first.exponent+m.m.exponent)))i++; if(i==terms.end()) { terms.insert(i,TermMap::value_type(Monomial(theRing,j->first.exponent+m.m.exponent),j->second*m.c)); } else { if(!TermMapCompare()(Monomial(theRing,j->first.exponent+m.m.exponent),i->first)) { // they must be equal FieldElement c=i->second+j->second*m.c; if(c.isZero()) { TermMap::iterator oldI=i; i++; terms.erase(oldI); } else { i->second=c; } } else { terms.insert(i,TermMap::value_type(Monomial(theRing,j->first.exponent+m.m.exponent),j->second*m.c)); } } } }