多项式小结 (求逆)(ln)(exp)(除法)(多点求值)(快速插值)(任意模数NTT)

多项式求逆
f ( x ) ∗ g ( x ) = 1 ( m o d   x n ) f(x)*g(x)=1(mod\ x^n) f(x)g(x)=1(mod xn)
先求出 f ( x ) ∗ g ( x ) ′ = 1 ( m o d   x n 2 ) f(x)*g(x)'=1(mod\ x^{\frac{n}{2}}) f(x)g(x)=1(mod x2n)
然后有 f ( x ) ∗ g ( x ) ′ = f ( x ) ∗ g ( x ) ( m o d   x n 2 ) f(x)*g(x)'=f(x)*g(x)(mod\ x^{\frac{n}{2}}) f(x)g(x)=f(x)g(x)(mod x2n)
移项平方, ( g ( x ) − g ′ ( x ) ) 2 = 0 ( m o d   x n ) (g(x)-g'(x))^2=0(mod\ x^{n}) (g(x)g(x))2=0(mod xn)
同乘 f f f g ( x ) − 2 ∗ g ′ ( x ) + g ′ ( x ) 2 f ( x ) = 0 ( m o d   x n ) g(x)-2*g'(x)+g'(x)^2f(x)=0(mod\ x^n) g(x)2g(x)+g(x)2f(x)=0(mod xn)
所以 g ( x ) = 2 ∗ g ′ ( x ) − g ′ ( x ) 2 f ( x ) ( m o d   x n ) g(x)=2*g'(x)-g'(x)^2 f(x)(mod\ x^n) g(x)=2g(x)g(x)2f(x)(mod xn)
于是可以倍增做,复杂度 O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n))


多项式 l n ln ln
f ( x ) = l n ( g ( x ) ) f(x)=ln(g(x)) f(x)=ln(g(x))
两边求导, f ( x ) ′ = g ( x ) ′ g ( x ) f(x)'=\frac{g(x)'}{g(x)} f(x)=g(x)g(x)
所以 f ( x ) = ∫ g ( x ) ′ g ( x ) f(x)=\int \frac{g(x)'}{g(x)} f(x)=g(x)g(x)


多项式 e x p exp exp
f ( x ) = e g ( x ) f(x)=e^{g(x)} f(x)=eg(x)
两边取对数
l n ( f ( x ) ) = g ( x ) ln(f(x))=g(x) ln(f(x))=g(x)
F ( x ) = l n ( x ) − g F(x)=ln(x)-g F(x)=ln(x)g,这里的 x x x 是一个函数,g 相当于一个常数
现在要求 F F F 的 0 点,牛顿迭代
f ( x ) = f 0 ( x ) − F ( f 0 ( x ) ) F ( f 0 ( x ) ) ′ f(x)=f_0(x)-\frac{F(f_0(x))}{F(f_0(x))'} f(x)=f0(x)F(f0(x))F(f0(x))
F ( f 0 ( x ) ) ′ = 1 f 0 ( x ) F(f_0(x))'=\frac{1}{f_0(x)} F(f0(x))=f0(x)1
所以 f ( x ) = f 0 ( x ) ( 1 − l n ( x ) + g ( x ) ) f(x)=f_0(x)(1-ln(x)+g(x)) f(x)=f0(x)(1ln(x)+g(x))
每次迭代精度翻番,证明略,可以倍增做,复杂度 O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n))


