霍納演算法

**秦九韶算法**是中國南宋時期的數學家秦九韶表述求解一元高次多項式的值的算法 —— 正負開方術。它也可以配合牛頓法用來求解一元高次多項式的根。

## 歷史

19 世紀初，英國數學家威廉・喬治・霍納重新發現並證明，後世稱作**霍納算法**（Horner's method、Horner scheme）。但是，19 世紀英國傳教士偉烈亞力 Alexander Wylie. (1815–1887) 最早對霍納的發明權提出質疑。他在 1852 年著的《中國科學札記》（Jottings on the Science of the Chinese）一篇論文中，詳細介紹秦九韶的正負開方術之後寫道「讀者不難認出這就是霍納在 1819 年因為發表《解所有次方程》論文，被數學家奧古斯都・德・摩根評為『必使其發明人因發現此算法而置身於重要發明家之列』的方法；我以為應該對霍納的發明權提出辯駁。歐洲的朋友們可能會覺得意外，一位來自天朝帝國的競爭者，有更大的機會確立他的優先權」。此後，日本數學史家三上義夫在《中日數學史》一書中在詳述秦九韶的正負開方術後寫道：「誰能否認，霍納的輝煌方法，至少在早於歐洲六百年之前，已經在中國運用了。」。三上義夫還最先指出，秦九韶算法起源於漢代《九章算術》的開方法。其後王玲和李約瑟有專文論述秦九韶算法起源於《九章算術》。前蘇聯數學史家尤什克維奇說「這是中國傳統數學最偉大成就之一」，他還說印度人不知有此方法，而阿拉伯數學家可能從中國前人傳入此方法。

下面以自今到古的順序，列出早在霍納之前對該算法的發現：

* 1809 年，保羅・魯菲尼
* 1669 年，艾薩克・牛頓（但缺乏詳細引文）
* 14 世紀，中國數學家朱世杰
* 13 世紀，中國數學家秦九韶在《數書九章》中
* 12 世紀，波斯的伊斯蘭數學家薩拉夫・丁・圖西
* 11 世紀（宋朝），中國數學家賈憲
* 漢朝（公元前 202 到公元 220 年），劉徽所注的《九章算術》中

霍納在 1819 年發表的《解所有次方程》論文中的算例，其算法程序和數字處理都遠不及五百多年前的秦九韶有條理；秦九韶算法不僅在時間上早於霍納，也比較成熟。

元代數學家李冶和朱世杰繼承了秦九韶算法。

## 秦九韶算法

南宋數學家秦九韶將賈憲的增乘開方術推廣，以求解任意高次方程的實數根的數值解。秦九韶的《數書九章》詳細敘述用秦九韶算法求解二十六個二次到十次方程的的實數根的數值解，其中包含二十個二次方程，一個三次方程，四個四次方程和一個十次方程。；其中有些得到精確解；多數得近似解。

《數書九章》「《遙度圓城》」題列出一個十次方程，求解圓城的直徑：

　
: : : $x^{10}+15x^{8}+72x^{6}-864x^{4}-11664x^{2}-34992=0$ ，得**精確解** x=3。

《數書九章》「《興田求積》」題列出一個四次方程，

$$
-x^{4}+763200x^{2}-40642560000=0
$$

將方程式寫成一般式 $-x^{4}+0x^{3}+763200x^{2}+0x-40642560000=0$

第一次估根～800；作 y=x-800 減根代換，估出根的第二位數字為 y=40；經過第二次減根代換 z=y-40 後常數項抵消為 0；得**精確解** y=40；x=800+y=800+40=840。右圖為用阿拉伯數字表示的解此四次方程的秦九韶程序圖（c'、d'、e' 是運算過程中的臨時數，最終分別併入 c、d、e）。

《數書九章》「《環田三積》」題列出另一個四次方程，

　
: : : $-x^{4}+15245x^{2}-6262506.25=0$ 右圖為秦九韶解下列四次方程的程序

　
: $-x^{4}+15245x^{2}-6262506.25=0$

其中經過 x=10x' 擴根代換和 x'=y+2 減根代換得

