Horner法则

又名秦九韶算法或嵌套乘法,是一种高效的多项式求值算法。

对于 n n n次多项式
f ( x ) = a 0 + a 1 x + . . . + a n − 1 x n − 1 + a n x n (1) f(x)=a_0+a_1x+...+a_{n-1}x^{n-1}+a_nx^n\tag{1} f(x)=a0​+a1​x+...+an−1​xn−1+an​xn(1)
将其重写为如下形式
f ( x ) = a 0 + x ( a 1 + . . . + x ( a n − 1 + x ( a n ) ) . . . ) (2) f(x)=a_0+x(a_1+...+x(a_{n-1}+x(a_n))...)\tag{2} f(x)=a0​+x(a1​+...+x(an−1​+x(an​))...)(2)
求解多项式值时,由内向外计算式(2)。

对于一个 n n n次多项式,如果按照朴素算法进行计算求值(即计算式(1)),需要进行 n ( n + 1 ) 2 \pmb{\frac{n(n+1)}2} 2n(n+1)​次乘法和 n \pmb{n} n次加法运算,而运用运用嵌套乘法(即计算式(2)),我们至多需要做次乘法 n \pmb{n} n和 n \pmb{n} n次加法运算,这也就体现出了horner法则的高效性,特别是通过计算机进行大规模计算时。

相比于式(2),嵌套乘法还有更一般的形式
f ( x ) = a 0 + ( x − r 1 ) ( a 1 + . . . + ( x − r n − 1 ) ( a n − 1 + ( x − r n ) ( a n ) ) . . . ) (3) f(x)=a_0+(x-r_1)(a_1+...+(x-r_{n-1})(a_{n-1}+(x-r_n)(a_n))...)\tag{3} f(x)=a0​+(x−r1​)(a1​+...+(x−rn−1​)(an−1​+(x−rn​)(an​))...)(3)
其中 r 1 , . . . , r n − 1 , r n r_1,...,r_{n-1},r_{n} r1​,...,rn−1​,rn​称为基点。如果设式(3)中参数 r 1 = . . . = r n − 1 = r n = 0 r_1=...=r_{n-1}=r_{n}=0 r1​=...=rn−1​=rn​=0,则变成传统的嵌套形式(即式(2))。

代码实现

Matlab代码

%%嵌套乘法
%使用霍纳方法以嵌套形式计算多项式的值
%输入: 多项式的阶n,
%      n+1个系数构成的数组a(第一个元素a_0为常数项),
%      x坐标需要进行求值的x位置,
%      如果需要的话,还有n个基点构成的数组b
%输出: 多项式在x点对应的值y
function y=nest(n,a,x,b)
if nargin<4, b=zeros(n,1); end
y=a(n+1);
for i=n:-1:1
y = y.*(x-b(i))+a(i);
end

Python代码

"""嵌套乘法求解多项式"""
import numpy as npdef ndarrayArgs(func):"""装饰器:函数参数list->ndarray"""def formated(*args):result = func(*map(lambda x: np.array(x) if isinstance(x, list) else x, args))return resultreturn formated@ndarrayArgs
def nest(n, a, x, b = None):"""使用霍纳方法以嵌套形式计算多项式的值:param n: 多项式的阶数:param a: n+1个系数构成的数组(第一个元素a_0为常数项):param x: 需要进行求值的x坐标位置:param b: 可选参数,由n个基点构成的数组b:return: 多项式在x点对应的值y"""if b is None:b = np.zeros(n)y = a[n]for i in reversed(range(n)):y = y * (x - b[i]) + a[i]return yif __name__ == "__main__":# results = nest(4, [-1, 5, -3, 3, 2], 1 / 2, [0, 0, 0, 0])# results = nest(4, [-1, 5, -3, 3, 2], [-2, -1, 0, 1, 2])results = nest(3, [1, 1 / 2, 1 / 2, -1 / 2], 1, [0, 2, 3])print(results)

参考

[1] 数论 | 秦九韶算法(Horner法则) - 简书 (jianshu.com)

[2] Numerical Analysis. secondd edition. Timothy Sauer.

[3] https://github.com/riverlike14/Numerical_Analysis

