「做多项式题就像嗑药,出多项式题就像贩毒。」 —— 某福建知名OI选手
学了学红日bn一年前玩剩下的东西。
倒是扩展了 FWT 的一种思路吧。
基本卷积算法
加法卷积
用于解决形如以下问题: 给出两个序列
A,B。求两个序列的卷积序列
C,其中序列
C
的定义如下
Ck=i+j=k∑Ai×Bj(1)
序列可以看作是函数的系数表示法,所以我们可以定义函数 $F(x) = _{i }
A_i x^i $ 和函数
G(x)=∑i≥0Bixi
分别对应序列
A,B
的两个函数。
类似的,还可以定义序列
C
对应函数
T(x)=∑i≥0Cixi。
注意到这种定义就是将序列的第
i
个数当作多项式函数的第
i
次系数。
注意到
T(x)=F(x)×G(x)(2)
这个是后面卷积方法的核心工作原理。本质上是 建立了
序列运算 与其对应 函数(多项式)运算
的一种联系。
注意到 (eq.~eq. 2) 也可以理解为对于任意常数
a,总有
T(a)=F(a)×G(a)。
也就是说,如果我们知道了
G(x)
和
F(x)
在
a
处的函数值,那么他们相乘就能够得到
T(x)
在
a
处的函数值。
考虑如果存在一种变换,能够快速计算
G(x)
和
F(x)
在某些特定自变量
a1,a2,a3,⋯ak
处的函数值,那么就能快速算出
T(x)
在这些自变量处的函数值。
如果存在某种逆变换,能够快速将函数在某些自变量处的函数值转换成每一次项的系数,那么就能够求出
T(x)
的系数(即序列
C)了。
总的来说,希望存在一种序列上变换
FFT(T),使得
FFT(C)=FFT(A×B)=FFT(A)⋅FFT(B)
其中
×
表示序列加法卷积
(eq.~eq. 1),⋅
表示对应位置相乘。
并且这种变换存在逆变换,能够将
FFT(C)
还原为
C
。
通过上述描述可以发现,对于一个函数
G(x)
来说,其表示成序列的方式有两种:一种是构造序列,使得序列第
i
位为多项式函数
G(x)
的第
i
次项系数。另一种是指定一系列取值a1,a2,a3,⋯ak
,分别带入函数中,得到的函数值依次排开,成为一个序列。我们称前者为函数
G(x)
的系数表示法,称后者为其点值表示法。而我们所希望的变换就是能够实现函数的系数表示法
与 点值表示法 相互转化。
因为
两函数相乘时,其对应的系数表示法的序列就是在做卷积操作,对应了我们希望的运算,但是这个并不能快速计算。而两函数相乘,对于点值表示法,就仅仅是对应位置相乘,这个可以快速计算。所以可以考虑如果能够快速实现
函数的系数表示法 与 点值表示法
相互转化。就能够解决上述问题。可以先转化为点值表示法,然后对点相乘后,再转换为系数表示法,就相当于对序列做卷积。
快速傅里叶变换(FFT)
快速傅里叶变换
就是一种满足上述条件的变换。她可以使得函数在系数表示法与点值表示法之间转换。
时间复杂度为
O(nlogn)。
考虑上述过程中,并没有限制点值表示法中的点值应该取哪些值,所以可以考虑取一些有丰富性质的数字,利用这些性质加速运算。
对于 FFT 我们取 n次单位根
来加速运算。n
为待变换序列长度。
单位根
n 次单位根记作
ωn。其定义为
ωn=cosn2π+isinn2π,这是一个虚数。虚数可以通过向量来表示,而
ωn
就可以考虑为一个模长为
1
,与
x
轴夹角为
n2π
的向量。易知,
ωnk=cosn2πk+isinn2πk。
他有如下性质
- ωnk=ω2n2k
- ωnk+2n=−ωnk
- ωn0=ωnn=1
这些性质都可以通过其定义得知。
考虑将
ωn0,ωn1,ωn2,⋯,ωnn−1
带入函数,得到点值即可。
蝴蝶操作
分别抽取函数
F(x)
的奇、偶次项系数构成两个新函数
G(x),H(x)。
易知:
F(x)=G(x2)+xH(x2)
即
F(ωnk)=G(ωn/2k)+ωnkH(ωn/2k)
F(ωnk+n/2)=G(ωn/2k)−ωnkH(ωn/2k)
划分了子问题,分治即可。这里必须保证
n=2k,k∈N
逆变换
单位根还有如下性质
i=0∑n−1(ωnk)i=⎩⎨⎧0nk=0k=0
第二种情况显然,第一种情况根据等比数列求和公式可以得证。
根据上述性质,我们只需要取单位根为之前的倒数,然后跑一遍
FFT
对结果除以
n
即可。 不会推QAQ。
快速数论变换(NTT)
FFT 需要实数运算,对精度要求较高。且无法解决常见的取模要求。
注意到
FFT
中所依赖的是一个复平面上的单位圆,其实剩余系本身就可以看作一个环。可以考虑在剩余系下寻找具有与单位根性质类似的数字。
设质数
P
的原根为
g。那么
∀k∈[0,φ(P)−1],k∈N,gk,可以表示
P
的剩余系中除
0
以外的任何数字,显然可表示的数字有
P−1
个。
以下关于剩余系类比复平面单位圆的描述由笔者口胡,不保证语言严谨。
在
FFT
中取单位根的方式本质上实在均分复平面上单位圆。而
NTT
中,如果将
gk
依次排成一个环,即剩余系,我们一样可以通过均分这个环,来取剩余系下的“单位根”,来获得和之前复平面单位根
类似性质的一些数。显然,这里需要保证在我们均分单位圆的过程中,每个值都能取到,也就是
n∣φ(P),即
n∣(P−1)。
所以这里的剩余系取值有一定要求,变换中所要求的
n
都是
2
的次幂,需要保证
P−1
中
2
的幂次应该足够大。(文末附质数取值表)
设
P−1=q×n。
考虑将
gn=gq
当作
ωn
即可,根据上面的描述,ωn
所具有的性质,gn
显然成立。这里的
q
可以想成等分环时的单位角度。
关于 蝴蝶操作 和 逆变换 的手法和
FFT
是一样的。
位运算卷积
类似地,定义位运算序列卷积。 给出两个序列
A,B。求两个序列的卷积序列
C,其中序列
C
的定义如下
Ck=i⊕j=k∑Ai×Bj(3)
可以仿照上述思路,构造一种作用在序列上的变换
FWT,使得其满足
FWT(C)=FWT(A⊕B)=FWT(A)⋅FWT(B)(4)
A⊕B
中的
⊕
指某种位运算。指下标的运算方式。即 (eq.~eq. 3) 中的
i⊕j=k。
快速沃尔什变换(FWT)
考虑分治处理,令
A0
为
A
的前一半,
A1
为
A
的后一半。可以考虑如果已经求出了
FWT(A0)
和
FWT(A1),如何求出
FWT(A)。
顺便定义函数
merge(A,B)
表示将序列
A,B
直接前后拼接,返回拼接后的大序列。例如
A=merge(A0,A1)。
或运算
考虑如何构造
FWT
的方式,使得:
FWT(A∣B)=FWT(A)⋅FWT(B)(5)
对于或运算卷积,直接给出结论。我们定义当前情况下的
FWT
的运算规则如下。
FWT(A)=merge(FWT(A0),FWT(A0)+FWT(A1))(6)
其中
+
为序列对应位置相加。
现在证明:已知 (eq.~eq. 6), (eq.~eq. 5) 成立。
将
FWT
简记为
F,将
merge(A,B)
简记为
[A,B]
首先试图从等式左边开始推导:
F(A)⋅F(B)=[F(A0), F(A0)+F(A1)]⋅[F(B0), F(B0)+F(B1)]=[F(A0)⋅F(B0), (F(A0)+F(A1))⋅(F(B0)+F(B1))]=[F(A0)⋅F(B0), F(A0)⋅F(B0)+F(A0)⋅F(B1)+F(A1)⋅F(B0)+F(A1)⋅F(B1)]
再从等式右边开始推导,先假设当序列长度为
2∣A∣
时,根据 (eq.~eq. 6) 能够使得 (eq.~eq. 5) 成立。
F(A ∣ B)=F([A0∣B0,A0∣B1+A1∣B0+A1∣B1])=[F(A0∣B0), F(A0∣B1)+F(A1∣B0)+F(A1∣B1)+F(A0∣B0)]=[F(A0)⋅F(B0), F(A0)⋅F(B0)+F(A0)⋅F(B1)+F(A1)⋅F(B0)+F(A1)⋅F(B1)]
我们假设结论在 序列长度为
2∣A∣
时 成立,能够推出 序列长度为
∣A∣
时 成立,就能够推出上述结论在任何情况下均适用(数学归纳法)。
考虑如何构造逆变换
iFWT
的运算规则。 相当于每一步都反向操作。
因为:
FWT(A)=merge(FWT(A0),FWT(A0)+FWT(A1))
相当于,现在已经得到了
A0′=A0
,A1′=A0+A1
那么易知:
A0=A0′
A1=A1′−A0′
因此,逆变换就是:
iFWT(A)=merge(iFWT(A0),iFWT(A1)−iFWT(A0))
需要注意的是:
FWT(A)i=j⊆i∑Aj
与运算
FWT(A)=merge(FWT(A0)+FWT(A1),FWT(A1))
iFWT(A)=merge(iFWT(A0)−iFWT(A1),iFWT(A1))
需要注意的是:
FWT(A)i=i⊆j∑Aj
一般方法
构造的逆运算为解方程。
考虑如何根据一种位运算,求出一种合法的
FWT/iFWT
构造方式。这里的合法指这种构造方式满足 (eq.~eq. 4)
考虑某种位运算
⊕
的
FWT
应该是什么样子。根据上面的两个例子,可以设出如下式子:
F(A)=merge(a⋅F(A0)+b⋅F(A1) ,c⋅F(A0)+d⋅F(A1))
这里的
a,b,c,d
为常数,“⋅”
为普通乘法。
为了方便,设
U=F(A0),V=F(A1),
W=F(B0),X=F(B1)
则:
F(A)⋅F(B)=[aU+bV,cU+dV]⋅[aW+bX,cW+dX]=[a2UW+2ab(UX+VW)+b2VX,c2UW+2cd(UX+VW)+d2VX ](7)
这里以异或为例,因为序列是中间分成两个序列,不妨设序列长度均为
2
的若干次方,那么分开之后,其下标的最高位一定是前一半为 0 后一半为
1,根据异或的运算规则,哪些元素组合起来能够什么样的最高位即可。
假设上式在 序列长度为
2∣A∣
时是成立的。则:
F(A⊕B)=F([A0⊕B0+A1⊕B1,A0⊕B1+A1⊕B0])=[aF(A0⊕B0+A1⊕B1)+bF(A0⊕B1+A1⊕B0),cF(A0⊕B0+A1⊕B1)+dF(A0⊕B1+A1⊕B0)]=[aF(A0⊕B0)+aF(A1⊕B1)+bF(A0⊕B1)+bF(A1⊕B0),cF(A0⊕B0)+cF(A1⊕B1)+dF(A0⊕B1)+dF(A1⊕B0)]=[aF(A0)F(B0)+aF(A1)F(B1)+bF(A0)F(B1)+bF(A1)F(B0),cF(A0)F(B0)+cF(A1)F(B1)+dF(A0)F(B1)+dF(A1)F(B0)]=[aUW+aVX+bUX+bVW , cUW+cVX+dUX+dVW]
和 (eq.~eq. 7) 对齐系数可以得到如下方程组:
⎩⎨⎧a=a2a=b2b=2abc=c2c=d2d=2cd
解上面的方程组即可,显然有许多解。但是考虑到不仅需要
FWT
,还需要
iFWT。有些解无法保证
iFWT
能够存在解。
由:
F(A)=merge(a⋅F(A0)+b⋅F(A1) ,c⋅F(A0)+d⋅F(A1))
设
X=a⋅F(A0)+b⋅F(A1),Y=c⋅F(A0)+d⋅F(A1)。问题变成了已知
X,Y,求出
F(A0),F(A1),可以解得:
F(A1)=da−bcaY−cX
F(A0)=da−bcdX−bY
因此上述方程组中,解还需要需要保证
ad=bc。
可以解出一如下两组解:
⎩⎨⎧a=1b=−1c=1d=1
⎩⎨⎧a=1b=1c=1d=−1
上述两组解带入后都可以实现异或卷积。
质数表
来自 min_25的博客Orz
最长周期
n |
质数 |
原根 |
z(zn=1) |
p−1的因数分解 |
226 |
469762049 |
3 |
2187 |
226×7 |
225 |
167772161 |
3 |
243 |
225×5 |
224 |
754974721 |
11 |
739831874 |
224×32×5 |
223 |
377487361 |
7 |
48510621 |
223×32×5 |
223 |
595591169 |
3 |
361399025 |
223×71 |
223 |
645922817 |
3 |
224270701 |
223×7×11 |
223 |
880803841 |
26 |
273508579 |
223×3×5×7 |
223 |
897581057 |
3 |
872686320 |
223×107 |
223 |
998244353 |
3 |
15311432 |
223×7×17 |
222 |
104857601 |
3 |
39193363 |
222×52 |
222 |
113246209 |
7 |
58671006 |
222×33 |
222 |
138412033 |
5 |
99040867 |
222×3×11 |
222 |
155189249 |
6 |
14921912 |
222×37 |
222 |
163577857 |
23 |
121532577 |
222×3×13 |
222 |
230686721 |
6 |
71750113 |
222×5×11 |
222 |
415236097 |
5 |
73362476 |
222×32×11 |
222 |
666894337 |
5 |
147340140 |
222×3×53 |
222 |
683671553 |
3 |
236932120 |
222×163 |
222 |
918552577 |
5 |
86995699 |
222×3×73 |
222 |
935329793 |
3 |
86363943 |
222×223 |
222 |
943718401 |
7 |
754500478 |
222×32×52 |
222 |
985661441 |
3 |
79986183 |
222×5×47 |
221 |
111149057 |
3 |
60767546 |
221×53 |
221 |
132120577 |
5 |
102376994 |
221×32×7 |
221 |
136314881 |
3 |
2981173 |
221×5×13 |
221 |
169869313 |
5 |
143354861 |
221×34 |
221 |
186646529 |
3 |
88383805 |
221×89 |
221 |
199229441 |
3 |
174670364 |
221×5×19 |
221 |
211812353 |
3 |
113852926 |
221×101 |
221 |
249561089 |
3 |
61724276 |
221×7×17 |
221 |
257949697 |
5 |
186470816 |
221×3×41 |
221 |
270532609 |
22 |
74891632 |
221×3×43 |
221 |
274726913 |
3 |
255478716 |
221×131 |
221 |
383778817 |
5 |
324881819 |
221×3×61 |
221 |
387973121 |
6 |
124477810 |
221×5×37 |
221 |
459276289 |
11 |
238723101 |
221×3×73 |
221 |
463470593 |
3 |
428228038 |
221×13×17 |
221 |
576716801 |
6 |
153098993 |
221×52×11 |
221 |
597688321 |
11 |
395834143 |
221×3×5×19 |
221 |
635437057 |
11 |
171402456 |
221×3×101 |
221 |
639631361 |
6 |
432237000 |
221×5×61 |
221 |
648019969 |
17 |
592437138 |
221×3×103 |
221 |
710934529 |
17 |
69533131 |
221×3×113 |
221 |
715128833 |
3 |
355872337 |
221×11×31 |
221 |
740294657 |
3 |
237508734 |
221×353 |
221 |
786432001 |
7 |
228383098 |
221×3×53 |
221 |
799014913 |
13 |
374051146 |
221×3×127 |
221 |
824180737 |
5 |
133412682 |
221×3×131 |
221 |
899678209 |
7 |
118485495 |
221×3×11×13 |
221 |
924844033 |
5 |
44009197 |
221×32×72 |
221 |
950009857 |
7 |
741494216 |
221×3×151 |
221 |
962592769 |
7 |
695637473 |
221×33×17 |
221 |
975175681 |
17 |
518451017 |
221×3×5×31 |
221 |
1004535809 |
3 |
702606812 |
221×479 |
221 |
1012924417 |
5 |
673144645 |
221×3×7×23 |