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

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

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

若多项式 F ( x ) F(x) F(x)的最高次数为 n n n,则 deg ⁡ F = n \deg F =n degF=n
F R ( x ) F_R(x) FR(x)表示将 F ( x ) F(x) F(x)的系数反转,即 F R ( x ) F_R(x) FR(x)的第 i i i次项系数为 F ( x ) F(x) F(x)的第 n − i n-i ni次项系数。

多项式乘法(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 A degBdegA并且 A ( x ) B ( x ) ≡ 1 m o d &ThinSpace;&ThinSpace; x n A(x)B(x)\equiv 1\mod x^n A(x)B(x)1modxn
B ( x ) ≡ A − 1 ( x ) m o d &ThinSpace;&ThinSpace; x n B(x)\equiv A^{-1}(x)\mod x^n B(x)A1(x)modxn,称 B ( x ) B(x) B(x) A ( x ) A(x) A(x) m o d &ThinSpace;&ThinSpace; x n \mod x^n modxn的意义下的逆元。
如何求 B ( x ) B(x) B(x)呢?
假设已经求出 B ′ ( x ) ≡ A − 1 ( x ) m o d &ThinSpace;&ThinSpace; x ⌈ n 2 ⌉ B&#x27;(x)\equiv A^{-1}(x)\mod x^{\lceil \frac{n}{2} \rceil} B(x)A1(x)modx2n
B ( x ) − B ′ ( x ) ≡ 0 m o d &ThinSpace;&ThinSpace; x ⌈ n 2 ⌉ B(x)-B&#x27;(x)\equiv 0\mod x^{\lceil \frac{n}{2} \rceil} B(x)B(x)0modx2n
两边同时平方有: B 2 ( x ) + B ′ 2 ( x ) − 2 B ( x ) B ′ ( x ) ≡ 0 m o d &ThinSpace;&ThinSpace; x n B^2(x)+B&#x27;^2(x)-2B(x)B&#x27;(x)\equiv 0\mod x^n B2(x)+B2(x)2B(x)B(x)0modxn
两边同时乘 A ( x ) A(x) A(x)有: B ( x ) + B ′ 2 ( x ) A ( x ) − 2 B ′ ( x ) ≡ 0 m o d &ThinSpace;&ThinSpace; x n B(x)+B&#x27;^2(x)A(x)-2B&#x27;(x)\equiv 0\mod x^n B(x)+B2(x)A(x)2B(x)0modxn
B ( x ) ≡ 2 B ′ ( x ) − B ′ 2 ( x ) A ( x ) m o d &ThinSpace;&ThinSpace; x n B(x)\equiv 2B&#x27;(x)-B&#x27;^2(x)A(x)\mod x^n B(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),则 F 2 ( x ) F^2(x) F2(x) m o d &ThinSpace;&ThinSpace; x n \mod x^n modxn后从

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值