多项式:求逆、取模、多点求值、多点插值

本文详细介绍了多项式的多项式乘法(包括FFT和NTT)、求逆、除法与取模、多点求值以及多点插值的方法。内容涵盖多项式逆元的计算、多项式除法的实现、拉格朗日插值公式等,旨在帮助读者深入理解多项式运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

若多项式F(x)F(x)F(x)的最高次数为nnn,则deg⁡F=n\deg F =ndegF=n
FR(x)F_R(x)FR(x)表示将F(x)F(x)F(x)的系数反转,即FR(x)F_R(x)FR(x)的第iii次项系数为F(x)F(x)F(x)的第n−in-ini次项系数。

多项式乘法(FFT(实数意义下)&NTT(模意义下))

FFT的板子

const double PI=acos(-1);
struct cpx
{
   
   
	double r,i;
	cpx(double r=0.0,double i=0.0):r(r),i(i){
   
   }
	cpx operator *(const cpx &a)const
	{
   
   
		return cpx(r*a.r-i*a.i,r*a.i+i*a.r);
	}
	cpx operator +(const cpx &a)const
	{
   
   
		return cpx(r+a.r,i+a.i);
	}
	cpx operator -(const cpx &a)const
	{
   
   
		return cpx(r-a.r,i-a.i);
	}
};
void FFT(cpx *A,int n,int typ)
{
   
   
	for(int i=1,j=0;i<n-1;i++)
	{
   
   
		for(int s=n;j^=s>>=1,~j&s;);
		if(i<j) swap(A[i],A[j]);
	}
	for(int i=1;i<n;i<<=1)
	{
   
   
		cpx w1(cos(PI/i),typ*sin(PI/i));
		cpx w(1,0);
		for(int j=0;j<i;j++,w=w*w1)
			for(int l=j,r=l+i;l<n;l+=(i<<1),r=l+i)
			{
   
   
				cpx tmp=w*A[r];
				A[r]=A[l]-tmp;
				A[l]=A[l]+tmp;
			}
	}
	if(typ==-1)
	{
   
   
		for(int i=0;i<n;i++) A[i].r/=n;
	}
}

NTT的板子

#define MO 998244353
#define G 3
int PowMod(int a,int b)
{
   
   
	int ret=1;
	while(b)
	{
   
   
		if(b&1) ret=1LL*a*ret%MO;
		a=1LL*a*a%MO;
		b>>=1;
	}
	return ret;
}
int W[30][2];
void NTTPre()
{
   
   
	for(int i=1,t=0;i<MAXN;i<<=1,t++)
	{
   
   
		W[t][0]=PowMod(G,(MO-1)/(i<<1));
		W[t][1]=PowMod(W[t][0],MO-2);
	}
}
void NTT(int *A,int n,int typ)
{
   
   
	for(int i=1,j=0;i<n-1;i++)
	{
   
   
		for(int s=n;j^=s>>=1,~j&s;);
		if(i<j) swap(A[i],A[j]);
	}
	for(int i=1,t=0;i<n;i<<=1,t++)
	{
   
   
		int w1=W[t][typ],w=1;
		for(int j=0;j<i;j++,w=1LL*w*w1%MO)
			for(int l=j,r=l+i;l<n;l+=(i<<1),r=l+i)
			{
   
   
				int tmp=1LL*w*A[r]%MO;
				A[r]=(A[l]-tmp+MO)%MO;
				A[l]=(A[l]+tmp)%MO;
			}
	}
	if(typ)
	{
   
   
		int inv=PowMod(n,MO-2);
		for(int i=0;i<n;i++)
			A[i]=1LL*A[i]*inv%MO;
	}
}

多项式求逆

对于一个多项式A(x)A(x)A(x),如果存在B(x)B(x)B(x)满足deg⁡B≤deg⁡A\deg B\le \deg AdegBdegA并且A(x)B(x)≡1mod&ThinSpace;&ThinSpace;xnA(x)B(x)\equiv 1\mod x^nA(x)B(x)1modxn
B(x)≡A−1(x)mod&ThinSpace;&ThinSpace;xnB(x)\equiv A^{-1}(x)\mod x^nB(x)A1(x)modxn,称B(x)B(x)B(x)A(x)A(x)A(x)mod&ThinSpace;&ThinSpace;xn\mod x^nmodxn的意义下的逆元。
如何求B(x)B(x)B(x)呢?
假设已经求出B′(x)≡A−1(x)mod&ThinSpace;&ThinSpace;x⌈n2⌉B&#x27;(x)\equiv A^{-1}(x)\mod x^{\lceil \frac{n}{2} \rceil}B(x)A1(x)modx2n
B(x)−B′(x)≡0mod&ThinSpace;&ThinSpace;x⌈n2⌉B(x)-B&#x27;(x)\equiv 0\mod x^{\lceil \frac{n}{2} \rceil}B(x)B(x)0modx2n
两边同时平方有:B2(x)+B′2(x)−2B(x)B′(x)≡0mod&ThinSpace;&ThinSpace;xnB^2(x)+B&#x27;^2(x)-2B(x)B&#x27;(x)\equiv 0\mod x^nB2(x)+B2(x)2B(x)B(x)0modxn
两边同时乘A(x)A(x)A(x)有:B(x)+B′2(x)A(x)−2B′(x)≡0mod&ThinSpace;&ThinSpace;xnB(x)+B&#x27;^2(x)A(x)-2B&#x27;(x)\equiv 0\mod x^nB(x)+B2(x)A(x)2B(x)0modxn
B(x)≡2B′(x)−B′2(x)A(x)mod&ThinSpace;&ThinSpace;xnB(x)\equiv 2B&#x27;(x)-B&#x27;^2(x)A(x)\mod x^nB(x)2B(x)B2(x)A(x)modxn
注意到平方的时候将模数也平方了,为什么模数也可以平方呢?
F(x)=B(x)−B′(x)F(x)=B(x)-B&#x27;(x)F(x)=B(x)B(x),则F2(x)F^2(x)F2(x)mod&ThinSpace;&ThinSpace;xn\mod x^nmodxn后从000n−1n-1n1的每一项系数必然由F(x)F(x)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值