多项式运算

  • 定义

             \ \ \ \ \ \ \,       多项式(Polynomial)是代数学中的基础概念,是由称为未知数的变量和称为系数的常数通过有限次加减法、乘法以及自然数幂次的乘方运算得到的代数表达式。多项式是整式的一种。未知数只有一个的多项式称为一元多项式。

             \ \ \ \ \ \ \,       一个 n n n元多项式,也就是长度为 n n n的多项式 f f f,我们可以这样表达:

    f = ∑ i = 0 n f i ⋅ x i f=\sum_{i=0}^{n}f_i\cdot x^i f=i=0nfixi

             \ \ \ \ \ \ \,       我们一般简写为:

    f = ∑ i = 0 n f i f=\sum_{i=0}^{n}f_i f=i=0nfi

  • 多项式的加减法

             \ \ \ \ \ \ \,       这个挺简单的,我们直接写吧:

             \ \ \ \ \ \ \,       对于一个长度为 n n n的多项式 f f f和长度为 m m m的多项式 g g g:

    f + g = ∑ i = 0 n f i + ∑ i = 0 m g i = ∑ i = 0 m a x ( n , m ) f i + g i \begin{aligned}f+g&=\sum_{i=0}^{n}f_i+\sum_{i=0}^{m}g_i\\ &=\sum_{i=0}^{{\rm max}(n,m)}f_i+g_i\end{aligned} f+g=i=0nfi+i=0mgi=i=0max(n,m)fi+gi

    f − g = ∑ i = 0 n f i − ∑ i = 0 m g i = ∑ i = 0 m a x ( n , m ) f i − g i \begin{aligned}f-g&=\sum_{i=0}^{n}f_i-\sum_{i=0}^{m}g_i\\ &=\sum_{i=0}^{{\rm max}(n,m)}f_i-g_i\end{aligned} fg=i=0nfii=0mgi=i=0max(n,m)figi

  • 多项式的乘法(卷积)

             \ \ \ \ \ \ \,       多项式的卷积,我们还是对于上文中的两个函数 f f f g g g,这个地方不展开写挺不方便的,我们就展开吧:

    f ⨂ g = ∑ i = 0 n f i ⋅ x i × ∑ i = 0 m g i ⋅ x i = ∑ v = 0 n + m f b ⋅ x b × g a ⋅ x a [ a + b = v ] = ∑ x = 0 n + m ∑ i = 0 v f i ⋅ g v − i ⋅ x v \begin{aligned}f\bigotimes g&=\sum_{i=0}^{n}f_i\cdot x^i\times \sum_{i=0}^{m}g_i\cdot x^i \\ &=\sum_{v=0}^{n+m}f_b\cdot x^b\times g_a\cdot x^a[a+b=v]\\&=\sum_{x=0}^{n+m}\sum_{i=0}^{v}f_i\cdot g_{v-i}\cdot x^v\end{aligned} fg=i=0nfixi×i=0mgixi=v=0n+mfbxb×gaxa[a+b=v]=x=0n+mi=0vfigvixv

             \ \ \ \ \ \ \,       计算的复杂度呢,是 O ( n 2 ) O(n^2) O(n2)的,可以用一些神奇算法优化成 O ( n log ⁡ n ) O(n\log n) O(nlogn)的具体看这里:【求多项式卷积的变换】

  • 多项式的除法

             \ \ \ \ \ \ \,       一个多项式除以一个多项式,就是乘以他的逆元。

             \ \ \ \ \ \ \,       多项式的逆元,是对于一个长度为 n n n的多项式 f f f,找到一个同样长度为 n n n的多项式 f i n v f_{inv} finv,使得:

    f ⨂ f i n v ≡ 1    ( m o d   x n ) f\bigotimes f_{inv}\equiv 1\ \ ({\rm mod}\ x^n) ffinv1  (mod xn)

             \ \ \ \ \ \ \,       这个 f i n v f_{inv} finv可以递归求解:

             \ \ \ \ \ \ \,       我们假设,我们已经求出了 f i n v ′ f'_{inv} finv,满足:

    f ⨂ f i n v ′ ≡ 1    ( m o d   x ⌈ n 2 ⌉ ) f\bigotimes f'_{inv}\equiv 1\ \ \left({\rm mod}\ x^{\left\lceil\frac{n}{2}\right\rceil}\right) ffinv1  (mod x2n)

             \ \ \ \ \ \ \,       可以得到,对于 f i n v f_{inv} finv是同样的:

    f ⨂ f i n v ≡ 1    ( m o d   x ⌈ n 2 ⌉ ) f\bigotimes f_{inv}\equiv 1\ \ \left({\rm mod}\ x^{\left\lceil\frac{n}{2}\right\rceil}\right) ffinv1  (mod x2n)

             \ \ \ \ \ \ \,       所以有:

    f ⨂ f i n v ′ − f ⨂ f i n v ≡ 0    ( m o d   x ⌈ n 2 ⌉ ) f\bigotimes f'_{inv}-f\bigotimes f_{inv}\equiv 0\ \ \left({\rm mod}\ x^{\left\lceil\frac{n}{2}\right\rceil}\right) ffinvffinv0  (mod x2n)

    f ⨂ ( f i n v ′ − f i n v ) ≡ 0    ( m o d   x ⌈ n 2 ⌉ ) f\bigotimes (f'_{inv}-f_{inv})\equiv 0\ \ \left({\rm mod}\ x^{\left\lceil\frac{n}{2}\right\rceil}\right) f(finvfinv)0  (mod x2n)

    f i n v ′ − f i n v ≡ 0    ( m o d   x ⌈ n 2 ⌉ ) f'_{inv}-f_{inv}\equiv 0\ \ \left({\rm mod}\ x^{\left\lceil\frac{n}{2}\right\rceil}\right) finvfinv0  (mod x2n)

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

    ( f i n v ′ − f i n v ) 2 ≡ 0    ( m o d   x n ) (f'_{inv}-f_{inv})^2\equiv 0\ \ \left({\rm mod}\ x^{n}\right) (finvfinv)20  (mod xn)

    f i n v ′ 2 + f i n v 2 − 2 f i n v ′ ⨂ f i n v ≡ 0    ( m o d   x n ) f'^2_{inv}+f^2_{inv}-2f'_{inv}\bigotimes f_{inv}\equiv 0\ \ \left({\rm mod}\ x^{n}\right) finv2+finv22finvfinv0  (mod xn)

             \ \ \ \ \ \ \,       两边同时卷 f f f

    f ⨂ f i n v ′ 2 + f ⨂ f i n v 2 − 2 f ⨂ f i n v ′ f i n v ≡ 0    ( m o d   x n ) f\bigotimes f'^2_{inv}+f \bigotimes f^2_{inv}-2f\bigotimes f'_{inv}f_{inv}\equiv 0\ \ \left({\rm mod}\ x^{n}\right) ffinv2+ffinv22ffinvfinv0  (mod xn)

    f ⨂ f i n v ′ 2 + f ⨂ f i n v ⨂ f i n v − 2 f ⨂ f i n v ⨂ f i n v ′ ≡ 0    ( m o d   x n ) f\bigotimes f'^2_{inv}+f \bigotimes f_{inv}\bigotimes f_{inv}-2f\bigotimes f_{inv}\bigotimes f'_{inv}\equiv 0\ \ \left({\rm mod}\ x^{n}\right) ffinv2+ffinvfinv2ffinvfinv0  (mod xn)

    f ⨂ f i n v ′ 2 + f i n v − 2 f i n v ′ ≡ 0    ( m o d   x n ) f\bigotimes f'^2_{inv}+f_{inv}-2f'_{inv}\equiv 0\ \ \left({\rm mod}\ x^{n}\right) ffinv2+finv2finv0  (mod xn)

    2 f i n v ′ − f ⨂ f i n v ′ 2 ≡ f i n v    ( m o d   x n ) 2f'_{inv}-f\bigotimes f'^2_{inv}\equiv f_{inv}\ \ \left({\rm mod}\ x^{n}\right) 2finvffinv2finv  (mod xn)

             \ \ \ \ \ \ \,       我们发现是卷积的形式,只需要先计算出:
    f ⨂ f i n v ≡ 1    ( m o d   1 ) f\bigotimes f_{inv}\equiv 1\ \ ({\rm mod}\ 1) ffinv1  (mod 1)
             \ \ \ \ \ \ \,       后面再递推上去求几次卷积就好了,显然,在上面的式子中:

    f i n v = i n v f 0 f_{inv}={\rm inv}f_{0} finv=invf0

             \ \ \ \ \ \ \,       复杂度是 O ( n log ⁡ n ) O(n\log n) O(nlogn)的:

void Inv(int *a,int *b,int xn){
  if(xn==1) {b[0]=power(a[0],mod-2);return;}
  Inv((xn+1)>>1);
  int L=0,n=1;
  while(n<(xn<<1)) n<<=1,++L;
  for(register int i=1;i<n;++i) R[i]=(R[i>>1]>>1)|((i&1)<<(L-1));
  for(register int i=0;i<xn;++i) c[i]=a[i];
  for(register int i=xn;i<n;++i) c[i]=0;
  NTT(c,1,n);NTT(b,1,n);
  for(register int i=0;i<=n;++i)
    b[i]=1ll*(2-1ll*c[i]*b[i]%mod+mod)%mod*b[i]%mod;
  NTT(b,-1,n);
  for(register int i=xn;i<n;++i) b[i]=0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值