淺談多項式除法 Part 2: 一些應用
多項式乘法常常在一些計數問題上出現,例如 UVa 12298 或 ICPC 5705。多項式除法雖然比乘法冷門,也是有一些應用的。
問題一:給定 n−1 次複係數多項式 f(z) 和 n 個點 z1,…,zn∈C,在 O(n(logn)2) 時間內求出 f(z1),…,f(zn)。
這題出自 CLRS 上的習題。設 1≤l≤r≤n 並考慮
p(z;l,r):=r∏k=l(z−zk)=(z−zl)…(z−zr)
觀察到 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,…,z⌊n/2⌋ 的值
- f(z)modp(z;⌊n/2⌋+1,n) 在 z=z⌊n/2⌋+1,…,zn 的值
那麼要怎麼求出過程中需要的 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 測。
問題二:給定 D0 和 c1,…,cn。已知 DP 式 Di=∑ij=1cjDi−j,在 O(nlogn) 時間內求出 D1,…,Dn。
其實只要發現了下面這個性質就結束了。考慮
f(x):=xn−n∑i=1cixn−i
則 D0x2n 除以 f(x) 的商式就是 ∑ni=0Dixn−i,因此計算 D1,…,Dn 只需要 O(nlogn) 時間。這個性質的證明如下:設 D0x2n 除以 f(x) 的商式是 ∑ni=0aixn−i,亦即
D0x2n=(xn−n∑i=1cixn−i)(n∑i=0aixn−i)+O(xn−1)
比較等式兩邊 x2n 項係數可得 a0=D0。另,設1≤k≤n,比較 x2n−k 項係數可得
ak−(c1ak−1+c2ak−2+…+cka0)=0
用數學歸納法可知 ak=Dk。
這題可以在 ZJ c492 測。
這題可以在 ZJ c492 測。
問題三:給定 a0,a1,…,ak−1 和 c1,…,ck,並對於所有的 i≥k,遞迴定義ai:=k∑j=1cjai−j在 O(klogklogn) 時間內求出 an。
這算是相當經典的問題,網路上也有不少時間複雜度 O(k3logn) 的 naïve(?) 演算法介紹。和上一題一樣,只要發現下面這個性質就幾乎結束了。考慮 (1) 的特徵多項式
f(x):=xk−k∑i=1cixk−i
令 xn 除以 f(x) 的餘式為 r(x):=∑k−1i=0rixi,則
an=k−1∑i=0riai
那麼 (2) 怎麼證明呢?其實用數學歸納法也不難證明,只是這樣會讓人有「到底是怎麼想到的OAO」的感覺。以下我採用稍微迂迴的方法,說明 (2) 本來就會成立。題外話,這個手法其實是線性差分方程的常用手法。
首先我們來重新定義什麼是一個數列。一個數列 a0,a1,a2,… 是一個函數 a:Z≥0→C,並令所有這種函數的集合為 S。接著,我們在 S 上引入加法和係數積如下:
- 設 a,b∈S,則 a+b∈S 定義為 (a+b)(i):=a(i)+b(i) 對於所有的 i∈Z≥0。
- 設 a∈S,α∈C,則 αa∈S 定義為 (αa)(i):=αa(i) 對於所有的 i∈Z≥0。
Lna=q(L)((f(L))a)+(r(L))a=(r(L))a
將 r(L) 寫成 ∑k−1i=0riLi,就有
(r(L))a=k−1∑i=0ri(Lia)
因此
an=(Lna)(0)=k−1∑i=0ri((Lia)(0))=k−1∑i=0riai
這恰好就是 (2)。
留言
張貼留言