【学习笔记】多项式全家桶

前置知识:生成函数入门

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} f1(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]f1(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}}} f1(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} f2(x)2f1(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} f1(x)f0(x)(2f0(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=0n!f(n)(a)(xa)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)(xx0)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)(xx0)=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))=i0i!g(i)(f0(x))(f(x)f0(x))i0(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(x1)

那么 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(x1)=Q(x1)G(x1)+R(x1)

两边同乘 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(x1)=xnQ(x1)G(x1)+xnR(x1)

写成反转的形式 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)+xnm+1RT(x)

两边同时模 x n − m + 1 x^{n-m+1} xnm+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)(modxnm+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(modxnm+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))=i1i(1F(x))iexp(F(x))=i0i!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 n1次多项式 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)(1lnf0(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)的逆),但是网上关于这方面的资料似乎很少,所以咕掉了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值