设代数式序列 $q_1(t), q_2(t), ..., q_{n-1}(t)$ ,由它们生成的多项式形式的表达式(不必定是多项式):算法
$$p(t)=x_1+x_2q_1(t)+...x_nq_1(t)q_2(t)..q_{n-1}(t)=\sum\limits_{i=1}^n(x_i\prod\limits_{j=1}^{i-1}q_j(t))$$ 通常来说,按照这个形式计算函数在 $t_0$ 点的取值的复杂度为:n-1次 $q_i(t)$ 求值,n-1次浮点数乘法(生成n个不一样的乘积),n-1次乘积和常系数浮点数乘法,n-1次浮点数加法 $\Rightarrow$ 总计n-1次 $q_i(t)$ 求值和 $T(n)\approx 3n$ 次浮点数运算。这须要在计算过程当中存储保留一个 $\prod\limits_{j=1}^{i-1}q_j(t)$ 的结果,避免重复运算(那样将会使得生成乘积的n次浮点乘法变成$n^2/2$ 次)。app
利用Horner嵌套算法,能够在 $T(n)\approx 3n$ 的基础上再进一步。Horner嵌套算法的表达式是:$$p(t)=x_1+q_1(t)(x_2+q_2(t)(x_3+q_3(t)(...(x_{n-1}+q_{n-1}(t)x_n)...)))$$ 迭代的伪代码能够写成:函数
$poly = x_n\\for\quad i = n -1 to 1\\ \quad poly = x_i+q_i(t)\times poly\\ end$it
Horner嵌套算法须要n-1次 $q_i(t)$ 求值(这是免不了的),n-1次浮点数乘法,和n-1次浮点数加法,这将把复杂度再削减到n次求值和 $T(n)\approx 2n$ 次浮点数运算。考虑到函数求值是很是广泛和基本的操做,即便只是在复杂度上打个折扣也是很是可观的事情。所以形如上式的多项式型表达式,只要能够使用Horner嵌套算法就应当使用。基础
Horner嵌套算法适用于经过单项式表达的多项式求值,即 $p(t)=x_1+x_2t+x_3t^2+...+x_nt^{n-1}$ ,此处 $q_1(t)=q_2(t)=...=q_n(t)=t$;一样也适用于经过牛顿插值表达的多项式,即 $p(t)=x_1+x_2(t-t_1)+...+x_n(t-t_1)..(t-t_n)$ ,此处 $q_i(t)=t-t_i$ 。im