测测你的 01 矩阵乘法
WorldMachine · · Algo. & Theory
测测你的 01 矩阵乘法!
这里的 01 矩阵乘法是指模
暴力容易做到
for (int i = 0; i < N; i++) {
for (int k = 0; k < N; k++) {
for (int j = 0; j < N; j++) c[i][j] ^= a[i][k] & b[k][j];
}
}
注意循环顺序:不仅有助于内存连续访问,更有助于想出进一步的优化。
注意到上面的代码等价于:
for (int i = 0; i < N; i++) {
for (int k = 0; k < N; k++) {
for (int j = 0; j < N; j++) if (a[i][k]) c[i][j] ^= b[k][j];
}
}
容易想到使用 bitset 优化:
for (int i = 0; i < N; i++) {
for (int k = 0; k < N; k++) if (a[i][k]) c[i] ^= b[k];
}
这样复杂度就做到了
考虑进一步的优化。
对
然后计算该块对
复杂度为
这个代码很好写。
for (int l = 0, r = B; l ^ N; l = r, r += B) {
if (__builtin_expect(r > N, 0)) r = N;
for (int i = 1; i ^ N; i++) f[i] = f[i ^ Lb[i]] ^ b[l + Lg[Lb[i]]];
for (int i = 0, k = 0; i ^ N; i++, k = 0) {
for (int j = l; j ^ r; j++) k ^= a[i][j] << j - l;
c[i] ^= f[k];
}
}
跑得还是很快的,