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\) 。自然而然,复数集便可被扩充。

  1. 复数通常可以用代数形式表示:\(z = a + bi\) ,其中 \(a\)\(z\) 的实部,读作 \(a\)\(z\)\(real\ part\) ,写作 \(Re(z) = a\)\(b\)\(z\) 的虚部,读作 \(b\)\(z\)\(Imaginary\ part\) ,写作 \(Im(z) = b\)

  2. 一种复数的常见形式为三角形式\(z = r(\cos \theta + i \sin \theta)\ s.t.\ r \in R\)\(r\) 为复数的模 \(|z|\)\(\theta\) 为辐角 \(Arg\ z\)\((\cos \theta, \sin \theta)\) 为直角坐标。

  3. 另一种复数的常见形式为指数形式\(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\) 下:

  1. \(b = 0\)\(z\) 是实数。
  2. \(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\)

  1. 封闭性:\(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\)
  2. 结合律:\(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\)
  3. 单位元: \(C\) 中有且仅有一个 \(e\) 满足 \(e + z = z + e = z\) ,则 \(e\)\(G\) 的单位元。
    证明: 显然有且仅有 \(e = 0\)\(\square\)
  4. 逆元:\(\forall a \in C\) ,都有且仅有一个 \(b\) 满足 \(a + b = b + a = e\) ,则 \(b\)\(a\) 的逆元。
    证明: 显然对于任意 \(a\) ,有且仅有 \(b = -a\)\(\square\)
  5. 交换律:\(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\) 。(显然复数乘法在几何意义上与向量点积和叉积无关。)

  1. 封闭性:\(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\)
  2. 结合律:\(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\)
  3. 单位元:\(C\) 中有且仅有一个 \(e\) 满足 \(e z = z e = z\) ,则 \(e\)\(G\) 的单位元。
    证明: 显然 \(C\) 中有且仅有 \(e = 1\)\(\square\)
  4. 逆元:\(\forall a \in C\) ,都有 \(a b = b a = e\) ,则 \(b\)\(a\) 的逆元。
    证明: 观察 \((a + bi)(x + yi) = 1\) ,当且仅当 \(a + bi \neq 0\) 时有解。 \(\square\)
  5. 交换律:\(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\) 的复数在复平面上构成单位圆
  2. 模为 \(1\) 的复数为单位复数。所有单位复数构成构成单位圆周
1.2.4.4 极坐标

在极坐标的视角下表示复数坐标,则 \((a, b) = (r, \theta)\) 。其中 \(r = \sqrt{a^2 + b^2}, \theta = Arg\ z\)

借助极坐标,复数乘法和除法的几何意义非常好理解。

  1. 乘法:\(z_1 z_2 = (r_1 r_2, \theta_1 + \theta_2)\) ,即模相乘,辐角相加。
  2. 除法:乘法的逆运算,\(z_1 / z_2 = (r_1 / r_2, \theta_1 - \theta_2)\) ,即模相除,辐角相减。

1.2.5 共轭复数

共轭复数,即模相等,辐角相反的的两个复数(角相反:即角的绝对值相等,符号相反)。几何意义上关于实轴对称。\(z = a + bi\) 的共轭复数写作 \(\bar{z} = a - bi\)

共轭复数是一种应用数学领域中常见的复数,具有以下性质。

  1. \(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\)
  2. \(\bar{\bar{z}} = z\)
    代数证明: \(a + (-(-b))i = a + bi\)\(\square\)
    极坐标证明: \((r, -(-\theta)) = (r, \theta)\)\(\square\)
  3. \(\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\)
  4. \(\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)\)
复数函数在复平面上的性质:

  1. 模横正:\(|\exp z| > 0\)
    证明: \(|\exp z| = |e^x(\cos y + i \sin y)| = e^x > 0\)\(\square\)
  2. 辐角主值:\(arg\ \exp z = y\)
    证明: \(\frac{e^x \sin y}{e^x \cos y} = \tan y\) ,于是 \(arg\ \exp z = y\)\(\square\)
  3. 加法定理:\(\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} \]

  4. 周期性:\(\exp z\) 是以 \(2 \pi i\)基本周期周期函数
    证明: \(\exp (z + 2 \pi i) = \exp(z) \exp(\pi i) \exp(\pi i) = \exp(z)\)\(\square\)

1.3.3 复三角函数

复三角函数在实数集上的定义与实三角函数的定义一致。
然而复三角函数在算法竞赛领域似乎未曾见过应用,暂时只给出复余弦函数复正弦函数的定义和几个常见性质。

  1. \(\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\)
  2. \(\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\)
  3. 特殊的,若 \(z \in R\) ,则:
    1. \(\cos z = Re(\exp (iz))\)
    2. \(\sin z = Im(\exp (iz))\)
      显然 \(\exp (iz) = \cos z + i \sin z\)

