
I haven't been able to evaluate this properly, but here were some quick thoughts: - Rename evaluate() to horner() and provide evaluate() as an inline call to horner(). - Rename evaluate_faithfully() to compensated_horner(). - Things that say "Be careful about this" generally need fixing. - It would be nice to have operator* and operator/ as well as *= and /=. - Considering they share the same core algorithm, it might be nice to have a function that could do division and return the remainder at the same time. Something like poly::divide(P &divisor, P "ient, P &remainer) - FFTs are good for multiplying polynomials above a certain size, but they are rather heavy for small polynomials and can lead to unexpected crosstalk between terms. There should be an option for * that doesn't use the FFT, and it should be the default for small polynomials. - operator/= has a hardcoded "std::vector<double> new_coefficients" that later gets rounded?? Maybe that works. Later, Daniel