霍纳法则

计算机科学中,有一些关于多项式求值的问题。对于多项式求值问题,我们最容易想到的算法是求出每一项的值然后把所求的值累加起来,这种算法的时间和空间效率都不高,对于数据规模不大的题目来说由于其直观、简单很容易被大家采纳,可一旦数据规模过大时,这种算法就显得无能为力了,下面介绍一种解决这类求值问题的高效算法――霍纳法则。在中国,霍纳法则也被称为秦九韶算法。

霍纳法则最重要的用途:为多项式求值提供了一个高效的方法。算式转化如下:

实例如下:

使用霍纳法则,步骤如下:

1,建立二维表格,将公式的系数填入第一行(即使对应项系数为0也要填写).

    2,对于第二行,除了第一个单元格直接填写系数外,其他单元格的值的计算方式都是
       x的值* 前一单元格的值+本单元格对应于公式的系数 
(比如第二个单元格: 7* 2 + (-1 ) = 13.其中x的值为7, 2是前一单元格的值, 本单元格对上的系数为-1 )

其实霍纳法也是从上面的多项式通过提取x得来的:

使用js代码实现方式如下:

var param = [2, -1, -3, 1, -5]; //参数放在数组中
        var H = 7;  // X 取值7;
        var sum = param[0];// 获得第一个参数;
        for(var i = 1; i < param.length; i ++){ // 循环不断计算总值;
            sum = H * sum + param[i];
            console.log(sum);
        }
        console.log(‘sum : ‘ + sum); // sum : 4314
时间: 2024-10-09 06:32:39

霍纳法则的相关文章

数学之路-python计算实战(3)-霍纳法则

假设有n+2个实数a0,a1,-,an,和x的序列,要对多项式Pn(x)= anx ^n+a(n-1)x^(n-1)+-+a1x+a0求值,直接方法是对每一项分别求值,并把每一项求的值累加起来,这种方法十分低效,它需要进行n+(n-1)+-+1=n(n+1)/2次乘法运算和n次加法运算.有没有更高效的算法呢?答案是肯定的.通过如下变换我们可以得到一种快得多的算法,即Pn(x)= anx ^n+a(n-1)x^(n-1)+-+a1x+a0=((-(((anx +an-1)x+an-2)x+ an-

【算法设计与分析基础】18、霍纳法则

产生随机数 package cn.xf.algorithm.ch02; import java.util.ArrayList; import java.util.List; /** * 生产随机数 * @author xiaof * */ public class Random { /** * 生产一个随机数的数列 * @param n 生成n个数列 * @param m 数据在0和m-1之间 * @param seed 随机初始种子 * @param a 参数 * @param b 参数 *

霍纳法则(Horner&#39;s rule)

卡在hdu 1402 的高精度乘法了,要用FFT(快速傅里叶变换),然后看到了这个霍纳法则,顺便就写下来了. 霍纳法则:求多项式值的一个快速算法. 简单介绍: 假设有n+2个数 , a0,a1,a2,a3,--an 和x组成的一个多项式,形式如下:   a0*x^0+a1*x^1+a2*x^2+a3*x^3+--an*x^n   ,通常都是一项一项的求和然后累加,这样的话要进行n* (n+1)/2 次乘法运算 和 n 次加法运算 , 而霍纳法则就是一个改进的一个算法.通过变换得到如下式子: ((

第一章 基本概念_利用霍纳规则求多项式的值(递归)

#include <stdio.h>  #include <stdlib.h>  #define LEN 3  int hornor(int [],int,int);  int main()  {     int a[3]={1,2,3};//数组表示多项式的系数     int x=2;//多项式的自变量值     int result=0;//存放结果     result = hornor(a,0,2);  //3*2^2+2*2^2+1*2^0              

霍纳规则(C/C++,Scheme)

一.背景 霍纳(Horner)规则是采用最少的乘法运算策略,来求多项式 A(x)=anxn+an?1xn?1+...+a1x+a0 在x0处的值. 该规则为 A(x0)=(...((anx0+an?1)x0+...+a1)x0+a0) 二.分析 如果光看着式子或许会有点烦躁,不妨手动设定几个值到式子中去来手工运算一番,这样一来也会有些亲身的理解. 通过分解我们注意到,从右往左来看,每一个小式子都是如此: something?x0+ai 三.代码 C语言版 #include <stdio.h>

霍纳规则解决多项式的求值问题

霍纳规则用来简化朴素多项式的求值.它将一元n次多项式的求值问题转化为n个一次式. 霍纳规则是采用最少的乘法运算策略,求多项式A(x) = anxn+ an-1xn-1+...+ a1x + a0在x0处的值,该规则是A(x0)=(...((anx0+ an-1)x0+...+ a1)x0+ a0) 1 #include<stdio.h> 2 3 int horner(int a[], int x, int n); 4 5 int main() 6 { 7 int n; 8 scanf(&quo

用于多项式计算的霍纳方法

洛谷 P2312 解方程

题目描述 已知多项式方程: $a_0+a_1x+a_2x^2+..+a_nx^n=0$//用LaTex好看多了 求这个方程在[1, m ] 内的整数解(n 和m 均为正整数) 输入输出格式 输入格式: 输入文件名为equation .in. 输入共n + 2 行. 第一行包含2 个整数n .m ,每两个整数之间用一个空格隔开. 接下来的n+1 行每行包含一个整数,依次为a0,a1,a2..an 输出格式: 输出文件名为equation .out . 第一行输出方程在[1, m ] 内的整数解的个

Python数据结构——散列表

散列表的实现常常叫做散列(hashing).散列仅支持INSERT,SEARCH和DELETE操作,都是在常数平均时间执行的.需要元素间任何排序信息的操作将不会得到有效的支持. 散列表是普通数组概念的推广.如果空间允许,可以提供一个数组,为每个可能的关键字保留一个位置,就可以运用直接寻址技术. 当实际存储的关键字比可能的关键字总数较小时,采用散列表就比较直接寻址更为有效.在散列表中,不是直接把关键字用作数组下标,而是根据关键字计算出下标,这种 关键字与下标之间的映射就叫做散列函数. 1.散列函数