单位根小记

单位根定义

方程 \(x^n=1\)\(\mathbb C\) 上根据代数基本定理恰好有 \(n\) 个根,记作 \(\omega_{n},\omega_{n}^2\dots \omega_{n}^n\)

由于复数相乘的规则是模长相乘,幅角相加,可以看到,这 \(n\) 个根所对应的向量都是单位向量,在复平面上对应着单位圆上的 \(n\) 个等分点。

另一种理解是根据欧拉公式 \(e^{ix}=\cos(x)+i\sin(x)\)。这个公式将 \(\exp\) 函数解析延拓到了复数域上。我们一旦注意到 \(e^{2\pi n}=1\),就可以推出 \(\omega_{n}=e^{\frac{2\pi i}{n}}=\cos(\frac{2\pi}{n})+i\sin(\frac{2\pi}{n})\)。这带给了我们在 \(\mathbb R\) 上计算单位根的可能性。

根据这个几何意义,我们发现 \(\omega_{n}^{i+n}=\omega_{n}^i\) 是很自然成立的。这意味着单位根和在模 \(n\) 意义下的运算具有很相似的性质。

用上指标来表示单位根的编号也是一个及其明智的选择,我们有 \(\omega_{n}^i=(\omega_{n})^i\),这也就意味着实际运用时我们往往只需要先求一个单位根再依此推出所有的根。

先求一个根再依此推出所有的根,这令我们回想起数论中我们求最小正原根然后求所有原根的过程。原根也是跟模 \(\varphi(m)\) 意义下的运算有着千丝万缕的联系。

把这两个东西联系起来,单位根有欧拉公式 \(e^{2\pi n}=1\),原根有欧拉定理 \(g^{\varphi(m)}\equiv 1 \pmod m\)

相似地,我们可以定义模意义下的单位根 \(\omega_n=g^{\frac{\varphi(m)}{n}}\)。模意义下的 \(n\) 次剩余经常不存在,所以一般只在模数比较特殊(如 \(\texttt{998244353}\))时使用模意义下的单位根。

DFT 与循环卷积

学习 OI,我们见识了定义在各种各样运算上的“卷积”,以及为了计算这种卷积定义的各种各样的“变换”。

形式化的说对于某种运算 \(\oplus\),两个序列 \(f,g\)\(\oplus\) 运算卷积得到的结果 \(f*g\) 满足:

\[(f*g)_k=\sum_{i\oplus j=k} f_i g_j \]

为了快速计算这种卷积,我们定义线性变换 \(A\) 满足 \(A(f)\cdot A(g)=A(f*g)\)\(\cdot\) 表示点乘),\(A\) 存在逆 \(A^{-1}\),且 \(A(f),A^{-1}(f)\) 均可快速计算。

拆开分析 \(A\) 矩阵应该满足性质 \(A_{i,j}A_{i,k}=A_{i,j\oplus k}\)

当我们将 \(\oplus\) 定义为模 \(n\) 意义下的加法时,\(\omega_n\) 构成的范德蒙德矩阵 \(A_{i,j}=\omega_n^{ij}\) 完美满足了上述条件。此时这个线性变换过程计算的就是 \(f,g\) 的循环卷积。

也就是说,当我们要计算循环卷积的若干次幂时可以先得到多项式的 \(n\) 个点值 \(F(\omega_n^0),F(\omega_n^1)\dots F(\omega_n^{n-1})\),快速幂之后插值回去。

\(n\) 个点值正好是等比数列的形式,我们可以用 \(\text{Chirp-Z}\) 变换计算。\(\text{Chirp-Z}\) 变换实际上就是一个 trick。注意到 \(ij={ij\choose 2}-{i\choose 2}-{j\choose 2}\),那么 \(F(c^i)=\sum_{j=0}^{n-1} c^{ij}f_j=c^{-{i\choose 2}}\sum_{j=0}^{n-1} c^{ij\choose 2} c^{-{j\choose 2}}f_j\)。减法卷积计算即可。

单位根反演

单位根具有类似“循环”的性质,我们可以利用这种性质处理整除与模相关的问题。

考虑下述式子:

\[\sum_{i=0}^{n-1} \omega_n^{ik} \]

大多数情况下这是一个等比数列,所以结果是 \(\frac{\omega_n^{nk}-1}{\omega_n^{k}-1}=0\)

但对于 \(\omega_n^k=1\),也就是 \(n|k\) 的情况,退化成等差数列,式子的值是 \(n\)

即:

\[[n|k]=\frac{1}{n} \sum_{i=0}^{n-1}\omega_n^{ik} \]

常见手段是用它来处理式子中的 \(\bmod\)。比如说可以用它来推导循环卷积:

\[\begin{aligned} C_k&=\sum_{i=0}^{n-1}\sum_{j=0}^{n-1} [(i+j)\equiv k \pmod n] A_i B_j \\ &=\sum_{i=0}^{n-1}\sum_{j=0}^{n-1} [n|(i+j-k)] A_i B_j \\ &=\frac{1}{n}\sum_{i=0}^{n-1}\sum_{j=0}^{n-1} A_i B_j \sum_{t=0}^{n-1} \omega_n^{(i+j-k)t}\\ &=\frac{1}{n}\sum_{t=0}^{n-1} -\omega_n^{kt} (\sum_{i=0}^{n-1} A_i\omega_n^{it}) (\sum_{j=0}^{n-1} B_j\omega_n^{jt})\\ \end{aligned} \]

注意到两个括号中就是两个多项式 \(\text{DFT}\) 的结果,而括号外面就是 \(\text{IDFT}\) 的结果。

单位根反演一个比较常见的用法就是用来提取多项式的系数。

众所周知,\(F(1)\) 代表的就是多项式的系数之和 \(\sum_{i=0}^{n-1} f_i\)。当我们想提取多项式的等差数列下标所对应的系数之和时,可以考虑单位根反演。

\[\frac{1}{k} \sum_{i=0}^{k-1} F(\omega_k^i)=\frac{1}{k} \sum_{i=0}^{k-1} \sum_{j=0}^{n-1} f_j \omega_k^{ij}=\sum_{j=0}^{n-1}[k|j] f_j \]

比如复读机这道题,对于指数生成函数 \(F(x)=e^x\),可以用上述式子提取对应项系数后暴力二/三项式展开计算。

联考神秘题

为了这叠醋包的饺子。

posted @ 2023-03-10 22:50  yyyyxh  阅读(156)  评论(0编辑  收藏  举报