FFT(快速傅里叶变换)、NTT(快速数论变换)
1.复数
1.1 复数的引入和定义
1.1.1 略谈数集扩充
略了很多字。
在数学在现实应用领域的发展过程中,我们常需要解类似的方程:
1.1.2 虚数单位于的引入与复数的定义
于是虚数单位 "i"被引入,并且有
让复数表示为实数与虚数的符合形式,如
定义复数相等:
令
-
复数通常可以用代数形式表示:
,其中 为 的实部,读作 是 的 ,写作 ; 为 的虚部,读作 是 的 ,写作 。 -
一种复数的常见形式为三角形式:
。 为复数的模 , 为辐角 , 为直角坐标。 -
另一种复数的常见形式为指数形式:
。最后一步变换为欧拉公式: ,后文会提到。
1.1.3 虚数的引入
定义虚数集,它与实数集划分复数集。
在复数的代数形式
- 若
, 是实数。 - 若
, 是虚数。- 特别的,若
且 , 是纯虚数。纯虚数集真包含于虚数集。
- 特别的,若
1.2 复数的性质与四则运算
1.2.1 复数的几何意义
考虑一根无限长的一维的数轴,定义实数单位
选取一条无限长的数轴过
对于复数的代数形式
对于复数的三角形式
二维空间的点可以看作向量,比如复数
所有向量的起点移动到原点即得到一个坐标系。
1.2.2 复数的加法与减法
定义复数加法:
- 封闭性:若
,则 。
证明: ,显然 能表现为复数的代数形式,即 。 - 结合律:若
,则 。
证明: 。 - 单位元:
中有且仅有一个 满足 ,则 是 的单位元。
证明: 显然有且仅有 。 - 逆元:
,都有且仅有一个 满足 ,则 是 的逆元。
证明: 显然对于任意 ,有且仅有 。 - 交换律:若
,则 。
证明: 。
由
减法是加法的逆运算,如
1.2.3 复数的乘法与除法
定义复数乘法:
- 封闭性:若
,则 。
证明: 令 ,则 ,继续展开得到 ,显然 能表现成复数的代数形式,即 。 - 结合律:若
,则 。
证明: 是直观显然的。 - 单位元:
中有且仅有一个 满足 ,则 是 的单位元。
证明: 显然 中有且仅有 。 - 逆元:
,都有 ,则 是 的逆元。
证明: 观察 ,当且仅当 时有解。 - 交换律:若
,则 。
证明: 是直观显然的。
由
除法是乘法的逆运算,于是
1.2.4 辐角
1.2.4.1 复平面
在几何意义中已经对复数二维空间的方向进行过一个定义,实数单位
现在可以补充说明,将所有复数向量的起点移动到原点后,这个复数二维空间即复平面。
1.2.4.2 辐角和辐角主值
一个复数
定义
需要注意,辐角不值某个角,而是指一个集合。
1.2.4.3 单位圆
- 所有模小于等于
的复数在复平面上构成单位圆。 - 模为
的复数为单位复数。所有单位复数构成构成单位圆周。
1.2.4.4 极坐标
在极坐标的视角下表示复数坐标,则
借助极坐标,复数乘法和除法的几何意义非常好理解。
- 乘法:
,即模相乘,辐角相加。 - 除法:乘法的逆运算,
,即模相除,辐角相减。
1.2.5 共轭复数
共轭复数,即模相等,辐角相反的的两个复数(角相反:即角的绝对值相等,符号相反)。几何意义上关于实轴对称。
共轭复数是一种应用数学领域中常见的复数,具有以下性质。
。
代数证明: 。
极坐标证明: 。 。
代数证明: 。
极坐标证明: 。 。
证明: , 。于是 。减法是加法逆运算。 。
代数证明: 。 。于是 。除法是乘法的逆运算。
极坐标证明: 。 。于是 。除法是乘法的逆运算。
1.3 欧拉公式、复指数函数、复三角函数
1.3.1 欧拉公式
以欧拉命名的常见公式不止一个,这里指的是最出名的欧拉公式。
欧拉公式是欧拉创造的,被誉为“最美丽的数学公式”的公式,它将实数、虚数、三角函数联系到了一起,是一个数集的桥梁,在后世中应用广泛。
欧拉公式:
不严谨的说明:
已知泰勒展开为:
先确定三个函数的
1.
2.
3.
由
可以发现
特殊的,有
证明:
1.3.2 复指数函数
复指数函数在实数集上的定义与实指数函数的定义一致。
对于复数
复数函数在复平面上的性质:
- 模横正:
。
证明: 。 - 辐角主值:
。
证明: ,于是 。 - 加法定理:
。
代数证明:
令 ,有极坐标证明: - 周期性:
是以 为基本周期的周期函数。
证明: 。
1.3.3 复三角函数
复三角函数在实数集上的定义与实三角函数的定义一致。
然而复三角函数在算法竞赛领域似乎未曾见过应用,暂时只给出复余弦函数与复正弦函数的定义和几个常见性质。
。
显然 。 。
显然 。- 特殊的,若
,则: 。 。
显然 。
复三角函数在复平面上的几个性质:
- 奇偶性:
是复平面上的偶函数。
证明: 。 是复平面上的积函数。
证明: 。
- 周期性:
和 在复平面上的基本周期为 。
证明: 。 - 值域:不同于实余弦函数与实正弦函数值域为
,复余弦函数与复正弦函数的值域为 。
证明: 令 ,记 。显然 。显然 。 - 三角恒等式:实际上基本符合实三角恒等式,暂时只给出常见的
证明。
证明: 有复数的几何意义与勾股定理则显然。
1.4 单位根
复数意义下的解叫做复根。
称
可以断言
证明: 由欧拉公式
设
- 互异性:
有 。
证明: 复数乘法,考虑极坐标系下, 在 互不相同。 - 加法定理:
。
证明: 极坐标系下 。于是 。 - 可除公约数性:
。
证明: 设极坐标系下 。显然 即 。
特殊的, ,又叫折半性。 - 周期性:
。
证明: 。 - 对称性:
。
证明: 显然地 , 。 - 一定性:
。
证明: 由对称性 , 。 - 逆元存在:
存在。
证明: , ,于是 。其中 。
1.5 C++ 中的复数类
不同于 C 中需要调用头文件,C++ 中直接有
类需要定义变量类型为 或 或 。- 一个
类可以初始化变量 。 是 类型的辐角。 - 一个
类有成员函数 和 ,可以访问实部和虚部。 - 一个
类有常见的非成员函数 、 、 、 ,返回复数的实部、虚部、模长、辐角。
2.多项式
2.1 多项式简介
2.1.1 多项式定义
对于常数系数乘以幂函数的和式
如果是有限项相加,称为多项式,写作
如果是无限项相加,成为幂级数,写作
2.1.2 多项式的阶和度
对于多项式
2.2 多项式表示
2.2.1 多项式系数表示
多项式的系数表示即:
2.2.2 多项式点值表示
先断言:一组横坐标不同的
即
证明:
不妨让
- 唯一性证明:
将方程组写成矩阵形式:
即
显然
- 矩阵可逆(即有逆元)
- 行列式不为
(即行向量线性无关、列向量线性无关,即有唯一解)
详见:https://www.cnblogs.com/zsxuan/p/18057134 。
于是
且
- 正确性证明:
唯一性证明完毕的基础下,正确性构造一下就成立了。
显然将一组不同的 与 代入方程组,得到的 是唯一的且和 中的系数相等。
2.2.3 多项式系数表示与点值表示的朴素转化
朴素的系数表示转点值表示:求出
朴素的点值表示转系数表示:横坐标非连续的情况下,通过拉格朗日插值
2.3 多项式加法与等差前缀和升阶定理
多项式加法:
系数表示下:若
点值表示下:
时间复杂度
只讨论系数表示意义下的多项式等差前缀和:
多项式等差前缀和:
等差前缀和升阶:
时间复杂度
如果有必要,多项式点值表示可以转化为多项式系数表示再进行前缀和。
2.4 多项式卷积
2.4.1 多项式乘法
多项式卷积即多项式乘法
定义
显然地
2.4.2 多项式系数表示下的卷积:
不考虑类似生成函数的角度,只考虑朴素的系数卷积。
定义
从 DP 的角度考虑转移方程:
则有:
算法的时间复杂度是
2.4.3 多项式点值表示下的卷积:
让
定义
则
算法的时间复杂度是
2.4.4 多项式快速卷积
可以提出爆论: 现实中遇到的需要处理的某个多项式几乎都是系数表示。且很多时候需要计算多项式在系数表示下的卷积。
是否可以避开系数卷积?即将系数转为点值,在点值意义下计算卷积,再转回系数?
显然这个做法的卷积复杂度为
这时候需要引入多项式快速变换算法。
2.4.5 常见多项式卷积
3.DFT
对于一个
。 。
证明:
- __builtin_clz 和 __builtin_popcount 传入 unsigned int 。
- 2^{31 - 31} = 1。
- 当且仅当 __built_popcount(x) >= 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 蝶变复写算法
观察
分析单位根的折半图:
和 的两个位置只能影响到 和 的两个位置。 的位置与下层 的位置一样。 的位置与下层 的位置一样。
于是这四个位置可以直接复写,而不需要开额外空间。
代码类似
complex<double> u = a[k], v = wmi * a[k + m / 2]; a[k] = u + v; a[k + m / 2] = u - v;
4.2 FT 蝶变定理
显然单位根的折半不会打乱顺序,但常数系数的折半会。
这里进行一些模拟
基于这个模拟,提出一个爆论:
一个排列
证明这个爆论正确的方法是,找不到模拟的反例。
于是该爆论可以视为定理。
需要先将常数系数置换到终点位置,才能从终点倍增回答案。于是有位逆序置换算法。
4.3 位逆序置换
4.3.1 位逆序变换算法
设二进制长度为
考虑一件事:
于是
于是将结果或上
写成公式即
当
显然
4.3.2 位逆序置换算法
考虑如何将权值
不开额外空间的置换只能使用
观察到性质
一个朴素的想法是开一份空间
有不开额外空间的办法吗?
正向遍历,借助
- 若
,已经是答案。不妨默认为 。 - 若
, ,并 。
可以断言若
显然。- 若
,则 ,即 会先于 被标记,与 矛盾。
这意味着只有
于是位逆序置换算法为,正向线性遍历
5.IDFT
一般
6. 原根在 NTT 中的性质
详见:https://www.cnblogs.com/zsxuan/p/18099744
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现