秦九韶算法 介紹:
一般地,一元n次多項式的求值需要經過(n+1)*n/2次乘法和n次加法,而秦九韶算法只需要n次乘法和n次加法。在人工計算時,一次大大簡化了運算過程。
把一個n次多項式
改寫成如下形式:
求多項式的值時,首先計算最內層括號內一次多項式的值,即
V1=an*x+a n-1
然後由內向外逐層計算一次多項式的值,即
這樣,求n次多項式f(x)的值就轉化爲求n個一次多項式的值。
結論:對於一個n次多項式,至多做n次乘法和n次加法。
實例 C 程序:
//比較不同算法實現的求100階多項式的運行時間
#include<stdio.h>
#include<time.h>
#include<math.h>
clock_t start, stop;
#define N_items 101 //多項式最大階數+1
#define MAXK 1e5 //運行函數10的7次方次,爲了看到時間
double time_s;
void myfun1(int n, double a[], double x); //暴力算法
void myfun2(int n, double a[], double x); //秦九韶算法
int main()
{
double a[N_items] = {1};
for(int i = 1; i < N_items; i++)
a[i] = (double)i;
start = clock();
for(int i = 0; i < MAXK; i++)
myfun1(N_items-1, a, 1.1);
stop = clock();
time_s = (double)(stop - start)/CLK_TCK;
printf("ticks_fun1 = %lf\n", (double)(stop - start));
printf("time_s_fun1 = %lf\n", time_s);
start = clock();
for(int i = 0; i < MAXK; i++)
myfun2(N_items-1, a, 1.1);
stop = clock();
time_s = (double)(stop - start)/CLK_TCK;
printf("ticks_fun2 = %lf\n", (double)(stop - start));
printf("time_s_fun2 = %lf\n", time_s);
getchar();
return 0;
}
void myfun1(int n, double a[], double x)
{
double result = a[0];
for(int i = 1; i <= n; i++)
result += i/pow(x, i);
}
void myfun2(int n, double a[], double x)
{
double result = a[n];
for(int i = n; i > 0; i--)
result = a[i-1] + x * a[i];
}