多项式除法
Q ( x ) , R ( x ) Q(x),R(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)+R(x)
F ( 1 x ) = Q ( 1 x ) ∗ G ( 1 x ) + R ( 1 x ) F(\frac{1}{x})=Q(\frac{1}{x})*G(\frac{1}{x})+R(\frac{1}{x}) F(x1)=Q(x1)G(x1)+R(x1)
x n ∗ F ( 1 x ) = x n − m Q ( 1 x ) ∗ x m G ( 1 x ) + x n − m + 1 ∗ x m − 1 R ( 1 x ) x^n*F(\frac{1}{x})=x^{n-m}Q(\frac{1}{x})*x^mG(\frac{1}{x})+x^{n-m+1}*x^{m-1}R(\frac{1}{x}) xnF(x1)=xnmQ(x1)xmG(x1)+xnm+1xm1R(x1)
发现这样正好是把系数翻转
F r ( x ) = Q r ( x ) ∗ G r ( x ) + x n − m + 1 ∗ R r ( x ) F_r(x)=Q_r(x)*G_r(x)+x^{n-m+1}*R_r(x) Fr(x)=Qr(x)Gr(x)+xnm+1Rr(x)
所以
F r ( x ) = Q r ( x ) ∗ G r ( x ) ( m o d   x n − m + 1 ) F_r(x)=Q_r(x)*G_r(x)(mod\ x^{n-m+1}) Fr(x)=Qr(x)Gr(x)(mod xnm+1)
Q r ( x ) = F r ( x ) ∗ G r ( x ) − 1 ( m o d   x n − m + 1 ) Q_r(x)=F_r(x)*G_r(x)^{-1}(mod\ x^{n-m+1}) Qr(x)=Fr(x)Gr(x)1(mod xnm+1)
R ( x ) = F ( x ) − G ( x ) ∗ Q ( x ) R(x)=F(x)-G(x)*Q(x) R(x)=F(x)G(x)Q(x)


