本文译自:http://dx.doi.org/10.1016/j.ipl.2017.04.015
为了在 n k + O ( 1 ) n^{k+O(1)} nk+O(1) 时间内计算积和式 m o d 2 k \bmod 2^k mod2k,我们首先要将其改写为另一个式子:
per A = ∑ x ∈ { 0 , 1 } n ( − 1 ) n − x 1 − … , − x n ∏ i = 1 n ( A x ) i \operatorname{per} \mathbf A = \sum_{\mathbf x\in \{0,1\}^n} (-1)^{n-x_1-\dots, -x_n} \prod_{i=1}^n (\mathbf {Ax})_i perA=x∈{0,1}n∑(−1)n−x1−…,−xni=1∏n(Ax)i
容易从组合意义上理解,这实际上就是让每个点向一个集合随便连,然后对这个集合容斥。事实上,我们可以稍微将其扩展一点,对任意 r \mathbf r r,都有
per A = ∑ x ∈ { 0 , 1 } n ( − 1 ) n − x 1 − … , − x n ∏ i = 1 n ( A x + r ) i \operatorname{per} \mathbf A = \sum_{\mathbf x\in \{0,1\}^n} (-1)^{n-x_1-\dots, -x_n} \prod_{i=1}^n (\mathbf {Ax+r})_i perA=x∈{0,1}n∑(−1)n−x1−…,−xni=1∏n(Ax+r)i
这是因为考虑构造矩阵 A ′ \mathbf A' A′ 为
A ′ = ( A r T 1 ) \mathbf A' =\begin{pmatrix} \mathbf A & \mathbf r^{\mathsf T}\\ & 1 \end{pmatrix} A′=(ArT1)
根据原始定义,显然有 per A ′ = per A \operatorname{per} \mathbf A' = \operatorname{per} \mathbf A perA′=perA,而在容斥公式中枚举 x n + 1 x_{n+1} xn+1 时必须为 1 1 1,否则乘积直接为 0 0 0,因此得证。
那么接下来我们观察容斥式子的好处,它直接将一个 n ! n! n! 级别的和式转化为了 2 n 2^n 2n 项求和,而每项都是一个乘积的形式!对于 A x + r \mathbf{Ax+r} Ax+r,如果其中有 k k k 个偶数,那么乘积就会是 2 k 2^k 2k 的倍数,由于域总是具有更好的性质,我们不妨先考虑整个问题 m o d 2 \bmod 2 mod2 的情况下 A x + r \mathbf {Ax+r} Ax+r 有几个 0 0 0。显然因为 A \mathbf A A 是输入的, x \mathbf x x 是枚举的,所以我们必须通过调整 r \mathbf r r 来使得贡献不是 2 k 2^k 2k 倍数的 x \mathbf x x 变少。我们能做到多好呢?设 X \mathbf X X 是这样的 x \mathbf x x 的集合,只需注意在 r \mathbf r r 在 F 2 n \mathbb F_2^n F2n 内随机选取的时候,有
E [ ∣ X ∣ ] = ∑ j < k ( n j ) \mathbb E[|\mathbf X|] = \sum_{j<k} \binom nj E[∣X∣]=j<k∑(jn)
这是很好证明的,因为此时 A x + r \mathbf{Ax+r} Ax+r 直接被 r \mathbf r r 的选取稀释为了均匀分布。显然存在一个 r \mathbf r r 使得 ∣ X ∣ < E [ ∣ X ∣ ] |\mathbf X| < \mathbb E[|\mathbf X|] ∣X∣<E[∣X∣]。
接下来,对于一个向量 v \mathbf v v,我们求解 A x = v \mathbf {Ax=v} Ax=v 的时候,显然 x \mathbf x x 由一个特解加上 n − dim A n-\dim\mathbf A n−dimA 个自由度组成。因此我们可以在期望 n k + O ( 1 ) n^{k+O(1)} nk+O(1) 时间内完成枚举,进而计算完答案。