FFT(快速傅里叶变换)和 NTT(快速数论变换)
Table of Contents
要理解 FFT(快速傅里叶变换)和 NTT(快速数论变换),首先必须理解它们试图解决的核心问题:多项式乘法(Polynomial Multiplication),或者更广泛地说,卷积(Convolution)。
1. 理论基础:多项式的两种表示法
在数学中,一个
A. 系数表示法 (Coefficient Representation)
这是最直观的表示法,即用一个系数向量来表示多项式:
问题: 在这种表示法下,两个多项式
计算复杂度: 计算所有系数需要两两相乘,复杂度为
B. 点值表示法 (Point-Value Representation)
根据代数基本定理,一个
优势: 在这种表示法下,多项式乘法变得异常简单。如果
计算复杂度: 只需要进行
2. 核心问题与解决方案
这就引出了 FFT/NTT 的核心逻辑链条:
- 目标: 快速计算多项式乘法。
- 障碍: 系数乘法
太慢;点值乘法 很快,但我们通常只知道系数。 - 策略:
- 第一步(求值 Evaluation):将系数表示法转换为点值表示法。
- 第二步(点乘 Point-wise Multiplication):在点值表示下进行
的乘法。 - 第三步(插值 Interpolation):将结果从点值表示法还原回系数表示法。
瓶颈: 普通的求值(代入
突破: FFT 和 NTT 的伟大之处在于,通过巧妙地选择那
3. FFT(快速傅里叶变换):复平面上的分治
FFT 选择的特殊点是单位复根(Roots of Unity)。
这里的“巧妙选择”是什么?
为了使用分治法,选取的点集必须具有对称性和周期性。在复平面上,方程
核心性质
- 折半引理(Halving Lemma):
。这意味着 次单位根平方后,落入 次单位根的集合中。这是分治递归的基础。 - 消去引理:
。 - 周期性:
。这意味着我们在计算前半部分时,可以免费得到后半部分所需的信息。
FFT 算法步骤
我们要计算
代入单位根
结论: 原本规模为
逆变换 (IFFT)
插值过程(从点值回系数)与正变换惊人地相似。只需要将
4. NTT(快速数论变换):从复数域到有限域
FFT 极其强大,但存在一个致命缺陷:精度丢失。 FFT 依赖复数和三角函数运算,计算机使用浮点数存储,经过大量运算后会产生误差。在数论、组合数学或大整数乘法题目中,我们需要精确的整数结果,浮点误差是不可接受的。
NTT 是 FFT 在模运算域(有限域)上的变体。它保留了 FFT 的分治结构,但将“单位复根”替换为“原根”。
理论迁移:寻找 的替代品
在 FFT 中,
若
这个
- 归一性:
。 - 折半性:
。 - 互异性:
在模 下互不相同。
NTT 算法流程
流程与 FFT 完全一致,只是将复数运算换成了模
- 复数加法
模加法。 - 复数乘法
模乘法。 - 单位根
。
优势与局限
- 优势: 没有任何精度损失,全是整数运算,且取模运算通常比浮点运算快。
- 局限: 模数
必须具备特殊形式( ),且多项式系数乘积的结果不能超过模数(或者是必须要对该模数取模的问题)。如果需要任意模数,则需要使用“任意模数 NTT”(通常涉及拆系数或多个模数合并 CRT)。
5. 总结
要掌握 FFT/NTT,请记住:
- 宏观视角: 这是一种“降维打击”。我们在时域(系数)上处理卷积很困难,于是通过变换穿越到频域(点值),在频域上乘法变得极其简单,处理完后再穿回来。
- 微观操作: 能够穿越的关键在于利用了数学对象的对称性(圆上的点、模域的循环群)。分治法利用这种对称性,避免了重复计算。
- 对比:
- FFT: 也就是复平面上的圆。适用于信号处理、不需要绝对精度的科学计算。
- NTT: 也就是模运算下的“圆”(循环群)。适用于大整数乘法、组合计数、加密算法等需要精确整数解的场景。
最终公式化记忆: