【多项式】多项式逆元/开方/取模/多点求值/插值/牛顿迭代/对数/exp/幂

多项式求逆元

已知多项式 F ( x ) F(x) F(x),求 F ( x ) F(x) F(x)在保留前n项(当然n要是2的次幂)的情况下的逆元 G ( x ) G(x) G(x),也就是:
F ( x ) G ( x ) ≡ 1 ( m o d x n ) F(x)G(x)\equiv 1 \pmod{x^n} F(x)G(x)1(modxn)
首先,如果 n = 1 n=1 n=1,那么直接就是常数项的逆元,

如果 n > 1 n>1 n>1,那么怎么办?
设: G ′ ( x ) G'(x) G(x)使得 F ( x ) G ′ ( x ) ≡ 1 ( m o d x n / 2 ) F(x)G'(x)\equiv 1 \pmod{x^{n/2}} F(x)G(x)1(modxn/2),且我们已知 G ′ ( x ) G'(x) G(x)
第一个式子可以变成: F ( x ) G ( x ) ≡ 1 ( m o d x n / 2 ) F(x)G(x)\equiv 1 \pmod{x^{n/2}} F(x)G(x)1(modxn/2)
(把模数开了个方,依旧成立)
把两个式子相减:
F ( x ) ( G ( x ) − G ′ ( x ) ) ≡ 0 ( m o d x n / 2 ) F(x)(G(x)-G'(x))\equiv 0 \pmod{x^{n/2}} F(x)(G(x)G(x))0(modxn/2)
G ( x ) − G ′ ( x ) ≡ 0 ( m o d x n / 2 ) G(x)-G'(x)\equiv 0 \pmod{x^{n/2}} G(x)G(x)0(modxn/2)
同时平方:(当然模数也平方依旧成立)
( G ( x ) − G ′ ( x ) ) 2 ≡ 0 ( m o d x n ) (G(x)-G'(x))^2\equiv 0 \pmod{x^n} (G(x)G(x))20(modxn)
G 2 ( x ) + G ′ 2 ( x ) − 2 G ( x ) G ′ ( x ) ≡ 0 ( m o d x n ) G^2(x)+G'^2(x)-2G(x)G'(x)\equiv 0 \pmod{x^n} G2(x)+G2(x)2G(x)G(x)0(modxn)
两边同时乘上 F ( x ) F(x) F(x),消掉部分 G ( x ) G(x) G(x)
G ( x ) + G ′ 2 ( x ) F ( x ) − 2 G ′ ( x ) ≡ 0 ( m o d x n ) G(x)+G'^2(x)F(x)-2G'(x)\equiv 0 \pmod{x^n} G(x)+G2(x)F(x)2G(x)0(modxn)
G ( x ) ≡ 2 G ′ ( x ) − G ′ 2 ( x ) F ( x ) ( m o d x n ) G(x)\equiv 2G'(x)-G'^2(x)F(x) \pmod{x^n} G(x)2G(x)G2(x)F(x)(modxn)
那么, G ( x ) G(x) G(x)就可以快速求出了,
(同时发现,只要常数项有逆元,这个多项式就有逆元)
复杂度: T ( n ) = T ( n / 2 ) + O ( n log ⁡ ( n ) ) = O ( n log ⁡ ( n ) ) T(n)=T(n/2)+O(n\log(n))=O(n\log(n)) T(n)=T(n/2)+O(nlog(n))=O(nlog(n))


多项式开方

多项式的开方同样可以以这种方法做出来,

已知多项式 F ( x ) F(x) F(x),求 F ( x ) F(x) F(x)在保留前n项(当然n要是2的次幂)的情况下的平方根 G ( x ) G(x) G(x),也就是:
G 2 ( x ) ≡ F ( x ) ( m o d x n ) G^2(x)\equiv F(x) \pmod{x^n} G2(x)F(x)(modxn)
首先,如果 n = 1 n=1 n=1,那么直接就是常数项的开方,可以暴力枚举,也可以用二次项剩余(CZY的二次剩余Cipolla算法学习小记),

对于 n > 1 n>1 n>1的情况,
设: G ′ ( x ) G'(x) G(x)使得 G ′ ( x ) 2 ≡ F ( x ) ( m o d x n / 2 ) G'(x)^2\equiv F(x) \pmod{x^{n/2}} G(x)2F(x)(modxn/2),且我们已知 G ′ ( x ) G'(x) G(x)
(把平方写在后面好看QuQ)

第一个式子可以变成: G 2 ( x ) ≡ F ( x ) ( m o d x n / 2 ) G^2(x)\equiv F(x) \pmod{x^{n/2}} G2(x)F(x)(modxn/2)
(把模数开了个方,依旧成立)
把两个式子相减:
G 2 ( x ) − G ′ ( x ) 2 ≡ 0 ( m o d x n / 2 ) G^2(x)-G'(x)^2\equiv 0 \pmod{x^{n/2}} G2(x)G(x)20(modxn/2)
因式分解:
( G ( x ) + G ′ ( x ) ) ( G ( x ) − G ′ ( x ) ) ≡ 0 ( m o d x n / 2 ) (G(x)+G'(x))(G(x)-G'(x))\equiv 0 \pmod{x^{n/2}} (G(x)+G(x))(G(x)G(x))0(modxn/2)
可得 G ( x ) G(x) G(x)有两个解(平方嘛),讨论 G ( x ) − G ′ ( x ) ≡ 0 ( m o d x n / 2 ) G(x)-G'(x)\equiv 0 \pmod{x^{n/2}} G(x)G(x)0(modxn/2)的情况,
G ( x ) − G ′ ( x ) ≡ 0 ( m o d x n / 2 ) G(x)-G'(x)\equiv 0 \pmod{x^{n/2}} G(x)G(x)0(modxn/2)
(历史总是惊人的相识)
同时平方:(当然模数也平方依旧成立)
( G ( x ) − G ′ ( x ) ) 2 ≡ 0 ( m o d x n ) (G(x)-G'(x))^2\equiv 0 \pmod{x^n} (G(x)G(x))20(modxn)
G 2 ( x ) + G ′ ( x ) 2 − 2 G ( x ) G ′ ( x ) ≡ 0 ( m o d x n ) G^2(x)+G'(x)^2-2G(x)G'(x)\equiv 0 \pmod{x^n} G2(x)+G(x)22G(x)G(x)0(modxn)
因为: G 2 ( x ) ≡ F ( x ) ( m o d x n ) G^2(x)\equiv F(x) \pmod{x^n} G2(x)F(x)(modxn)
F ( x ) + G ′ ( x ) 2 − 2 G ( x ) G ′ ( x ) ≡ 0 ( m o d x n ) F(x)+G'(x)^2-2G(x)G'(x)\equiv 0 \pmod{x^n} F(x)+G(x)22G(x)G(x)0(modxn)
G ( x ) ≡ F ( x ) + G ′ ( x ) 2 2 G ′ ( x ) ( m o d x n ) G(x)\equiv \frac{F(x)+G'(x)^2}{2G'(x)} \pmod{x^n} G(x)2G(x)F(x)+G(x)2(modxn)
那么, G ( x ) G(x) G(x)就可以快速求出了,
(同时发现,只要常数项是二次项剩余且有逆元,这个多项式就可以开方)
复杂度: T ( n ) = T ( n / 2 ) + 2 ∗ O ( n log ⁡ ( n ) ) = O ( n log ⁡ ( n ) ) T(n)=T(n/2)+2*O(n\log(n))=O(n\log(n)) T(n)=T(n/2)+2O(nlog(n))=O(nlog(n))


多项式取模

已知 A ( x ) , B ( x ) A(x),B(x) A(x),B(x),求 D ( x ) = A ( x ) m o d    B ( x ) D(x)=A(x)\mod B(x) D(x)=A(x)modB(x)
A ( x ) = B ( x ) C ( x ) + D ( x ) A(x)=B(x)C(x)+D(x) A(x)=B(x)C(x)+D(x)
n = A ( x ) 的 次 数 , m = B ( x ) 的 次 数 n=A(x)的次数,m=B(x)的次数 n=A(x)m=B(x),显然有 m ≤ n m\leq n mn
上面的等式两边同时乘上 x n x^n xn得:
x n A ( 1 x ) = x m B ( 1 x ) x n − m C ( 1 x ) + x n D ( 1 x ) x^nA(\frac{1}{x})=x^mB(\frac{1}{x})x^{n-m}C(\frac{1}{x})+x^nD(\frac{1}{x}) xnA(x1)=xmB(x1)xnmC(x1)+xnD(x1)
1 x \frac{1}{x} x1的作用相当于是把多项式头尾翻转一下)

A ′ ( x ) = x n A ( 1 x ) , B ′ ( x ) = x m B ( 1 x ) , C ′ ( x ) = x n − m C ( 1 x ) , D ′ ( x ) = x n D ( 1 x ) A'(x)=x^nA(\frac{1}{x}),B'(x)=x^mB(\frac{1}{x}),C'(x)=x^{n-m}C(\frac{1}{x}),D'(x)=x^nD(\frac{1}{x}) A(x)=xnA(x1)B(x)=xmB(x1)C(x)=xnmC(x1)D(x)=xnD(x1)

可以发现,经过翻转后,
D ′ ( x ) D'(x) D(x)中只有次数 ∈ [ n − m + 1 , n ] \in[n-m+1,n] [nm+1,n]的项是有效的,其他项均为0,,
A ′ ( x ) A'(x) A(x)中次数 ∈ [ 0 , n ] \in[0,n] [0,n]的项是有效的,
B ′ ( x ) B'(x) B(x)中次数 ∈ [ 0 , m ] \in[0,m] [0,m]的项是有效的,
C ′ ( x ) C'(x) C(x)中次数 ∈ [ 0 , n − m ] \in[0,n-m] [0,nm]的项是有效的,

现在再对原来的等式 m o d    x n − m + 1 \mod{x^{n-m+1}} modxnm+1,也就是
A ′ ( x ) = B ′ ( x ) C ′ ( x ) + D ′ ( x ) m o d    x n − m + 1 A'(x)=B'(x)C'(x)+D'(x) \mod{x^{n-m+1}} A(x)=B(x)C(x)+D(x)modxnm+1
这样 D ′ ( x ) D'(x) D(x)这一项就能模掉了,也就是:
A ′ ( x ) = B ′ ( x ) C ′ ( x ) m o d    x n − m + 1 A'(x)=B'(x)C'(x) \mod{x^{n-m+1}} A(x)=B(x)C(x)modxnm+1
A ′ ( x ) B ′ ( x ) = C ′ ( x ) m o d    x n − m + 1 \frac{A'(x)}{B'(x)}=C'(x) \mod{x^{n-m+1}} B(x)A(x)=C(x)modxnm+1
因为 C ′ ( x ) C'(x) C(x)的次数范围刚好在模以内,所以就可以直接求出 C ′ ( x ) C'(x) C(x),变换得 C ( x ) C(x) C(x)
求出了 C ( x ) C(x) C(x),剩下直接减就好了
D ( x ) = A ( x ) − B ( x ) C ( x ) D(x)=A(x)-B(x)C(x) D(x)=A(x)B(x)C(x)

复杂度: O ( n log ⁡ ( n ) ) O(n\log(n)) O(nlog(n))


多项式多点求值

已知多项式 F ( x ) F(x) F(x),给出 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an,要求 F ( a 1 ) , F ( a 2 ) , . . . , F ( a n ) F(a_1),F(a_2),...,F(a_n) F(a1),F(a2),...,F(an)

先抛出一个显然的结论: F ( a 1 ) = F ( x ) m o d    ( x + a 1 ) F(a_1)=F(x)\mod{(x+a_1)} F(a1)=F(x)mod(x+a1)
(意思是:多项式 F ( x ) F(x) F(x)模多项式 ( x + a 1 ) (x+a_1) (x+a1)的余数就是当 x = a 1 x=a_1 x=a1 F ( x ) F(x) F(x)的值)

有这个结论就好办了,
设多项式 C l , r ( x ) = ∏ i = l r ( x + a i ) , G l , r ( x ) = F ( x ) m o d    C l , r ( x ) C_{l,r}(x)=\prod_{i=l}^r(x+a_i),G_{l,r}(x)=F(x)\mod{C_{l,r}(x)} Cl,r(x)=i=lr(x+ai)Gl,r(x)=F(x)modCl,r(x)
考虑分治求解,
显然的: G l , m i d ( x ) = G l , r ( x ) m o d    C l , r ( x ) G_{l,mid}(x)=G_{l,r}(x)\mod{C_{l,r}(x)} Gl,mid(x)=Gl,r(x)modCl,r(x),右边同理,
这样当l=r时 G l , l ( x ) G_{l,l}(x) Gl,l(x)就是 F ( a l ) F(a_l) F(al)的值了,
做两遍分治FFT,

复杂度: O ( n log ⁡ 2 ( n ) ) O(n\log^2(n)) O(nlog2(n))


多项式插值

给出 a 1 , b 1 , a 2 , b 2 , . . . , a k , b k a_1,b_1,a_2,b_2,...,a_k,b_k a1,b1,a2,b2,...,ak,bk,要求多项式 F ( x ) F(x) F(x)满足 F ( a i ) = b i F(a_i)=b_i F(ai)=bi

考虑使用拉格朗日插值法,
F ( x ) = ∑ i = 1 k b i ( ∏ 1 ≤ j ≤ k , i ≠ j x − a j a i − a j ) F(x)=\sum_{i=1}^kb_i(\prod_{1\leq j \leq k,i\ne j }\frac{x-a_j}{a_i-a_j}) F(x)=i=1kbi(1jk,i̸=jaiajxaj)
将式子拆成两部分:

F ( x ) = ∑ i = 1 k b i ( ∏ 1 ≤ j ≤ k , i ≠ j 1 a i − a j ) ( ∏ 1 ≤ j ≤ k , i ≠ j ( x − a j ) ) F(x)=\sum_{i=1}^kb_i(\prod_{1\leq j \leq k,i\ne j }\frac{1}{a_i-a_j})(\prod_{1\leq j \leq k,i\ne j }(x-a_j)) F(x)=i=1kbi(1jk,i̸=jaiaj1)(1jk,i̸=j(xaj))
先做前面那一部分:(先取个倒数方便书写)
G i = ∏ 1 ≤ j ≤ k , i ≠ j ( a i − a j ) , M ( x ) = ∏ j = 1 k ( a i − a j ) G_i=\prod_{1\leq j \leq k,i\ne j }(a_i-a_j),M(x)=\prod_{j=1}^k(a_i-a_j) Gi=1jk,i̸=j(aiaj)M(x)=j=1k(aiaj)
显然有 M ( a i ) = 0 M(a_i)=0 M(ai)=0,

有:
G i = lim ⁡ x → a i M ( x ) − M ( a i ) x − a j G_i=\lim_{x\to a_i}\frac{M(x)-M(a_i)}{x-a_j} Gi=xailimxajM(x)M(ai)
我们发现这个东西相当于 M ( x ) M(x) M(x) x = a i x=a_i x=ai处的导数,于是有:

G i = lim ⁡ x → a i M ( x ) − M ( a i ) x − a j = M ′ ( a i ) G_i=\lim_{x\to a_i}\frac{M(x)-M(a_i)}{x-a_j}=M'(a_i) Gi=xailimxajM(x)M(ai)=M(ai)
所以对 M ′ ( x ) M'(x) M(x)做一次多点求值即可,

这个东西还可以用洛必达法则证明,
f ( x ) = x − a i f(x)=x-a_i f(x)=xai
已知有 lim ⁡ x → a i M ( x ) = 0 , lim ⁡ x → a i f ( x ) = 0 \lim_{x\to a_i}M(x)=0,\lim_{x\to a_i}f(x)=0 limxaiM(x)=0,limxaif(x)=0
所以:
lim ⁡ x → a i M ( x ) f ( x ) = lim ⁡ x → a i M ′ ( x ) f ′ ( x ) = M ′ ( a i ) \lim_{x\to a_i}\frac{M(x)}{f(x)}=\lim_{x\to a_i}\frac{M'(x)}{f'(x)}=M'(a_i) xailimf(x)M(x)=xailimf(x)M(x)=M(ai)

现在的原始变成了:
F ( x ) = ∑ i = 1 k b i G i ( ∏ 1 ≤ j ≤ k , i ≠ j ( x − a j ) ) F(x)=\sum_{i=1}^kb_iG_i(\prod_{1\leq j \leq k,i\ne j }(x-a_j)) F(x)=i=1kbiGi(1jk,i̸=j(xaj))
这个东西可以直接使用分治FFT实现,分治的时候记录两个多项式分别表示是否已经空缺了一位,

复杂度: O ( n log ⁡ 2 ( n ) ) O(n\log^2(n)) O(nlog2(n))

多点求值+几遍分治FFT常数爆炸


多项式牛顿迭代

已知多项式 G ( x ) G(x) G(x),要求多项式 F F F使得 G ( F ) = 0 m o d    x n G(F)=0\mod{x^n} G(F)=0modxn

前置技能:

泰勒展开

对于多项式 f ( x ) f(x) f(x)它在 x 0 x_0 x0处的泰勒展开为:
f ( x ) = f ( x 0 ) + f ′ ( x ) 1 ! ( x − x 0 ) + f ′ ′ ( x ) 2 ! ( x − x 0 ) 2 + . . . . . f(x)=f(x_0)+\frac{f'(x)}{1!}(x-x_0)+\frac{f''(x)}{2!}(x-x_0)^2+..... f(x)=f(x0)+1!f(x)(xx0)+2!f(x)(xx0)2+.....

考虑倍增求 F F F

现在要求的 F F F m o d    x 2 n \mod x^{2n} modx2n的,假设我们已经求出了 F 0 F_0 F0表示 m o d    x n \mod x^n modxn时的答案,

G ( F ) G(F) G(F) F 0 F_0 F0处展开:
G ( F ) = G ( F 0 ) + G ′ ( F 0 ) ( F − F 0 ) + 1 2 G ′ ′ ( F 0 ) ( F − F 0 ) 2 m o d    x 2 n G(F)=G(F_0)+G'(F_0)(F-F_0)+\frac{1}{2}G''(F_0)(F-F_0)^2 \mod{x^{2n}} G(F)=G(F0)+G(F0)(FF0)+21G(F0)(FF0)2modx2n
我们注意到是在 m o d    x 2 n \mod{x^{2n}} modx2n意义下的,而从第3项开始最低次项的指数均大于2n,所以可以直接省去,于是:

G ( F ) = G ( F 0 ) + G ′ ( F 0 ) ( F − F 0 ) m o d    x 2 n G(F)=G(F_0)+G'(F_0)(F-F_0)\mod{x^{2n}} G(F)=G(F0)+G(F0)(FF0)modx2n
又因为 G ( F ) = 0 m o d    x 2 n G(F)=0\mod{x^{2n}} G(F)=0modx2n

0 = G ( F 0 ) + G ′ ( F 0 ) F − G ′ ( F 0 ) F 0 m o d    x 2 n 0=G(F_0)+G'(F_0)F-G'(F_0)F_0\mod{x^{2n}} 0=G(F0)+G(F0)FG(F0)F0modx2n

F = F 0 − G ( F 0 ) G ′ ( F 0 ) F=F_0-\frac{G(F_0)}{G'(F_0)} F=F0G(F0)G(F0)


多项式求对数

给出多项式 G ( x ) G(x) G(x),要求 F ( x ) F(x) F(x)使得 F ( x ) = ln ⁡ ( G ( x ) ) m o d    x n F(x)=\ln(G(x))\mod{x^n} F(x)=ln(G(x))modxn

对两边同时求导,最后再积分回来,
有:
( ln ⁡ ( G ( x ) ) ) ′ = G ′ ( x ) G ( x ) (\ln(G(x)))'=\frac{G'(x)}{G(x)} (ln(G(x)))=G(x)G(x)
所以
F ( x ) = ∫ G ′ ( x ) G ( x ) d x F(x)=\int \frac{G'(x)}{G(x)}dx F(x)=G(x)G(x)dx

复杂度: O ( n log ⁡ ( n ) ) O(n\log(n)) O(nlog(n))


多项式求EXP

给出多项式 G ( x ) G(x) G(x),求 F ( x ) F(x) F(x)满足 F ( x ) = e G ( x ) F(x)=e^{G(x)} F(x)=eG(x)

考虑使用牛顿迭代,
设多项式 g ( x ) = l n ( x ) − G ( x ) g(x)=ln(x)-G(x) g(x)=ln(x)G(x),即 g ( F ) = 0 g(F)=0 g(F)=0

F = F 0 − g ( F 0 ) g ′ ( F 0 ) F=F_0-\frac{g(F_0)}{g'(F_0)} F=F0g(F0)g(F0)
又因为
g ′ ( F 0 ) = ( ln ⁡ ( F 0 ) ) ′ − ( A ) ′ = 1 F 0 g'(F_0)=(\ln(F_0))'-(A)'=\frac{1}{F_0} g(F0)=(ln(F0))(A)=F01
所以:

F = F 0 − F 0 ( ln ⁡ ( F 0 ) − A ) F=F_0-F_0(\ln(F_0)-A) F=F0F0(ln(F0)A)

复杂度: O ( n log ⁡ ( n ) ) O(n\log(n)) O(nlog(n))


多项式求幂

给出多项式 F ( x ) F(x) F(x),求 F ( x ) k F(x)^k F(x)k
F ( x ) k = e k ln ⁡ ( F ( x ) ) F(x)^k=e^{k\ln(F(x))} F(x)k=ekln(F(x))

这样如果k不为整数也能求了

复杂度: O ( n log ⁡ ( n ) ) O(n\log(n)) O(nlog(n))


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值