学习笔记多项式全家桶(包含全套证明)

Posted 繁凡さん

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习笔记多项式全家桶(包含全套证明)相关的知识,希望对你有一定的参考价值。

整理的算法模板合集: ACM模板

点我看算法全家桶系列!!!

实际上是一个全新的精炼模板整合计划


多项式全家桶!!!

目录


tips:

注意一点,在我们每次求 limit 的时候,把范围都乘 2 ,反正乘了开大一点不会错,最多会跑的慢一点,但是有时候不开就会 WA(比如在求多项式除法的时候)
limit 可以设成全局变量,注意每次使用 limit 的时候都要按照下面的格式初始化一下 limit 以及 L

就是这里:

       for(limit = 1, L = 0; limit <= (n + m) * 2; limit <<= 1) L ++ ;
       for(int i = 0; i < limit; ++ i) 
           RR[i] = (RR[i >> 1] >> 1) | ((i & 1) << (L - 1));

0x00.多项式基本概述

既然是多项式全家桶,那么肯定要先来了解一下什么是多项式hhh,基础一定要扎实,不然到后面让你怀疑人生

0x01. 多项式的基础概念

首先是多项式的一些基础的概念:

0x02. 多项式的度

对于一个多项式 f ( x ) f(x) f(x),称其最高次项的次数为该多项式的 度(Degree) ,记作 d e g   f deg\\ f deg f

好吧就是多项式的次数。(顺带一提,单项式的次数是所有字母次数之和hhh)

0x03. 多项式的乘法

我们上面也说了多项式 × \\times × 多项式 = = = 新的多项式。

所以我们最关心的操作就是两个多项式的乘法 —— 卷积。

广义上的卷积为:

h ( x ) = ∫ − ∞ ∞ g ( τ ) ⋅ f ( x − τ ) d τ h(x) = \\int _- \\infty ^\\inftyg(\\tau) \\cdot f(x - \\tau) \\rmd\\tau h(x)=g(τ)f(xτ)dτ

我们这里仅讨论多项式域,即两个多项式 / 数组 / 序列的卷积。

即给定两个多项式 f ( x ) f(x) f(x) g ( x ) g(x) g(x)

f ( x ) = a 0 + a 1 x + ⋯ + a n x n f(x)= a_0 + a_1x+ \\dots +a_nx^n f(x)=a0+a1x++anxn

g ( x ) = b 0 + b 1 x + ⋯ + b m x m g(x)= b_0 + b_1x+ \\dots +b_mx^m g(x)=b0+b1x++bmxm

计算多项式 Q ( x ) = f ( x )   ⋅   g ( x ) : Q(x) = f(x)\\ ·\\ g(x): Q(x)=f(x)  g(x):

Q ( x ) = ∑ i = 0 n ∑ j = 0 m a i b j x i + j = c 0 + c 1 x + ⋯ + c n + m x n + m \\boxed Q(x) = \\sum \\limits_ i = 0 ^ n \\sum \\limits_ j = 0 ^ m a_i b_j x ^ i + j = c_0 + c_1 x + \\dots + c_ n + m x ^ n + m Q(x)=i=0nj=0maibjxi+j=c0+c1x++cn+mxn+m

C ( x ) = A ( x ) ∗ B ( x ) = ∑ i = 0 n ( ∑ j = 0 i a j b i − j ) x j + i − j = ∑ i = 0 n ( ∑ j = 0 i a j b i − j ) x i C(x)=A(x)*B(x)=\\sum_i = 0^n(\\sum_j=0^ia_j b_i-j)x^j+i-j=\\sum_i = 0^n(\\sum_j=0^ia_j b_i-j)x^i C(x)=A(x)B(x)=i=0n(j=0iajbij)xj+ij=i=0n(j=0iajbij)xi

也就是对于 C ( x ) C(x) C(x) 的第 i i i 项的系数:

[ i ] C ( x ) = ∑ j = 0 i a j b i − j [i]C(x)=\\sum_j=0^ia_j b_i-j [i]C(x)=j=0iajbij

C ( x ) = A ( x ) ∗ B ( x ) = ∑ k = 0 n + m − 2 ( ∑ k = i + j a i b j ) x k C(x)=A(x)* B(x)=\\sum_k=0^n+m-2(\\sum_k=i+ja_ib_j)x^k C(x)=A(x)B(x)=k=0n+m2(k=i+jaibj)xk

       这里使用的就是上面介绍的系数表示,我们如果直接暴力相乘很明显是一个 O ( n m ) O(nm) O(nm) 的复杂度,因为我们每一项都需要相乘。但是我们可以通过快速傅里叶变换将常用的系数表示转为点值表示用 O ( n l o g n ) O(nlogn) O(nlogn) 的时间复杂度下计算得到答案,再逆变换转成系数表示输出,将会在下面章节介绍。

0x04. 多项式的逆元

对于 n n n 次多项式 f ( x ) f(x) f(x),若存在 g ( x ) g(x) g(x),满足:
f ( x ) g ( x ) ≡ 1 ( m o d x n )  

以上是关于学习笔记多项式全家桶(包含全套证明)的主要内容,如果未能解决你的问题,请参考以下文章

快速傅里叶变换学习笔记

[学习笔记] 多项式与快速傅里叶变换(FFT)基础

快速傅里叶变换FFT学习小记

数学笔记:FFT(快速傅里叶变换)

知识总结多项式全家桶(NTT加减乘除和求逆)

快速傅里叶变换FFT及其延伸(只是一个引导)