任意模数二项卷积

二项卷积:

c n = ∑ k ( n k ) a k b n − k c_n = \sum_k \binom n k a_k b_{n-k} cn=k(kn)akbnk

当模数 M M M 有一质因子 p ≤ n p\le n pn 时,计算二项卷积无法直接变为 EGF 进行计算,因为 n ! n! n! 此时不可逆。


我们考虑首先如何解决 M = p k M = p^k M=pk 时的情况,然后可以用 CRT 合并各情况。

我们记 v p ( n ) v_p(n) vp(n) n ! n! n! p p p 的质因子次数, p p p-阶乘为 n ! p = p v p ( n ) n!_p = p^{v_p(n)} n!p=pvp(n),反 p p p-阶乘为 n ! p ‾ = n ! n ! p \overline{n!_p} = \frac{n!}{n!_p} n!p=n!pn!

那么由定义显然 n ! p ‾ \overline{n!_p} n!p 还是同余 M M M 可逆的。我们先令 a ^ n = a n ⋅ ( n ! p ‾ ) − 1   m o d   M \widehat a_n = a_n \cdot \left( \overline{n!_p} \right)^{-1} \bmod M a n=an(n!p)1modM,我们可以得到

c ^ n ≡ ∑ k ( n ! p k ! p ( n − k ) ! p ) a ^ k b ^ n − k ≡ ∑ k p v p ( n ) − v p ( k ) − v p ( n − k ) a ^ k b ^ n − k ( m o d M ) \widehat c_n \equiv \sum_k \left(\frac{n!_p}{k!_p (n-k)!_p}\right) \widehat a_k \widehat b_{n-k} \equiv \sum_k p^{v_p(n)-v_p(k)-v_p(n-k)} \widehat a_k \widehat b_{n-k} \pmod M c nk(k!p(nk)!pn!p)a kb nkkpvp(n)vp(k)vp(nk)a kb nk(modM)

d = v p ( n ) − v p ( k ) − v p ( n − k ) d = v_p(n)-v_p(k)-v_p(n-k) d=vp(n)vp(k)vp(nk) 可以推出就是在 p p p 进制下, n n n 减去 k k k 时所发生的退位次数。(这个被叫做 Kummer 定理,过程略)

n n n p p p 进制下最多只有 log ⁡ p n \log_p n logpn 位可退,因此我们知道 p d ≤ n p^d \le n pdn,因此我们在不取模的情况下,可以得到 c ^ n ≤ n ⋅ n M 2 = n 2 M 2 \widehat c_n \le n \cdot nM^2 = n^2M^2 c nnnM2=n2M2

虽然 p p p 在模 M M M 下不可逆,但是当 p ≤ n p\le n pn,自然满足在我们选取的 NTT 模数下都可逆!因此,这一涉及除法的卷积式子,因为已经保证了结果是值域在 n 2 M 2 n^2M^2 n2M2 内的整数,所以我们只需选取 NTT 模数进行卷积,之后用 CRT 合并即可。取 n ≤ 1 0 6 , M ≤ 1 0 9 n\le 10^6, M\le 10^9 n106,M109 的一般情况下,可得 c n ≤ 1 0 30 c_n \le 10^{30} cn1030,使用四个 NTT 模数进行合并足够。

因此对于每个 M = p k M=p^k M=pk 的情况,我们都可以通过“四模数 NTT”进行计算,那么对于一般的 M M M 进行 CRT,算法的复杂度为 Θ ( n log ⁡ n ⋅ ω ( M ) ) \Theta(n\log n \cdot \omega(M)) Θ(nlognω(M)),或者也可以解释为,结果值域是 n 1 + ω ( M ) M 2 n^{1+\omega(M)}M^2 n1+ω(M)M2 的卷积。


该提交记录 是一个不算精细的实现。在 ω ( M ) \omega(M) ω(M) 取到最大时大概效率是 loj 的 1s 上下波动(其实这个时候每次 CRT 不用四模数了,如果考虑这一点还能更快)。暂时没想到在“四模数 NTT”的时候避免 int128 的方法。


特殊情况:

  • p p p 很小的时候可以类比子集卷积,加一个占位多项式来帮助计算,但是这个做法的复杂度看起来会带 p p p log ⁡ p n \log_p n logpn,在 p p p 大的时候尚未想到能从此想法得到什么优秀的做法。之前思考这个问题的时候也在这里困惑了很久。
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值