前言
对于一个序列,将其中的元素一一映射到一个多项式函数的系数上,这个多项式函数便叫做该序列的生成函数。
对于序列 f 0 , f 1 , ⋯ , f n f_0,f_1,\cdots,f_n f0,f1,⋯,fn, f ( x ) = ∑ i = 0 n f i x i f(x)= \sum_{i=0}^n f_ix^i f(x)=∑i=0nfixi为其生成函数,我们一般叫他们多项式。
卷积是通过两个函数 f f f和 g g g生成第三个函数的一种数学运算,其本质是一种特殊的积分变换。
当多项式卷积为 C k = ∑ i + j = k A i × B j C_k=\sum_{i+j=k} A_i \times B_j Ck=∑i+j=kAi×Bj。
我们可以用FFT,NTT来做。
而当多项式卷积为(这里 ⊕ \oplus ⊕指代异或): C k = ∑ i ∣ j = k A i × B j C_k=\sum_{i|j=k} A_i \times B_j Ck=i∣j=k∑Ai×Bj C k = ∑ i & j = k A i × B j C_k=\sum_{i\&j=k} A_i \times B_j Ck=i&j=k∑Ai×Bj C k = ∑ i ⊕ j = k A i × B j C_k=\sum_{i \oplus j=k} A_i \times B_j Ck=i⊕j=k∑Ai×Bj我们的FFT,NTT就不能派上用场了,这就要用到下面讲的FWT\FMT。而一般来讲,FMT(快速莫比乌斯变换)处理OR,AND问题,而FWT(快速沃尔什变换)是处理XOR问题的。
正文
OR运算的FMT
我们不妨先回忆一下FFT的思路:
先对于一个多项式求出它在带入若干单位根后的点值表示法,然后把点值表示法下的多项式乘起来,然后再把点值表示法变成多项式表示法。
FMT的思路与此类似。
不过,由于这三类与位运算关联的多项式卷积有其特殊的性质,我们不再代入若干指定的值,而是先进行一些变换。
我们不妨进行如下定义:
要求 c k = ∑ i ∣ j = k a i × b j c_k=\sum_{i|j=k} a_i \times b_j ck=i∣j=k∑ai×bj设 F M T ( f n ) = ∑ i ∣ n = n f i FMT(f_n)= \sum_{i | n=n} f_i FMT(fn)=i∣n=n∑fi不难发现
F M T ( a t ) × F M T ( b t ) = ( ∑ i ∣ t = t a i ) × ( ∑ j ∣ t = t b j ) = ∑ i ∣ t = t ∑ j ∣ t = t ( a i × b j ) = ∑ ( i ∣ j ) ∣ t = t ( a i × b j ) = F M T ( c t ) FMT(a_t) \times FMT(b_t) \\ =(\sum_{i|t=t}a_i) \times (\sum_{j|t=t}b_j) \\ = \sum_{i|t=t} \sum_{j|t=t} (a_i \times b_j) \\ = \sum_{(i|j)|t=t}(a_i \times b_j) \\ =FMT(c_t) FMT(at)×FMT(bt)=(∑i∣t=tai)×(∑j∣t=tbj)=∑i∣t=t∑j∣t=t(ai×bj)=∑(i∣j)∣t=t(ai×bj)=FMT(ct)
由此可得 F M T ( a t ) × F M T ( b t ) = F M T ( c t ) FMT(a_t) \times FMT(b_t)=FMT(c_t) FMT(at)×FMT(bt)=FMT(c

本文介绍了如何利用快速沃尔什变换(FWT)和快速莫比乌斯变换(FMT)来高效地处理多项式卷积中的OR, AND和XOR运算,通过FMT的巧妙设计,展示了在多项式乘法中的应用,并提供了相应的算法实现和时间复杂度分析。
最低0.47元/天 解锁文章
1606

被折叠的 条评论
为什么被折叠?



