---
tags: linux kernel
---
# 研讀 Algorithms for Computing Fibonacci Numbers Quickly
contributed by < [`Risheng1128`](https://github.com/Risheng1128) >
## [Algorithms for Computing Fibonacci Numbers Quickly](https://ir.library.oregonstate.edu/downloads/t435gg51w)
這篇論文針對以下不同的算法分析費氏數列的效能
:::info
目標
- [x] Natural recursive
- [x] Repeated addition
- [ ] Binet's formula
- [x] Matrix Methods of Gries, Levin and Others
- [x] Matrix Methods
- Three Multiply Matrix Method
- Two Multiply Matrix Method
- [x] Extending N. N. Vorob'ev's methods
- [ ] Binomial Coefficients
- [ ] Generating function
- [ ] Product of Factors
:::
接著會分析每個不同的演算法的數學理論及效能分析
## 1. Natural recursive
### 演算法
這是在演算法學習費氏數列時都會學到的方法
$fib(n)=\left\{
\begin{array}{l}
0 &if&0\leq n=0\\
1 &if&n=1\\
fib(n-1)+fib(n-2) &if& n\geq2
\end{array}
\right.$
我們可以產生以下虛擬碼 (參考論文第 7 頁)
```
fib(n)
if n = 0 return 0
else if n = 1 return 1
else return fib(n-1) + fib(n-2)
```
> 參考 Figure 2.1: Recursive algorithm to compute $f_n$
### 分析效能
我們可以計算產生第 n 個數的計算時間 T~n~ ,其中:
> T~n-1~ 為產生第 n - 1 個數的 bit operations
> T~n-2~ 為產生第 n - 2 個數的 bit operations
> Nn 為 T~n-1~ 和 T~n-2~ 相加所花的 bit operations
且初始條件
> T~0~ = 0
> T~1~ = 0
方程式: $T_n = T_{n-1} + T_{n-2} + Nn$
接著發現上述方程式為 [Linear recurrence with constant coefficients](https://en.wikipedia.org/wiki/Linear_recurrence_with_constant_coefficients)
可以先解 recurrence relation ($a_n = \lambda^n$) ,原方程式會改寫為
$\lambda^n = \lambda^{n-1} + \lambda^{n-2}$
接著同除以 $\lambda^{n-2}$ 得到 $\lambda^2 - \lambda - 1 = 0$
解方程式可以得到
$\left\{
\begin{array}{l}
\lambda_1 = \frac{1 + \sqrt5}{2} \\
\lambda_2 = \frac{1 - \sqrt5}{2}\\
\end{array}
\right.$
因此 gerneral solution 為 $a_n = \alpha_1\lambda_1^n + \alpha_2\lambda_2^n$
接著開始找 particular solution
假設 particular solution $v$ 的形式為 $v = C_1Nn + C_2$
將 $v$ 代入 $T_n = T_{n-1} + T_{n-2} + Nn$ 可得:
$(C_1Nn + C_2) - (C_1N(n - 1) + C_2) - (C_1N(n - 2) + C_2) = Nn$
比較係數後可以得到
$\left\{
\begin{array}{l}
C_1 = -1 \\
C_2 = -3N \\
\end{array}
\right.$
最後得到通解
$T_n = v + \alpha_1\lambda_1^n + \alpha_2\lambda_2^n$
將初始條件代入我們可以得到
$\left\{
\begin{array}{l}
\alpha_1 = N(3-\frac{4 - 3\lambda_1}{\lambda_2 - \lambda_1}) \\
\alpha_2 = N(\frac{4 - 3\lambda_1}{\lambda_2 - \lambda_1}) \\
\end{array}
\right.$
最後根據論文令 ==$\beta = \alpha_1$==
可以得到跟論文一樣的結果: ==$T_n = \beta\lambda_1^n + (3N - \beta)\lambda_2^n - Nn - 3N$==
:::success
分析結果
- $0 < \beta < 3$ 且 $\alpha_1$ 和 $\alpha_2$ 都為正數
- $-1 < \lambda_2 < 0$ 且 $1.5 < \lambda_1 < 2$
- 由以上兩點可以推論 bit operation 的數量為 $\theta(\lambda_1^n)$ ,加上 $1.5 < \lambda_1$ 及 這個演算法為 $n$ 的指數,因此==對很大的數非常不適合==
:::
## 2. Repeated addition
### 演算法
接著不考慮第一種使用的方法,而是使用迭代的方式將每個數值計算出來,以下為虛擬碼 (參考論文第 8 頁)
```
fib (n)
previous = 0
fibonacci = 1
for loop = 2 to n
temp = fibonacci
fibonacci = fibonacci previous
previous = temp
return fibonacci
```
> 參考 Figure 2.2: Repeated addition algorithm
### 分析效能
從上述的虛擬碼,可以先歸類以下幾點
> 1. $f_i = f_{i-1} + f_{i-2}$ , $2 \leq i \leq n$
> 2. 為了計算 $f_n$ ,每次的加法會使用到 $N(n-1)$ 個 bit operations
由以上兩點可以得到計算 $f_n$ 的 bit operations 總數
$\begin{split} T(n) &= T(n-1) + N(n-1), T(0) = 0, T(1) = 0 \\
&= \sum_{i=2}^nN(i-1) \\
&= N\sum_{i=0}^{n-2}(i+1) \\
&= N(\frac{(n-2)(n-1)}{2}) + N(n-1) \\
&= N(\frac{n^2}{2} - \frac{n}{2})
\end{split}$
此外,論文也有計算 order-k Fibonacci sequcence 的方法,以下直接提供結果
> $T_k(n) = N(\frac{(k-1)n^2}{2} - \frac{(k-1)n}{2})$
> 參考論文 (3.4)
當 $k = 2$ 時,可以得到一開始的結論 → ==$T_2(n) = N(\frac{n^2}{2} - \frac{n}{2})$==
## 3. Binet's formula
### 演算法
這邊參考[費氏數列分析](https://hackmd.io/@sysprog/fibonacci-number)搭配論文閱讀,可以得知其實費氏數列是有一個「公式解」的,如以下所示
==$f_n = \frac{1}{\sqrt5}(\lambda_1^n - \lambda_2^n)$== ,其中:
$\left\{
\begin{array}{l}
\lambda_1 = \frac{1 + \sqrt5}{2} \\
\lambda_2 = \frac{1 - \sqrt5}{2} \\
\end{array}
\right.$
根據論文敘述,以下為推導出「公式解」係數 $\frac{1}{\sqrt5}$ 的方法
首先,根據上一個方法的方程式 $f_n = f_{n-1} + f_{n-2}$ ,我們可以得到特徵多項式 (Characteristic Polynomial):
$\lambda^2 = \lambda + 1$
接著可以解出特徵值
$\left\{
\begin{array}{l}
\lambda_1 = \frac{1 + \sqrt5}{2} \\
\lambda_2 = \frac{1 - \sqrt5}{2} \\
\end{array}
\right.$
可以得到 ==$f_n = a\lambda_1^n + b\lambda_2^n$== ,並代入 $f_0 = 0$ 及 $f_1 = 1$ ,可以得到以下聯立方程式
$\left\{
\begin{array}{l}
b = -a \\
1 = a(\lambda_1 - \lambda_2) \\
\end{array}
\right.$
代入 $\lambda_1$ 及 $\lambda_2$ 得到 a 及 b
$\left\{
\begin{array}{l}
a = \frac{1}{\sqrt5} \\
b = -\frac{1}{\sqrt5} \\
\end{array}
\right.$
因此最後可以的到完整的公式解 ==$f_n = \frac{1}{\sqrt5}((\frac{1 + \sqrt5}{2})^n - (\frac{1 - \sqrt5}{2})^n)$==
接著由於 $\lambda_2 = -0.61803$ ,且 $\lambda_2$ 會隨著 n 越大而越來越小,因此根據以下論文可以近似成更簡單的公式解
> Knuth, D. E., "The Art of Computer Programming," Vol. Reading MA; 1973.
$f_n = [\frac{1}{\sqrt5}(\frac{1 + \sqrt5}{2})^n + 0.5], n \geq 0$
最後提供==遞迴==及==非遞迴==的虛擬碼
> 非遞迴
fib(n)
$\quad$ compute the $Nn + logn$ most significant bits of $\sqrt5$
$\quad$ return $[\frac{1}{\sqrt5}(\frac{1 + \sqrt5}{2})^n + 0.5]$
> 參考 Figure 2.4: Approximation of Binet's formula
> 遞迴
fib(n)
$\quad$ if n = 1 $f_1$ ← 1
$\quad$ else $f_n$ ← $[(fib(n/2))^2\cdot\sqrt5]$
$\quad$ return $f_n$
> 參考 Figure 2.5: Recursive Binet's approximation
### 分析效能
在計算上述==非遞迴==的演算法之前,需要先考慮以下三種 operations
> 1. The $Nn + logn$ bits of the square root of five
> 2. $Nn + logn$ bit number must be exponentiated to the $n^th$ power
> 3. $Nn + logn$ bit division
$\begin{split} T(n) &= T(n/2) + D(Nn/2) \\
&= \frac{(Nn)^2}{4} + \frac{(Nn)^2}{16} + \frac{(Nn)^2}{64} + ... \\
&= \sum_{i=1}^\infty\frac{(Nn)^2}{2^{2i}} \\
&= (Nn)^2\sum_{i=1}^\infty(\frac{1}{4})^i \\
&= \frac{(Nn)^2}{3}
\end{split}$
:::warning
ToDo: 分析的更完整
:::
## 4. Matrix Methods of Gries, Levin and Others
在這個章節,提到數個論文用來計算 ==order-k Fibonacci sequcence== 第 n^th^ 數的演算法,並參考了以下兩篇論文,裡頭提到上述演算法的 Running time 、 number of multiplies 及 number of additions ,以 bit operations 為單位
> - Er, M. C., "A fast algorithm for computing order-k Fibonacci numbers," in The Computer Journal,26, 224-227; 1983.
> - Fiduccia, C. M., "An efficient formula for linear recurrences," in SIAM Journal of Computing,14, 106-112; 1985.
> Time to comput $f_n^k$
> | Author | Running time | Multiplies | Additions |
> | --------- | ------------ | ---------- | --------- |
> | Gries | $\theta(1.5k^2logn)$ | $\theta(1.5k^2)$ | $\theta(3k^2)$ |
> | Shortt | $\theta(k^2logn)$ | $\theta(k^2)$ | $\theta(k^3)$ |
> | Pettrossi | $\theta(1.5k^3logn)$ | $\theta(1.5k^3)$ | $\theta(1.5k^3)$ |
> | Urbanek | $\theta(k^3logn)$ | $\theta(k^3 + 0.5k^2)$ | $\theta(k^3 + 0.5k^2)$ |
> | Fiduccia | $\theta(\mu(k)logn)$ | $\theta(\mu(k)logn)$ | $\theta(\mu(k)logn)$ |
>
> 其中 $\mu(k)$ 表示總共所需要的 arithmetic operations (用來計算 multiply two polynomials of degree k - 1)。 如果 fast Fourier transform 可以使用,運算操作的數量會變成 $\theta(k\cdot logk\cdot logn)$
> 參考論文 Table 2.1: Running times of algorithms to compute $f_n^k$
論文接著提到了上述表格第一列 Gries and Levin 所使用的方法
令 $A=\left[
\begin{array}{l}
1& 1& ...& 1& 1 \\
1& 0& ...& 0& 0 \\
0& 1& ...& 0& 0 \\
& & \ddots \\
0& 0& ...& 1& 0 \\
\end{array}
\right]$
並且使用 recurrence relation:
$\left[
\begin{array}{}
f_n^k \\
f_{n-1}^k \\
f_{n-2}^k \\
\vdots \\
f_{n-k+1}^k \\
\end{array}
\right] = A\left[
\begin{array}{}
f_{n-1}^k \\
f_{n-2}^k \\
f_{n-3}^k \\
\vdots \\
f_{n-k}^k \\
\end{array}
\right]$
為了計算 $f_n^k$ ,由於下列式子,我們只需要計算 $A^{n-k+1}$ 就可以得知
$\left[
\begin{array}{}
f_n^k \\
f_{n-1}^k \\
f_{n-2}^k \\
\vdots \\
f_{n-k+1}^k \\
\end{array}
\right] = A^{n-k+1}\left[
\begin{array}{}
f_{k-1}^k = 1 \\
f_{k-2}^k = 0 \\
f_{k-3}^k = 0 \\
\vdots \\
f_{k-k}^k = 0 \\
\end{array}
\right]$
接著要降低計算時所消耗的成本,以下為論文的方法
1. 利用 $A$ 和 $A^{i-1}$ 計算出 $A^i$ ,且除了第一列的值,新矩陣 $A^i$ 的其他列都會和 $A^{i-1}$ 有對應關係,例如 $A^i$ 第 2 列 會和 $A^{i-1}$ 第 1 列一樣
> By noticing that any row, except the first, of $A^i$ is the same as the previous rowof $A^{i-1}$ Gries and Levin were able to construct an algorithm that computes $A^{i+1}$ from $A$ and $A^i$ by computing the bottom row of $A^{i+1}$ and copying the remaining rows from $A^i$
2. 由第一點得知,我們只需要計算每個矩陣的第一列,而其他列則直接複製即可,使用這樣的方法可以把矩陣乘法的時間從 $\theta(k^3)$ 降為 $\theta(k^2)$ ,加上計算 $A^{n-k}$ 只需要 $logn$ 的時間,因此使用 Gries and Levin 的方法所消耗的時間為 $\theta(k^2logn)$
> This reduced the number of multiplies from $\theta(k^3)$ to $\theta(k^2)$ to do the matrix multiply. Since $A^{n-k}$ can be computed using $\theta(log n)$ matrix multiplies by using repeated squaring, the time to compute $f_n^k$ using Gries and Levin's algorithm is $\theta(k^2logn)$.
## 5. Matrix Methods
### 矩陣定義
首先定義矩陣,該矩陣可以用來計算 Fibonacci numbers
$\left[
\begin{array}{l}
1& 1 \\
1& 0 \\
\end{array}
\right]^n = \left[
\begin{array}{}
f_{n+1}& f_n \\
f_n& f_{n-1} \\
\end{array}
\right]$
接下來證明下列等式是否成立
$\left[
\begin{array}{l}
1& 1 \\
1& 0 \\
\end{array}
\right]^{n+1} = \left[
\begin{array}{}
f_{n+2}& f_{n+1} \\
f_{n+1}& f_{n} \\
\end{array}
\right]$
證明方法很單純,直接乘上一個 $A$ 即可,如下所示
$\left[
\begin{array}{l}
1& 1 \\
1& 0 \\
\end{array}
\right]\left[
\begin{array}{l}
1& 1 \\
1& 0 \\
\end{array}
\right]^n = \left[
\begin{array}{}
f_{n+1} + f_n& f_n + f_{n-1} \\
f_{n+1}& f_n \\
\end{array}
\right] = \left[
\begin{array}{}
f_{n+2}& f_{n+1} \\
f_{n+1}& f_n \\
\end{array}
\right]$
得到等式成立!
接下來可以跳脫思考,不一定要每次都乘上 $A$ ,也可以一次乘上 $A^n$ ,這樣的話可以從矩陣 $\left[
\begin{array}{}
f_{n+1}& f_n \\
f_n& f_{n-1} \\
\end{array}
\right]$ 計算出 $\left[
\begin{array}{}
f_{2n+1}& f_{2n} \\
f_{2n}& f_{2n-1} \\
\end{array}
\right]$ 並且可以歸納出以下方程式 (以下兩種方法都會用到!):
$\left\{
\begin{array}{l}
f_{2n+1} = f_{n+1}^2 + f_n^2 \\
f_{2n} = f_{n+1}f_n + f_nf_{n-1} \\
f_{2n-1} = f_{2n+1} - f_{2n} \\
\end{array}
\right.$
### Three Multiply Matrix Method
#### 演算法
直接附上虛擬碼
> fib(n)
$\quad$ if n = 1 return the matrix $\left[
\begin{array}{l}
1& 1 \\
1& 0 \\
\end{array}
\right]$
$\quad$ else
$\qquad$ $\left[
\begin{array}{}
f_{n/2+1}& f_{n/2} \\
f_{n/2}& f_{n/2-1} \\
\end{array}
\right]$ ← fib(n/2)
$\qquad$ a ← $(f_{n/2+1})^2$
$\qquad$ b ← $(f_{n/2})^2$
$\qquad$ c ← $(f_{n/2-1})^2$
$\qquad$ return the matrix $\left[
\begin{array}{l}
a+b& a-c \\
a-c& b+c \\
\end{array}
\right]$
> 參考 Figure 2.6: Three multiply matrix algorithm
#### 分析效能
這邊根據上述的演算法 (Figure 2.6) 進行計算,首先觀察一共有三個一半大小的乘法,三個加法運算,以及每次取一半大小的遞迴,由這些條件我們可以開始計算,這邊論文忽略加法的 bit operations
$\begin{split} T(n) &= T(n/2) + 3M(Nn/2) \\
&= 3M(Nn/2) + 3M(Nn/4) + 3M(Nn/8) + ... \\
&= \frac{3(Nn)^2}{4} + \frac{3(Nn)^2}{16} + \frac{3(Nn)^2}{64} + ... \\
&= \sum_{i=1}^\infty\frac{3(Nn)^2}{2^{2i}} \\
&= 3(Nn)^2\sum_{i=1}^\infty(\frac{1}{4})^i \\
&= 3(Nn)^2\cdot\frac{1}{3} \\
&= (Nn)^2
\end{split}$
### Two Multiply Matrix Method
#### 演算法
直接附上虛擬碼
> fib(n)
$\quad$ if n = 1 return the matrix $\left[
\begin{array}{l}
1& 1 \\
1& 0 \\
\end{array}
\right]$
$\quad$ else
$\qquad$ $\left[
\begin{array}{}
f_{n/2+1}& f_{n/2} \\
f_{n/2}& f_{n/2-1} \\
\end{array}
\right]$ ← fib(n/2)
$\qquad$ $f_{n+2}$ ← $f_{n/2+1}(f_{n/2+1} + 2f_{n/2})$
$\qquad$ $f_n$ ← $f_{n/2}(2f_{n/2+1} - f_{n/2})$
$\qquad$ return the matrix $\left[
\begin{array}{}
f_{n+2} - f_n& f_n \\
f_n& f_{n+2} - 2f_n \\
\end{array}
\right]$
> 參考 Figure 2.7: Two multiply matrix algorithm
#### 分析效能
這邊根據上述的演算法 (Figure 2.7) 進行計算,首先觀察一共有兩個一半大小的乘法,四個加法運算,以及每次取一半大小的遞迴。這邊論文說明這個演算法使用的 bit operation 為 $\frac{2\cdot M(Nn)}{3}$ ,由這些條件,可以得到以下等式
$\begin{split} T(n) &= T(n/2) + 2M(Nn/2) \\
&= 2M(Nn/2) + 2M(Nn/4) + 2M(Nn/8) + ... \\
&= \frac{2(Nn)^2}{4} + \frac{2(Nn)^2}{16} + \frac{2(Nn)^2}{64} + ... \\
&= \sum_{i=1}^\infty\frac{2(Nn)^2}{2^{2i}} \\
&= 2(Nn)^2\sum_{i=1}^\infty(\frac{1}{4})^i \\
&= 2(Nn)^2\cdot\frac{1}{3} \\
&= \frac{2(Nn)^2}{3}
\end{split}$
## 6. Extending N. N. Vorob'ev's methods
### 演算法
以下為 N. N. Vorob'ev method 中很重要的關係式
> 參考書籍 Vorob'ev, N.N., "Fibonacci Numbers," Pergamon press, New York; 1961.
==$f_{n+k} = f_{n-1}f_k + f_nf_{k+1}$==
而公式推導可以參考論文第 18 頁,主要是使用數學歸納法進行證明
接著實作虛擬碼如下所示
> fib(n)
> $\quad$ if n = 4 return $f_2$ = 1, $f_3$ = 2, $f_4$ = 3
> $\quad$ else
> $\qquad$ $f_{n/4}, f_{n/4+1}, f_{n/2}$ ← fib(n/2)
> $\qquad$ $f_{n/2+1}$ ← $f_{n/4-1}f_{n/4+1} + f_{n/4}(f_{n/4+1}f_{n/4})$
> $\qquad$ $f_n$ ← $f_{n/2}(f_{n/2-1} + f_{n/2+1})$
> $\qquad$ return $f_{n/2}, f_{n/2+1}, f_n$
> 參考 Figure 2.8: Extended N. N. Vorob'ev algorithm to compute $f_n$
> 
> 參考 Figure 2.9: Call tree for $f_{16}$
### 分析效能
這邊根據上述的演算法 (Figure 2.8) 進行計算, Figure 2.8 將一個 $\frac{n}{2}$ bit 的乘法改成兩個 $\frac{n}{4}$ bit 的乘法,且論文說明這個演算法使用的 bit operation 為 $\frac{M(Nn)}{2}$ ,由這些條件,可以得到以下等式
$\begin{split} T(n) &= T(n/2) + M(Nn/2) + 2M(Nn/4) \\
&= M(Nn/2) + 3M(Nn/4) + 3M(Nn/8) + ... \\
&= \frac{(Nn)^2}{4} + \frac{3(Nn)^2}{16} + \frac{3(Nn)^2}{64} + ... \\
&= \frac{(Nn)^2}{4} + \sum_{i=2}^\infty\frac{3(Nn)^2}{2^{2i}} \\
&= \frac{(Nn)^2}{4} + 3(Nn)^2\sum_{i=2}^\infty(\frac{1}{4})^i \\
&= \frac{(Nn)^2}{4} + 3(Nn)^2\cdot\frac{1}{12} \\
&= \frac{(Nn)^2}{2}
\end{split}$
## 7. Binomial Coefficients
### 演算法
使用二項式係數 ([Binomial Coefficients](https://en.wikipedia.org/wiki/Binomial_coefficient)) 計算 Fibonacci numbers ,以下二項式係數的定義
$\left(
\begin{array}{}
n \\
k \\
\end{array}
\right) = \frac{n!}{k!(n-k)!}$
接著有兩個性質,如以下所示:
> Recursive formula
$\left(
\begin{array}{}
n \\
k \\
\end{array}
\right) + \left(
\begin{array}{}
n \\
k + 1 \\
\end{array}
\right) = \left(
\begin{array}{}
n + 1 \\
k + 1 \\
\end{array}
\right)$
> 參考論文 (2.14)
> Multiplicative formula
$\left(
\begin{array}{}
n \\
k \\
\end{array}
\right) = \left(
\begin{array}{}
n \\
n-k \\
\end{array}
\right)$
> 參考論文 (2.15)
接著附上帕斯卡三角形,其中 $0 \leq n \leq 5$ 且 $0 \leq k \le$,如下圖
> 
> 參考論文 Table 2.2: Pascal's triangle
接著有一個有趣的性質,這邊定義帕斯卡三角形第 $n^{th}$ 個對角線 ($d_n$) 為以下二項式係數的序列
$\left(
\begin{array}{}
n \\
0 \\
\end{array}
\right), \left(
\begin{array}{}
n-1 \\
1 \\
\end{array}
\right), \left(
\begin{array}{}
n-2 \\
2 \\
\end{array}
\right), ..., \left(
\begin{array}{}
0 \\
n \\
\end{array}
\right)$
這邊假設 n = 5 ,可以得到序列 1, 4, 3 ,可以對應 Table 2.2 左下角往右上移動的位置
另外有個有趣的定理,也就是把上述第 $n^{th}$ 個對角線的值全部相加的話,可以得到 $f_{n+1}$ ,以剛剛的例子為例,總和為 1 + 4 + 3 = 8 ,剛好為費氏數列的第 6 個數
> Theorem 2.8 The sum of the $n^{th}$ diagonal, $d_n$, of Pascal's triangle is equal to $f_{n+1}$.
因此要計算 $f_n$ 的話,我們只需要計算 $d_{n-1}$ 的總和即可,那多了一個新問題,==怎麼算 $d_{n-1}$ 最快呢?==
論文提供了一種演算法 - Goetgheluck's algorithm ,用來計算 $\left(
\begin{array}{}
n \\
k \\
\end{array}
\right)$ 的 prime power factorization ,以下為虛擬碼 (E is the power of input n,k and p)
> E ← 0, r ← 0
if p > n - k then E ← 1; end.
if p > n/2 then E ← 0; end.
if p $\cdot$ p > n then if n mod p < k mod p then E ← 1; end.
Repeat
$\quad$ a ← n mod p
$\quad$ n ← [n/p]
$\quad$ b ← (k mod p) + r
$\quad$ k ← [k/p]
$\quad$ if a < b then E ← E + 1,r ← 1
$\quad$ else r ← 0
until n = 0
> 參考 Figure 2.10: Goetgheluck's algorithm
### 分析效能
:::warning
ToDo: 分析 bit operations
:::
## 8. Generating function
### 數學推導
使用 [Generating function](https://en.wikipedia.org/wiki/Generating_function) 表示完整的費氏數列
$G(z) = f_0 + f_1z + f_2z^2 + ... = \displaystyle\sum_{n\geq0}^\infty f_nz^n$
假設
$zG(z) = f_0z + f_1z^2 + f_2z^3$
$z^2G(z) = f_0z^2 + f_1z^3 + f_2z^4$
接著計算 $G(z) - zG(z) - z^2G(z)$ 可以得到以下式子
$G(z) - zG(z) - z^2G(z) = f_0 + (f_1 - f_0)z + (f_2 - f_1 - f_0)z^2 + (f_3 - f_2 - f_1)z^3 + ...$
→ $G(z)(1 - z - z^2) = 0 + z + 0z^2 + 0z^3 + ...$
→ $G(z) = \frac{z}{1 - z - z^2}$
最後估計 G(z) 位於單位根 ($\omega_i$) 上的值 ($\nu_i$),並且為了找到每項的係數,也就是 e Fibonacci numbers ,因此使用反傅立葉轉換,可以得到最後結果如下,其中 $F$ 為 [Fourier matrix](https://en.wikipedia.org/wiki/DFT_matrix)
$f_n = \displaystyle\sum_{i=0}^{n-1}F_{n-1,i}\cdot\nu_i$
### 分析效能
## 9. Product of Factors
### 演算法
### 分析效能
## 測試比較
## 參考資料
[費氏數列分析](https://hackmd.io/@sysprog/fibonacci-number#Vorobev-%E7%AD%89%E5%BC%8F)
[Algorithms for Computing Fibonacci Numbers Quickly](https://ir.library.oregonstate.edu/downloads/t435gg51w)