复三角函数在复平面上的几个性质:

  1. 奇偶性:
    1. \(\cos z\) 是复平面上的偶函数。
      证明: \(\cos z - \cos (-z) = \frac{\exp(iz) + \exp(-iz)}{2} - \frac{\exp(-iz) + \exp(iz)}{2} = 0\)\(\square\)
    2. \(\sin z\) 是复平面上的积函数。
      证明: \(\sin z + \sin (-z) = \frac{\exp(iz) - \exp(-iz)}{2i} + \frac{\exp(-iz) - \exp(iz)}{2i} = 0\)\(\square\)
  2. 周期性:\(\cos z\)\(\sin z\) 在复平面上的基本周期为 \(2 \pi\)
    证明: \(\exp(w + 2 \pi) = \exp(w) \exp(2 \pi) = \exp(w)\)\(\square\)
  3. 值域:不同于实余弦函数与实正弦函数值域为 \([-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\)
  4. 三角恒等式:实际上基本符合实三角恒等式,暂时只给出常见的 \(\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\) 时具有性质:

  1. 互异性:\(\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\)
  2. 加法定理:\(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\)
  3. 可除公约数性: \(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}\) ,又叫折半性
  4. 周期性:\(w_{n}^{k + n} = w_{n}^{k}\)
    证明: \(w_{n}^{k + n} = w_{n}^{k} w_{n}^{n} = w_{n}^{k}\)\(\square\)
  5. 对称性:\(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\)
  6. 一定性:\(\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\)
  7. 逆元存在:\(\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\) 标准类。

  1. \(complex\) 类需要定义变量类型为 \(complex<float>\)\(complex<double>\)\(complex<long\ double>\)
  2. 一个 \(complex\) 类可以初始化变量 \(complex<T> z(cos(Arg), sin(Arg))\)\(Arg\)\(double\) 类型的辐角。
  3. 一个 \(complex\) 类有成员函数 \(real\)\(imag\) ,可以访问实部和虚部。
  4. 一个 \(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\)

  1. 唯一性证明:
    将方程组写成矩阵形式:

\[V = \begin{bmatrix} 1 & x_{0}^{1} & x_{0}^{2} & \cdots & x_{0}^{n}\\ 1 & x_{1}^{1} & x_{1}^{2} & \cdots & x_{1}^{n}\\ 1 & x_{2}^{1} & x_{2}^{2} & \cdots & x_{2}^{n}\\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 1 & x_{n}^{1} & x_{n}^{2} & \cdots & x_{n}^{n}\\ \end{bmatrix} \qquad A = \begin{bmatrix} a_0 \\ a_1 \\ a_2 \\ \vdots \\ a_n \\ \end{bmatrix} \qquad B = \begin{bmatrix} y_0 \\ y_1 \\ y_2 \\ \vdots \\ y_n \\ \end{bmatrix} \]

\[VA = B \]

显然 \(V\) 是个 \(Vandermonde\) 矩阵,是给个经典的满秩矩阵。矩阵满秩是个描述性名词,实际上和下述两个性质满足充要关系:

  • 矩阵可逆(即有逆元)
  • 行列式不为 \(0\)(即行向量线性无关、列向量线性无关,即有唯一解)

详见:https://www.cnblogs.com/zsxuan/p/18057134

于是

\[A = V^{-1} B \]

\(A\) 有唯一解。
\(\square\)

  1. 正确性证明:
    唯一性证明完毕的基础下,正确性构造一下就成立了。
    显然将一组不同的 \(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}\)
则有:

\[h(x) = \sum_{i = 0}^{n + m} \sum_{j = 0}^{i} a_j b_{i - j} x^{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\)

  1. \(\lfloor \log_2 x \rfloor = 31 - \_\_builtin\_clz(x)\ s.t.\ 0 < x \leq 2^{32}\)
  2. \(\lceil \log_2 x \rceil = 31 - \_\_builtin\_clz(x) + e(\_\_bulitin\_popcount(x) > 1)\ s.t.\ 0 < x \leq 2^{32}\)

证明:

  1. __builtin_clz 和 __builtin_popcount 传入 unsigned int 。
  2. 2^{31 - 31} = 1。
  3. 当且仅当 __built_popcount(x) >= 2 时有进位。
    \(\square\)

于是 \(f(x)\) 的项数为 \(2^k\) ,显然地可以分治。

\[\begin{aligned} F(x) &= a_0 x^0 + a_1 x^1 + a_2 x^2 + \cdots + a_n x^n \\ &= (a_0 x^0 + a_2 x^2 + a_4 x^4 + \cdots + a_{n - 1} x^{n - 1}) + (a_1 x^1 + a_3 x^3 + a_5 x^5 + \cdots + a_n x^n) \\ &= (a_0 x^0 + a_2 x^2 + a_4 x^4 + \cdots + a_{n - 1} x^{n - 1}) + x (a_1 x^0 + a_3 x^2 + a_5 x^4 + \cdots + a_n x^{n - 1}) \\ \textbf{令} \\ G(x) &= (a_0 x^0 + a_2 x^1 + a_4 x^2 + \cdots a_{n - 1} x^{(n - 1) / 2}) \\ H(x) &= (a_1 x^0 + a_3 x^1 + a_5 x^2 + \cdots a_n x^{(n - 1) / 2}) \\ \textbf{则有} \\ F(x) &= G(x^2) + x H(x^2) \end{aligned} \]

其中 \(\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\) ,则有:

\[\begin{aligned} F(w_{l}^k) &= G(w_{l}^{2k}) + w_{l}^{k} H(w_{l}^{2k}) \\ &= G(w_{l/2}^{k}) + w_{l}^{k} H(w_{l/2}^{k}) \\ F(w_{l}^{k + l/2}) &= H(w_{l}^{2k + l}) + w_{l}^{k + l/2} G(w_{l}^{2k + l}) \\ &= G(w_{l}^{2k}) + (-w_{l}^{k}) H(w_{l}^{2k}) \\ &= G(w_{l/2}^{k}) - w_{l}^{k} H(w_{l/2}^{k}) \end{aligned} \]

其中 \(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})\) 得到。然后继续分治。

