矩陣快速冪中矩陣的構造技巧

2021-08-06 01:34:32 字數 3839 閱讀 6170

考慮fi

bona

cci 數列, f(

n)=f

(n−1

)+f(

n−2)

將右邊兩項看做是乙個列向量的形式,令  x

n−1=

很容易得到xn

的形式,即  x

n=現在的任務就是找到乙個係數矩陣a

,使得axn

−1=x

n ,且a

需與n

無關。 

如果能夠找到這個a

,則易知an

−1x1

=xn

,於是可以利用矩陣快速冪計算出xn

。這樣就可以在o(

logn)

的時間內計算出指定的fi

bona

cci

數。 這個矩陣很容易找,觀察易得  a

=(1)

推廣一下,如果令fn

=afn

−1+b

fn−2

,則係數矩陣為 a=

(2)fib

onac

ci數列只是最簡單的例子,對於稍微複雜一點的例子,二項式展開是常用的一項技術。 

考慮計算: sn

=∑i=

1nik

易得  sn

=nk+

sn−1

如果仿照fi

bona

cci

數列,令  x

n−1=

則  xn

=此時,可求出  a

=⎧⎩⎨

⎪⎪(n

+1n)

k101

⎫⎭⎬⎪

⎪這個係數矩陣很明顯是不能用的,因為它與n

有關,無法將遞推公式轉化為矩陣的冪運算。 

這裡需要使用二項式展開。  s

n=(n

−1+1

)k+s

n−1=

c0k(

n−1)

k+c1

k(n−

1)k−

1+⋯+

ckk+

sn−1

此時,如果令  x

n−1=

⎧⎩⎨⎪

⎪⎪⎪⎪

⎪(n−

1)k(

n−1)

k−1⋮

(n−1

)0sn

−1⎫⎭

⎬⎪⎪⎪

⎪⎪⎪則有  x

n=⎧⎩

⎨⎪⎪⎪

⎪⎪⎪n

knk−

1⋮n0

sn⎫⎭

⎬⎪⎪⎪

⎪⎪⎪現在的任務與剛才一樣,找到乙個係數矩陣a

,使得axn

−1=x

n ,且a

需與n

無關。 有關s

n 的遞推公式實際上就指明了a

的最後一行。而利用二項式展開很容易得到其他行。 有 

a=⎧⎩

⎨⎪⎪⎪

⎪⎪⎪c

0k0⋮

0c0k

c1kc

0k−1

⋮⋯c1

k⋯⋯⋱

⋯⋯ck

kck−

1k−1

⋮c00

ckk0

0⋮01

⎫⎭⎬⎪

⎪⎪⎪⎪

⎪(3)

最後有  a

n−1x

1=xn

且  x1

=t利用該係數矩陣可以在o(

k3logn)

時間內計算出k

次方的和。

再考慮乙個一般情況:sn

=∑i=

1n(a

i+b)

k與剛才幾乎一模一樣,有  s

n=[a

(n−1

)+(a

+b)]

k+sn

−1=c

0kak

(n−1

)k+c

1kak

−1(a

+b)(

n−1)

k−1+

⋯+ck

k(a+

b)k+

sn−1

剩下的步驟,也幾乎完全與之前的一樣,令  x

n−1=

⎧⎩⎨⎪

⎪⎪⎪⎪

⎪(n−

1)k(

n−1)

k−1⋮

(n−1

)0sn

−1⎫⎭

⎬⎪⎪⎪

⎪⎪⎪則 

xn=⎧⎩⎨⎪

⎪⎪⎪⎪

⎪nkn

k−1⋮

n0sn

⎫⎭⎬⎪

⎪⎪⎪⎪

⎪同樣,有關sn

的遞推公式實際上就指明了a

的最後一行,其他行則利用二項式展開得到。 有 

a=⎧⎩

⎨⎪⎪⎪

⎪⎪⎪c

0k0⋮

0c0k

akc1

kc0k

−1⋮⋯

c1ka

k−1(

a+b)

⋯⋯⋱⋯

⋯ckk

ck−1

k−1⋮

c00c

kk(a

+b)k

00⋮0

1⎫⎭⎬

⎪⎪⎪⎪

⎪⎪(4)假設要計算如下和式: sn

=∑i=

1nik

ki同樣,將其寫成遞推公式,有  s

n=nk

kn+s

n−1=

(n−1

+1)k

k(n−

1)+1

+sn−

1=c0

k(n−

1)kk

(n−1

)+1+

c1k(

n−1)

k−1k

(n−1

)+1+

⋯+ck

kk(n

−1)+

1+sn

−1將與n

有關的項抽出來作為列向量,令  x

n−1=

⎧⎩⎨⎪

⎪⎪⎪⎪

⎪(n−

1)kk

(n−1

)+1(

n−1)

k−1k

(n−1

)+1⋮

(n−1

)0k(

n−1)

+1sn

−1⎫⎭

⎬⎪⎪⎪

⎪⎪⎪則 

xn=⎧⎩⎨⎪

⎪⎪⎪⎪

⎪nkk

n+1n

k−1k

n+1⋮

n0kn

+1sn

⎫⎭⎬⎪

⎪⎪⎪⎪

⎪同樣,有關sn

的遞推公式說明了係數矩陣

a 的最後一行。而其他行仍然可以由二項式展開得到,只是相差了乙個係數

k 而已,這很容易解決。 

最後,有 a=

⎧⎩⎨⎪

⎪⎪⎪⎪

⎪kc0

k0⋮0

c0kk

c1kk

c0k−

1⋮⋯c

1k⋯⋯

⋱⋯⋯k

ckkk

ck−1

k−1⋮

kc00

ckk0

0⋮01

⎫⎭⎬⎪

⎪⎪⎪⎪

⎪(5)

poj3070利用了矩陣1,hdu3369利用了矩陣3和4,hdu3483利用了矩陣5。

矩陣快速冪 矩陣構造

fibonacci數列 f 0 1 f 1 1 f n f n 1 f n 2 我們以前快速求fibonacci數列第n項的方法是 構造常係數矩陣 一 fibonacci數列f n f n 1 f n 2 f 1 f 2 1的第n項快速求法 不考慮高精度 解法 考慮1 2的矩陣 f n 2 f n ...

矩陣快速冪的構造

參考部落格 a i a i 1 b i 1 1,b i 2 a i 1 5 a 1 1,b 1 1,問a x b x 很簡單的遞推,一步步推即可,但是,如果x是10 9,如何推?思維 遞推式可以化為矩陣乘積 那麼,矩陣a i a i 1 b a i 1 a i b a i 1 bb a x a 1 ...

矩陣快速冪 構造方法

與快速冪一樣,可以將遞推式通過二進位制的方式來進行優化,這個學了快速冪就是十分容易理解 大概的板子如下 struct mat 自己定義大小的矩陣 mat mulmat mat a,mat b 兩個矩陣相乘 return ans 最後的矩陣,答案 int main 這個與快速冪寫法略有不同,主要是因為...