一些常見數列的生成函式推導

2021-07-24 14:57:46 字數 4615 閱讀 6494

曾經有人問過我:「斐波那契數列的生成函式長啥樣?」

。。。所以這東西我還是寫一發吧

它有什麼用?它沒啥用。。。

1.齊次線性遞推數列

定義:給定常數k,

a1,a

2,..

.,ak

,h0,

h1,.

..,h

k−1 ,構造如下數列: hn

={hn

a1hn

−1+a

2hn−

2+..

.+ak

hn−k

n≥k稱作齊次線性遞推數列。

多項式 f(

x)=h

0+h1

x+h2

x2+.

..被稱作這個數列的一般生成函式。

說到齊次線性遞推數列,最經典的就是斐波那契數列。

定義不用給了吧……

斐波那契數列的生成函式是這個樣子的: f(

x)=1

+x+2

x2+3

x3+5

x4+8

x5+.

..

如何用一些有限項的多項式來表示這個級數?

我們構造這樣乙個函式: a(

x)=1

−x−x

2 易驗證: f(

x)a(

x)=1

即: f(

x)=1

1−x−

x2

這是為什麼呢?

原因很簡單,對於∀n

≥2, [n

](f(

x)a(

x))=

[n]f

(x)−

[n−1

]f(x

)−[n

−2]f

(x)=

0 其中[

n]f(

x)代表f(

x)的n

次項係數

這個結論有一些很好玩的結果,比如代入x=

0.01

,有:

10.9899

=1.010203050813213455...

我們還可以知道,如果把斐波那契數列寫成這樣: 1

11112

1113

11115

111118

11111

13

111111

21

… 然後把每一位從上到下加起來,將會出現長度為89的迴圈節,因為

10.89

是個有理數……

我們可以把這個推廣到一般形式:

對於遞推式 hn

=a1h

n−1+

a2hn

−2+.

..+a

khn−

k 的生成函式 f(

x)=h

0+h1

x+h2

x2+.

..

建構函式: h(

x)=h

0+h1

x+h2

x2+.

..+h

k−1x

k−1

a(x)

=1−a

1x−a

2x2−

...−

akxk

則: f(

x)a(

x)=h

(x)a

(x)m

odxk

f(x)=h(

x)a(

x)mo

dxka

(x)

可以看出這個形式十分的優雅,不過我並不知道這個優雅的形式與數列本質有什麼關聯……

這東西有啥用?

給出乙個

k 階線性遞推方程,求第n項,

n,k≤

105暴力o(

nk) ,矩乘k3

logk

,全掛了……

fft可以o(

nlog

n)。

叫我毒瘤。

2.非齊次線性遞推數列

定義:給定常數k,

a1,a

2,..

.,ak

,h0,

h1,.

..,h

k−1 ,構造如下數列: hn

={hn

a1hn

−1+a

2hn−

2+..

.+ak

hn−k

+g(n

)n≥k

稱作非齊次線性遞推數列。 其中g

(n) 是關於

n 的函式,可以是常函式

要求用一些有限項多項式來表示級數: f(

x)=h

0+h1

x+h2

x2+.

..和之前一樣,構造多項式: h(

x)=h

0+h1

x+h2

x2+.

..+h

k−1x

k−1

a(x)

=1−a

1x−a

2x2−

...−

akxk

g(x)=g(

0)+g

(1)x

+g(2

)x2+

...

則: f(x

)a(x

)=h(

x)a(

x)mo

dxk+

(g(x

)−g(

x)mo

dxk)

f(x)=[h

(x)a

(x)−

g(x)

]mod

xk+g

(x)a

(x)

所以如果g(

x)能被有限項多項式表示的話就做完了。。。 若g

(n)=

1 ,則g(

x)=1

+x+x

2+..

.=11

−x 若

g(n)

=n,則g(

x)=x

+2x2

+3x3

...=

x(1−

x)2

若g(n

)=n2

,則g(

x)=x

+4x2

+9x3

...=

x(x+

1)(1

−x)3

以此類推,如果

g 函式是個多項式的話還是可以表示出來的

3.卡特蘭數列

定義: hn

={1h

0hn−

1+h1

hn−2

+...

+hn−

1h0n

=0n≥

1 求f

(x)=

h0+h

1x+h

2x2+

...

容易發現這個遞推式本身就是乙個卷積,所以我們直接把這個多項式自乘一下 f2

(x)=

h1+h

2x+h

3x2+

...=

f(x)

−1x

解得 f(x

)=1−

1−4x

√2x

即為卡特蘭數列的生成函式。

4.。。。我並不知道這數列叫啥名字,暫且稱作廣義卡特蘭數列吧。。。

我們都知道卡特蘭數列的第

n 項代表

n個元素的入棧出棧序列數,即從原點走到(n

,n) 不跨越y=

x 的方案數

那麼,定義廣義卡特蘭數列hk

(n) 表示n+

k 個元素入棧出棧後棧中剩餘

k 個元素的入棧出棧序列數,即從原點走到(n

+k,n

)不跨越y=

x 的方案數

求生成函式: fk

(x)=

hk(0

)+hk

(1)x

+hk(

2)x2

+...

考慮棧中剩餘的這

k 個元素,第

i個元素放進去之後就不動了,然後經歷了一些入棧彈棧,然後塞入第i+

1 個元素

換句話說我們可以把第

i 個元素看做棧底,然後進行了一堆入棧出棧操作,然後棧空了,然後塞進第i+

1個元素……

如果中間這些走了個過場的元素數量為

s ,那麼方案數是多少? h0

(s),即卡特蘭數列第

s 項

於是問題就簡單了,我們把

n個元素的序列分成k+

1 段,如果一段有

s 個元素,方案數是h0

(s),求方案數

會生成函式的看到這裡已經懂了吧。

建構函式h(

x)=h

0(0)

+h0(

1)x+

h0(2

)x2+

...=

1−1−

4x√2

x 則f

k(x)

=hk+

1(x)

=(1−

1−4x

√2x)

k+1

一些常見的二元生成函式

形式化的 g x,y sum sum frac x iy j sum x xy i frac 則稱 g x,y 為二元組 x,y 在組合數意義下的乙個二元生成函式 具體用途 處理一些比較詭異的組合數上的連續求和 一般是通過將 y 帶換成 x k x 也相應變形的方法來處理 g x x k sum s...

常見的一些 Hash 函式

hash的主要原理就是把大範圍對映到小範圍 所以,你輸入的實際值的個數必須和小範圍相當或者比它更小。不然衝突就會很多。不同的應用對hash函式有著不同的要求 比如,用於加密的hash函式主要考慮它和單項函式的差距,而用於查詢的hash函式主要考慮它對映到小範圍的衝突率。下面介紹一些常用的用於查詢ha...

一些常見的移位函式

微控制器 crol 字元迴圈左移 cror 字元迴圈右移 irol 整數迴圈左移 iror 整數迴圈右移 lrol 長整數迴圈左移 lror 長整數迴圈右移一些暫存器置位 define gpioc crl unsigned int gpioc base 0x00 define rcc apb2enr...