ビットコンピューティング畳み込み

定義

\ [\開始{整列} MEX(A、B)= \ sum_ {i = 0} ^ {K-1} MEX(a_iを、b_i)3 ^ I \端{整列} \]

前記\(a_iを、b_i \)を表し\(B \)三部\(I \)ビットは、シーク

\ [\ \ {整列} c_k = \ sum_ {MEX(I、J)= K} a_iをを開始し、b_j \端{整列}]

私たちは、最初に記載されている柿

\ [\ {整列}始める&C_0 = a_1b_2 + a_2b_1 + a_1b_1 + a_2b_2 \\&C_1 = a_0b_0 + a_0b_2 + a_2b_0 \\&C_2 = a_0b_1 + a_1b_0 \端{整列} \]

各項目は、次にプロットを補うために、左から右へ二つの同じ形の形で表現して見つけることができている(3 \)\ビットが十分ではありません、プラスはるかに1、余分なAなければならない\(C_3を\)

\ [\ {整列}始める&C_0 =(A_1 + A_2)(B_1 + B_2)\\&C_0 + C_1 + C_2 =(A_0 + A_1 + A_2)(B_0 + B_1 + B_2)\\&C_3 = a_2b_2 \\&C_1 + C_3 =(A_0 + A_2)(B_0 + B_2)\端{整列} \]

それはそれは何だ\(FWT \) 私たちが必要なので4で、あなたは三三四の最後のターンバックを有効にする必要がありますので、タイトルは、3です

複雑\(O(K4 ^ k)は \)

コードは以下の通りです

inline void FWT(int &a,int &b,int &c,int &d){
    int x0=a,x1=b,x2=c;
    a=x1+x2,b=x0+x1+x2,c=x0+x2,d=x2;
}
inline void IFWT(int &a,int &b,int &c,int &d){
    int x0=a,x1=b,x2=c;
    a=x0,b=x2-d,c=x1-x0-x2+d;
}
inline void FWT(int *a,int lim){
    for(R int mid=1;mid<lim;mid<<=2)
        for(R int j=0;j<lim;j+=(mid<<2))
            fp(k,0,mid-1)
            FWT(a[j+k],a[j+k+mid],a[j+k+mid*2],a[j+k+mid*3]);
}
inline void IFWT(int *a,int lim){
    for(R int mid=1;mid<lim;mid<<=2)
        for(R int j=0;j<lim;j+=(mid<<2))
            fp(k,0,mid-1)
            IFWT(a[j+k],a[j+k+mid],a[j+k+mid*2],a[j+k+mid*3]);
}

私たちは、ある3つのバイナリ畳み込みも説明するために、このルーチンを使用することができます

しかし、それだけでドメインを展開し、そのメソッドを使用しますので、一緒に三元の巡回畳み込み係数をこすりことができませんでした

誰もが古い鳩を掻き出すことができるなら、あなたは以下の私をからかっ楽しむことができます

おすすめ

転載: www.cnblogs.com/yuanquming/p/11804462.html