FFT与NTT

news/2025/3/28 6:48:24/文章来源:https://www.cnblogs.com/IAKCTSC/p/18785173

闲话

老师,数论会和 dp 有关吗?
“会的,而且如果有关的话也会比较简单

开篇

FFTNTT 都是用来求多项式的,他们可以求所有的 加法卷积,也就是形如 \(h_x=\sum\limits_{i+j=x}a_ib_j\)。那么显然我们的多项式乘法、以及一些 dp 式都具有卷积的特性。
初中老师都教过我们,如果是多个多项式相乘,我们可以拆括号,那么如果两个序列长度为 \(n\)\(m\),那么我们的计算量为 \(\mathcal O(nm)\)
那么到 OI 里,有没有我们更快的算法呢?前面我们都讲过,OI 最大的乐趣,莫过于 \(\mathcal O(n^2)\rightarrow \mathcal O(n\log n)\)
那么我们如何优化这种算法呢?

点值表示

我们假设我们有一个 \(n-1\) 次多项式,那么我们假设 \(y=\sum\limits_{i=0}^{n-1} a_ix^i\),那么我们显然有 \(n\) 个解 \(x_0,x_1,\cdots,x_{n-1}\),并且有对应的 \(y_0,y_1,\cdots,y_n\),那么我们将 \(<x_0,y_0>,<x_1,y_1>,\cdots,<x_{n-1},y_{n-1}>\) 记作点值。
那么我么假设我们随了几组特别强的 \(x_i\),那么当然 \(y_i\) 也会很强,我们考虑怎么确定这个多项式呢?

点值唯一定理

假设我们有不同的 \(x_i\),那么根据这些 \(<x_i,y_i>\) 我们可以逆推原多项式的 \(a_i\),即根据数值求系数,并且情况是 唯一的
可以补充一下怎么求解。
我们写成矩阵形式,即:

\[\begin{bmatrix}1 & 1 & 1 & \cdots & \cdots & 1\\1 & x_1 & x_1^2 & \cdots & \cdots & x_1^{n-1}\\1 & \cdots & \cdots & \cdots & \cdots & \cdots\\1 & x_{n-1} & x_{n-1}^2 & \cdots & \cdots & x_{n-1}^{n-1} \end{bmatrix} \times \begin{bmatrix} a_0\\ a_1\\ a_2\\ \cdots\\ a_{n-1} \end{bmatrix} = \begin{bmatrix} y_0\\ y_1\\ y_2\\ \cdots\\ y_{n-1} \end{bmatrix} \]

以上为范德蒙德卷积形式,只要 \(<x_0,x_1,\cdots,x_{n-1}>\) 互不相同,就有唯一解,这就是 DFT 的过程。
我们可以给个简单的证明。我们将上面的矩阵写为行列式。

\[\begin{vmatrix} 1 & x_0 & x_0^2 & \cdots & \cdots & x_0^{n-1}\\1 & x_1 & x_1^2 & \cdots & \cdots & x_1^{n-1}\\1 & \cdots & \cdots & \cdots & \cdots & \cdots\\1 & x_{n-1} & x_{n-1}^2 & \cdots & \cdots & x_{n-1}^{n-1} \end{vmatrix} \]

我们每一次用前一列乘上 \(x_0\) 然后消去,可以得到:

\[\begin{vmatrix} 1 & 0 & 0 & \cdots & \cdots & 0\\1 & x_1-x_0 & x_1(x_1-x_0) & \cdots & \cdots & x_1^{n-2}(x_1-x_0)\\1 & \cdots & \cdots & \cdots & \cdots & \cdots\\1 & x_{n-1}-x_0 & x_{n-1}(x_{n-1}-x_0) & \cdots & \cdots & x_{n-1}^{n-2}(x_{n-1}-x_0) \end{vmatrix} \]

很好!让我们紧接着提取公因式,得到:

\[\prod\limits_{i=1}^{n-1}(x_i-x_0)\times \begin{vmatrix}1 & x_1 & x_1^2 & \cdots & \cdots & x_1^{n-2}\\1 & \cdots & \cdots & \cdots & \cdots & \cdots\\1 & x_{n-1} & x_{n-1}^2 & \cdots & \cdots & x_{n-1}^{n-2} \end{vmatrix} \]

以此类推我们就找到了递推式!然后我们就可以发现,只要 \(x_i\) 互不相同,就不会有 \(0\),然后就有唯一解了。


非常好,所以现在我们只需要找到若干个点值就可以得到这个多项式的系数了,这就叫做 IDFT
但是这样是 \(\mathcal O(n^2)\) 的复杂度傻大,所以咋办呢?

DFT

单位根

