code: function(symbol, factors) {
                  if(symbol.isConstant() || symbol.group === S) return symbol;
                  var poly = new Polynomial(symbol),
                      cnst = poly.coeffs[0],
                      cfactors = core.Math2.ifactor(cnst),
                      roots = __.proots(symbol);
                  for(var i=0; i<roots.length; i++) {
                      var r = roots[i],
                          p = 1;
                      if(!isNaN(r)) { //if it's a number
                          for(var x in cfactors) {
                              //check it's raised to a power
                              var n = core.Utils.round(Math.log(x)/Math.log(Math.abs(r)), 8);
                              if(isInt(n)) {
                                  r = x; //x must be the root since n gave us a whole
                                  p = n; break;
                              }
                          }
                          var root = new Frac(r),
                              terms = [new Frac(root.num).negate()];
                          terms[p] = new Frac(root.den);
                              //convert to Frac. The den is coeff of LT and the num is coeff of constant
                          var div = Polynomial.fromArray(terms, poly.variable).fill(),
                              t = poly.divide(div);
                          if(t[1].equalsNumber(0)) { //if it's zero we have a root and divide it out
                              poly = t[0];
                              factors.add(div.toSymbol());
                          }
                      }
                  }
                  if(!poly.equalsNumber(1)) {
                      poly = __.Factor.search(poly, factors);
                  }
                  return poly.toSymbol();
              }
docs: The name says it all :)
  @param {Symbol} symbol
  @param {Factor} factors
  @returns {Symbol}