淺談多項式除法 Part 2: 一些應用

多項式乘法常常在一些計數問題上出現,例如 UVa 12298 或 ICPC 5705。多項式除法雖然比乘法冷門,也是有一些應用的。

問題一:給定 n1 次複係數多項式 f(z)n 個點 z1,,znC,在 O(n(logn)2) 時間內求出 f(z1),,f(zn)

這題出自 CLRS 上的習題。設 1lrn 並考慮
p(z;l,r):=rk=l(zzk)=(zzl)(zzr)
觀察到 f(z)z=zl,,zr 上的值,和 f(z)modp(z;l,r)z=zl,,zr 上的值相同。假定 p(z;1,n/2)p(z;n/2+1,n) 為已知,我們可以分別計算
  • f(z)modp(z;1,n/2)z=z1,,zn/2 的值
  • f(z)modp(z;n/2+1,n)z=zn/2+1,,zn 的值
這樣的 divide and conquer 時間複雜度是 T(n)=2T(n/2)+O(nlogn)=O(n(logn)2)

那麼要怎麼求出過程中需要的 p(z;l,r) 們呢?回想一下,計算 p(z;1,n)=p(z;1,n/2)p(z;n/2+1,n) 有一個顯然的 D&C 做法,時間複雜度也是 O(n(logn)2),且中間過程算到的 p(z;l,r) 們正好就是前一個 D&C 所需要的 p(z;l,r) 們。這樣一來,整體的時間複雜度就是兩次 D&C 的時間複雜度,O(n(logn)2)

這題可以在 ZJ c491 測。

問題二:給定 D0c1,,cn。已知 DP 式 Di=ij=1cjDij,在 O(nlogn) 時間內求出 D1,,Dn

其實只要發現了下面這個性質就結束了。考慮 f(x):=xnni=1cixniD0x2n 除以 f(x) 的商式就是 ni=0Dixni,因此計算 D1,,Dn 只需要 O(nlogn) 時間。這個性質的證明如下:設 D0x2n 除以 f(x) 的商式是 ni=0aixni,亦即 D0x2n=(xnni=1cixni)(ni=0aixni)+O(xn1) 比較等式兩邊 x2n 項係數可得 a0=D0。另,設1kn,比較 x2nk 項係數可得 ak(c1ak1+c2ak2++cka0)=0 用數學歸納法可知 ak=Dk

這題可以在 ZJ c492 測。

問題三:給定 a0,a1,,ak1c1,,ck,並對於所有的 ik,遞迴定義ai:=kj=1cjaijO(klogklogn) 時間內求出 an

這算是相當經典的問題,網路上也有不少時間複雜度 O(k3logn) 的 naïve(?) 演算法介紹。和上一題一樣,只要發現下面這個性質就幾乎結束了。考慮 (1) 的特徵多項式
f(x):=xkki=1cixki
xn 除以 f(x) 的餘式為 r(x):=k1i=0rixi,則 
an=k1i=0riai
當然我們不是直接計算 xnmodf(x),而是用快速冪O(logn) 次的多項式運算,整體時間複雜度 O(klogklogn)

那麼 (2) 怎麼證明呢?其實用數學歸納法也不難證明,只是這樣會讓人有「到底是怎麼想到的OAO」的感覺。以下我採用稍微迂迴的方法,說明 (2) 本來就會成立。題外話,這個手法其實是線性差分方程的常用手法。

首先我們來重新定義什麼是一個數列。一個數列 a0,a1,a2, 是一個函數 a:Z0C,並令所有這種函數的集合為 S。接著,我們在 S 上引入加法和係數積如下:
  • a,bS,則 a+bS 定義為 (a+b)(i):=a(i)+b(i) 對於所有的 iZ0
  • aS,αC,則 αaS 定義為 (αa)(i):=αa(i) 對於所有的 iZ0
不難發現在這兩個運算下 S 是個 C-vector space。接著我們引入左移算子 L:SS:設 aS,定義 (La)(i):=a(i+1) 對於所有的 iZ0,可以發現 L 是線性的。這樣一來,(1) 就能寫成 (f(L))a=0,而我們想算的 an 其實就是 Lna 代入 0 的函數值。將 Ln 除以 f(L) 得到 Ln=q(L)f(L)+r(L),則
Lna=q(L)((f(L))a)+(r(L))a=(r(L))a
r(L) 寫成 k1i=0riLi,就有
(r(L))a=k1i=0ri(Lia)
因此
an=(Lna)(0)=k1i=0ri((Lia)(0))=k1i=0riai
這恰好就是 (2)

這題可以在 ZJ c490 測。另外,如果多項式乘法和取餘的部分用 naïve 演算法代替,可以做到 O(k2logn) 的時間複雜度,效率依然比 O(k3logn) 高。

留言

這個網誌中的熱門文章

2020 全國賽驗題心得

水母上 Divide-and-Conquer

109 學年度全國資訊學科能力競賽各題詳解