Polynomial::Polynomial(const Polynomial& that) : numVars_(that.numVars_) { PowersToCoeffMap::const_iterator iter; for (iter = that.terms_.begin(); iter != that.terms_.end(); ++iter) { assert(hasSameNumVars(iter->first)); assert(isValidCoeff(iter->second)); terms_.insert(PowersToCoeffMap::value_type(iter->first, iter->second)); } assert(getNumTerms() == that.getNumTerms()); }
// O(n^2) factoring void Polynomial::factor() { /* PRE-CONDITIONS: The polynomial is of the correct format. POST-CONDITIONS: The polynomial will combine all like terms in preparation for either output or addition. */ Polynomial newPoly; Term currentTerm; int newCoefficient; // Loop while there is a term left to check while (termList.size() > 0) { bool foundLikeTerm = false; // If there are no terms in the new polynomial add the first term if (newPoly.getNumTerms() == 0) { // If the exponent is anything but 0, add the term as is. if (termList.front().getExponent() != 0) { newPoly.addTermToList(termList.front()); termList.pop_front(); } else{ // If the exponent is zero, drop the variable and add the coefficient newPoly.addTermToList(Term(termList.front().getCoefficient())); termList.pop_front(); } } else { // Set new current term to be checked against the new polynomial currentTerm = termList.front(); // If the exponent of the term is zero, drop the variable if (currentTerm.getExponent() == 0) currentTerm = Term(termList.front().getCoefficient()); // Iterate through the new polynomial to check for matches of exponents // If the exponents match add the terms together, else add to the end of the new poly for (list<Term>::iterator iter = newPoly.termList.begin(); iter != newPoly.termList.end();) { // If the exponents match or they are both numbers with no variables, add them together if ((iter->getExponent() == currentTerm.getExponent()) || (iter->getHasVariable() == false && currentTerm.getHasVariable() == false)) { newCoefficient = iter->getCoefficient() + currentTerm.getCoefficient(); iter->setCoefficient(newCoefficient); foundLikeTerm = true; break; } else{ // Advance iterator if no matches are found on the current term iter++; } } // If it gets through the new poly without a match, add it to the new poly if(foundLikeTerm == false) newPoly.addTermToList(currentTerm); termList.pop_front(); } } // Clear everything from old polynomial, update with the new polynomial termList = newPoly.termList; }