这一节,我们讲讲子集卷积在任意环上的推广,和在min-sum半环上的一个做法。
讲之前解释一下一些简单的代数结构。
一些代数概念
半群(semigroup):如果一个集合 和定义在这个集合上的一个二元运算 ,(既是函数 ),满足结合律(Associaltivity),即: 那么称 为半群。
幺半群(monoid):如果对于一个半群 ,存在单位元(Identity),即: 则称 为幺半群。
群(group):如果一个幺半群 ,满足任意元素存在逆元(Invertibility),即: 则称 为群。
阿贝尔群(Abelian group):如果一个群 ,满足交换律(Commutativity),即: 则称 为阿贝尔群,或者交换群。
比如正整数的加法 就是一个半群,而自然数的加法 就是一个幺半群,整数的加法 就是一个阿贝尔群。
半环(semiring):如果一个三元代数结构 ,对于 都满足结合律和交换律, 对于 来说满足分配律(distrbutivity),即: ,并且存在两个元素 ,满足 是 的零元素,即 , 是 的单位元, 是 的单位元,那么称 是半环。
环(ring):如果一个三元代数结构 ,满足 是个阿贝尔群, 是一个幺半群,并且 对于 满足分配律,那么 就是一个环。
环与子集卷积
在之前的文章中,我们讨论的都是值域定义在环 的函数,其中 是整数加法, 是整数乘法。而我们所有的变换,zeta变换,Mobius变换,或者之后的子集卷积运算,都没有超出环的范围。
换句话说,只要我们想,我们可以对值域定义在任意的环上的函数进行zeta变换,Mobius变换,子集卷积运算。
举个栗子:我们有两个函数 ,我们想计算如下卷积: ,即把 乘运算,换成了 取最小运算。即环 (这是一个合法的环,大家可以思考一下为什么)。这样的卷积,依然是可以利用zeta变换和Mobius变换快速计算,当然我们需要把zeta变换和Mobius变换的 运算也变成 。
半环min-sum上的子集卷积与覆盖积
我们现在可以计算 环上的子集卷积了,但是如果我们想换过来呢?比如我们想计算 上的子集卷积。
然而很不幸, 并不是一个阿贝尔群(因为没有逆元),即对于 ,不存在 ,使得 ,从而 不是一个环。
不难验证, 其实是个半环。zeta变换对于半环来说是没有任何问题的,但是到了Mobius变换,我们就需要求 的逆元(因为运算中有个 ),所以我们不能计算Mobius变换。但这并不意味着min-sum上的子集卷积是不可做的,我们可以转换到一个环上(虽然会增加复杂度)。
定理13:对于两个函数 ,输入 全部 个值,所有 在min-sum半环上的子集卷积的 个输出值可以在 的时间内计算出来。对覆盖积也成立。
证明:令 ,我们构造连个新的函数 ,其中 。我们考虑卷积: 其中 表示 的 的个数。这个卷积是一般的子集卷积,所以我们是能直接算出来等式左侧的。我们知道 ,所以我们可以计算出所有的 (考虑等式左侧表达成 进制)。
所以我们就能得到, 。
我们将半环上的 转换到环上的 ,所以我们可以在 的复杂度内计算。但是由于 是个 bit的大整数,所以在这个整数上的四则运算的复杂度也该被考虑进来。故我们有复杂度 。
证毕。
下一节将讲一些子集卷积的应用~