FFT 与 NTT 学习笔记
【概念】
点值:给定多项式
求点值的算法一般是
插值:给定
求插值的算法一般是拉格朗日插值,令多项式
容易观察到
则
下证唯一性。若有两个多项式
考虑
【单位根的性质】
考虑复数,记
因为单位根的定义,所以
还有一个性质:
复数的折半定理:
【FFT:快速傅里叶变换】
考虑这样一个问题:给定
多项式的乘积,其实就是系数的卷积。所以 FFT 解决的是卷积的问题。
令
如果直接循环做,是
为了确定
基本思路是:① 求出
拉格朗日插值也是
这里我们取
(当
-
求
在 的值。我们用分治的思路解决这个问题。但在这之前,我们假定
是二的幂。如果 不是二的幂,补若干个 系数使 是二的幂。定义
。定义
。观察到
。问题转化为计算 和 在 的值(求平方项的值)。(折半定理:
,除以 后再对 取模)于是可以递归
求解。则 在 的点值 。可以 求得。 -
求
的点值。与上同理。 -
插值还原
。也同样采取递归的思路。这里引入矩阵的角度理解点值。(
)记等号左边列向量为
,矩阵为 ,右侧列向量为 。观察到 (编号从 开始)。 。插值就是已知 求 ,即求 。那 的逆 是什么呢?形式也很简单:
。编号也是从 开始。验证的话只要证明他俩相乘等于单位矩阵(对角线
其余 )。观察到
和 就是把每一个 都换成了他的共轭。类似点值的递归公式 ,可以写出插值的递归公式 。递归的写法常数巨大。但这个过程其实可以用非递归实现。观察我们递归时哪些值被处理。
(注意每次不是分首尾两半而是奇偶两半)
发现了吗?最下面一层的二进制数如果从右往左读,刚好是
。还有一个优化:上面我们对
做了两次 DFT,对 做了一次 IDFT,共三次。但是如果 的系数都是实数,其实可以只做两次。摘自知乎。
至此,FFT 的算法介绍完毕。
【FFT 应用】
大整数乘积
一个
合法平行四边形
题意:
考虑一个合法的平行四边形,将它补全成一个正方形。
则它的面积可以表示为
令
所以
力
把很像卷积的形式变成标准卷积:考虑拆开两半,一半标准形式,另一半对称地求。
给出
对
可以理解
定义
但这不是标准卷积的形式,因为这里的
法一:考虑平移。
令
则
法二:考虑对称。
令
考虑
Super Rooks on Chessboard
普通的车能控制所在行列;超级车除此之外,还能控制所在的主对角线(左上-右下的对角线)。
棋盘
FFT + 容斥。
先反过来,求有多少个格子被至少一个控制到。
令
即求
难点在于求
设
※ 即求有多少
变形一下,
答案就是
Triple Sums
给定
如果不限制
如何从上面转移到
要求的是
等号左边用两次 FFT 可求。
考虑
(感觉很像
Point Distance
(求有哪几种距离,和有几种点对是这个距离。
下面从
实际上是求
暴力算是
令
(
(当
但是还不是卷积的形式。卷积是求和后等于左边,这里的做差后等于左边。
令
我们有
HDU4609
计数
老样子,先忽略
对于固定的
怎么转化?基本思路还是容斥。用
分类:
-
。即 。这一种的数量也是一个后缀和 ,可以求。 -
。即 ,这种情况肯定成立,于是这一种的 的数量就是数对 的数量 。 -
。类似,这种三元组数量为 。 -
各不相同。-
或 。若原题的答案记作 ,这种的情况数是 。 -
不是最大值。这种情况因为 是升序排列的,一定满足条件。情况数就是 。
-
因此
Sum of Arrays
是长为 的随机生成的数列,将他们任意排列后,令 ,目标是让 中众数的出现次数最大。 。
先做一个简单的转化。
令
然后怎么转化成卷积的形式?这个
令
假定
也就是对于固定的
注意到题目保证
我们可以对于
【NTT 算法】
NTT,数论变换。它解决的问题是:两个多项式
如果用 FFT 最后再取模有个问题:FFT 算出来的大多数都是浮点数,精度不足。
众所周知,FFT 是先在
阶:
模 的阶记作 , 是所有满足 的正整数 中最小的那个。
原根:若
,称 是模 的原根。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!