• 卷积相关


    复数

    复数的表示

    形如(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)))

  • 相关阅读:
    man LVCREATE
    Pyhton---基础---递归
    Python---基础---循环,函数
    Python---基础---dict_tuple_set
    Python---基础---dict和set2
    安卓网络编程学习(1)——java原生网络编程(1)
    使用python爬取B站弹幕和三连
    maven项目整合工具学习
    读阿里巴巴泰山版《java开发手册》总结(2)
    第十三周学习进度
  • 原文地址:https://www.cnblogs.com/acha/p/7182773.html
Copyright © 2020-2023  润新知