$$
-10000y^{4}-80000y^{3}+1284500y^{2}+577800y-324506.25=0
$$

再次作擴根變換令 z=10y 得：

$$
-z^{4}-80z^{3}+12845z^{2}+57780z-324506.25=0
$$

籌算程序：

得 x~ $20{\frac {1298025}{2362256}}$ 其中： ${\frac {1298025}{2362256}}$ 不等於 0，其第一位有效數字 = 0.5；即商的下一位數字為 5，商～20.5，按秦九韶程序的一般規則，運算須繼續進行下去直到「實」=0 為止；但秦九韶在商 = 20.5 而止，因 20.5 的精確度已滿足在相關問題的需要。

三上義夫特別指出（1）秦九韶在處理 $-x^{4}+15245x^{2}-6262506.25=0$ 這一類四次方程式時，絕非作為 $x^{2}$ 的二次方程式來求解（所謂雙二次方程），而是按四次方程來求解的。（2）秦九韶算法同樣可以求出小數點後的數值，後來的中國數學家和日本數學正是這麼做的。

## 原理

設有 $n+1$ 項的 $n$ 次函數

$$
f(x)=a_{n}x^{n}+a_{n-1}x^{n-1}+a_{n-2}x^{n-2}+......+a_{2}x^{2}+a_{1}x+a_{0}
$$

 
將前 $n$ 項提取公因子 $x$ ，得

$$
f(x)=(a_{n}x^{n-1}+a_{n-1}x^{n-2}+a_{n-2}x^{n-3}+......+a_{2}x+a_{1})x+a_{0}
$$

 
再將括號內的前 $n-1$ 項提取公因子 $x$ ，得

$$
f(x)=((a_{n}x^{n-2}+a_{n-1}x^{n-3}+a_{n-2}x^{n-4}+......+a_{2})x+a_{1})x+a_{0}
$$

 
**如此反覆提取公因子 $x$** ，最後將函數化為

$$
f(x)=(((a_{n}x+a_{n-1})x+a_{n-2})x+......+a_{1})x+a_{0}
$$

 
令

$$
f_{1}=a_{n}x+a_{n-1}
$$

$$
f_{2}=f_{1}x+a_{n-2}
$$

$$
f_{3}=f_{2}x+a_{n-3}
$$

......

$$
f_{n}=f_{n-1}x+a_{0}
$$

 
則 $f_{n}$ 即為所求

## 應用示例

求當 $x=3$ 時 $f(x)=2x^{3}-6x^{2}+2x-1\,$ 的值。 
反覆提取公因子 $x$ 後，原函數可以寫成 $f_{1}(x)=x(x(2x-6)+2)-1$ 。建立下列**係數表**可以用來加快演算速度：

```
 $x_{0}$ |   $x^{3}$   $x^{2}$    $x^{1}$   $x^{0}$ 
  3 |   2    -6     2    -1
    |        6      0    6  
    |----------------------
        2    0      2    5
```

第四行中的數是表中本列上方兩數之和。第三行的數字是 x 的值與左下方第四行數的乘積。第二行的數是多項式各項按照次數從大到小排列後的係數。表中右下角的數就是函數的值：5。

## 效率

對於一個 n 次的多項式函數，用常規方法（用重複乘法計算冪，再把各項相加）計算出結果最多需要 n 次加法和 ${\frac {(n^{2}+n)}{2}}$ 次乘法。若用 x 迭代的方法計算冪則需要 n 次加法和 2n+1 次乘法。如果計算中的數值數據是以字節方式儲存的，那麼常規方法約需要 x 占用的字節的 2n 倍空間。

而使用秦九韶算法時，至多只需作 n 次加法和 n 次乘法，最多需要 x 占用的字節的 n 倍空間。

## 意義

該算法看似簡單，其最大的意義在於將求 n 次多項式的值轉化為求 n 個一次多項式的值。在人工計算時，利用秦九韶算法和其中的係數表可以大幅簡化運算；對於電腦程式算法而言，加法比乘法的計算效率要高很多，因此該算法仍有極大的意義，用於減少中央處理器運算時間。

## 參考文獻

### 引用

### 來源

## 參見

* 秦九韶
* 多項式方程求解