「营业日志 2020.12.31」积和式 mod 2^k 算法简要介绍

本文译自: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)nx1,xni=1n(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)nx1,xni=1n(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 ndimA 个自由度组成。因此我们可以在期望 n k + O ( 1 ) n^{k+O(1)} nk+O(1) 时间内完成枚举,进而计算完答案。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值