1. 程式人生 > >母函式第二彈 之 真正的母函式入門

母函式第二彈 之 真正的母函式入門

閒話:

上次第一期更完了之後,博主覺得題目貌似還是相對來說trl。

於是博主覺得在這一期除了介紹母函式以外,還帶來了一波富有思維量的 毒瘤題 水題。

嗯,就這樣吧。閒話不多說,現在就開講了!

 

定義:

生成函式即母函式,是組合數學中尤其是計數方面的一個重要理論和工具。

生成函式有普通型生成函式和指數型生成函式兩種,其中普通型用的比較多。

形式上說,普通型生成函式用於解決多重集的組合問題,而指數型母函式用於解決多重集的排列問題。

母函式還可以解決遞迴數列的通項問題(例如使用母函式解決斐波那契數列的通項公式)。

 

對於任意數列   

即用如下方法與一個函式聯絡起來:

則稱G(x)是數列的生成函式

(注意:數列可以是有限的也可以是無限的,母函式也一樣)

 

(以上兩段摘自百度百科~~~)

 

嗯,這就是基本定義了。

不知各位看官們有沒有理解呢?

想必應該是沒有的,博主本人在第一次看到這些定義的時候也是一臉懵逼。

 

那麼既然如此,就通過上一些例題幫助大家理解,

然後博主在立足於這個定義,

給各位一邊解釋例題的證明,

一邊補充講解這些定義吧。

 

那麼,一波例題即將發車啦!

請各位繫好安全帶,並確認自己已經清楚上面例題內容。

為保證您的出行安全,如若您還有迷惑,請自行下車會看(向上翻)。

列車即將發車。下一站,例題!

 

例題:

(1)使用母函式法求Fib通項。

        寫在前面:

        博主首先宣告,如果只是為了證明Fib數列絕對不需要什麼鬼母函式。

        如果您是高中生,請您使用特徵根法手撕本題。

        如果您是初中生,這個問題就有一些困難了。

        不過不要緊,如果您知道n次方差公式,您還是求出結論。

        並另外給您一個傳送咒語:

        http://www.jjchg.cn/show.aspx?id=2213&cid=26

        這是一篇介紹初中生寫的純初等的方式解決Fib通項的文章,

        不過應該還有學生習作的性質,畢竟還扯了一些閒話。

       (不過不要緊啦,反正本章隨筆介紹的重點是用母函式法來做)

        好了,關於Fib問題的 閒扯 介紹就先到這裡,下面將用母函式法怎麼搞。

 

解: 對於Fib數列{1, 1, 2, 3, 5, 8, 13, 21, 34,......,} 

        我們有生成函式(記不記得,又名母函式)F(x) = x + x2 + 2*x3 + 3*x4 + 5*x5 + ...... + Fib(n)*xn + ......

        (換句話說,就是構造一個函式,使得它的n次方係數與Fib(n)形成一個一 一對應關係)

        (那為啥要這樣構造呢?那當然有這樣做的意義。這個意義後面自然就會顯現。)

        嗯,下面繼續我們的求解。根據Fib的遞推式 Fib(n+2) == Fib(n+1) + Fib(n),我們可知,

        F(x) + x*F(x) == F(x)/x  - 1;                ···························································· (1)式

        (這是顯然的。請讀者在草稿本上畫上幾項,就容易發現其顯然性。)

        (額。。。算我沒說這句話吧還是稍微講一下當湊字。)

                       

                         對於這個子問題的解釋(各位巨佬們大可考慮自行跳過):

                         首先我們看等式左邊:

                         F(x) = x  +  x +  2*x +  3*x +  5*x5 +  ......  +  Fib(n)*xn  +  ......

                            +                                            +

                     x*F(x) =         x +     x +   2*x4 +  3*x5 +  ......  +  Fib(n-1)*xn + ......      

                                                                         =

                                   x + 2*x+  3*x +  5*x+  8*x5 +  ......  +  (Fib(n-1)+Fib(n))  Fib(n+1) *xn  +  ...... (說過了Fib(n+2) == Fib(n+1) + Fib(n)嘛!)                        

                          然後我們再來看等式右邊

                          F(x)/x = x1-1 + x2-1 +  2*x3-1 +  3*x4-1 + 5*x5-1 +  ......  +  Fib(n)*xn-1 + Fib(n+1)*xn  ......                                                  

                          減去1之後,藍色的多餘部分顯然就沒有了。

                          然後我們對比每一項的係數(粉色部分),是不是發現,這兩個函式是完全相同的?

                            這樣不就證完了麼?是不是很顯然。

 

        好了,然後迴歸證明吧。

       我們把(1)式移項變形變形,是不是就得到了F(x) = -x /(x2+x+1)

       因為分母這方程的兩個根下面會頻繁用,不過這個分式根式寫起來太複雜,

       我們這裡就用 λ1 和 λ2 表示這個方程的兩根吧。

       也就是說,x2+x+1 == (x-λ1)*(x-λ2)

       那麼我們對變形後的(1)再進行拆分,顯然有F(x) = A/(x-λ1)  +  B/(x-λ2); A,B的意義同上面的λ。

      (就是當某個式子經常要使用卻又比較複雜,我們常常會設一個量來表示。這可以類似理解成OI裡的define) 

       然後我們會注意到 (1-x)-1 == 1 + x + x2 + x3 + x4 + ... + xn + ... (就是這樣無限的加下去)

       (這一步非常關鍵,也是一種經典的構造方法。就可以把分數的多項式與整數型式的來進行對應係數比較。)

       就可以容易地推出Fib的通項就是 Fib(i) = -A/λ1 * λ1-i  +  -B/λ2 * λ2-i

       然後把A, B, λ1, λ2 算出來帶進去就可以得到Fib的通項了。

 

//當然是沒有寫完的,不過博主要去吃飯了,晚上再更吧。讀者可以先自行思考回顧一下這個證明思想。