我们发现上面的做法瓶颈是啥呢?是确定完了 \(n\)\(x_i\) 后求数值,这样就是 \(\mathcal O(n)\times O(n)\),怎么办呢?
我们可以把目光放到 \(x_i\) 上,我们想有没有一些具有性质的数,能够降低复杂度呢?
答案是 单位根
先来讲讲复数,我们定义 \(i=\sqrt{-1}\),而我们设 \(z=a+bi\),这就是一个复数了。复数的加减乘除和实数完全一致。
我们如果把普通平面直角坐标系放到复数系,那么我们就可以得到复平面的一个向量来表示复数。
我们可以表示 \(z=|z|(\cos\theta+i\sin\theta)\)\(|z|\) 表示模长。
我们可以简写为 \(z=e^{i\theta}\)
那么单位根是个啥东东呢?我们假设 \(\omega_n\)\(n\) 次单位根,那么 \(\omega_n=\cos{\frac{2\pi}{n}}+i\sin{\frac{2\pi}{n}}\)
然后我们可以发现一些规律。

  1. \(\omega_n^{\frac{n}{2}}=-\omega_n^0\)
  2. \(\omega_n=\omega_0\)
  3. \(\omega_{nk}^{kd}=\omega_{n}^d\)
  4. 折半定理:\(\forall n,k\in\{k|k=2y,y\in N\},\omega_n^k=\omega_{\frac{n}{2}}^{\frac{k}{2}}\)
  5. \(\sum\limits_{i=0}^{n-1} \omega_n^i=0\)
  6. \(\omega_n^k=\omega_n^{k\% n}\)
    根据以上性质,我们就可以快速计算单位根的幂次,这样就不用 \(\mathcal O(n)\) 算值了,而是 \(\mathcal O(\log n)\) 次!
    具体的,我们设 \(<\omega_n^0,\omega_n^1,\cdots,\omega_n^{n-1}>\)\(y=\sum\limits_{i=0}^{n-1}a_ix^i\),那么我们方便起见令 \(n=2^L-1\),也就是比它大的第一个 \(2\) 的幂次减一。
    我们把 \(y\) 的多项式分为奇偶项(根据次数)。我们得到 \(y_i=(a_0+a_2\omega_n^{2i}+a_4\omega_n^{4i}+\cdots+a_{n-2}\omega_n^{(n-2)i})+\omega_n^i(a_1+a_3\omega_n^{2i}+\cdots+a_{n-1}\omega_n^{(n-2)i})\)
    根据折半定理,\(y_i=(a_0+a_2\omega_{\frac{n}{2}}^{i}+a_4\omega_{\frac{n}{2}}^{2i}+\cdots+a_{n-2}\omega_{\frac{n}{2}}^{\frac{(n-2)i}{2}})+\omega_n^i(a_1+a_3\omega_{\frac{n}{2}}^{i}+\cdots+a_{n-1}\omega_{\frac{n}{2}}^{\frac{(n-2)i}{2}})\)
    我们令 \(Y_1(\omega_{\frac{n}{2}}^{i})=a_0+a_2\omega_{\frac{n}{2}}^{i}+a_4\omega_{\frac{n}{2}}^{2i}+\cdots+a_{n-2}\omega_{\frac{n}{2}}^{\frac{(n-2)i}{2}}\)\(Y_2(\omega_{\frac{n}{2}}^{i})=a_1+a_3\omega_{\frac{n}{2}}^{i}+\cdots+a_{n-1}\omega_{\frac{n}{2}}^{\frac{(n-2)i}{2}}\),那么 \(y_i=Y_1(\omega_{\frac{n}{2}}^{i})+\omega_n^iY_2(\omega_{\frac{n}{2}}^{i})\)
    但是这样我们的 \(i\) 还是 \(n\) 的级别,怎么与 \(\frac{n}{2}\) 建立联系呢?
    我们可以发现当 \(i\in [0,\frac{n}{2})\),我们就用 \(y_i=Y_1(\omega_{\frac{n}{2}}^{i})+\omega_n^iY_2(\omega_{\frac{n}{2}}^{i})\)
    对于 \(i\in[\frac{n}{2},n)\),我们可以 \(y_i=Y_1(\omega_{\frac{n}{2}}^{i-\frac{n}{2}})+\omega_n^{i-\frac{n}{2}}\omega_n^{\frac{n}{2}}Y_2(\omega_{\frac{n}{2}}^{i-\frac{n}{2}})\)
    大功告成!这样无论 \(i\) 取何值,我们都有 \(n\)\(\frac{n}{2}\) 的映射了!
    而我们发现 \(\omega_n^{n\frac{n}{2}=-1\),所以对于 \(i\in[\frac{n}{2},n)\),我们可以 \(y_i=Y_1(\omega_{\frac{n}{2}}^{i-\frac{n}{2}})-\omega_n^{i-\frac{n}{2}}Y_2(\omega_{\frac{n}{2}}^{i-\frac{n}{2}})\)
    我们对于 \(i\in [0,\frac{n}{2})\),可以这么写:

\[\begin{cases} y_i=Y_1(\omega_{\frac{n}{2}}^{i})+\omega_n^iY_2(\omega_{\frac{n}{2}}^{i})\\\ y_{i+\frac{n}{2}}=Y_1(\omega_{\frac{n}{2}}^{i})-\omega_n^{i}Y_2(\omega_{\frac{n}{2}}^{i}) \end{cases} \]

这样我们原来要求的是 \(y_0,\cdots,y_{n-1}\),现在我们只需要求 \({Y_1}_0,\cdots,{Y_1}_{\frac{n}{2}-1}\)\({Y_2}_0,\cdots,{Y_2}_{\frac{n}{2}-1}\)
根据主定理,这显然是 \(\mathcal O(n\log n)\)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/902478.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

save actions 设置

activate save actions on save – 在保存的时候激活save actions optimize imports – 自动删除没有引用的importsreformat file – 自动格式化代码add missing @Override – 在save actions激活的时候直接提添加overrideadd a serialVersionUID – 自动添加序列化id

同源策略SpringBoot允许跨域请求配置

完全允许(测试环境) import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotat…

【Vscode】用Vscode配置简约方便的Qt环境!

其实本文是在好不容易配好的情况下写成 故进食后人 Qt Creator的那个页面真的好丑 写完上学期大作业 这学期还要写的时候终于受不了了 而且各种报错什么的非常不好用 不知道是在干嘛 毕竟谁不想用舒服的字体 然后再配上麻衣学姐的背景和看板娘写代码呢?() 于是我开始探索怎么…

17.6K star!后端接口零代码的神器来了,腾讯开源的ORM库太强了!

"🏆 实时零代码、全功能、强安全 ORM 库 🚀 后端接口和文档零代码,前端定制返回 JSON 的数据和结构"嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法"🏆 实时零代码、全功能、强安全 ORM 库 🚀 后端接口和文…

WPF 和 Avalonia 开发者的 html css 前端指南 WrapPanel 篇

本文主要是向大家列出 WPF 和 Avalonia 的 WrapPanel 在 html 和 css 的实现方法。WPF 和 Avalonia 开发者的 html css 前端指南 WrapPanel 篇笔者前端框架使用的是 Vue3 + Deno。 笔者主要会以 Avalonia 作为 C# 技术部分的示例。 本文主要是向大家列出 WPF 和 Avalonia 的 Wr…

os管理文件和open创建文件

目录os基础操作获取当前工作目录更改工作目录列出目录内容创建目录删除目录、文件文件重命名路径拼接与拆分判断路径是否存在递归遍历目录open创建文件读取模式下写入模式下 os基础操作 获取当前工作目录 import os #返回的是一个绝对路径 print(f"当前的工作目录为:{os.…

【VMware VCF】VMware Cloud Foundation 5.2.1.1

如果你尝试访问 KB 52520 并跟踪 VMware Cloud Foundation 发行版本,可能会发现当前最新版本是 VMware Cloud Foundation 5.2.1。如果登录 SDDC Manager UI,导航到生命周期管理->发行版本,从这里查看 VCF 的版本也是同样如此(如下图所示)。但是,如果查看 VMware Cloud…

注意力机制流程图

知识是我们已知的也是我们未知的基于已有的知识之上我们去发现未知的由此,知识得到扩充我们获得的知识越多未知的知识就会更多因而,知识扩充永无止境

26-搭建审计迷你天猫商城python相关知识

1、搭建迷你天猫商城系统并复现log4j2 、fastjson命令执行、sql注入漏洞 搭建迷你天猫商城下载源码配置数据库(5.7.26)将数据库文件导入,,修改 application.properties中 的数据库账号密码 当数据库版本 > 5.7 时会报 GROUP BY 语句的错误,所以还需要修改 MySQL 5.7.26…

焊接保护气体自适应调节装置

机器人焊接节气这一术语,指的是在焊接作业流程中,借助特定的技术手段或专业装置,旨在有效缩减焊接气体的使用量,进而达成资源节约与成本控制的双重目标。这一技术精髓在于对焊接气体流量的智能化调控,使之与焊接电流形成精准匹配,从而杜绝气体的无谓损耗。焊接气体自适应…

华为Pura X首发搭载鸿蒙5,应用市场体验再升级

3月20日,华为Pura先锋盛典及鸿蒙智行新品发布会如期举行,正式推出首款搭载HarmonyOS 5的新形态阔折叠手机Pura X,硬件设计实现突破性创新。生态上,鸿蒙应用市场(AppGallery)也完成全新升级,整合了生活、娱乐、办公、金融等多元场景,精准满足用户需求,实现应用高效获取…