霍纳法则(Horner'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 次加法运算 ,

而霍纳法则就是一个改进的一个算法。通过变换得到如下式子:

(((……(((an+an-1)*x+an-2)*x+an-3)*x)+……)*x+a1)*x+a0 ,

这种求值的方法便是霍纳法则。(复杂度 为 O(n) )

根据霍纳法则写的一个代码:

简单的多项式求值

#include <iostream>

using namespace std;

int Horner_rule(int arr[],int n,int x)
{
    int i,ans = 0;;
    for(i = 0;i<n;i++)
    {
        ans =arr[i]+x*ans;
    }
    return ans;
}
int main()
{
    int n,x,i,t,arr[1000];
    cin>>t;
    while(t--)
    {
        cout<<"输入 : n , x : ";
        cin>>n>>x;
        cout<<"输入 "<<n <<" 个数  : ";
        for(i = n-1;i>=0;i--)//求值是从 an 开始,所以倒着存
            cin>>arr[i];
        for(i = 0;i<n-1;i++)
            cout<<arr[i]<<"*x"<<"^"<<i<<"+";
        cout<<arr[i]<<"*x"<<"^"<<i<<" = ";
        cout<<Horner_rule(arr,n,x)<<endl;
    }
    return 0;
}

霍纳法则(Horner's rule)

时间: 2024-08-04 04:54:53

霍纳法则(Horner's rule)的相关文章

【算法设计与分析基础】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 参数 *

数学之路-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-

霍纳法则

计算机科学中,有一些关于多项式求值的问题.对于多项式求值问题,我们最容易想到的算法是求出每一项的值然后把所求的值累加起来,这种算法的时间和空间效率都不高,对于数据规模不大的题目来说由于其直观.简单很容易被大家采纳,可一旦数据规模过大时,这种算法就显得无能为力了,下面介绍一种解决这类求值问题的高效算法――霍纳法则.在中国,霍纳法则也被称为秦九韶算法. 霍纳法则最重要的用途:为多项式求值提供了一个高效的方法.算式转化如下: 实例如下: 使用霍纳法则,步骤如下: 1,建立二维表格,将公式的系数填入第一

霍纳规则(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

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

#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              

Horner&#39;s rule

A rule for polynomial computation which both reduces the number of necessary multiplications and results in less numerical instability due to potential subtraction of one large number from another. The rule simply factors out powers of x, giving Horn

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

蒙哥马利算法详解

这篇文章为大家梳理一下整个蒙哥马利算法的本质,蒙哥马利算法并不是一个独立的算法,而是三个相互独立又相互联系的算法集合,其中包括 蒙哥马利乘模,是用来计算x?y (mod N) 蒙哥马利约减,是用来计算t?ρ?1 (mod N) 蒙哥马利幂模,是用来计算xy (mod N) 其中蒙哥马利幂乘是RSA加密算法的核心部分. 基本概念 梳理几个概念,试想一个集合是整数模N之后得到的 ZN={0,1,2,?,N?1} 注:N在base-b进制下有lN位. 比如10进制和100进制,都属于base-10进制