多項式計算之秦九韶算法


多項式求值與秦九韶算法

一、引言

  多項式函數常常用於描述現實世界的各種規律,而在用計算機計算多項式的值的時候,不同算法的計算時空復雜度通常不一樣。如一個n次多項式

  f(x)=a[n]x^n+a[n-1]x^(n-1)+......+a[1]x+a[0],我們的常規計算辦法是,直接計算,這樣我們的時間復雜度為:O(n^2)

下面我們介紹秦九韶算法:

其核心思想:后面每一次計算都依賴於前面計算的結果,這樣以減少重復的計算。

簡單引例:

       計算 x^8 直接算將算8次乘法,而這8次都是必要的嗎?顯然不是,當我們知道x^2的值后,計算x^4只需要用x^2*x^2即可。秦九韶算法正是這樣來減少計算量的。

一、推導

  

 

       

  

  a0--->an依次是最高項,到常數項系數

  從而bn就是所求的解

三、算法描述

       由以上推導知,bn就是我們所求的值,要求bn就得逆推到b0,由於b0=a0我們就可以求出b1依次下去就可以求出bn。

數據結構:

       1.數組

                     1.a[]用於保存系數

                     ps:一般做法還需要保存b[],我們這里只是用到前一項,所以一個常數即可

 

c++實現:

 

#include <iostream>
using namespace std;
inline double calculate(double x, double* a, int n)
/*
    x:f(x)中的x。a是系數數組
*/
{
    double b = a[0];
    for (int i = 1 ; i <= n; i++)
    {
        b = b * x + a[i];
    }
    return b;
}

int main(int argc, char const *argv[])
{
    double x = 0;
    int n = 0;
    cout << "最高項冪:";
    cin >> n;
    double* a = new double[n+1];
    cout << "\n請輸入個項系數(系數為0輸入0):";
    for (int i = 0; i <= n; i++)
    {
        cin >> *(a + i);
    }
    cout<<"\n要計算的x:";
    cin>>x;
    double res = calculate(x, a, n);
    cout << res << endl;
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM