卷积相关
復(fù)數(shù)
復(fù)數(shù)的表示
形如(a+bi)的實數(shù)成為復(fù)數(shù)
a稱為實部,b稱為虛部,i為虛數(shù)單位((i=sqrt{-1}))
以(R)(實部)為(x)軸,以(i)(虛部)為(y)軸
可以將一個復(fù)數(shù)表示為該二維平面內(nèi)的一個向量
復(fù)數(shù)的模長和輔角
復(fù)數(shù)的模長即對應(yīng)向量的模長(r=sqrt{a^2+b^2})
輔角(arg)為該向量與(x)軸正半軸的夾角
(輔角有無限多個,每個相差(2kpi,kin Z))
那么(a=rcos arg~,b=rsin arg)
則(a+bi=r(cos arg+isin arg))
復(fù)數(shù)的加法
((a+bi)+(c+di)=(a+c)+(b+d)i)
可以看做是該二維平面中向量的加法
滿足三角形法則和平行四邊形法則
復(fù)數(shù)的乘法
記(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))
復(fù)數(shù)的n次根
(x=a+bi=r(cos p+isin p))
(x^{frac 1 n})表示滿足(y^n=x的所有y)
根據(jù)乘法的性質(zhì)可知
(y=r^{frac 1 n}left(cosfrac{p+2kpi}{n}+isinfrac {p+2kpi}{n}ight))
可知當(dāng)(k=0dots n-1)時,(y)表示不同的(n)個復(fù)數(shù)
即一個數(shù)的(n)次單位根有(n)個
幾何意義上,它們組成圓內(nèi)接的一個正(n)邊形
n次單位根
定義(r=1,arg=0)時即復(fù)數(shù)等于實數(shù)(1)時
復(fù)數(shù)的n次根為n次單位根
n次單位根(x)滿足
(x=rleft(cosfrac{2kpi}{n}+isinfrac{2kpi}{n}ight))
可知(n)次單位根在復(fù)數(shù)平面的單位圓上,把圓(n)等分
且(n)個(n)次單位根組成(n)次單位根群(乘群)
將群中的生成元記作本原單位根
取其中一個記為(omega_n)
一般選(omega_n=cos frac {2pi}{n}+isinfrac{2pi}{n})
根據(jù)歐拉公式 (e^{ix}=cos x+isin x)
則$$omega_n=e^frac {2pi~i}{n}$$
可以用(omega_n^k,k=0dots n-1)來表示其它的(n)個單位根
n次單位根的性質(zhì)
(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)(幾何理解:轉(zhuǎn)半個圓)
(frac 1 nsum_{i=0}^{n-1} omega_n^{ki}=[k~mod~n=0])
(當(dāng)(k~mod~n=0)時全為1,否則為等比數(shù)列,和為(frac {omega_n^{nk}-1}{omega_n^k-1}=0))
形式冪級數(shù)
[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_kight)x^i)
(Fcdot G)或(FG)表示點乘(對應(yīng)位相乘)
(F^n(x)=prod_{i=1}^n F(x))
(deg F)表示(F)的最高次數(shù)
沒有聲明的情況下,大寫字母表示多項式,對應(yīng)小寫字母表示該多項式的系數(shù)
定義乘法
即多項式乘法
就是上面的(F imes G)啦
運算律
乘法滿足結(jié)合率,交換律,對加法的分配率
復(fù)數(shù)域卷積
DFT的推導(dǎo)
利用一個if語句(frac 1 nsum_{i=0}^{n-1} omega_n^{ki}=[k~mod~n=0])
設(shè)(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)大的數(shù)\
&=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_iight)left(sum_jomega_n^{jl}b_jight)\
&=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)大的數(shù))
DFT的性質(zhì)
(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優(yōu)化
[egin{aligned}
&當(dāng)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)\\
&當(dāng)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的整數(shù)次冪即可)
這樣我們可以對奇數(shù)位算DFT,對偶數(shù)位算DFT,這樣遞歸計算
最后的式子稱蝶形運算
總復(fù)雜度是(T(n)=2T(n/2)+O(n))的
根據(jù)主定理(T(n)=O(nlog n))
逆運算的式子長得差不多,處理也是同理的
具體實現(xiàn)網(wǎng)上很多本文不細說
mod P域卷積
模數(shù)為質(zhì)數(shù)
所以該環(huán)是一個域(有單位元1,且除非零元外有逆元)
(1)的(P-1)次單位根是滿足之前單位根的性質(zhì)的(滿足下標(biāo)是整數(shù)的條件下)
設(shè)(P-1=2^m*C)
當(dāng)(2^m)比(deg C)大時
我們就可以用原根來替代(omega)
判斷原根與尋找原根
bool ok(LL x,int p)
{//類似某題分解質(zhì)因數(shù)判原根的方法,單次log
int l=p-1,i,L=p-1;//根據(jù)歐拉,p以內(nèi)的最長循環(huán)節(jié)為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
數(shù)論變換
不同于(omega_n=]cos(2pi/n)+isin(2pi/n))可以直接計算
NTT實現(xiàn)的時候要預(yù)處理(g_n),不然每次快速冪算總復(fù)雜度(O(nlog^2n))
NTT的性質(zhì)與FFT相同,具體實現(xiàn)上網(wǎng)找
其它域上的卷積
待補多項式導(dǎo)論
集合冪級數(shù)
[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項系數(shù),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)
乘法定義
注意學(xué)會類比
我們希望乘法也滿足結(jié)合律,交換率,對加法的分配率
常見的幾種乘法:對稱差(oplus),并(cap),或(cup)
對于集合冪級數(shù)(A,B)
((Acup B)(x)=sum_{kin 2^U}left(sum_{icup j=k}a_ib_jight)x^k)
((Acap B)(x)=sum_{kin 2^U}left(sum_{icap j=k}a_ib_jight)x^k)
((Aoplus B)(x)=sum_{kin 2^U}left(sum_{ioplus j=k}a_ib_jight)x^k)
FWT的推導(dǎo)
復(fù)數(shù)有一個(if)語句性質(zhì),這邊也找一個?
((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}
]
(注:除了下面推導(dǎo)的式子以外,不排除有其它形式的FWT式子,合理即可)
于是我們以(oplus)為例推導(dǎo)
設(shè)(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_iight) left(sum_{jin 2^U}(-1)^{|jcap l|}b_jight)
end{aligned}
]
另外兩個運算的推導(dǎo)可以先自己嘗試推一推
設(shè)(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_iight)left(sum_{jsubseteq l} b_jight)\
end{aligned}
]
設(shè)(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_iight)left(sum_{jsupseteq l} b_jight)\
end{aligned}
]
FWT的性質(zhì)
不證了也不難證
(FWT(k_1A+k_2B)=k_1FWT(A)+k_2FWT(B))
(FWT(Aoplus B)=FWT(A)cdot FWT(B))
(A=IFWT(FWT(A)))
FWT的優(yōu)化
注意到(DFT o FFT)是通過奇偶序列運算近似的方法來優(yōu)化計算的
對于FWT,我們可以通過最高位有無(即前半長序列與后半長序列)運算近似來優(yōu)化
記(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)))
總結(jié)
- 上一篇: ABAP面试题系列:写一组会出现死锁(D
- 下一篇: 抖音年度报告怎么查2021 2021抖音