數學 快速Walsh變換

2022-05-11 05:45:11 字數 1515 閱讀 3512

給兩個長度為 \(n\) 的序列 \(a,b\) ,滿足 \(n=2^k\) ,序列標號為 \(a_0,a_1,\cdots,a_\) ,

求and卷積:

序列 \(c\) ,滿足 \(c_i=\sum\limits_a_j\cdot b_k\)

求or卷積:

序列 \(c\) ,滿足 \(c_i=\sum\limits_a_j\cdot b_k\)

求xor卷積:

序列 \(c\) ,滿足 \(c_i=\sum\limits_a_j\cdot b_k\)

複雜度 \(o(nlogn)\)

模數可以任意選,但是小心這個除以2是怎麼實現,當模數是質數的時候可以用2的逆元。

namespace fwt 

inline int sub(const int &x, const int &y)

inline int mul(const int &x, const int &y)

/* op =

+1 and

-1 iand

+2 or

-2 ior

+3 xor

-3 ixor

*/void fwt(int *a, int n, int op) }}

}}

/* op =

+1 and

+2 or

+3 xor

*/void convolution(int *a, int *b, int n, int op)

};

求子集卷積:

序列 \(c\) ,滿足 \(c_i=\sum\limits_a_j\cdot b_k\)

複雜度:\(o(n\log^2 n)\)

inline int cnt1(const int &x) 

const int mod = 1e9 + 9;

const int inv2 = (mod + 1) >> 1;

inline int add(const int &x, const int &y)

inline int sub(const int &x, const int &y)

inline int mul(const int &x, const int &y)

void fwt(int *a, int n) }}

}void ifwt(int *a, int n) }}

}int ln, n;

const int maxlogn = 20;

int a[maxlogn + 1][1 << maxlogn];

int b[maxlogn + 1][1 << maxlogn];

int c[maxlogn + 1][1 << maxlogn];

void solve()

for(int i = 0; i < n; ++i)

printf("%d%c", c[cnt1(i)][i], " \n"[i == n - 1]);

}

Walsh函式 極度的數學美

walsh函式取值簡單,僅取0和1兩個值,但是它們在這兩個值之間頻繁地躍變,似乎比三角函式要複雜得多。表面上複雜的函式,多種的排序方式,依據表示式難以作出它們的圖形,傳統的數學處理方法 如微積分 難以奏效,但它竟然是由乙個簡單的方波演化生成的。從方波r x 1處罰,經過伸縮平移的二分手續即可加工出w...

快速傅利葉變換 快速數論變換

update 3.29.2017 2月10日初學,記得那時好像是正月十五放假那一天 當時寫了手寫版的筆記 過去近50天差不多忘光了,於是複習一下,具體請看手寫版筆記 參考文獻 picks miskcoo menci 阮一峰 i 表示逆時針旋轉90度 a bi 對應復平面上的向量 複數加法同向量 複數...

快速傅利葉變換

學習快速傅利葉變化是量子計算中的基礎,查了很多資料,以下鏈結可以作為參考 本部落格部分知識學習於 最後這個裡面有解釋蝴蝶效應是怎麼來的!實用數字訊號處理 dft 離散傅利葉變換 o n2 計算多項式乘法 fft 快速傅利葉變換 o n log n 計算多項式乘法 fntt ntt 快速傅利葉變換的優...