[学习笔记]多项式多点求值与多点插值 - 多项式理论 - 学习笔记

下文及代码中所有提及某个函数是以n为界或者是n次的,意思是其最高次项次数 n 1 n-1
关于求逆,由牛顿迭代: F = G 1 F n + 1 = 2 F n F n 2 G F=G^{-1}\\F_{n+1}=2F_n-F_n^2G
关于多项式取模,A(x)以n为界,B(x)以m为界,需要求C(x)和D(x),使得C(x)的界是n-m+1,D(x)的界是m-1:
A ( x ) = B ( x ) C ( x ) + D ( x ) x n 1 A ( 1 x ) = ( x m 1 B ( 1 x ) ) ( x n m C ( 1 x ) ) + x n 1 D ( 1 x ) A(x)=B(x)C(x)+D(x)\\x^{n-1}A\left(\frac 1x\right)=\left(x^{m-1}B\left(\frac 1x\right)\right)\left(x^{n-m}C\left(\frac1x\right)\right)+x^{n-1}D\left(\frac 1x\right)
注意到 x n 1 D ( 1 x )   m o d   x n m + 1 = 0 x^{n-1}D\left(\frac 1x\right)\bmod {x^{n-m+1}}=0 ,因此(设 A T n ( x ) A^{T_n}(x) 表示将 A ( x ) A(x) n n 为界翻转):
A T n ( x ) = B T m ( x ) C T n m + 1 ( x ) ( m o d x n m + 1 ) C T n m + 1 ( x ) = A T n ( x ) ( B T m ( x ) ) 1 A^{T_{n}}(x)=B^{T_{m}}(x)C^{T_{n-m+1}}(x)\pmod {x^{n-m+1}}\\ C^{T_{n-m+1}}(x)=A^{T_{n}}(x)\left(B^{T_{m}}(x)\right)^{-1}
因此可以求出 C C ,再通过一次乘法求出D即可。

多项式多点求值:
现在有一个以 n n 为界的多项式 A ( x ) A(x) ,以及 m m 个位置 x 1 , , x m x_1,\dots,x_m ,求 A ( x 1 ) , , A ( x m ) A(x_1),\dots,A(x_m)
考虑分治,令 L ( x ) = i = L m i d ( x x i ) , R ( x ) = i = m i d + 1 R ( x x i ) L(x)=\prod_{i=L}^{mid}(x-x_i),R(x)=\prod_{i=mid+1}^R(x-x_i) ,那么 A ( x i ) = ( A   m o d   L ) ( x i ) , i [ L , m i d ] A(x_i)=\left(A\bmod L\right)(x_i),\forall i\in[L,mid] ,右边同理,递归处理即可。 L , R L,R 可以分治NTT的时候保存下来。

多项式多点插值:
现在告诉你 n n 个位置的点值 ( x 1 , y 1 ) , , ( x n , y n ) (x_1,y_1),\dots,(x_n,y_n) ,求一个以 n n 为界的多项式 A ( x ) A(x) ,使得 i [ 1 , n ] , A ( x i ) = y i \forall i\in[1,n],A(x_i)=y_i
考虑拉格朗日插值: A ( x ) = i = 1 n y i j = 1 , j i > 0 n x x j x i x j A(x)=\sum_{i=1}^ny_i\prod_{j=1,|j-i|>0}^n\frac{x-x_j}{x_i-x_j}
首先考虑 v i = j = 1 , j i > 0 n ( x i x j ) v_i=\prod_{j=1,|j-i|>0}^n (x_i-x_j) 怎么求。
注意到令 F ( x ) = i = 1 n ( x x i ) F(x)=\prod_{i=1}^n(x-x_i) ,那么 F ( x ) = i = 1 n j = 1 , j i > 0 n ( x x j ) F'(x)=\sum_{i=1}^n\prod_{j=1,|j-i|>0}^n(x-x_j) ,因此 v i = F ( x i ) v_i=F'(x_i) ,分治NTT出 F F 求导再多点求值即可。
接下来考虑求 s o l v e ( L , R ) = i = L R y i v i j = L , j i > 0 R ( x x j ) \mathrm{solve}(L,R)=\sum_{i=L}^R\frac {y_i}{v_i}\prod_{j=L,|j-i|>0}^R(x-x_j)
L ( x ) = i = L m i d ( x x i ) , R ( x ) = i = m i d + 1 R ( x x i ) L(x)=\prod_{i=L}^{mid}(x-x_i),R(x)=\prod_{i=mid+1}^R(x-x_i)
那么 s o l v e ( L , R ) = s o l v e ( L , m i d ) R ( x ) + L ( x ) s o l v e ( m i d + 1 , R ) \mathrm{solve}(L,R)=\mathrm{solve}(L,mid)R(x)+L(x)\mathrm{solve}(mid+1,R)
几个卡常小技巧是:预处理单位根,多项式求逆的时候手动展开。

猜你喜欢

转载自blog.csdn.net/Mys_C_K/article/details/87917015