1. 程式人生 > >多項式各種操作(求逆,取模,ln,exp,開方,牛頓迭代)+生成函式

多項式各種操作(求逆,取模,ln,exp,開方,牛頓迭代)+生成函式

我們已經知道了可以使用FFT和NTT在 O ( n l o g n ) O(nlogn)

的時間內計算多項式乘法,那對於其它的運算呢?
首先,我們需要知道多項式逆元這個根本性的問題。

多項式求逆

考慮兩個多項式 A ( x ) B (

x ) A ( x ) B ( x
) 1 ( m o d   x n ) A(x),B(x),若A(x)B(x)\equiv 1(mod~x^n) ,那麼我們稱 B ( x ) A ( x ) m o d   x n B(x)是A(x)mod~x^n 意義下的逆元,即它們乘積的前 n n 項只有常數項為1,其它都是0.
那麼我們如何計算逆元呢?考慮如果我們已經計算出了 A ( x ) C ( x ) 1 ( m o d   x n ) A(x)C(x)\equiv 1(mod~x^n) ,那麼我們能不能推匯出滿足 A ( x ) B ( x ) 1 ( m o d   x 2 n ) A(x)B(x)\equiv 1(mod~x^{2n}) 的多項式 B ( x ) B(x) 呢?
首先將兩式相減,可以得到
A ( x ) ( B ( x ) C ( x ) ) 0 ( m o d   x n ) A(x)(B(x)-C(x))\equiv0(mod~x^n)
由於等式左邊多項式的前 n n 項係數都是0,可以把這個玩意兒平方:
A 2 ( x ) B 2 ( x ) + A 2 ( x ) C 2 ( x ) 2 A 2 ( x ) B ( x ) C ( x ) 0 ( m o d   x 2 n ) A^2(x)B^2(x)+A^2(x)C^2(x)-2A^2(x)B(x)C(x)\equiv0(mod~x^{2n})
又由於 A ( x ) B ( x ) 1 ( m o d   x 2 n ) A(x)B(x)\equiv 1(mod~x^{2n}) ,帶入可以得到:
2 A ( x ) C ( x ) A 2 ( x ) C 2 ( x ) 1 ( m o d   x 2 n ) 2A(x)C(x)-A^2(x)C^2(x)\equiv1(mod~x^{2n})
提取多項式 A ( x ) A(x)
A ( x ) ( 2 C ( x ) A ( x ) C 2 ( x ) ) 1 ( m o d   x 2 n ) A(x)(2C(x)-A(x)C^2(x))\equiv1(mod~x^{2n})
B ( x ) = 2 C ( x ) A ( x ) C 2 ( x ) B(x)=2C(x)-A(x)C^2(x)
於是我們會發現一個多項式是否有逆元完全取決於該多項式的常數項是否有逆元。由於這個演算法每次可以將問題規模減半,總的時間複雜度就是 T ( n ) = T ( n 2 ) + O ( n l o g n ) = O ( n l o g n ) T(n)=T(\frac n2)+O(nlogn)=O(nlogn)

例題 洛谷3711 倉鼠的數學題

題目連結
首先可以想到使用伯努利數來化簡算式。於是就有
f ( n ) = k = 0 n S k ( x ) a k = 1 + k = 0 n a k 1 k + 1 i = 0 k ( 1 ) i ( k + 1 i ) B i x k + 1 i f(n)=\sum_{k=0}^nS_k(x)a_k=1+\sum_{k=0}^na_k\frac{1}{k+1}\sum_{i=0}^k(-1)^i\binom{k+1}{i}B_ix^{k+1-i}
最開始有個1是因為題目中把 0 0 0^0 也算為1.然後我們考慮繼續化簡:
f ( n ) 1 = i = 0 n ( 1 ) i i ! k = i n a k B i x k + 1 i k ! ( k + 1 i ) ! f(n)-1=\sum_{i=0}^n\frac{(-1)^i}{i!}\sum_{k=i}^n\frac{a_kB_ix^{k+1-i}k!}{(k+1-i)!}