多项式快速幂
f ( x ) = g ( x ) k ( m o d   x n ) f(x)=g(x)^k(mod\ x^n) f(x)=g(x)k(mod xn)
l n ( f ( x ) ) = k ∗ l n ( g ( x ) ) ln(f(x))=k*ln(g(x)) ln(f(x))=kln(g(x))
f ( x ) = e x p ( k ∗ l n ( g ( x ) ) f(x)=exp(k*ln(g(x)) f(x)=exp(kln(g(x))


多项式多点求值
给一个多项式,多点求值
比如说要求 x 0 x_0 x0 的值 f ( x 0 ) f(x_0) f(x0)
考虑构造一个 g ( x ) = x − x 0 g(x)=x-x_0 g(x)=xx0 g ( x 0 ) = 0 g(x_0)=0 g(x0)=0
求出 f ( x 0 ) = g ( x 0 ) ∗ Q ( x 0 ) + R ( x 0 ) = R ( x 0 ) = f ( x 0 ) % g ( x 0 ) f(x_0)=g(x_0)*Q(x_0)+R(x_0)=R(x_0)=f(x_0)\%g(x_0) f(x0)=g(x0)Q(x0)+R(x0)=R(x0)=f(x0)%g(x0)
然后考虑分治,一起模
走左边的时候模 ∏ i = 1 n 2 g ( x i ) \prod_{i=1}^{\frac{n}{2}}g(x_i) i=12ng(xi)
然后那个 ∏ \prod 也可以分治 n t t ntt ntt


多项式快速插值
首先有拉格朗日插值
f ( x ) = ∑ i = 1 n y i ∏ j ! = i x − x j x i − x j f(x)=\sum_{i=1}^ny_i\prod_{j!=i}\frac{x-x_j}{x_i-x_j} f(x)=i=1nyij!=ixixjxxj
f ( x ) = ∑ i = 1 n y i ∏ j ! = i x i − x j ∏ j ! = i x − x j f(x)=\sum_{i=1}^n\frac{y_i}{\prod_{j!=i}x_i-x_j}\prod_{j!=i}x-x_j f(x)=i=1nj!=ixixjyij!=ixxj
考虑求 ∏ j ! = i x i − x j \prod_{j!=i}x_i-x_j j!=ixixj,如果有 g ( x ) = ∏ j = 1 n x − x j g(x)=\prod_{j=1}^nx-x_j g(x)=j=1nxxj
那么 g ( x i ) x − x i \frac{g(x_i)}{x-x_i} xxig(xi),根据洛必达法则就是 g ( x i ) ′ g(x_i)' g(xi)
考虑分治,令 f l , r f_{l,r} fl,r 为考虑 [ l , r ] [l,r] [l,r] 插出来的多项式
f l , r = ∑ i = l r y i g ( x i ) ′ ∏ j ! = i x − x j x i − x j f_{l,r}=\sum_{i=l}^r\frac{y_i}{g(x_i)'}\prod_{j!=i}\frac{x-x_j}{x_i-x_j} fl,r=i=lrg(xi)yij!=ixixjxxj
= ∏ j = m i d + 1 r ( x − x j ) ∑ i = l m i d y i g ( x i ) ′ ∏ j = l , j ! = i m i d ( x − x j ) + ∏ j = l m i d ( x − x j ) ∑ i = m i d + 1 r y i g ( x i ) ′ ∏ j = m i d + 1 , , j ! = i r ( x − x j ) =\prod_{j=mid+1}^r(x-x_j)\sum_{i=l}^{mid}\frac{y_i}{g(x_i)'}\prod_{j=l,j!=i}^{mid}(x-x_j)+\prod_{j=l}^{mid}(x-x_j)\sum_{i=mid+1}^{r}\frac{y_i}{g(x_i)'}\prod_{j=mid+1,,j!=i}^{r}(x-x_j) =j=mid+1r(xxj)i=lmidg(xi)yij=l,j!=imid(xxj)+j=lmid(xxj)i=mid+1rg(xi)yij=mid+1,,j!=ir(xxj)
= ∏ j = m i d + 1 r ( x − x j ) f l , m i d + ∏ j = l m i d ( x − x j ) f m i d + 1 , r =\prod_{j=mid+1}^r(x-x_j)f_{l,mid}+\prod_{j=l}^{mid}(x-x_j)f_{mid+1,r} =j=mid+1r(xxj)fl,mid+j=lmid(xxj)fmid+1,r
然后要对每个 x i x_i xi 求出 g ( x i ) ′ g(x_i)' g(xi),多点求值即可


任意模数 n t t ntt ntt
把每个数拆成 a ∗ 32768 + b a*32768+b a32768+b 的形式
那么两个数相乘就是 ( a 1 ∗ 32768 + b 1 ) ( a 2 ∗ 32768 + b 2 ) (a_1*32768+b_1)(a_2*32768+b_2) (a132768+b1)(a232768+b2),拆开即可
发现需要求 a 1 a 2 , a 1 b 2 , b 1 a 2 , b 1 b 2 a_1a_2,a_1b_2,b_1a_2,b_1b_2 a1a2,a1b2,b1a2,b1b2
做 8 次 d f t dft dft,4 次 i d f t idft idft
然后发现只用做 4 次 d f t dft dft,4 次 i d f t idft idft
考虑利用 f f t fft fft 的复数部分
( a + b i ) ( c + d i ) = a c − b d + ( a d + b c ) i (a+bi)(c+di)=ac-bd+(ad+bc)i (a+bi)(c+di)=acbd+(ad+bc)i
我们设两个多项式
P = a 1 + i ∗ a 2 P=a_1+i*a_2 P=a1+ia2
Q = b 1 + i ∗ b 2 Q=b_1+i*b_2 Q=b1+ib2
P ∗ Q = ( a 1 b 1 − a 2 b 2 ) + i ( a 1 b 2 + a 2 b 1 ) P*Q=(a_1b_1-a_2b_2)+i(a_1b_2+a_2b_1) PQ=(a1b1a2b2)+i(a1b2+a2b1)
又设 P ′ = a 1 − i ∗ a 2 P'=a_1-i*a_2 P=a1ia2
P ′ ∗ Q = ( a 1 b 1 + a 2 b 2 ) + i ( a 1 b 2 − b 1 a 2 ) P'*Q=(a_1b_1+a_2b_2)+i(a_1b_2-b_1a_2) PQ=(a1b1+a2b2)+i(a1b2b1a2)
加加减减就可以得出所有的值
3 次 d f t dft dft,2 次 i d f t idft idft

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FSYo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值