简介
计算机科学中,有一些关于多项式求值的问题。对于多项式求值问题,我们最容易想到的算法是求出每一项的值然后把所求的值累加起来,这种算法的时间和空间效率都不高,对于数据规模不大的题目来说由于其直观、简单很容易被大家采纳,可一旦数据规模过大时,这种算法就显得无能为力了,下面介绍一种解决这类求值问题的高效算法――霍纳法则。在中国,霍纳法则也被称为秦九韶算法。
简单来说就是这个算法可以提高下面多项式求值的计算速度。
霍纳法则(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)=((…(((anx+an-1)x+an-2)x+an−3)…)x+a1)x+a0
这种求值的方法我们称为霍纳法则,复杂度为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=3时,计算P(x)=2x4-x3+3x2+x-5的值。
对
于
多
项
式
对于多项式
对于多项式
P
(
x
)
=
2
x
4
-
x
3
+
3
x
2
+
x
-
5
P(x)=2x^4-x^3+3x^2+x-5
P(x)=2x4-x3+3x2+x-5,
我
们
按
霍
纳
法
则
进
行
变
换
,
有
:
我们按霍纳法则进行变换,有:
我们按霍纳法则进行变换,有:
P
(
x
)
=
2
x
4
-
x
3
+
3
x
2
+
x
-
5
P(x)=2x^4-x^3+3x^2+x-5
P(x)=2x4-x3+3x2+x-5
=
x
(
2
x
3
-
x
2
+
3
x
+
1
)
-
5
=x(2x^3-x^2+3x+1)-5
=x(2x3-x2+3x+1)-5
=
x
(
x
(
2
x
2
-
x
+
3
)
+
1
)
-
5
=x(x(2x^2-x+3)+1)-5
=x(x(2x2-x+3)+1)-5
=
x
(
x
(
x
(
2
x
-
1
)
+
3
)
+
1
)
-
5
=x(x(x(2x-1)+3)+1)-5
=x(x(x(2x-1)+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"*
-
-