多项式全家桶(二):多项式的逆,导,积

         \ \ \ \ \ \ \,       这一部分麻烦一点了,但是很重要,几乎所有多项式都得用的,不过好在也不是很复杂的。


1. 多项式求逆

         \ \ \ \ \ \ \,       P4238 【模板】多项式求逆

         \ \ \ \ \ \ \,       求一个多项式 A A A 的模 x n x^n xn 的逆元 B B B 时,假设先求出了模 x n 2 x^{\frac{n}{2}} x2n 的逆元 B ′ B' B,既:

A ∗ B ′ ≡ 1   ( m o d   x n 2 ) A*B' \equiv 1\ (mod\ x^{\frac{n}{2}}) AB1 (mod x2n)

A ∗ B ≡ 1   ( m o d   x n ) A*B \equiv 1\ (mod\ x^{n}) AB1 (mod xn)

         \ \ \ \ \ \ \,       那么显然存在:

A ∗ B ≡ 1   ( m o d   x n 2 ) = A ∗ B ′ A*B \equiv 1\ (mod\ x^{\frac{n}{2}})=A*B' AB1 (mod x2n)=AB

B − B ′ ≡ 0   ( m o d   x n 2 ) B-B' \equiv 0\ (mod\ x^{\frac{n}{2}}) BB0 (mod x2n)

         \ \ \ \ \ \ \,       两边同时平方:

B 2 − 2 B B ′ + B ′ 2 ≡ 0   ( m o d   x n ) B^2-2BB'+B'^2 \equiv 0\ (mod\ x^n) B22BB+B20 (mod xn)

         \ \ \ \ \ \ \,       再把 A A A 乘回去:

( A ∗ B ) ∗ B − ( A ∗ B ) ∗ 2 B ′ + A ∗ B ′ 2 ≡ A ∗ 0   ( m o d   x n ) (A*B)*B-(A*B)*2B'+A*B'^2 \equiv A*0\ (mod\ x^n) (AB)B(AB)2B+AB2A0 (mod xn)

B − 2 B ′ + A ∗ B ′ 2 ≡ 0   ( m o d   x n ) B-2B'+A*B'^2 \equiv 0\ (mod\ x^n) B2B+AB20 (mod xn)

B ≡ 2 B ′ − A ∗ B ′ 2   ( m o d   x n ) B \equiv 2B'-A*B'^2\ (mod\ x^n) B2BAB2 (mod xn)

         \ \ \ \ \ \ \,       我们就可以倍增来处理它了,起点是 B 0 ≡ A 0 − 1 ( m o d   x 1 ) B_0 \equiv A_0^{-1}(mod\ x^1) B0A01(mod x1)

inline Polynomial Inverse(const Polynomial &a){
	Polynomial ret,inv_a; 
	ret.resize(1);
  	ret[0]=Inv(a[0]);int ed=a.size();
	for(int len=2;len<=ed;len<<=1){
	 	int n=Prepare_Transformation(len+len);
	  	inv_a=a;inv_a.resize(n);ret.resize(n);
	  	for(int i=len;i<n;i++)inv_a[i]=0;
	  	NTT(inv_a,1);NTT(ret,1);
	  	for(int i=0;i<n;i++)ret[i]=1ll*(2ll-1ll*inv_a[i]*ret[i]%mod+mod)%mod*ret[i]%mod;
	  	NTT(ret,-1);
	  	//这里把比较复杂的卷积过程拖下来了。
	  	for(int i=len;i<n;i++)ret[i]=0;
	  	//这里不resize了,直接把多余的清零。
	}
	ret.resize(ed);
	//resize回来,防止以后长度爆炸。
	return ret;
}


2. 多项式求导

       &ThinSpace; \ \ \ \ \ \ \,       按照公式来,公式挺简单的,设多项式 A A A 的导数为 A ′ A&#x27; A

       &ThinSpace; \ \ \ \ \ \ \,       那么有:

