'Construct a new ``RootSum`` instance of roots of a polynomial.'

def __new__(cls, expr, func=None, x=None, auto=True, quadratic=False):

    (coeff, poly) = cls._transform(expr, x)
    if (not poly.is_univariate):
        raise MultivariatePolynomialError('only    univariate    polynomials    are    allowed')
    if (func is None):
        func = Lambda(poly.gen, poly.gen)
    else:
        try:
            is_func = func.is_Function
        except AttributeError:
            is_func = False
        if (is_func and (1 in func.nargs)):
            if (not isinstance(func, Lambda)):
                func = Lambda(poly.gen, func(poly.gen))
        else:
            raise ValueError(('expected    a    univariate    function,    got    %s' % func))
    (var, expr) = (func.variables[0], func.expr)
    if (coeff is not S.One):
        expr = expr.subs(var, (coeff * var))
    deg = poly.degree()
    if (not expr.has(var)):
        return (deg * expr)
    if expr.is_Add:
        (add_const, expr) = expr.as_independent(var)
    else:
        add_const = S.Zero
    if expr.is_Mul:
        (mul_const, expr) = expr.as_independent(var)
    else:
        mul_const = S.One
    func = Lambda(var, expr)
    rational = cls._is_func_rational(poly, func)
    ((_, factors), terms) = (poly.factor_list(), [])
    for (poly, k) in factors:
        if poly.is_linear:
            term = func(roots_linear(poly)[0])
        elif (quadratic and poly.is_quadratic):
            term = sum(map(func, roots_quadratic(poly)))
        elif ((not rational) or (not auto)):
            term = cls._new(poly, func, auto)
        else:
            term = cls._rational_case(poly, func)
        terms.append((k * term))
    return ((mul_const * Add(*terms)) + (deg * add_const))
