FFT(快速傅里叶变换)、NTT(快速数论变换)
1.复数
1.1 复数的引入和定义
1.1.1 略谈数集扩充
略了很多字。
在数学在现实应用领域的发展过程中,我们常需要解类似的方程: \(x^2 + a = 0\) ,然而这在实数集下无解。
1.1.2 虚数单位于的引入与复数的定义
于是虚数单位 "i"被引入,并且有 \(i^2 = -1\) 。
让复数表示为实数与虚数的符合形式,如 \(a + bi\ a,b \in R\) ,让新集“复数集”表示为 C 。
定义复数相等:\(z_1 = a + bi, z_2 = c + di\) ,\(z_1 = z_2 \Leftrightarrow a = c, b = d\) 。
令 \(\cdot\) 表示为复数的四则运算加减乘除,则 \((G, \cdot)\) 会是一个阿贝尔群。于是类似 \(x^2 + a = 0\) 可以有复数解 \(a i^2\) 。自然而然,复数集便可被扩充。
-
复数通常可以用代数形式表示:\(z = a + bi\) ,其中 \(a\) 为 \(z\) 的实部,读作 \(a\) 是 \(z\) 的 \(real\ part\) ,写作 \(Re(z) = a\) ;\(b\) 为 \(z\) 的虚部,读作 \(b\) 是 \(z\) 的 \(Imaginary\ part\) ,写作 \(Im(z) = b\) 。
-
一种复数的常见形式为三角形式:\(z = r(\cos \theta + i \sin \theta)\ s.t.\ r \in R\) 。\(r\) 为复数的模 \(|z|\) ,\(\theta\) 为辐角 \(Arg\ z\) ,\((\cos \theta, \sin \theta)\) 为直角坐标。
-
另一种复数的常见形式为指数形式:\(z = r \exp(i \theta) = r e^{i \theta} = r(\cos \theta + i \sin \theta)\) 。最后一步变换为欧拉公式: \(e^{ix} = \cos x + i \sin x\) ,后文会提到。
1.1.3 虚数的引入
定义虚数集,它与实数集划分复数集。
在复数的代数形式 \(z = a + bi\) 下:
- 若 \(b = 0\) , \(z\) 是实数。
- 若 \(b \neq 0\) ,\(z\) 是虚数。
- 特别的,若 \(b \neq 0\) 且 \(a = 0\) ,\(z\) 是纯虚数。纯虚数集真包含于虚数集。
1.2 复数的性质与四则运算
1.2.1 复数的几何意义
考虑一根无限长的一维的数轴,定义实数单位 \(1\) 为水平正方向,显然“所有实数”与数轴上的“坐标”形成双射。
选取一条无限长的数轴过 \(0\) 垂直于原数轴,定义虚数单位 \(i\) 为竖直正方向,得到一个二维空间。
对于复数的代数形式 \(z = a + bi\) ,显然“所有 \((a, b)\)” 与二维空间的“平面直角坐标”形成双射。
对于复数的三角形式 \(z = r(\cos \theta + i \sin \theta)\) ,显然“所有 \(r(\cos \theta, \sin \theta)\)” 与二维空间的“三角坐标”形成双射。
二维空间的点可以看作向量,比如复数 \(z\) 可以看作向量 \(\vec{OZ}\) 。显然地,复数可以相等,但不能比较大小。
所有向量的起点移动到原点即得到一个坐标系。
1.2.2 复数的加法与减法
定义复数加法:\(z_1 = a + bi, z_2 = c + di\) 。则 \(z_1 + z_2 = (a + c) + (b + d)i\) 。
- 封闭性:若 \(z_1, z_2 \in C\) ,则 \(z_3 = z_1 + z_2 \in C\) 。
证明: \(z_3 = z_1 + z_2 = ac + bdi\) ,显然 \(z_3\) 能表现为复数的代数形式,即 \(z_3 \in C\) 。\(\square\) - 结合律:若 \(z_1, z_2, z_3 \in C\) ,则 \((z_1 + z_2) + z_3 = z_1 + (z_2 + z_3)\) 。
证明: \((a + c) + (b + d)i + e + fi = a + bi + (c + e) + (d + f)i = (a + c + e) + (b + e + f)i\) 。\(\square\) - 单位元: \(C\) 中有且仅有一个 \(e\) 满足 \(e + z = z + e = z\) ,则 \(e\) 是 \(G\) 的单位元。
证明: 显然有且仅有 \(e = 0\) 。\(\square\) - 逆元:\(\forall a \in C\) ,都有且仅有一个 \(b\) 满足 \(a + b = b + a = e\) ,则 \(b\) 是 \(a\) 的逆元。
证明: 显然对于任意 \(a\) ,有且仅有 \(b = -a\) 。\(\square\) - 交换律:若 \(z_1, z_2 \in C\) ,则 \(z_1 + z_2 = z_2 + z_1\) 。
证明: \(a + bi + c + di = c + di + a + bi = (a + c) + (b + d)i\) 。\(\square\)
由 \(1, 2, 3, 4\) , \((C, +)\) 是个群。再由 \(5\) ,\((C, +)\) 是个阿贝尔群。
减法是加法的逆运算,如 \((z_1 + z_2) - z_2 = z_1\) 。于是 \((C, -)\) 是个阿贝尔群。
1.2.3 复数的乘法与除法
定义复数乘法:\(z_1 = a + bi, z_2 = c + di\) ,则 \(z_1 z_2 = (a + bi)(c + di) = ac + adi + bci + bdi^2 = (ac - bd) + (ad + bc)i\) 。(显然复数乘法在几何意义上与向量点积和叉积无关。)
- 封闭性:若 \(z_1, z_2 \in C\) ,则 \(z_1 z_2 \in C\) 。
证明: 令 \(z_1 = a + bi, z_2 = c + di, z_3 = z_1 z_2\) ,则 \(z_3 = z_1 z_2 = (a + bi)(c + di)\) ,继续展开得到 \(z_3 = ac + adi + bci + bdi^2 = (ac - bd)(ad + bc)i\) ,显然 \(z_3\) 能表现成复数的代数形式,即 \(z_3 \in C\) 。\(\square\) - 结合律:若 \(z_1, z_2, z_3 \in C\) ,则 \((z_1 z_2) z_3 = z_1 (z_2 z_3)\) 。
证明: \(((a + bi)(c + di))(e + fi) = (a + bi)((c + di)(e + fi))\) 是直观显然的。\(\square\) - 单位元:\(C\) 中有且仅有一个 \(e\) 满足 \(e z = z e = z\) ,则 \(e\) 是 \(G\) 的单位元。
证明: 显然 \(C\) 中有且仅有 \(e = 1\) 。\(\square\) - 逆元:\(\forall a \in C\) ,都有 \(a b = b a = e\) ,则 \(b\) 是 \(a\) 的逆元。
证明: 观察 \((a + bi)(x + yi) = 1\) ,当且仅当 \(a + bi \neq 0\) 时有解。 \(\square\) - 交换律:若 \(z_1, z_2 \in C\) ,则 \(z_1 z_2 \in C\) 。
证明: \((a + bi)(c + di) = (c + di)(a + bi)\) 是直观显然的。\(\square\)
由 \(1, 2, 3, 4\) ,\((C \backslash \{0\}, \times)\) 是个群。再由 \(5\) ,\((C \backslash \{0\}, \times)\) 是个阿贝尔群。
除法是乘法的逆运算,于是 \((C \backslash \{0\}, /)\) 是个阿贝尔群。
1.2.4 辐角
1.2.4.1 复平面
在几何意义中已经对复数二维空间的方向进行过一个定义,实数单位 \(1\) 为水平正方向,虚数单位 \(i\) 为竖直正方向。
现在可以补充说明,将所有复数向量的起点移动到原点后,这个复数二维空间即复平面。
1.2.4.2 辐角和辐角主值
一个复数 \(z = a + bi\) 可以表示出坐标 \((a, b)\) 。定义 \(Arg\ z\) 为 \(z\) 的辐角,有 \(\tan (Arg\ z) = \frac{b}{a}\) 。
定义 \(z\) 的 辐角主值或主辐角 为 \(arg\ z\) ,有 \(-\pi < arg\ z \leq \pi\) 。
需要注意,辐角不值某个角,而是指一个集合。 \(Arg\ z = \{ arg\ z + 2 k \pi \mid k \in Z \}\) 。
1.2.4.3 单位圆
- 所有模小于等于 \(1\) 的复数在复平面上构成单位圆。
- 模为 \(1\) 的复数为单位复数。所有单位复数构成构成单位圆周。
1.2.4.4 极坐标
在极坐标的视角下表示复数坐标,则 \((a, b) = (r, \theta)\) 。其中 \(r = \sqrt{a^2 + b^2}, \theta = Arg\ z\) 。
借助极坐标,复数乘法和除法的几何意义非常好理解。
- 乘法:\(z_1 z_2 = (r_1 r_2, \theta_1 + \theta_2)\) ,即模相乘,辐角相加。
- 除法:乘法的逆运算,\(z_1 / z_2 = (r_1 / r_2, \theta_1 - \theta_2)\) ,即模相除,辐角相减。
1.2.5 共轭复数
共轭复数,即模相等,辐角相反的的两个复数(角相反:即角的绝对值相等,符号相反)。几何意义上关于实轴对称。\(z = a + bi\) 的共轭复数写作 \(\bar{z} = a - bi\) 。
共轭复数是一种应用数学领域中常见的复数,具有以下性质。
- \(z \bar{z} = |z|^2\) 。
代数证明: \((a + bi)(a - bi) = a^2 - abi + abi - b^2 i^2 = a^2 + b^2 = (\sqrt{a^2 + b^2})^2\) 。\(\square\)
极坐标证明: \((r, \theta) (r, -\theta) = (r^2, 0) = r^2\) 。\(\square\) - \(\bar{\bar{z}} = z\) 。
代数证明: \(a + (-(-b))i = a + bi\) 。\(\square\)
极坐标证明: \((r, -(-\theta)) = (r, \theta)\) 。\(\square\) - \(\overline{z \pm w} = \bar{z} \pm \bar{w}\) 。
证明: \(\overline{z + w} = \overline{(a + bi) + (c + di)} = \overline{(a + c) + (b + d)i} = (a + c) - (b + d)i\) ,\(\bar{z} + \bar{w} = (a - bi) + (c - di) = (a + c) - (b + d)i\) 。于是 \(\overline{z + w} = \bar{z} + \bar{w}\)。减法是加法逆运算。 \(\square\) - \(\overline{z w} = \bar{z} \bar{w}\) 。
代数证明: \(\overline{z 2} = \overline{(a + bi)(c + di)} = \overline{(ac - bd) + (ad + bc)i} = (ac - bd) - (ad + bc)i\) 。\(\bar{z} \bar{w} = (a - bi)(c - di) = (ac - bd) + (a(-d) + (-b)c)i = (ac - bd) - (ad + bc)i\) 。于是 \(\overline{z w} = \bar{z} \bar{w}\) 。除法是乘法的逆运算。\(\square\)
极坐标证明: \(\overline{z w} = \overline{(r_1 r_2, \theta_1 + \theta_2)} = (r_1 r_2, -(\theta_1 + \theta_2))\) 。\(\bar{z} \bar{w} = (r_1, -\theta_1)(r_2, \theta_2) = (r_1 r_2, -(\theta_1 + \theta_2))\) 。于是 \(\overline{z w} = \bar{z} \bar{w}\) 。除法是乘法的逆运算。\(\square\)
1.3 欧拉公式、复指数函数、复三角函数
1.3.1 欧拉公式
以欧拉命名的常见公式不止一个,这里指的是最出名的欧拉公式。
欧拉公式是欧拉创造的,被誉为“最美丽的数学公式”的公式,它将实数、虚数、三角函数联系到了一起,是一个数集的桥梁,在后世中应用广泛。
欧拉公式: \(e^{ix} = \cos x + i \sin x\) 。
不严谨的说明:
已知泰勒展开为:
$$
f(x) \to \sum_{x = 0}^{\infty} \frac{1}{i!} x^{i}
$$
先确定三个函数的 \(Taylor\) 展开式,已知(首先很经典,其次课本上说的)它们的展开式是收敛的:
1. \(e^x = \sum_{i = 0}^{n} \frac{1}{i!} x^i + o(x^{n})\) 。
2. \(\cos x = \sum_{i = 0}^{n} (-1)^{2i + 2} \frac{1}{(2i)!} x^{2i} + o(x^{2n})\) 。
3. \(\sin x = \sum_{i = 0}^{n} (-1)^{2i} \frac{1}{(2i + 1)!} x^{2i + 1} + o(x^{2n + 1})\) 。
由
\(e^{ix} = \frac{x^0}{0!} + i\frac{x^1}{1!} - \frac{x^2}{2!} - i\frac{x^3}{3!} + \frac{x^4}{4!} + i\frac{x^5}{5!} - \frac{x^{6}}{6!} - i\frac{x^7}{7!} \cdots\)
\(\cos x = \frac{x^0}{0!} - \frac{x^2}{2!} + \frac{x^4}{4!} - \frac{x^6}{6!} + \cdots\)
\(i \sin x = i \frac{1}{1!} - i\frac{x^3}{3!} + i\frac{x^5}{5!} - i\frac{x^7}{7!} + \cdots\)
可以发现 \(\cos x + i \sin x = 1 + i\frac{1}{0!} - \frac{x^2}{2!} - i\frac{x^3}{3!} + \frac{x^4}{4!} + i\frac{x^5}{5!} - \frac{x^6}{6!} - i\frac{x^7}{7!} + \cdots = e^{ix}\) 。
\(\square\)
特殊的,有 \(e^{\pi i} = -1\) 。 这个恒等式较为常用。
证明: \(e^{\pi i} = \cos \pi + i \sin \pi = -1 + i \times 0 = -1\) 。\(\square\)
1.3.2 复指数函数
复指数函数在实数集上的定义与实指数函数的定义一致。
对于复数 \(z = x + iy\) ,定义函数 \(\exp z = e^{x + iy} = e^x(\cos y + i \sin y)\) 。
复数函数在复平面上的性质:
- 模横正:\(|\exp z| > 0\) 。
证明: \(|\exp z| = |e^x(\cos y + i \sin y)| = e^x > 0\) 。\(\square\) - 辐角主值:\(arg\ \exp z = y\) 。
证明: \(\frac{e^x \sin y}{e^x \cos y} = \tan y\) ,于是 \(arg\ \exp z = y\) 。\(\square\) - 加法定理:\(\exp(z_1 + z_2) = \exp(z_1) \exp(z_2)\) 。
代数证明:
令 \(z_1 = a + bi, z_2 = c + di\) ,有\[\begin{aligned} \exp(a + c + (b + d)i) &= e^{a + c}(\cos (b + d) + i \sin (b + d)) \\ \exp(a + bi) \exp(c + di) &= e^{a}(\cos b + i\sin b) e^{c}(\cos d + i\sin d) \\ &= e^{a + c}(\cos b \cos d + i \cos b \sin d + i \sin b \cos d + i^2 \sin b \sin d) \\ &= e^{a + c}(\cos b \cos d - \sin b \sin d) + i(\cos b \sin d + \sin b \cos d) \\ &= e^{a + c}(\cos (b + d) + i\sin (b + d)) \\ \textbf{于是} \\ \exp(z_1 + z_2) &= \exp(z_1) \exp(z_2) \quad \square \end{aligned} \]极坐标证明:\[\begin{aligned} \exp z_1 \exp z_2 &= e^{a + b}(\cos b + i \sin b)(\cos d + i \sin d) \\ &= e^{a + b}(1, b)(1, d) \\ &= e^{a + b}(1, b + d) \\ &= e^{a + b}(\cos (c + d) + i\sin(c + d)) \\ &= \exp(z_1 + z_2) \quad \square \end{aligned} \] - 周期性:\(\exp z\) 是以 \(2 \pi i\) 为基本周期的周期函数。
证明: \(\exp (z + 2 \pi i) = \exp(z) \exp(\pi i) \exp(\pi i) = \exp(z)\) 。\(\square\)
1.3.3 复三角函数
复三角函数在实数集上的定义与实三角函数的定义一致。
然而复三角函数在算法竞赛领域似乎未曾见过应用,暂时只给出复余弦函数与复正弦函数的定义和几个常见性质。
- \(\cos z = \frac{\exp(iz) + \exp(-iz)}{2}\) 。
显然 \(\frac{\exp(iz) + \exp(-iz)}{2} = \frac{\cos z + i \sin z + \cos (-z) + i \sin (-z)}{2} = \cos z\) 。 - \(\sin z = \frac{\exp(iz) - \exp(-iz)}{2 i}\) 。
显然 \(\frac{\exp(iz) - \exp(-iz)}{2i} = \frac{\cos z + i \sin z - \cos (-z) - i\sin (-z)}{2i} = \sin z\) 。 - 特殊的,若 \(z \in R\) ,则:
- \(\cos z = Re(\exp (iz))\) 。
- \(\sin z = Im(\exp (iz))\) 。
显然 \(\exp (iz) = \cos z + i \sin z\) 。
复三角函数在复平面上的几个性质:
- 奇偶性:
- \(\cos z\) 是复平面上的偶函数。
证明: \(\cos z - \cos (-z) = \frac{\exp(iz) + \exp(-iz)}{2} - \frac{\exp(-iz) + \exp(iz)}{2} = 0\) 。\(\square\) - \(\sin z\) 是复平面上的积函数。
证明: \(\sin z + \sin (-z) = \frac{\exp(iz) - \exp(-iz)}{2i} + \frac{\exp(-iz) - \exp(iz)}{2i} = 0\) 。\(\square\)
- \(\cos z\) 是复平面上的偶函数。
- 周期性:\(\cos z\) 和 \(\sin z\) 在复平面上的基本周期为 \(2 \pi\) 。
证明: \(\exp(w + 2 \pi) = \exp(w) \exp(2 \pi) = \exp(w)\) 。\(\square\) - 值域:不同于实余弦函数与实正弦函数值域为 \([-1, 1]\) ,复余弦函数与复正弦函数的值域为 \(C \backslash \{0\}\) 。
证明: 令 \(z = a + bi\ s.t. a,b \in R\) ,记 \(u = \exp(-b + ai) = e^{-b}(\cos a + i \sin a) \in C \backslash \{0\}\) 。显然 \(\cos z = \frac{1}{2}(u + \frac{1}{u}) \in C \backslash \{0\}\) 。显然 \(\sin z = \frac{1}{2i} (u - \frac{1}{u}) \in C \backslash \{0\}\) 。\(\square\) - 三角恒等式:实际上基本符合实三角恒等式,暂时只给出常见的 \(\cos^2 z + \sin^2 z = 1\) 证明。
证明: 有复数的几何意义与勾股定理则显然。\(\square\)
1.4 单位根
复数意义下的解叫做复根。
称 \(x^n = 1\) 的解叫做 \(n\) 次单位复根或 \(n\) 次单位根。
可以断言 \(n\) 次单位复根有且仅有 \(n\) 个,且是从 \(1\) 开始将等分单位元的 \(n\) 个复数。
证明: 由欧拉公式 \(e^{2 \pi i} = 1\) ,两边做 \(k\) 次幂有 \(e^{2k \pi i} = 1\) ,再取 \(n\) 次根 \(\sqrt[n]{1} = e^{2 \frac{1}{n} k \pi i} = \cos 2 \frac{1}{n} k \pi + i \sin 2 \frac{1}{n} k \pi\) 。由于 \(2 \pi\) 是一个周期,于是一个周期内的解集为 \(k = \{0, 1, 2, \cdots, n - 1\}\) 。\(\square\)
设 \(w_{n}^{0} = w_{n}^{n} = 1\) ,逆时针依次为 \(w_{n}^{0}, w_{n}^{1}, w_{n}^{2}, \cdots, w_{n}^{n - 1}\) 。其中 \(w_{n}^{1}\) 通常直接被写作 \(w_n\) 。
\(w_1 = 1\) 是平凡的,不存在扩展性质。
\(n \geq 2\) 时具有性质:
- 互异性:\(\forall 0 \leq i < n,j\ s.t. i \neq j\) 有 \(w_n^{i} \neq w_{n}^j\) 。
证明: 复数乘法,考虑极坐标系下, \(w_{n}^{k} = (1, k \frac{2 \pi}{n})\) 在 \(k = \{0, 1, 2, \cdots, n - 1 \}\) 互不相同。\(\square\) - 加法定理:\(w_{n}^{a + b} = w_{n}^{a} w_{n}^{b}\) 。
证明: 极坐标系下 \(w_{n}^{k} = (1, k \frac{2 \pi}{n})\) 。于是 \(w_{n}^{a + b} = (1, (a + b) \frac{2 \pi}{n}) = (1, a \frac{2 \pi}{n}) (1, b \frac{2 \pi}{n}) = w_{n}^{a} w_{n}^{b}\) 。\(\square\) - 可除公约数性: \(w_{ln}^{lk} = w_{n}^{k}\) 。
证明: 设极坐标系下 \(w_{n}^{k} = (1, k \frac{2 \pi}{n}), w_{ln}^{lk} = (1, lk \frac{2 \pi}{nl})\) 。显然 \((1, lk \frac{2 \pi}{nl} = (1, k \frac{2 \pi}{n}))\) 即 \(w_{n}^{k} = w_{ln}^{lk}\) 。\(\square\)
特殊的,\(w_{2n}^{2k} = w_{n}^{k}\) ,又叫折半性。 - 周期性:\(w_{n}^{k + n} = w_{n}^{k}\) 。
证明: \(w_{n}^{k + n} = w_{n}^{k} w_{n}^{n} = w_{n}^{k}\) 。\(\square\) - 对称性:\(w_{2n}^{k + n} = -w_{2n}^{k}\) 。
证明: 显然地 \(w_{2n}^{n} = -1\) , \(w_{2n}^{k + n} = w_{2n}^{k} w_{2n}^{n} = -w_{2n}^{k}\) 。\(\square\) - 一定性:\(\sum_{k = 0}^{n - 1} w_{n}^{k} = 0\) 。
证明: 由对称性 \(w_{n}^{k} + w_{n}^{k + n/2} = 0\) ,\(\sum_{k = 0}^{n - 1} w_{n}^{k} = 0\) 。\(\square\) - 逆元存在:\(\frac{1}{w_{n}^{k}}\) 存在。
证明: \(\frac{1}{w_{n}^{k}} = e^{- \theta i} = (\cos (-\theta) + i \sin (-\theta)) = (\cos \theta - i \sin \theta)\) , \(w_{n}^{k} = e^{\theta i} = (\cos \theta + i \sin \theta)\) ,于是 \(\frac{1}{w_{n}^{k}} = \overline{w_{n}^{k}}\) 。其中 \(\theta = Arg\ w_{n}^{k} = \frac{2 k \pi}{n}\) 。
1.5 C++ 中的复数类
不同于 C 中需要调用头文件,C++ 中直接有 \(complex\) 标准类。
- \(complex\) 类需要定义变量类型为 \(complex<float>\) 或 \(complex<double>\) 或 \(complex<long\ double>\) 。
- 一个 \(complex\) 类可以初始化变量 \(complex<T> z(cos(Arg), sin(Arg))\) 。\(Arg\) 是 \(double\) 类型的辐角。
- 一个 \(complex\) 类有成员函数 \(real\) 和 \(imag\) ,可以访问实部和虚部。
- 一个 \(complex\) 类有常见的非成员函数 \(real\) 、\(imag\) 、\(abs\) 、\(arg\) ,返回复数的实部、虚部、模长、辐角。
2.多项式
2.1 多项式简介
2.1.1 多项式定义
对于常数系数乘以幂函数的和式 \(\sum a_i x^i\) 。
如果是有限项相加,称为多项式,写作 \(f(x) = \sum_{i = 0}^{n} a_i x^i \quad s.t. \quad a_i \in Z\) 。
如果是无限项相加,成为幂级数,写作 \(f(x) = \sum_{i = 0}^{\infty} a_i x^i \quad s.t. \quad a_i \in Z\) 。幂级数可以列项相消。
2.1.2 多项式的阶和度
对于多项式 \(f(x) = \sum_{i = 0}^{n} a_i x^i\) ,可以详细称作:关于 \(x\) 的 \(n\) 阶多项式。
\(x\) 的最高次项的系数称为 \(\deg f\) ,也可以叫做 \(f(x)\) 的阶。形式上 \(\deg \sum_{i = 0}^{n} a_i x^i = n\) 。
2.2 多项式表示
2.2.1 多项式系数表示
多项式的系数表示即:\(f(x) = \sum_{i = 0}^{n} a_i x^{i}\) 。计算复杂度为 \(O(n)\) 。
2.2.2 多项式点值表示
先断言:一组横坐标不同的 \(n + 1\) 个点对可以表示一个 \(n\) 阶多项式。
即 \(f(x)\) 的点值表示为: \(f(x) = \{ (p_0, f(p_0)), (p_1, f(p_1)), (p_2, f(p_2)), \cdots, (p_n, f(p_n)) \}\) 。
证明:
不妨让 \(f(x) = \sum_{i = 0}^{n} a_i x^i\) ,将横坐标不同的 \(x_0, x_1, x_2, \cdots, x_n\) 带入 \(f(x)\) 得到 \(y_0, y_1, y_2, \cdots, y_n\) 。
- 唯一性证明:
将方程组写成矩阵形式:
即
显然 \(V\) 是个 \(Vandermonde\) 矩阵,是给个经典的满秩矩阵。矩阵满秩是个描述性名词,实际上和下述两个性质满足充要关系:
- 矩阵可逆(即有逆元)
- 行列式不为 \(0\)(即行向量线性无关、列向量线性无关,即有唯一解)
详见:https://www.cnblogs.com/zsxuan/p/18057134 。
于是
且 \(A\) 有唯一解。
\(\square\)
- 正确性证明:
唯一性证明完毕的基础下,正确性构造一下就成立了。
显然将一组不同的 \(x_0, x_1, x_2, \cdots, x_n\) 与 \(y_0, y_1, y_2, \cdots, y_n\) 代入方程组,得到的 \(A\) 是唯一的且和 \(f(x) = \sum_{i = 0}^{n} a_i x_i\) 中的系数相等。
\(\square\)
2.2.3 多项式系数表示与点值表示的朴素转化
朴素的系数表示转点值表示:求出 \(n + 1\) 个点即可,时间复杂度 \(O(n^2)\) 。
朴素的点值表示转系数表示:横坐标非连续的情况下,通过拉格朗日插值 \(O(n^2)\) 得到。
2.3 多项式加法与等差前缀和升阶定理
多项式加法:
系数表示下:若 \(f(x) = \sum_{i = 0}^{n} a_i x^i\) ,\(g(x) = \sum_{i = 0}^{n} b_i x^i\) ,则 \(f(x) + g(x) = \sum_{i = 0}^{n} (a_i + b_i) x^i\) 。
点值表示下: \(f(x) + g(x) = \{(p_0, f(p_0) + g(p_0)), (p_1, f(p_1) + g(p_1)), (p_2, f(p_2) + g(p_2)), \cdots, (p_n, f(p_n) + g(p_n)) \}\)
时间复杂度 \(O(n)\) 。
只讨论系数表示意义下的多项式等差前缀和:
多项式等差前缀和:\(\sum_{x = 0}^{m} \sum_{i = 0}^{n} a_i (u + vx)^{i} = \sum_{j = 0}^{n + 1} b_j m^j\) 。
等差前缀和升阶:\(f(x)\) 经过等差前缀和后成为了 \(g(m)\) ,\(\deg g = \deg f + 1\) 。前缀和是平凡的等差前缀和。
时间复杂度 \(O(m)\) 。
如果有必要,多项式点值表示可以转化为多项式系数表示再进行前缀和。
2.4 多项式卷积
2.4.1 多项式乘法
多项式卷积即多项式乘法
定义 \(h\) 是 \(f\) 和 \(g\) 的卷积,即 \(h(x) = f(x) g(x)\) 。
显然地 \(\deg h = \deg f + \deg g = n + m\) 。
2.4.2 多项式系数表示下的卷积:
不考虑类似生成函数的角度,只考虑朴素的系数卷积。
定义 \(f(x) = \sum_{i = 0}^{n} a_i x^i, g(x) = \sum_{i = 0}^{m} b_i x^i\) 。
从 DP 的角度考虑转移方程:\(c_k = a_i x^i b_{k - i}\) 。
则有:
算法的时间复杂度是 \(O(n + m)^2\) 的。
2.4.3 多项式点值表示下的卷积:
让 \(f\) 和 \(g\) 取相同的横坐标,不妨定义 \(n \geq m\) ,若否等同 \(swap(f, g)\) 。\(g\) 在升阶后只需要在空缺位补 \(0\) 。
定义 \(f(x) = \{ (p_0, f(p_0)), (p_1, f(p_1)), (p_2, f(p_2)), \cdots, (p_n, f(p_n)) \}\) ,\(g(x) = \{ (p_0, f(p_0)), (p_1, f(p_1)), (p_2, f(p_2)), \cdots, (p_m, f(p_n)) \}\) 。
则 $g(x) = f(x) + g(x) = { (p_0, f(p_0) + g(p_0)), (p_1, f(p_1) + g(p_1)), (p_2, f(p_2) + g(p_2)), \cdots, (p_n, f(p_n) + g(p_n)) } $ 。
算法的时间复杂度是 \(O(n)\) 的。
2.4.4 多项式快速卷积
可以提出爆论: 现实中遇到的需要处理的某个多项式几乎都是系数表示。且很多时候需要计算多项式在系数表示下的卷积。
是否可以避开系数卷积?即将系数转为点值,在点值意义下计算卷积,再转回系数?
显然这个做法的卷积复杂度为 \(O(n)\) ,但变换复杂度为 \(O(n^2)\) ,于是 \(O(n^2)\) 成为瓶颈。
这时候需要引入多项式快速变换算法。
2.4.5 常见多项式卷积
3.DFT
\(DFT\) 即离散傅里叶变换,可以快速将多项式系数表示变换成点值表示。
对于一个 \(n\) 阶多项式 \(f(x)\) ,不妨让 \(len\) 为 \(2^{\lceil \log_2 (n + 1) \rceil}\) ,并让多项式升阶至 \(len - 1\) ,空缺位补 \(0\) 。
- \(\lfloor \log_2 x \rfloor = 31 - \_\_builtin\_clz(x)\ s.t.\ 0 < x \leq 2^{32}\) 。
- \(\lceil \log_2 x \rceil = 31 - \_\_builtin\_clz(x) + e(\_\_bulitin\_popcount(x) > 1)\ s.t.\ 0 < x \leq 2^{32}\) 。
证明:
- __builtin_clz 和 __builtin_popcount 传入 unsigned int 。
- 2^{31 - 31} = 1。
- 当且仅当 __built_popcount(x) >= 2 时有进位。
\(\square\)
于是 \(f(x)\) 的项数为 \(2^k\) ,显然地可以分治。
其中 \(\deg G = \deg H = \frac{1}{2} \deg F\) 。可以令 \(G = F^{'}, H = F^{''}\) 继续分治。
考虑计算复杂度,每次向下递归,需要计算的函数都会倍增。
于是可以 \(T(1 + 2 + 4 + \cdots + n) = O(l \log l)\) 计算出 \(F(x)\) 。
然而这个分治有什么意义?
考虑将 \(x\) 替换成 \(w_{l}^k\) ,则有:
其中 \(l\) 为大于 \(1\) 的 \(2\) 的幂次。
这意味着我们只需要求出 \(G(w_{l/2}^{}k), H(w_{l/2}^{k})\) 即可得到 \(F(w_{l}^{k}), F(w_{l}^{k + l/2})\) 。
于是 \(n\) 个 \(F(w_{l})\) 可以由 \(l/2\) 个 \(G(w_{l/2})\) 和 \(l/2\) 个 \(H(w_{l/2})\) 得到。然后继续分治。
考虑基于特列来模拟理解这个过程,列举每个递归层的单位根折半情况:
显然 \(m\) 次单位根的函数 \(Y_{w_m}\) 可以由 \(m/2\) 次单位根的函数 \(Y_{w_{m/2}}\) 算出。
- 枚举 \(m \in \{2, 4, 8, \cdots, l\}\) 表示正在计算 \(m\) 次单位根的函数 \(Y_{w_m}\) 。
- 计算 \(m\) 次单位根 \(w_{m}^{1} = (\cos Arg, \sin Arg)\) 。辐角 \(Arg = \frac{2 \pi}{m}\) 。
- 显然数组会被分为 \(l / m\) 段,每段长度为 \(m\) ,代表一个函数。于是枚举 \(0 \leq j < l, j := j + m\) 表示每段函数的起点。
- 对于每段长度为 \(m\) 的函数,枚举 \(j \leq k < j + m/2\) 计算 \(f(w_{m}^{k})\) 与 \(f(w_{m}^{k + m/2})\) 。
代码类似
for (int m = 2; m <= l; m *= 2) { // 枚举需要计算的 m 次单位根函数
double Arg = 2 * PI / m;
CD wm(cos(Arg), sin(Arg));
for (int j = 0; j < l; j += m) { // 枚举起点
CD wmi = 1;
for (int k = j; k < j + m / 2; k++) { // 折半计算
// f[k] = xxx, f[k + m / 2] = xxx;
wmi *= wm;
}
}
}
4.FT 蝶变
4.1 蝶变复写算法
观察
\(F(w_{m}^{k}) = G(w_{m/2}^{k}) + w_{m}^{k}H(w_{m/2}^{k})\) 。
\(F(w_{m}^{k + m/2}) = G(w_{m/2}^{k}) - w_{m}^{k}H(w_{m/2}^{k})\) 。
分析单位根的折半图:
- \(G(w_{m/2}^{k})\) 和 \(H(w_{m/2}^{k})\) 的两个位置只能影响到 \(F(w_{m}^{k})\) 和 \(F(w_{m}^{k + m/2})\) 的两个位置。
- \(F(w_{m}^{k})\) 的位置与下层 \(G(w_{m/2}^{k})\) 的位置一样。
- \(F(w_{m}^{k + m/2})\) 的位置与下层 \(H(w_{m/2}^{k})\) 的位置一样。
于是这四个位置可以直接复写,而不需要开额外空间。
代码类似
complex<double> u = a[k], v = wmi * a[k + m / 2];
a[k] = u + v; a[k + m / 2] = u - v;
4.2 FT 蝶变定理
显然单位根的折半不会打乱顺序,但常数系数的折半会。
这里进行一些模拟
基于这个模拟,提出一个爆论:
一个排列 \(p\) 分治地进行奇偶拆分后,得到的最终排列 \(q\) ,满足 \(q_i = p_{R(i)}\) 。
\(R(i)\) 是 \(i\) 的二进制逆序后得到的数。
证明这个爆论正确的方法是,找不到模拟的反例。
于是该爆论可以视为定理。
需要先将常数系数置换到终点位置,才能从终点倍增回答案。于是有位逆序置换算法。
4.3 位逆序置换
4.3.1 位逆序变换算法
设二进制长度为 \(k\) ,\(x\) 的位逆序为 \(R(x)\ s.t.\ 0 \leq x \leq 2^k - 1\) 。
考虑一件事:\(x\) 右移一位 等于 \(x\ >>\ 1\) 。\(R(x)\) 左移一位 等于 \(R(x\ >>\ 1)\) 。
于是 \(x\) 右移一位,再逆序,再右移一位,便可得到 \(x\ \&\ (2^k - 2)\) 的位逆序。即 \(x\) 的第一位与上 \(0\) 后的位逆序。
于是将结果或上 \((x\ \&\ 1) \times 2^{k - 1}\) 即可得到 \(x\) 的位逆序。
写成公式即
当 \(2^k = len\) ,有
显然 \(x\ >>\ 1 < x\) ,于是可以递推。枚举复杂度 \(O(n)\) ,转移复杂度 \(O(\log n)\) ,于是递推复杂度为 \(O(n \log n)\) 。
4.3.2 位逆序置换算法
考虑如何将权值 \(a_0, a_1, a_2, \cdots, a_{n - 1}\) 换成 \(a_{R(0)}, a_{R(1)}, a_{R(2)}, \cdots, a_{R(n - 1)}\) 。
不开额外空间的置换只能使用 \(swap\) 。当 \(swap(a_{i}, a_{R(i)})\) 后,\(i\) 和 \(R(i)\) 位置成为答案。
观察到性质 \(R(R(i)) = i\) 。即数组中二元组 \((i, R(i))\) 和 \((R(i), i)\) 成对。则若线性遍历 \(i\) 执行 \(swap(a_i, a_{R(i)})\) ,算法结束后数组不变。
一个朴素的想法是开一份空间 \(vis\) 。正向线性遍历 \(i\) ,若 \(vis_{i} = 0\) ,则修改 \(a_i = b_{R(i)}\) ,并令 \(vis_{i} = vis_{R(i)} = 1\) 。
有不开额外空间的办法吗?
正向遍历,借助 \(vis\) 数组观察算法特性。
- 若 \(i = R(i)\) ,已经是答案。不妨默认为 \(vis_i = 1\) 。
- 若\(vis_i \neq 1\) , \(swap(a_{i}, a_{R(i)})\) ,并 \(vis_i = vis_{R(i)} = 1\) 。
可以断言若 \(vis_i \neq 1\) ,则 \(i < R(i)\) 。
- \(i \neq R(i)\) 显然。
- 若 \(i > R(i)\) ,则 \(R(i) < R(R(i))\) ,即 \(R(i)\) 会先于 \(i\) 被标记,与 \(vis_i \neq 1\) 矛盾。
这意味着只有 \(i < R(i)\) 的部分需要操作。
于是位逆序置换算法为,正向线性遍历 \(i\) ,若 \(i < R(i)\) 则 \(swap(a_i, a_{R(i)})\) 。
5.IDFT
\(IDFT\) 即离散傅里叶逆变换,可以快速将多项式点值表示变换成系数表示。
一般 \(DFT\) 和 \(IDFT\) 合称 \(FDFT\) ,快速(离散)傅里叶变换。在计算机领域中通常直接称作 \(FFT\) 。
6. 原根在 NTT 中的性质
详见:https://www.cnblogs.com/zsxuan/p/18099744