1. 程式人生 > >多項式求逆,多項式取模,多項式開方 學習筆記

多項式求逆,多項式取模,多項式開方 學習筆記

前言

還記得上個學期tututu跟我提過多項式的很多操作,還有一些優化常數的奇技淫巧,然而那個時候我一臉懵逼。最近幾天無所事事,去洛谷做比賽又整天被吊著打,閒暇之餘就想著學一下多項式的幾個基本操作。

其實一開始我是想學CZT的,根據myy的論文它能把BZOJ3992那題優化到O(mlog(m)+mlog(n))。然而它的應用面不廣我就很功利地沒有學。還有如何用兩次DFT求實序列的卷積等等。至於多項式牛頓迭代法,生成函式之類的,等我補完高數再回來學吧。說不定以後會填這些坑

多項式求逆,取模及開方應該算是多項式最為常見的應用,主要配合生成函式,常係數線性齊次遞推優化一起用。雖然已經有很多dalao們寫過詳細的筆記,不過這些演算法的題目比較少,我怕太久沒寫就忘了,所以還是自己寫(shui)一篇QAQ。

多項式求逆:

定義:

給出多項式A(x),現要求一個多項式B(x),使得:

A(x)B(x)1(modxn)

為什麼要模xn?如果不在模xn意義下定義逆元,除非A(x)只有常數項,否則根據二項式定理,B(x)有無窮多項。

xn,換句話說就是把多項式A(x)B(x)的n次方及更高次項截斷。

暴力:

考慮如何暴力求逆。

C(x)=A(x)B(x)。由於A0B0=C0=1,可得B0A0的逆元。又因為A0B1+

A1B0=C1=0,可以解得B1=A1B0A0。依此類推,即可解出B0Bn1。解到Bn1即可停止,因為求逆在模xn意義下進行。

同時我們可以看出,多項式A(x)是否存在逆元B(x),只取決於A0是否有逆元,因為每次求Bi的時候,分母的位置總是A0。在下面O(nlog(n))的演算法中,同樣可以證明這一點。

倍增:

為了方便,下面假設n=2k(k>0)。如果實際操作中n不是2的冪,像FFT那樣將n強行增大到2的冪即可。如果n=1,直接求A0的逆元即可。

假設已經求出多項式G

(x),使得:

A(x)G(x)1(modxn2)

因為A(x)B(x)1(modxn),所以