Horner法则(霍纳法则)及其C语言描述

简介

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

简单来说就是这个算法可以提高下面多项式求值的计算速度。

霍纳法则(Horner Rule)

对于有多项式 P ( x ) = ∑ i = 0 n a i x i = a 0 + a 1 x 1 + a 2 x 2 + . . . + a n x n P(x) = \sum_{i=0}^n a_ix^i=a_0+a_1x^1+a_2x^2+...+a_nx^n P(x)=i=0naixi=a0+a1x1+a2x2+...+anxn
要求 P ( x ) P(x) P(x) 有两种办法:

一种就是把这 n + 1 n+1 n+1直接全部加起来,但是这样做的效率很低,需要进行 n ∗ ( n + 1 ) 2 \dfrac{n* (n+1)}{2} 2n(n+1)乘法运算 n n n 次加法运算

而通过如下变换我们可以得到一种快得多的算法,即:
P ( x ) = ( ( … ( ( ( a n x + a n - 1 ) x + a n - 2 ) x + a n − 3 ) … ) x + a 1 ) x + a 0 P(x) = ((…(((a_nx +a_n-1)x+a_n-2)x+ a_n-3)…)x+a_1)x+a_0 P(x)=(((((anxan)xan)x+an3))xa1)xa0
这种求值的方法我们称为霍纳法则复杂度为O(n)

举个栗子

例 如 , 当 x = 3 时 , 计 算 P ( x ) = 2 x 4 - x 3 + 3 x 2 + x - 5 的 值 。 例如,当x=3时,计算P(x)=2x^4-x^3+3x^2+x-5的值。 x=3P(x)=2x4x3+3x2+x5
对 于 多 项 式 对于多项式 P ( x ) = 2 x 4 - x 3 + 3 x 2 + x - 5 P(x)=2x^4-x^3+3x^2+x-5 P(x)=2x4x3+3x2+x5
我 们 按 霍 纳 法 则 进 行 变 换 , 有 : 我们按霍纳法则进行变换,有:
P ( x ) = 2 x 4 - x 3 + 3 x 2 + x - 5 P(x)=2x^4-x^3+3x^2+x-5 P(x)=2x4x3+3x2+x5
= x ( 2 x 3 - x 2 + 3 x + 1 ) - 5 =x(2x^3-x^2+3x+1)-5 =x(2x3x2+3x+1)5
= x ( x ( 2 x 2 - x + 3 ) + 1 ) - 5 =x(x(2x^2-x+3)+1)-5 =x(x(2x2x+3)+1)5
= x ( x ( x ( 2 x - 1 ) + 3 ) + 1 ) - 5 =x(x(x(2x-1)+3)+1)-5 =x(x(x(2x1)+3)+1)5

C语言实现
/* 霍纳算法实例 */
#include <stdio.h>

long int 
Horner(int coefficient[], int n, int x) 
{ 
//coefficient[]为待求多项式的系数数组,n为数组大小,x为多项式中未知数x的具体值                                      
//注意:coefficient[0]存放系数a0,coefficient[1]存放系数a1,以此类推…
    int i;
    long int result;

    result = coefficient[n-1];
    for(i = 1; i <= n-1; i++)
       result = result * x + coefficient[n-1-i];
       
    return result;
}

int 
main(void)
{
    long int p;
    int a[4] = {3, 2, 1, 1};
    p = horner(a, 4, 1);
    printf("polynomial x^3 + x^2 + 2x + 3 = %ld\n", p);
}
    • 补个,我居然不知道这是什么

      • 完全平方指用一个整数乘以自己例如11,22,33等,依此类推。若一个数能表示成某个整数的平方的形式,则称这个数为完全平方数。完全平方数是非负数,而一个完全平方数的项有两个。注意不要与完全平方式所混淆。
        a
        "foo"*

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值