前置知识:生成函数入门
1.1 1.1 1.1 多项式乘法逆元:给定多项式 f ( x ) f(x) f(x),求 f − 1 ( x ) ( m o d x n ) f^{-1}(x)\pmod{x^n} f−1(x)(modxn)。保证 f 0 ≠ 0 f_0\ne 0 f0=0。
首先,当 n = 1 n=1 n=1时, [ x 0 ] f − 1 ( x ) = ( [ x 0 ] f ( x ) ) − 1 [x^0]f^{-1}(x)=([x^0]f(x))^{-1} [x0]f−1(x)=([x0]f(x))−1。
设我们已经求出了模 x n 2 x^{\frac{n}{2}} x2n意义下的解 f 0 ( x ) f_0(x) f0(x),有:
f − 1 ( x ) − f 0 ( x ) ≡ 0 ( m o d x n 2 ) f^{-1}(x)-f_0(x)\equiv 0\pmod{x^{\frac{n}{2}}} f−1(x)−f0(x)≡0(modx2n)
两边平方可得:
f − 2 ( x ) − 2 f − 1 ( x ) f 0 ( x ) + f 0 2 ( x ) ≡ 0 ( m o d x n ) f^{-2}(x)-2f^{-1}(x)f_0(x)+f^2_0(x)\equiv 0\pmod{x^n} f−2(x)−2f−1(x)f0(x)+f02(x)≡0(modxn)
两边同乘 f ( x ) f(x) f(x),解得:
f − 1 ( x ) ≡ f 0 ( x ) ( 2 − f 0 ( x ) f ( x ) ) ( m o d x n ) f^{-1}(x)\equiv f_0(x)(2-f_0(x)f(x))\pmod{x^n} f−1(x)≡f0(x)(2−f0(x)f(x))(modxn)
复杂度 O ( n log n ) O(n\log n) O(nlogn)。
1.2 1.2 1.2 泰勒级数和麦克劳林级数:
泰勒级数用无限项连加式来表示函数。一般的,对于一个光滑函数 f ( x ) f(x) f(x),有
f ( x ) = ∑ n = 0 f ( n ) ( a ) n ! ( x − a ) n f(x)=\sum_{n=0}\frac{f^{(n)}(a)}{n!}(x-a)^n f(x)=n=0∑n!f(n)(a)(x−a)n
这个式子被称为 f ( x ) f(x) f(x)在 a a a处的泰勒展开式;在 0 0 0处的展开式也被称为麦克劳林展开式或麦克劳林级数。
1.3 1.3 1.3 一般的 Newton’s Method:
一般用于求解非线性方程 f ( x ) = 0 f(x)=0 f(x)=0的根。算法如下:
- 选取一个合适的数作为 x 0 x_0 x0
- 将 f ( x ) f(x) f(x)在 x 0 x_0 x0处展开,即 f ( x ) = ∑ n = 0 f ( n ) ( x 0 ) n ! ( x − x 0 ) n f(x)=\sum_{n=0}\frac{f^{(n)}(x_0)}{n!}(x-x_0)^n f(x)=∑n=0n!f(n)(x0)(x−x0)n
- 取其常数项和线性项的系数,令其等于 0 0 0,即 f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) = 0 f(x_0)+f'(x_0)(x-x_0)=0 f(x0)+f′(x0)(x−x0)=0
- 解得这个近似线性方程的根 x 1 x_1 x1,可以证明证明每个新解都更接近 f ( x ) = 0 f(x)=0 f(x)=0的根
1.4 1.4 1.4 Newton’s Method 在多项式中的 Methodology:
已知函数 g g g且 g ( f ( x ) ) = 0 g(f(x))=0 g(f(x))=0,求 f ( x ) ( m o d x n ) f(x)\pmod{x^n} f(x)(modxn)。
首先当 n = 1 n=1 n=1时,可以解得 f 0 = − g 0 g 1 f_0=-\frac{g_0}{g_1} f0=−g1g0。
设我们已经求出了模 x n 2 x^{\frac{n}{2}} x2n意义下的解 f 0 ( x ) f_0(x) f0(x),将 g ( f ( x ) ) g(f(x)) g(f(x))在 f 0 ( x ) f_0(x) f0(x)处泰勒展开:
g ( f ( x ) ) = ∑ i ≥ 0 g ( i ) ( f 0 ( x ) ) i ! ( f ( x ) − f 0 ( x ) ) i ≡ 0 ( m o d x n ) g(f(x))=\sum_{i\ge 0}\frac{g^{(i)}(f_0(x))}{i!}(f(x)-f_0(x))^i\equiv 0\pmod {x^n} g(f(x))=i≥0∑i!g(i)(f0(x))(f(x)−f0(x))i≡0(modxn)
因为 f ( x ) − f 0 ( x ) f(x)-f_0(x) f(x)−f0(x)的最低非零项为 x n 2 x^{\frac{n}{2}} x2n,因此:
g ( f ( x ) ) = g ( f 0 ( x ) ) + g ′ ( f 0 ( x ) ) ( f ( x ) − f 0 ( x ) ) ≡ 0 ( m o d x n ) g(f(x))=g(f_0(x))+g'(f_0(x))(f(x)-f_0(x))\equiv 0\pmod{x^n} g(f(x))=g(f0(x))+g′(f0(x))(f(x)−f0(x))≡0(modxn)
则:
f ( x ) ≡ f 0 ( x ) − g ( f 0 ( x ) ) g ′ ( f 0 ( x ) ) ( m o d x n ) f(x)\equiv f_0(x)-\frac{g(f_0(x))}{g'(f_0(x))}\pmod{x^n} f(x)≡f0(x)−g′(f0(x))g(f0(x))(modxn)
1.5 1.5 1.5 多项式开根:
定义方程 g ( f ( x ) ) = f 2 ( x ) − F ( x ) g(f(x))=f^2(x)-F(x) g(f(x))=f2(x)−F(x)
应用 Newton’s Method 可得:
f
(
x
)
≡
f
0
2
(
x
)
+
F
(
x
)
2
f
0
(
x
)
(
m
o
d
x
n
)
f(x)\equiv \frac{f^2_0(x)+F(x)}{2f_0(x)}\pmod{x^n}
f(x)≡2f0(x)f02(x)+F(x)(modxn)
复杂度
O
(
n
log
n
)
O(n\log n)
O(nlogn)。
1.6 1.6 1.6 多项式带余除法:
我们定义 n n n次多项式的反转操作 F T ( x ) = x n F ( x − 1 ) F^T(x)=x^nF(x^{-1}) FT(x)=xnF(x−1)
那么 F ( x ) = Q ( x ) G ( x ) + R ( x ) F(x)=Q(x)G(x)+R(x) F(x)=Q(x)G(x)+R(x),其中 F ( x ) F(x) F(x)和 G ( x ) G(x) G(x)已知
换元得到 F ( x − 1 ) = Q ( x − 1 ) G ( x − 1 ) + R ( x − 1 ) F(x^{-1})=Q(x^{-1})G(x^{-1})+R(x^{-1}) F(x−1)=Q(x−1)G(x−1)+R(x−1)
两边同乘 x n x^n xn: x n F ( x − 1 ) = x n Q ( x − 1 ) G ( x − 1 ) + x n R ( x − 1 ) x^nF(x^{-1})=x^nQ(x^{-1})G(x^{-1})+x^nR(x^{-1}) xnF(x−1)=xnQ(x−1)G(x−1)+xnR(x−1)
写成反转的形式, F T ( x ) = Q T ( x ) G T ( x ) + x n − m + 1 R T ( x ) F^T(x)=Q^T(x)G^T(x)+x^{n-m+1}R^T(x) FT(x)=QT(x)GT(x)+xn−m+1RT(x)
两边同时模 x n − m + 1 x^{n-m+1} xn−m+1,得到 F T ( x ) = Q T ( x ) G T ( x ) ( m o d x n − m + 1 ) F^T(x)=Q^T(x)G^T(x)\pmod{x^{n-m+1}} FT(x)=QT(x)GT(x)(modxn−m+1)
变形得 Q T ( x ) = F T ( x ) G T ( x ) − 1 ( m o d x n − m + 1 ) Q^T(x)=F^T(x)G^T(x)^{-1}\pmod{x^{n-m+1}} QT(x)=FT(x)GT(x)−1(modxn−m+1)
求出 Q T ( x ) Q^T(x) QT(x)后翻转即可得到 Q ( x ) Q(x) Q(x)。
R ( x ) = F ( x ) − Q ( x ) G ( x ) R(x)=F(x)-Q(x)G(x) R(x)=F(x)−Q(x)G(x),容易算出余数。
复杂度 O ( n log n ) O(n\log n) O(nlogn)。
1.7 1.7 1.7 多项式 ln , exp \ln,\exp ln,exp
两者均由麦克劳林级数定义:
ln ( F ( x ) ) = − ∑ i ≥ 1 ( 1 − F ( x ) ) i i exp ( F ( x ) ) = ∑ i ≥ 0 F ( x ) i i ! \ln(F(x))=-\sum_{i\ge 1}\frac{(1-F(x))^i}{i}\\\exp(F(x))=\sum_{i\ge0}\frac{F(x)^i}{i!} ln(F(x))=−i≥1∑i(1−F(x))iexp(F(x))=i≥0∑i!F(x)i
在这个定义下, ln \ln ln和 exp \exp exp仍为互逆运算。
1.7.1 1.7.1 1.7.1 给定 n n n次多项式 F ( x ) F(x) F(x),求 ln ( F ( x ) ) ( m o d x n ) \ln(F(x))\pmod{x^n} ln(F(x))(modxn),保证 f 0 = 1 f_0=1 f0=1
相当于 G ( x ) ≡ ln ( F ( x ) ) ( m o d x n ) G(x)\equiv \ln(F(x))\pmod{x^n} G(x)≡ln(F(x))(modxn)
两边同时求导(链式法则), G ′ ( x ) ≡ F ( x ) ′ F ( x ) ( m o d x n ) G'(x)\equiv\frac{F(x)'}{F(x)}\pmod{x^n} G′(x)≡F(x)F(x)′(modxn)
两边同时积分, G ( x ) ≡ ∫ F ( x ) ′ F ( x ) ( m o d x n ) G(x)\equiv \int \frac{F(x)'}{F(x)}\pmod{x^n} G(x)≡∫F(x)F(x)′(modxn)
需要一次多项式求导,一次多项式求逆,一次多项式积分。复杂度 O ( n log n ) O(n\log n) O(nlogn)。
1.7.2 1.7.2 1.7.2 给定 n − 1 n-1 n−1次多项式 F ( x ) F(x) F(x),求 exp ( F ( x ) ) ( m o d x n ) \exp(F(x))\pmod{x^n} exp(F(x))(modxn),保证 f 0 = 0 f_0=0 f0=0
相当于 G ( x ) ≡ exp ( F ( x ) ) ( m o d x n ) G(x)\equiv\exp(F(x))\pmod{x^n} G(x)≡exp(F(x))(modxn)
即 F ( x ) − ln ( G ( x ) ) ≡ 0 F(x)-\ln(G(x))\equiv0 F(x)−ln(G(x))≡0,定义 g ( f ( x ) ) = F ( x ) − ln ( f ( x ) ) g(f(x))=F(x)-\ln(f(x)) g(f(x))=F(x)−ln(f(x)),带入 Newton’s Method 得
f ( x ) ≡ f 0 ( x ) − g ( f 0 ( x ) ) g ′ ( f 0 ( x ) ) ≡ f 0 ( x ) − ( ln f 0 ( x ) − F ( x ) ) ∗ f 0 ( x ) ≡ f 0 ( x ) ( 1 − ln f 0 ( x ) + F ( x ) ) ( m o d x n ) \begin{aligned}f(x)&\equiv f_0(x)-\frac{g(f_0(x))}{g'(f_0(x))}\\&\equiv f_0(x)-(\ln f_0(x)-F(x))*f_0(x)\\&\equiv f_0(x)(1-\ln f_0(x)+F(x))\pmod{x^n} \end{aligned} f(x)≡f0(x)−g′(f0(x))g(f0(x))≡f0(x)−(lnf0(x)−F(x))∗f0(x)≡f0(x)(1−lnf0(x)+F(x))(modxn)
需要多项式
ln
\ln
ln。套娃了是吧 复杂度
O
(
n
log
n
)
O(n\log n)
O(nlogn)。
PS:似乎分治 NTT 更好写。
1.8
1.8
1.8 多项式快速幂
给定
n
n
n次多项式
F
(
x
)
F(x)
F(x),求
F
(
x
)
k
(
m
o
d
x
n
)
F(x)^k\pmod{x^n}
F(x)k(modxn),保证
f
0
=
1
f_0=1
f0=1。
公式非常简单: F ( x ) k = exp ( k ln F ( x ) ) F(x)^k=\exp(k\ln F(x)) F(x)k=exp(klnF(x))。
复杂度 O ( n log n ) O(n\log n) O(nlogn)。
也可以暴力 NTT。显然后者更好写。
1.9
1.9
1.9 任意多项式快速幂
给定
n
n
n次多项式
F
(
x
)
F(x)
F(x),求
F
(
x
)
k
(
m
o
d
x
n
)
F(x)^k\pmod{x^n}
F(x)k(modxn),不保证
f
0
=
1
f_0=1
f0=1
记 F ( x ) = c x m G ( x ) F(x)=cx^mG(x) F(x)=cxmG(x),其中 g 0 = 1 g_0=1 g0=1
那么 F ( x ) k = c k x m k G ( x ) k F(x)^k=c^kx^{mk}G(x)^k F(x)k=ckxmkG(x)k,可以计算。
复杂度 O ( n log n ) O(n\log n) O(nlogn)。
upd on 2023/12/27:修改了部分公式。
PS:知道你们想要模板(这玩意谁会每次都打一遍啊),但是由于笔者的多项式板子常数太大了,笔者感觉到多项式exp的部分有较大的常数优化空间(例如,递推求解
f
0
(
x
)
f_0(x)
f0(x)的逆),但是网上关于这方面的资料似乎很少,所以咕掉了。