数值分析 | 多项式求值(Horner法则)相关推荐

  1. 求幂运算、多项式乘法及Horner法则的应用

    一,两种不同的求幂运算 求解x^n(x 的 n 次方) ①使用递归,代码如下: 1 private static long pow(int x, int n){ 2 if(n == 0) 3 retu ...

  2. 解题报告(三)多项式求值与插值(拉格朗日插值)(ACM / OI)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  3. 6-2 多项式求值 (15 分)

    6-2 多项式求值 (15 分) 本题要求实现一个函数,计算阶数为n,系数为a[0] ... a[n]的多项式f(x)=∑i=0n​(a[i]×xi) 在x点的值. 函数接口定义: double f( ...

  4. C语言实现一维多项式求值

    /*  * plyv.h  *  *  Created on: Oct 14, 2010  *      Author: jenson  */ #ifndef PLYV_H_ #define PLYV ...

  5. matlab多项式的求值,多项式求值的MATLAB实现

    公茂果老师的课件中,给出了四种多项式求值的算法,下面给出代码示例: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %E-mail: [email protected] ...

  6. 1002: 简单多项式求值 ZZULIOJ

    1002: 简单多项式求值 题目描述 对用户输入的任一整数,输出以下多项式的值. y=2x^2+x+8 输入 输入整数x的值. 输出 输出一个整数,即多项式的值. 样例输入 Copy 1 样例输出 C ...

  7. 【C++】用递归函数实现Hermite多项式求值

    要求:用递归函数实现Hermite多项式求值.当x>1时,Hermite多项式定义为: 当输入实数x和整数n后,求出Hermite多项式前n项的值. #include <iostream& ...

  8. Matlab多项式求值(2)(roots和poly的使用)

    Matlab多项式求值(2)(roots和poly的使用) #Matlab学习笔记 1.多项式求根 n次多项式具有n个根(包括实根和共轭复根) roots函数可以用于求解多项式的全部根,其调用格式为: ...

  9. 《C#零基础入门之百识百例》(五十二)封装介绍 -- 二维多项式求值

    C#零基础入门 面向对象 -- 封装介绍 -- 二维多项式求值 前言 一,封装概念 二,封装属性 三,实例练习 -- 二维多项式求值 3.1 题目描述 3.2 问题分析 3.3 参考代码 前言 本文属 ...

最新文章

  1. 2015化妆品行业如何进行微信公众号营销
  2. Pass4side CompTIA PK0-002题库下载
  3. 机器学习知识点(三十)LDA话题模型Java实现
  4. 物料需求计划评估和订单创建
  5. QOS是什么?(Quality of Service,服务质量)
  6. php判断目录是否有写的权限,php中判断文件空目录是否有读写权限的函数代码_php技巧...
  7. 以下哪个选项不是单例模式的优点_深度解密Python单例模式
  8. Linux 格式化分区 报错Could not stat --- No such file or directory 和 partprobe 命令
  9. linkedblockingqueue使用_学会java这几个线程池的使用,会使得你的程序效率提升十倍...
  10. rocketmq 同步双写
  11. 什么是统一架构框架 (Unified Architecture Framework)?
  12. 修正 H33Y 准系统 intel HM55 芯片组安装 Windows 10 的问题
  13. ddm模型公式_绝对估值法DDM、DCF、RNAV模型简介
  14. 计算机教室的英语单词怎么写的,小学的英语单词怎么写
  15. 道场与世间修行的区别
  16. 外星人冯诺依曼【转】
  17. python中跳过本次循环的语句是_Python跳过for循环
  18. 盘点2018年化工行业大事故!回顾那些令人心痛的瞬间......
  19. 信息系统安全防范策略
  20. Excel绘制图表时X轴在有数据点的地方才出现刻度标签

热门文章

  1. 曙光服务器显示psu故障,排除故障a.c. -系列服务器重新启动
  2. 最详细NER实战讲解-bilstm+crf(4)提取词边界和词性特征
  3. oracle外键约束的各种选项,聊聊Oracle外键约束的几个操作选项
  4. JAVA读取EDID
  5. The Chinese Postman Problem HIT - 2739(有向图中国邮路问题)
  6. Mac下词典无法发音的解决办法 - 只有音标不能发音
  7. DRF - 解析器组件
  8. 中国历史上最早的牛人
  9. SD 分离Alpha通道
  10. 【报告分享】2021线上新品消费趋势报告-阿里研究院天猫小黑盒(附下载)