快速傅里叶变换

本文将简单推导两种方式进行的离散傅里叶变换,用另种视角解释并优化算法。参考了 Seniorious yhx-12243 的 NTT 到底写了些什么(详细揭秘) 一文、OI Wiki 快速傅里叶变换 条目 和 rushcheyo 转置原理及其应用 讲稿。

离散傅里叶变换

我们计算数列 {an}\{a_n\} 的离散傅里叶变换 DFT(a,n)k=j=0n1aje2πinkj \newcommand\DFT{\operatorname{DFT}}\DFT(a,n)_k=\sum_{j=0}^{n-1}a_j\mathrm{e}^{\frac{-2\pi\mathrm{i}}{n}kj}

卷积定理循环卷积得到,我们对同样长为 nn 的数列 {bn}\{b_n\}DFT\DFT,并令数列 ck=DFT(a,n)kDFT(b,n)kc_k=\DFT(a,n)_k\DFT(b,n)_k,则有 IDFT(c,n)k=j+qk(modn)ajbq \newcommand\IDFT{\operatorname{IDFT}}\IDFT(c,n)_k=\sum_{j+q\equiv k\pmod n}a_jb_q

于是我们可以利用该原理实现常规意义下的数列卷积:有长为 nn 的数列 {an}\{a_n\},长 mm 的数列 {bm}\{b_m\},则将 a,ba,b 高位补 00,分别作 n+m1n+m-1 位的 DFT\DFT,点值相乘后 IDFT\IDFT 即可得到 ck=i+jk(modn+m1)aibj=i+j=k0i<n0j<maibjc_k=\sum_{i+j\equiv k\pmod{n+m-1}}a_ib_j=\sum_{\substack{i+j=k\\0\leq i<n\\0\leq j<m}}a_ib_j

为行文方便,下文采用 DFT(a,n)k=i=0n1aiωnik\DFT(a,n)_k=\sum_{i=0}^{n-1}a_i\omega_n^{ik} 的定义,其中 ωn=exp(2πi/n)\omega_n=\exp(2\pi\mathrm{i}/n),即 nn 阶单位根。 (更多…)

More
  • 2023年2月23日

洛谷题库 P6031 Cards 加强版

对于每一轮对局的 m!m! 种排列,对于编号为 aa 的牌,恒有 (m1)!(m-1)! 种是以牌 aa 为首的。因此一轮可以归为 mm 种情况,首张为王牌的概率为 1m\frac{1}{m}

这是某场模拟考试给出的部分分: SubtaskConstraintsPointsDependencies1n,m,k522k=123k5000101,24m1001015nk56k105101,2,37k5×106201,2,3,684117 \begin{array}{cccc} \text{Subtask}&\text{Constraints}&\text{Points}&\text{Dependencies}\\ \hline 1&n,m,k\leq 5&2&\\ 2&k=1&2&\\ 3&k\leq 5000&10&1,2\\ 4&m\leq 100&10&1\\ 5&n\leq k&5&\\ 6&k\leq 10^5&10&1,2,3\\ 7&k\leq 5\times 10^6&20&1,2,3,6\\ 8&&41&1\sim 7 \end{array} (更多…)

More
  • 2023年1月31日

形式化题意

给定 A+BA+B 个本质相同的随机变量,在 {1,2,,6}\{1,2,\cdots,6\} 内等概率取值。若两个随机变量 aA,bB,a=ba \in A, b \in B, a=b,则二者相消为 00。求在所有可能的消除完成后,存在 at,aA,t{1,2,,6}a \leq t, a \in A, t \in \{1,2,\cdots,6\} 的概率。对 109+710^9+7 取模。

朴素DP

cic_i 表示随机结果中数值为 iiAA 内变量数;did_i 同理。原题意可以转化为求出 1P(不存在小于等于ta)1-P(\text{不存在小于等于}t\text{的}a)。由概率的定义,我们可以用能造成后者局面的方案总数除以 6A+B6^{A+B} 既是结果。换句话说,原命题的否命题应当满足 i{1,2,,t},cidi\forall i \in \{1,2,\cdots,t\}, c_i \leq d_i

又因为这些随机变量本质相同,则由“可重集的排列数”得,若有确定的 c1,c2,,c6,i=16ci=Ac_{1},c_2,\cdots,c_6, \sum_{i=1}^{6}c_i=A,则掷出对应结果的方案数为 (Ac1)(Ac1c2)(Ai=15cic6)=A!i=16ci!\dbinom{A}{c_1}\dbinom{A-c_1}{c_2}\cdots\dbinom{A-\sum_{i=1}^{5}c_i}{c_6}=\dfrac{\color{blue}A!}{\prod_{i=1}^{6}c_i!} (更多…)

