卷积相关

复数

复数的表示

形如(a+bi)的实数成为复数
a称为实部,b称为虚部,i为虚数单位((i=sqrt{-1}))

(R)(实部)为(x)轴,以(i)(虚部)为(y)
可以将一个复数表示为该二维平面内的一个向量

复数的模长和辅角

复数的模长即对应向量的模长(r=sqrt{a^2+b^2})
辅角(arg)为该向量与(x)轴正半轴的夹角
(辅角有无限多个,每个相差(2kpi,kin Z))
那么(a=rcos arg~,b=rsin arg)
(a+bi=r(cos arg+isin arg))

复数的加法

((a+bi)+(c+di)=(a+c)+(b+d)i)
可以看做是该二维平面中向量的加法
满足三角形法则和平行四边形法则

复数的乘法

(x=a+bi=r(cos p+isin p))(y=c+di=t(cos q+isin q))

[egin{aligned} xy&=rt(cos pcos q-sin psin q+i(cos psin q+sin pcos q))\ &=rt(cos(p+q)+isin(p+q)) end{aligned} ]

因此有
(|xy|=|x||y|)
(arg(xy)=arg(x)+arg(y))

复数的n次根

(x=a+bi=r(cos p+isin p))
(x^{frac 1 n})表示满足(y^n=x的所有y)
根据乘法的性质可知
(y=r^{frac 1 n}left(cosfrac{p+2kpi}{n}+isinfrac {p+2kpi}{n} ight))
可知当(k=0dots n-1)时,(y)表示不同的(n)个复数
即一个数的(n)次单位根有(n)
几何意义上,它们组成圆内接的一个正(n)边形

n次单位根

定义(r=1,arg=0)时即复数等于实数(1)
复数的n次根为n次单位根
n次单位根(x)满足
(x=rleft(cosfrac{2kpi}{n}+isinfrac{2kpi}{n} ight))

可知(n)次单位根在复数平面的单位圆上,把圆(n)等分
(n)(n)次单位根组成(n)次单位根群(乘群)
将群中的生成元记作本原单位根
取其中一个记为(omega_n)
一般选(omega_n=cos frac {2pi}{n}+isinfrac{2pi}{n})
根据欧拉公式 (e^{ix}=cos x+isin x)
则$$omega_n=e^frac {2pi~i}{n}$$
可以用(omega_n^k,k=0dots n-1)来表示其它的(n)个单位根

n次单位根的性质