x A ′ = A x A − 1 x^{A&#x27;}=Ax^{A-1} xA=AxA1

       &ThinSpace; \ \ \ \ \ \ \,       既:

A i ′ = i × A i + 1 A&#x27;_{i}=i\times A_{i+1} Ai=i×Ai+1

inline Polynomial Derivation(const Polynomial &a){
	int size=a.size();Polynomial ret;ret.resize(size);
  	for(int i=1;i<size;i++)ret[i-1]=1ll*i*a[i]%mod;
  	ret[size-1]=0;
	return ret;
}

3. 多项式求积

       &ThinSpace; \ \ \ \ \ \ \,       还是按照公式来,设多项式 A A A 的积分为 A ′ A&#x27; A

       &ThinSpace; \ \ \ \ \ \ \,       那么有:

∫ x A ′ d x = 1 A + 1 x A − 1 \int x^{A&#x27;}dx=\frac{1}{A+1}x^{A-1} xAdx=A+11xA1

       &ThinSpace; \ \ \ \ \ \ \,       既:

A i ′ = A i − 1 i A&#x27;_{i}=\frac{A_{i-1}}{i} Ai=iAi1

       &ThinSpace; \ \ \ \ \ \ \,       那就是乘逆元咯 (兄弟俩长得挺像

inline Polynomial Integral(const Polynomial &a){
	int size=a.size();Polynomial ret;ret.resize(size);
  	for(int i=1;i<size;i++)ret[i]=1ll*Inv(i)*a[i-1]%mod;
  	ret[0]=0;
	return ret;
}

4. 多项式复合逆

       &ThinSpace; \ \ \ \ \ \ \,       NFLSOJ #332. 多项式复合逆

       &ThinSpace; \ \ \ \ \ \ \,       对于一个多项式 F F F,若是存在一个多项式 G G G,使得:

G ( F ( x ) ) = x G(F(x))=x G(F(x))=x

       &ThinSpace; \ \ \ \ \ \ \,       那么就称多项式 G G G是多项式 F F F的复合逆。

       &ThinSpace; \ \ \ \ \ \ \,       目前复合逆没有 O ( n log ⁡ n ) O(n \log n) O(nlogn)的做法,但是可以用拉格朗日反演做到 O ( n 2 log ⁡ n ) O(n^2 \log n) O(n2logn),既每一项每一项得求,求一项的时间是 O ( n log ⁡ n ) O(n \log n) O(nlogn)的,下面给出公式:

G i = ( x F ) i − 1 i i G_i=\frac{\left(\frac{x}{F}\right)^i_{i-1}}{i} Gi=i(Fx)i1i

       &ThinSpace; \ \ \ \ \ \ \,       那么求逆和卷积就好了, x x x都挺好处理的,证明很复杂,感兴趣可以看这里

       &ThinSpace; \ \ \ \ \ \ \,       有一个值得注意的地方就是求逆的时候,应该直接求 F x \frac{F}{x} xF的逆,而不是 F F F的逆,因为既然多项式 F F F 存在复合逆,那么常数项就应该是 0 0 0 ,这是不可能求逆的,先算出 F x \frac{F}{x} xF即可。

       &ThinSpace; \ \ \ \ \ \ \,       若是需要 O ( n log ⁡ n ) O(n \log n) O(nlogn)只求一项,则需要用到快速幂,下一篇我们会讲到

inline Polynomial Composition_Inverse(const Polynomial &a){
	int n=a.size();
  	Polynomial ret,Cinv=a,Pow;
  	Cinv.resize(n);ret.resize(n);Pow.resize(n);Pow[0]=1;
  	for(register int i=0;i<n-1;i++)Cinv[i]=Cinv[i+1];Cinv[n-1]=0;
  	Cinv=Inverse(Cinv);
  	for(register int i=1;i<n;++i){
  		Pow=Pow*Cinv;Pow.resize(n);
  		ret[i]=1ll*Pow[i-1]*Inv(i)%mod;
	}
  	return ret;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 要将多项式化成不定分,可以使用多项式的基本分公式。根据这个公式,对于任何一个多项式,它的不定分都可以表示为其各项系数的分。 例如,对于一个多项式 f(x) = 2x^3 + 3x^2 + 4x + 5,它的不定分可以表示为: ∫(2x^3 + 3x^2 + 4x + 5)dx = (2/4)x^4 + (3/3)x^3 + (4/2)x^2 + 5x + C 其中,C 为任意常数项。 因此,多项式可以通过使用基本分公式来化成不定分。 ### 回答2: 要将多项式转化为不定分,可以按照以下步骤进行操作: 1. 首先,将多项式按照降幂排列,即从高次到低次的顺序排列各项。 2. 对于每一项,根据幂的规则,可以将其转化为不定分。具体而言,对于幂函数 $x^n$,其中 $n$ 是一个实数,不定分为 $\frac{1}{n+1}x^{n+1}+C$,其中 $C$ 是一个常数。例如,$x^3$ 的不定分为 $\frac{1}{4}x^4+C$。 3. 将每一项的不定分相加,得到整个多项式的不定分。注意,由于不定分是线性的,可以分别对每一项进行不定分,然后将结果相加。 4. 最后,记得在结果中添加常数项 $C$,表示原函数的不确定性。这是因为不定分得到的是一个函数族,只有添加常数项才能表示出具体的函数。 总之,将多项式化为不定分的具体步骤包括:按照降幂排列多项式各项,对每一项应用幂函数的不定分规则,相加得到整个多项式的不定分,并在结果中添加常数项。 ### 回答3: 多项式的不定分是一个常见的求解方法,可以将一个多项式化成它的原函数。要将一个多项式进行不定分,可以使用多项式的求运算——分来实现。 首先,将多项式的各项按照次数降序排列。然后,对于每一项,将其指数加1,并且将系数除以新的指数,得到新的项。这个过程相当于将每一项的幂函数求分。 例如,对于一个多项式f(x) = 3x² + 2x + 1,可以按照次数降序排列为f(x) = 3x² + 2x + 1。对于每一项,将指数加1并且将系数除以新的指数,得到f(x) = x³ + x² + x。这样,多项式f(x)的不定分就是F(x) = 1/4x⁴ + 1/3x³ + 1/2x² + C,其中C为常数。 总结起来,将每一项的指数加1,并将系数除以新的指数,就可以得到多项式的不定分。当然,在计算过程中要注意处理常数项,保留常数项的不定分时需要加上常数C。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值