More
  • 2022年9月22日

我们实现NTT时,总是在 整数模质数 p=2kq+1p=2^kq+1 上进行的。原因很简单:为了在 Z/pZ\mathbb{Z}/p\mathbb{Z} 上使用原根以套用复数域 C\mathbb{C} 上“单位根”的概念,其阶必然也应当是 2k2^k 的倍数才行。这就为我们带来了很多不便。假如现在给定一质数 pp’ 且不保证有 p=2kq+1p’=2^kq+1,我们就需要另辟蹊径完成卷积。

实现一:中国剩余定理

中国剩余定理:若数 nn 的质因数分解为 i=1kpiei\sum_{i=1}^{k}p_i^{e_i},有整数模 nn 加法(或者,随便你怎么叫吧)

Z/nZZ/p1e1Z×Z/p2e2Z××Z/pkekZ\mathbb{Z}/n\mathbb{Z}\cong \mathbb{Z}/p_1^{e1}\mathbb{Z}\times \mathbb{Z}/p_2^{e2}\mathbb{Z}\times \cdots \times\mathbb{Z}/p_k^{ek}\mathbb{Z}

或者通俗地讲,若 m1,m2,,mkm_1, m_2, \cdots, m_k 两两互质,则线性同余方程组 {xx1(modm1)xx2(modm2)xxk(modmk)\left\{\begin{aligned} x &\equiv x_1\pmod{m_1}\\ x &\equiv x_2\pmod{m_2}\\ &\quad \vdots\\ x &\equiv x_k\pmod{m_k}\end{aligned}\right.modi=1kmi\bmod \prod_{i=1}^{k}m_i 意义下有唯一解。 (更多…)

More
  • 2022年7月3日

众所周知,由于做快速傅里叶变换时,要先将两个多项式 f(x),g(x)f(x),g(x) 分别DFT,点值相乘后再IDFT,其常数是巨大的。但如果其系数均为实数,我们就可以通过构造多项式的方式,充分利用复数虚部存储需要的信息。下文中默认有 deg(f(x))=deg(g(x))=n=2s\operatorname{deg}(f(x))=\operatorname{deg}(g(x))=n=2^s。记 nn 次单位根为 ωn\omega_{n}

考虑构造两多项式 p(x)=f(x)+ig(x),q(x)=f(x)ig(x)p(x)=f(x)+\mathrm{i}g(x),q(x)=f(x)-\mathrm{i}g(x),则假若我们求出 p(x)p(x) 的点值表示,就会有 p(ωnk)=q(ωnk modn)\overline{p(\omega_n^k)}=q(\omega_n^{-k\space\bmod n})(更多…)

More
  • 2022年7月3日

洛谷题库 P4721【模板】分治FFT

给定数列 g1ng_{1\cdots n},求解满足如下形式的数列 fff0=1,fi=j=0i1fjgij,i{1,2,,n}f_0=1,f_i=\sum_{j=0}^{i-1}f_jg_{i-j},\forall i \in \{1,2,\cdots,n\},对 998244353998244353 取模。

这道题可以通过多项式求逆解决。我们在此不作讨论。

考虑其转移形式,全部都是依赖于前序已求出项的、固定系数的线性转移。则可以考虑CDQ分治。如果你愿意,也可以叫作“分治FFT”。

假设正处理区间 [l,r][l, r];令 mid=(l+r)/2\text{mid}=\lceil (l+r)/2\rceil,我们已经计算好 fl,,midf_{l,\cdots,\text{mid}}。现统一处理左半区间对右半的贡献。

则令考虑的乘积项为 fi,i[l,mid]f_i, i \in [l, \text{mid}],要向 fj,j(mid,r]f_j, j \in (\text{mid}, r] 作贡献。有 fjgjifif_j \leftarrow g_{j-i}f_i。故而对于 i[l,mid]i \in [l, \text{mid}],其将分别与 gmid+1l,,rl,gmidl,,rl1,,g1,,rmidg_{\text{mid}+1-l, \cdots, r-l}, g_{\text{mid}-l, \cdots, r-l-1}, \cdots, g_{1, \cdots, r-\text{mid}} 作卷积。其二者下标的和即为贡献对象。故而我们构造两个多项式 F(x),G(x)F(x), G(x),有 [xi]F(x)=fi+l,[xj]G(x)=gj1[x^i]F(x)=f_{i+l}, [x^j]G(x)=g_{j-1},将其二者作卷积,他们对 fj,j(mid,r]f_j, j \in (\text{mid}, r] 的贡献即为 [xjl1]F(x)G(x)[x^{j-l-1}]F(x)G(x)

(更多…)

More
  • 2022年7月3日