(omega_n^k=e^{frac {2kpi i} n}=cosfrac{2kpi}{n}+isinfrac{2kpi}{n})
(omega_n^k=omega_{n/2}^{k/2})
(omega_n^k=omega_n^{k~mod~n})
(omega_n^{n/2+k}=omega_n^{n/2}omega_n^k=e^{ipi}omega_n^k=-omega_n^k)(几何理解:转半个圆)
(frac 1 nsum_{i=0}^{n-1} omega_n^{ki}=[k~mod~n=0])
(当(k~mod~n=0)时全为1,否则为等比数列,和为(frac {omega_n^{nk}-1}{omega_n^k-1}=0)

形式幂级数

[F(x)=sum_{i=0}^n f_ix^i ]

基本记号

((F+G)(x)=sum_{i=0}^n(f_i+g_i)x^i)
((F imes G)(x)=sum_{i=0}^{2n}left(sum_{j+k=i}f_jg_k ight)x^i)
(Fcdot G)(FG)表示点乘(对应位相乘)
(F^n(x)=prod_{i=1}^n F(x))
(deg F)表示(F)的最高次数
没有声明的情况下,大写字母表示多项式,对应小写字母表示该多项式的系数

定义乘法

即多项式乘法
就是上面的(F imes G)

运算律

乘法满足结合率,交换律,对加法的分配率

复数域卷积

DFT的推导

利用一个if语句(frac 1 nsum_{i=0}^{n-1} omega_n^{ki}=[k~mod~n=0])

(C=A imes B)

[egin{aligned} c_k&=sum_{i+j=k} a_ib_j\ &=sum_isum_j[i+j=k]a_ib_j\ &令n为一个比(deg A+deg B)大的数\ &=sum_isum_j[i+jequiv k(mod~n)] a_ib_j\ &=sum_isum_j[(i+j-k)~mod~n=0]a_ib_j\ &=sum_isum_jfrac 1 nsum_{l=0}^{n-1}omega_n^{(i+j-k)l} a_ib_j\ &=frac 1 nsum_{l=0}^{n-1}omega_n^{-kl}left(sum_iomega_n^{il}a_i ight)left(sum_jomega_n^{jl}b_j ight)\ &=frac 1 nsum_{l=0}^{n-1}omega_n^{-kl} A(omega_n^l)B(omega_n^l)\ end{aligned} ]

DFT可以看做求点值
IDFT可以看做插值(我们之前令(n)(比deg A+deg B=deg C)大的数)

DFT的性质

(DFT[i](A)=sum_{j=0}^{n-1} a_jomega_n^{ij}=A(w_n^i))
(IDFT[i](A)=frac 1 nsum_{j=0}^{n-1}a_jomega_n^{-ij})

1.(DFT(k_1A+k_2B)=k_1DFT(A)+k_2DFT(A))
2.(DFT(A imes B)=DFT(A)cdot DFT(B))
3.(A=IDFT(DFT(A)))

FFT优化

[egin{aligned} &当kle n/2时\ A(omega_n^k)&=A_0(omega_n^{2k})+omega_n^kA_1(omega_n^{2k})\ &=A_0(omega_{n/2}^k)+omega_n^kA_1(omega_{n/2}^k)\\ &当kgt n/2时\ A(omega_n^k)&=A_0(omega_n^{2k})+omega_n^kA_1(omega_n^{2k})\ &=A_0(omega_{n/2}^k)+omega_n^kA_1(omega_{n/2}^k)\ &=A_0(omega_{n/2}^{k-n/2})-omega_n^{k-n/2}A_1(omega_{n/2}^{k-n/2})\\ &则对于j=i+n/2时\ A_i&=A_0i+omega_n^i A_1i\ A_j&=A_0i-omega_n^i A_1i\ end{aligned} ]

(n为满足之前条件的最小的2的整数次幂即可)
这样我们可以对奇数位算DFT,对偶数位算DFT,这样递归计算
最后的式子称蝶形运算
总复杂度是(T(n)=2T(n/2)+O(n))
根据主定理(T(n)=O(nlog n))
逆运算的式子长得差不多,处理也是同理的

具体实现网上很多本文不细说

mod P域卷积

模数为质数
所以该环是一个域(有单位元1,且除非零元外有逆元)
(1)(P-1)次单位根是满足之前单位根的性质的(满足下标是整数的条件下)
(P-1=2^m*C)
(2^m)(deg C)大时
我们就可以用原根来替代(omega)

判断原根与寻找原根

bool ok(LL x,int p)
{//类似某题分解质因数判原根的方法,单次log
    int l=p-1,i,L=p-1;//根据欧拉,p以内的最长循环节为p-1
    for(i=2;i*i<=l;i++) if(l%i==0){
		if(pwd(x,L/i,p)==1) return 0;
		while(l%i==0) l/=i;
    }
	if(l>1&&pwd(x,L/l,p)==1) return 0;
    return 1;
}
 
LL getrt(int p)
{
    if(p==2) return 1;
    int res=2;
    for(;!ok(res,p);res++);
    return res;
}

NTT

数论变换
不同于(omega_n=]cos(2pi/n)+isin(2pi/n))可以直接计算
NTT实现的时候要预处理(g_n),不然每次快速幂算总复杂度(O(nlog^2n))
NTT的性质与FFT相同,具体实现上网找

其它域上的卷积

待补多项式导论

集合幂级数

[F(x)=sum_{sin 2^U}f_sx^s ]

基本记号

(U={1cdots n}),代表本文的全集
(2^X)表示集合(X)的幂集,即所有(X)的子集组成的集合
(s_x)表示集合s的二进制第x位
(|s|)表示bitcount(x)

(F(x)=sum_{sin 2^U}f_sx^s)式子中
(f_s表示第s项系数,f_sx^s没有乘法的意思,x^s代表是第s项)
(e.g.~~F(x)=5x^{phi}+9x^{{1}}+3x^{{1,2}})
表示(f_{phi}=5,f_{{1}}=9,f_{{1,2}}=3)

乘法定义

注意学会类比
我们希望乘法也满足结合律,交换率,对加法的分配率
常见的几种乘法:对称差(oplus),并(cap),或(cup)
对于集合幂级数(A,B)
((Acup B)(x)=sum_{kin 2^U}left(sum_{icup j=k}a_ib_j ight)x^k)
((Acap B)(x)=sum_{kin 2^U}left(sum_{icap j=k}a_ib_j ight)x^k)
((Aoplus B)(x)=sum_{kin 2^U}left(sum_{ioplus j=k}a_ib_j ight)x^k)

FWT的推导