考虑基于特列来模拟理解这个过程,列举每个递归层的单位根折半情况:

\[\begin{aligned} &\{w_{8}^{0},\ w_{8}^{1},\ w_{8}^{2},\ w_{8}^{3},\ w_{8}^{4},\ w_{8}^{5},\ w_{8}^{6},\ w_{8}^{7}\} \\ &\{w_{4}^{0},\ w_{4}^{1},\ w_{4}^{2},\ w_{4}^{3}\} \{\ w_{4}^{0},\ w_{4}^{1},\ w_{4}^{2},\ w_{4}^{3}\} \\ &\{w_{2}^{0},\ w_{2}^{1}\} \{\ w_{2}^{0},\ w_{2}^{1}\} \{\ w_{2}^{0},\ w_{2}^{1}\} \{\ w_{2}^{0},\ w_{2}^{1}\} \\ &\{w_{1}^{0}\} \{w_{1}^{0}\} \{w_{1}^{0}\} \{w_{1}^{0}\} \{w_{1}^{0}\} \{w_{1}^{0}\} \{w_{1}^{0}\} \{w_{1}^{0}\} \\ \end{aligned} \]

显然 \(m\) 次单位根的函数 \(Y_{w_m}\) 可以由 \(m/2\) 次单位根的函数 \(Y_{w_{m/2}}\) 算出。

  1. 枚举 \(m \in \{2, 4, 8, \cdots, l\}\) 表示正在计算 \(m\) 次单位根的函数 \(Y_{w_m}\)
  2. 计算 \(m\) 次单位根 \(w_{m}^{1} = (\cos Arg, \sin Arg)\) 。辐角 \(Arg = \frac{2 \pi}{m}\)
  3. 显然数组会被分为 \(l / m\) 段,每段长度为 \(m\) ,代表一个函数。于是枚举 \(0 \leq j < l, j := j + m\) 表示每段函数的起点。
  4. 对于每段长度为 \(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})\)

分析单位根的折半图:

  1. \(G(w_{m/2}^{k})\)\(H(w_{m/2}^{k})\) 的两个位置只能影响到 \(F(w_{m}^{k})\)\(F(w_{m}^{k + m/2})\) 的两个位置。
  2. \(F(w_{m}^{k})\) 的位置与下层 \(G(w_{m/2}^{k})\) 的位置一样。
  3. \(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 蝶变定理

显然单位根的折半不会打乱顺序,但常数系数的折半会。
这里进行一些模拟

\[\begin{aligned} &\{x_0,\ x_1,\ x_2,\ x_3,\ x_4,\ x_5,\ x_6,\ x_7\} \\ &\{x_0,\ x_2,\ x_4,\ x_6\} \{\ x_1,\ x_3,\ x_5,\ x_7\} \\ &\{x_0,\ x_4\} \{\ x_2,\ x_6\} \{\ x_1,\ x_5\} \{\ x_3,\ x_7\} \\ &\{x_0\} \{x_4\} \{x_2\} \{x_6\} \{x_1\} \{x_5\} \{x_3\} \{x_7\} \\ \end{aligned} \]

基于这个模拟,提出一个爆论
一个排列 \(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\) 的位逆序。
写成公式即

\[R(x) = R(x\ >>\ 1)\ >>\ 1 + (x\ \&\ 1) \mid 2^{k - 1} \]

\(2^k = len\) ,有

\[R(x) = R(x\ >>\ 1)\ >>\ 1 + (x\ \&\ 1) \mid (len\ >>\ 1) \]

显然 \(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\) 数组观察算法特性。

  1. \(i = R(i)\) ,已经是答案。不妨默认为 \(vis_i = 1\)
  2. \(vis_i \neq 1\)\(swap(a_{i}, a_{R(i)})\) ,并 \(vis_i = vis_{R(i)} = 1\)

可以断言若 \(vis_i \neq 1\) ,则 \(i < R(i)\)

  1. \(i \neq R(i)\) 显然。
  2. \(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

7.NTT

posted @ 2024-03-06 17:49  zsxuan  阅读(9)  评论(0编辑  收藏  举报