子集卷积学习笔记

本文介绍了子集卷积的概念,包括或卷积、与卷积和异或卷积。通过转换思想,利用类似于FFT的方法,将子集卷积的复杂度降低到线性或对数级别。文中给出了详细的计算过程和代码示例,帮助理解并实现子集卷积的高效算法。
摘要由CSDN通过智能技术生成

前言

子集卷积,指的是 c i = ∑ j ⊕ k = i a j × b k c_i=\sum\limits_{j\oplus k=i}a_j\times b_k ci=jk=iaj×bk,其中 ⊕ \oplus 指的是 ∪ , ∩ , x o r \cup,\cap,xor ,,xor
在这里,把 i , j , k i,j,k i,j,k 的二进制看作集合。

或卷积

现在我们先求 c i = ∑ j ∪ k = i a j × b k c_i=\sum\limits_{j\cup k = i}a_j\times b_k ci=jk=iaj×bk
朴素的求法是 O ( n 2 ) O(n^2) O(n2) 的。
我们回忆 F F T FFT FFT 是怎么加速卷积过程的。 F F T FFT FFT 是快速得到多项式的一个点值表示,其实是找到一种变换,满足 C i ′ = A i ′ × B i ′ C'_i=A'_i\times B'_i Ci=Ai×Bi,让它能够在 O ( n ) O(n) O(n) 的时间内得到 C C C 的点值表示。
在这里,我们也用这个思想。不妨令 A ′ A' A 表示 A A A 的变换。
注意到(我也不知道怎么想出来的),当 a i ′ = ∑ j ⊆ i a j a'_i=\sum\limits_{j\subseteq i}a_j ai=jiaj c i ′ = a i ′ × b i ′ c'_i=a'_i\times b'_i ci=ai×bi
a i ′ a'_i ai 其实就是子集和。我们稍微证明一下。

c i ′ = ∑ d ⊆ i c d = ∑ d ⊆ i ∑ j ∪ k = d a j × b k = ∑ j ∪ i , k ∪ i a j × b k = ( ∑ j ∪ i a j ) × ( ∑ k ∪ i b k ) = a i ′ × b i ′ c'_i=\sum\limits_{d\subseteq i}c_d=\sum\limits_{d\subseteq i}\sum\limits_{j\cup k=d}a_j\times b_k=\sum\limits_{j\cup i,k\cup i}a_j\times b_k=(\sum\limits_{j\cup i}a_j)\times(\sum\limits_{k\cup i}b_k)=a'_i\times b'_i ci=dicd=di

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值