下文及代码中所有提及某个函数是以n为界或者是n次的,意思是其最高次项次数
n−1。
关于求逆,由牛顿迭代:
F=G−1Fn+1=2Fn−Fn2G
关于多项式取模,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)xn−1A(x1)=(xm−1B(x1))(xn−mC(x1))+xn−1D(x1)
注意到
xn−1D(x1)modxn−m+1=0,因此(设
ATn(x)表示将
A(x)以
n为界翻转):
ATn(x)=BTm(x)CTn−m+1(x)(modxn−m+1)CTn−m+1(x)=ATn(x)(BTm(x))−1
因此可以求出
C,再通过一次乘法求出D即可。
多项式多点求值:
现在有一个以
n为界的多项式
A(x),以及
m个位置
x1,…,xm,求
A(x1),…,A(xm)。
考虑分治,令
L(x)=∏i=Lmid(x−xi),R(x)=∏i=mid+1R(x−xi),那么
A(xi)=(AmodL)(xi),∀i∈[L,mid],右边同理,递归处理即可。
L,R可以分治NTT的时候保存下来。
多项式多点插值:
现在告诉你
n个位置的点值
(x1,y1),…,(xn,yn),求一个以
n为界的多项式
A(x),使得
∀i∈[1,n],A(xi)=yi。
考虑拉格朗日插值:
A(x)=i=1∑nyij=1,∣j−i∣>0∏nxi−xjx−xj
首先考虑
vi=∏j=1,∣j−i∣>0n(xi−xj)怎么求。
注意到令
F(x)=∏i=1n(x−xi),那么
F′(x)=∑i=1n∏j=1,∣j−i∣>0n(x−xj),因此
vi=F′(xi),分治NTT出
F求导再多点求值即可。
接下来考虑求
solve(L,R)=∑i=LRviyi∏j=L,∣j−i∣>0R(x−xj)。
令
L(x)=∏i=Lmid(x−xi),R(x)=∏i=mid+1R(x−xi)
那么
solve(L,R)=solve(L,mid)R(x)+L(x)solve(mid+1,R)。
几个卡常小技巧是:预处理单位根,多项式求逆的时候手动展开。