給兩個長度為 \(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 快速傅利葉變換的優...