复数有一个(if)语句性质,这边也找一个?
((x-1)^n=sum_{i=0}^ninom n i(-1)^i x^{n-i})
所以((1-1)^n=sum_{i=0}^ninom n i(-1)^i=[n=0])
推广一下得到

[egin{aligned} &frac 1 {2^n}sum_{Tin 2^U}(-1)^{|Scap T|}=[S=phi](1)\ &sum_{Tsubseteq Xsubseteq S}(-1)^{|S|-|X|}=[T=S](2)\ &sum_{Tsupseteq Xsupseteq S}(-1)^{|X|-|S|}=[T=S](3)\ end{aligned} ]

注:除了下面推导的式子以外,不排除有其它形式的FWT式子,合理即可

于是我们以(oplus)为例推导
(C=Aoplus B),使用if语句(1)

[egin{aligned} C_k&=sum_{iin 2^U}sum_{jin 2^U}[ioplus joplus k=phi]a_ib_j\ &=sum_{iin2^U}sum_{jin 2^U}frac 1 {2^n}sum_{lin 2^U}(-1)^{|(ioplus joplus k)cap l|} a_ib_j\ &=sum_{iin2^U}sum_{jin 2^U}frac 1 {2^n}sum_{lin2^U}(-1)^{sum_{x=0}^{n-1}~~(i_x+j_x+k_x)*l_x}a_ib_j~~(注:-1自带mod~2)\ &=frac 1 {2^n}sum_{lin2^U}(-1)^{|kcap l|}left(sum_{iin2^U}(-1)^{|icap l|}a_i ight) left(sum_{jin 2^U}(-1)^{|jcap l|}b_j ight) end{aligned} ]

另外两个运算的推导可以先自己尝试推一推

(C=Acup B),使用if语句(2)

[egin{aligned} C_k&=sum_{iin2^U}sum_{jin 2^U} [icup j=k]a_ib_j\ &=sum_{iin2^U}sum_{jin2^U}sum_{(icup j)subseteq lsubseteq k}(-1)^{|k|-|l|} a_ib_j\ &=sum_{iin2^U}sum_{jin2^U}sum_{lsubseteq k}(-1)^{|k|-|l|}[(icup j)subseteq l]a_ib_j\ &因为[icup jsubseteq l]Leftrightarrow [isubseteq l][jsubseteq l]\ &=sum_{lsubseteq k}(-1)^{|k|-|l|}left(sum_{isubseteq l}a_i ight)left(sum_{jsubseteq l} b_j ight)\ end{aligned} ]

(C=Acap B),使用if语句(3)

[egin{aligned} C_k&=sum_{iin2^U}sum_{jin 2^U} [icap j=k]a_ib_j\ &=sum_{iin2^U}sum_{jin2^U}sum_{(icup j)supseteq lsupseteq k}(-1)^{|l|-|k|} a_ib_j\ &=sum_{iin2^U}sum_{jin2^U}sum_{lsupseteq k}(-1)^{|l|-|k|}[(icap j)supseteq l]a_ib_j\ &因为[icap jsupseteq l]Leftrightarrow [isupseteq l][jsupseteq l]\ &=sum_{lsupseteq k}(-1)^{|l|-|k|}left(sum_{isupseteq l}a_i ight)left(sum_{jsupseteq l} b_j ight)\ end{aligned} ]

FWT的性质

不证了也不难证
(FWT(k_1A+k_2B)=k_1FWT(A)+k_2FWT(B))
(FWT(Aoplus B)=FWT(A)cdot FWT(B))
(A=IFWT(FWT(A)))

FWT的优化

注意到(DFT o FFT)是通过奇偶序列运算近似的方法来优化计算的
对于FWT,我们可以通过最高位有无(即前半长序列与后半长序列)运算近似来优化
(A_0)为序列前半段,(A_1)为序列后半段
(A=(A_0,A_1))
对于(oplus):
(FWT(A)=(FWT(A_0+A_1),FWT(A_0-A_1)))
(IFWT(A)=(IFWT(frac {A_0+A_1}2),IFWT(frac {A_0-A_1}2)))
对于(cup):
(FWT(A)=(FWT(A_0),FWT(A_0+A_1)))
(IFWT(A)=(IFWT(A_0),FWT(A_1-A_0)))
对于(cap):
(FWT(A)=(FWT(A_0+A_1),FWT(A_1)))
(IFWT(A)=(IFWT(A_0-A_1),IFWT(A_1)))

原文地址:https://www.cnblogs.com/acha/p/7182773.html