淺談多項式除法 Part 1: 快速演算法
計算兩個不超過 n 次的複係數一元多項式 f(x) 和 g(x) 的乘積,可以藉由 FFT (Fast Fourier Transform, 快速傅立葉變換) 在 O(nlogn) 時間內求得。更一般的情形,設 R 為一個環且 f(x),g(x)∈R[x],則 f(x)g(x) 可以用 Karatsuba 演算法在 O(nlog23) 時間內求得,也比 naïve 演算法的 O(n2) 快。假設多項式乘法的時間複雜度是 O(M(n)),這篇將介紹如何在 O(M(n)) 時間內計算 f(x)÷g(x) 的商式和餘式。
先定義好我們的問題:設 R 為一個有 1 的環,f(x),g(x)∈R[x] 滿足
先定義好我們的問題:設 R 為一個有 1 的環,f(x),g(x)∈R[x] 滿足
- degf=n
- g(x)≠0,degg=m≤n
- g 的 xm 項係數為 1
- f(x)=q(x)g(x)+r(x)
- degr<m
(Rh)(x)={0,if h(x)=0,xph(1x),if degh=p.
事實上,若 h(x)=α0+∑pi=1αixi≠0,則 (Rh)(x)=αp+∑pi=1αp−ixi。這樣一來,就有
(Rf)(x)={(Rq)(x)⋅(Rg)(x),if r(x)=0,(Rq)(x)⋅(Rg)(x)+xn−degr(Rr)(x),otherwise.
不難發現 h−1modx=1。令 l∈Z≥1 並假設 s:=h−1modxl 為已知,我們介紹一個在 O(M(l)) 時間內求出 h−1modx2l 的演算法。
令 h(x)=h0+h1xl+(higher terms),其中 h0,h1∈R[x] 且 degh0,degh1≤l−1。我們想找某個 a,b∈R[x],其中 dega,degb≤l−1,使得 (a+bxl)hmodx2l=(a+bxl)(h0+h1xl)modx2l=(ah0+(ah1+bh0)xl)modx2l=1
最後,假設計算 h−1modxk 的總時間為 T(k),利用這個倍增法,可知 T(k)=T(⌈k2⌉)+O(M(k))=O(M(k)),也就是計算 q(x) 和 r(x) 只需要 O(M(n)) 時間,和乘法一樣。
我是在這裡學到這個演算法的。至於實作部分,有興趣的話可以參考我放在github上的整係數多項式模板。
注意當 r(x)≠0 時,有 n−degr≥n−m+1。所以我們總是有
(Rf)(x)modxn−m+1=((Rq)(x)⋅(Rg)(x))modxn−m+1
如果我們能找到 (Rg)(x)−1modxn−m+1,就有
(Rq)(x)modxn−m+1=((Rf)(x)⋅(Rg)(x)−1)modxn−m+1
又因為 degq=n−m,事實上我們有 (Rq)(x)modxn−m+1=(Rq)(x),因此上式可以改成
(Rq)(x)=((Rf)(x)⋅(Rg)(x)−1)modxn−m+1
一旦求得了 (Rg)(x)−1modxn−m+1,就能在 O(M(n)) 時間內計算出 q(x) 以及 r(x)=f(x)−q(x)g(x)。接下來我們把目標放在:給定 h∈R[x] 和 k∈Z≥1,其中 h 的常數項為 1,求出 h−1modxk。
不難發現 h−1modx=1。令 l∈Z≥1 並假設 s:=h−1modxl 為已知,我們介紹一個在 O(M(l)) 時間內求出 h−1modx2l 的演算法。
令 h(x)=h0+h1xl+(higher terms),其中 h0,h1∈R[x] 且 degh0,degh1≤l−1。我們想找某個 a,b∈R[x],其中 dega,degb≤l−1,使得 (a+bxl)hmodx2l=(a+bxl)(h0+h1xl)modx2l=(ah0+(ah1+bh0)xl)modx2l=1
注意
(a+bxl)hmodxl=((a+bxl)hmodx2l)modxl=ah0modxl=ahmodxl=1
所以 a=s。接著,令 ah0=sh0=1+cxl,其中 c∈R[x],則 (1)可以改寫成
(1+(sh1+bh0+c)xl)modx2l=1
因此 sh1+bh0+c=0modxl,亦即 b=−s(sh1+c)modxl,此時的 a+bxl 就是 h−1modx2l。因為 s,h0,h1,c 的次數都不超過 l−1,由 h−1modxl 計算 h−1modx2l 的時間複雜度是 O(M(l))。
最後,假設計算 h−1modxk 的總時間為 T(k),利用這個倍增法,可知 T(k)=T(⌈k2⌉)+O(M(k))=O(M(k)),也就是計算 q(x) 和 r(x) 只需要 O(M(n)) 時間,和乘法一樣。
我是在這裡學到這個演算法的。至於實作部分,有興趣的話可以參考我放在github上的整係數多項式模板。
留言
張貼留言