首页 > 其他分享 >FFT & NTT 复习笔记

FFT & NTT 复习笔记

时间:2024-06-22 17:43:01浏览次数:6  
标签:frac 复习 hat sum FFT NTT aligned omega 2k

快速变换

设原多项式为 \(F(x) = \sum_{i \in [0,n)} a_i x ^ i\),其中 \(n = 2 ^ k, k \in \mathbb Z ^ +\)。

我们要求 \(\forall i \in [0,n),\hat a_i = F(t_i)\),其中 \(t\) 是一个长度为 \(n\) 且两两互不相同的序列。

显然 \(F\) 可以被一组 \(\hat a,t\) 唯一确定,即点值表示法。


另设两个多项式

\[G_0(x)=a_0 + a_2 x + \dots + a_{n - 2} x^{\frac n 2 - 1} \\ G_1(x)=a_1 + a_3 x + \dots + a_{n - 1} x^{\frac n 2 - 1} \\ \]

则有

\[\begin{aligned} F(x) & = \sum_{i \in [0,n)} a_i x ^ i \\ & = a_0 + a_1 x + a_2 x^2 + \dots + a_{n-1} x^{n-1} \\ & = (a_0 + a_2 x^2 + \dots + a_{n-2} x^{n-2}) + (a_1 x + a_3 x^3 + \dots + a_{n-1} x^{n-1}) \\ & = G_0 (x ^ 2) + x G_1 (x ^ 2) \\ \end{aligned} \]


考虑构造单位根 \(\omega _n ^k\) 满足 \(\omega _n ^{\frac n 2} = -1, \omega _{2n} ^ {2k} = \omega _n ^k\)。

显然也有 \(\omega _n ^n = \omega _n ^0 = 1\)。

设 \(\forall i \in [0,n), t_i = \omega _n ^i\)。

当 \(x = \omega _n ^k, k \in [0,\frac n 2)\) 时显然有

\[\begin{aligned} F(\omega _n ^k) & = G_0(\omega _n ^{2k}) + \omega _n ^k G_1(\omega _n ^{2k}) \\ & = G_0(\omega _ {\frac n 2} ^ k) + \omega _n ^k G_1(\omega _{\frac n 2} ^k) \\ \end{aligned} \]

当 \(x = \omega _n ^{k + \frac n 2}, k \in [0,\frac n 2)\) 时有

\[\begin{aligned} F(\omega _n ^{k + \frac n 2}) & = G_0(\omega _n ^{2k + n}) + \omega _n ^{k + \frac n 2} G_1(\omega _n ^{2k + n}) \\ & = G_0(\omega _n ^{2k} \cdot \omega _n ^n) - \omega _n ^k G_1(\omega _n ^{2k} \cdot \omega _n ^n) \\ & = G_0(\omega _n ^{2k}) - \omega _n ^k G_1(\omega _n ^{2k}) \\ & = G_0(\omega _{\frac n 2} ^k) - \omega _n ^k G_1(\omega _{\frac n 2} ^k) \\ \end{aligned} \]


由于两者只有一个符号的差异,于是 \(F\) 的点值可以直接 \(\mathrm O(n)\) 从 \(G_0, G_1\) 的点值得到。

递归解决,时间复杂度 \(\mathrm O(n \log n)\)。

逆变换

设变换后的点值序列为 \(\hat a\),即

\[\begin{aligned} \forall i \in [0,n), \hat a_i & = F(\omega _n ^i) \\ & = \sum _{j \in [0,n)} a_j (\omega _n ^i)^j \\ & = \sum _{j \in [0,n)} a_j \omega _n ^{ij} \\ \end{aligned} \]

设多项式 \(\hat F(x) = \sum _{i \in [0,n)} \hat a_i x^i\)。

对 \(\hat F\) 进行点值变换(\(\forall i \in [0,n),t_i = \omega _n ^{-i}\)),设点值序列为 \(s\)。

则有

\[\begin{aligned} \forall i \in [0,n), s_i & = \hat F(\omega _n ^{-i}) \\ & = \sum _{j \in [0,n)} \hat a_j (\omega _n ^{-i}) ^j \\ & = \sum _{j \in [0,n)} \omega _n ^{-ij} \hat a_j \\ & = \sum _{j \in [0,n)} \omega _n ^{-ij} \sum _{k \in [0,n)} a_k \omega _n ^{jk} \\ & = \sum _{j \in [0,n), k \in [0,n)} \omega _n ^{-ij} a_k \omega _n ^{jk} \\ & = \sum _{j \in [0,n), k \in [0,n)} \omega _n ^{j(k-i)} a_k \\ & = \sum _{k \in [0,n)} a_k \sum _{j \in [0,n)} \omega _n ^{j(k-i)} \\ & = \sum _{k \in [0,n)} a_k \sum _{j \in [0,n)} (\omega _n ^{k-i}) ^j \\ \end{aligned} \]


显然第二个求和是一个等比数列,由等比数列求和公式 \(\sum _{i \in [m,n)} p^i = \frac {p^m - p^n} {1 - p}\) 得:

  • 当 \(\omega _n ^{k-i} \not = 1 \iff i \not = k\)

\[\begin{aligned} \sum _{j \in [0,n)} (\omega _n ^{k-i}) ^j & = \frac {1 - \omega _n ^{(k-i) n}} {1 - \omega _n ^{k-i}} \\ & = \frac {1 - (\omega _n ^{k-i}) ^n} {1 - \omega _n ^{k-i}} \\ & = \frac {1 - 1} {1 - \omega _n ^{k-i}} \\ & = 0 \end{aligned} \]

  • 当 \(\omega _n ^{k-i} = 1 \iff i = k\)

\[\sum _{j \in [0,n)} (\omega _n ^{k-i}) ^j = \sum _{j \in [0,n)} 1 = n \]


因此

\[\begin{aligned} \forall i \in [0,n), s_i & = \sum _{k \in [0,n)} a_k \sum _{j \in [0,n)} (\omega _n ^{k-i}) ^j \\ & = n a_i \\ \end{aligned} \]

于是我们有

\[\forall i \in [0,n), a_i = \frac {s_i} n \]

构造单位根

  • FFT

在复数域下,有 \(\omega _n = \cos \frac {2 \pi} n + \mathrm i \sin \frac {2 \pi} {n}\)。

其中 \(\mathrm i = \sqrt {-1}\) 是 虚数单位,可以用 C++ 中的 complex 库中的 std::complex<double/long double> 存储复数。

  • NTT

对于模数 \(P \in \mathbb P, \exist n,k \in \mathbb Z^+, P=2^nk+1\),在模 \(P\) 意义下有 \(\omega _n \equiv g ^ {\frac {P-1} n}\),其中 \(g\) 是原根。

标签:frac,复习,hat,sum,FFT,NTT,aligned,omega,2k
From: https://www.cnblogs.com/lnw143/p/18262539

相关文章

  • 计算机基础知识复习资料整理
    小林coding:https://xiaolincoding.com/reader_nb/计算机基础整体深入理解计算系统B站地址:https://www.bilibili.com/video/BV1iW411d7hd操作系统主要组成(学习顺序)内存管理进程管理文件系统输入输出管理网络系统入门课程B站清华大学操作系统+《现代操作系统......
  • 【抽代复习笔记】21-群(十五):循环群引理及定义
    例4:证明,如果σ=(i1i2…ik)是Sn中的一个k-循环,而r∈Sn,则rσr^(-1)也是一个k-循环,且rσr^(-1)=(r(i1),r(i2),…,r(ik))。证:①设σ=(i1i2…ik)=(i1ik)(i1ik-1)…(i1i2),则rσr^(-1)=r(i1i2…ik)r^(-1)=r(i1ik)(i1ik-1)…(i1i2)r^(-1)=r(i1ik)[r^(-1)r](i1ik-1)[......
  • 复习提纲:《计算机网络(自顶向下方法)第七版》
    第一章计算机网络和因特网线路交换(Circuitswitching)中的时分复用(TimeDivisionMultiplexing(TDM))与频分复用(FrequencyDivisionMultiplexing(FDM))首先通过信令系统,在网络核心中为两者之间的通信分配一条独享的线路。由于两个交换节点之间的链路带宽较大,可以采用时分......
  • 探索信号世界的奥秘:MATLAB中的傅里叶变换、滤波器与FFT仿真设计
    探索信号世界的奥秘:MATLAB中的傅里叶变换、滤波器与FFT仿真设计一、引言:信息技术的脉搏——信号处理二、技术概述:理论与实践的桥梁傅里叶变换滤波器设计FFT(快速傅里叶变换)代码示例:基本FFT应用三、技术细节:深入理解背后的数学原理傅里叶变换原理滤波器设计原理FFT算法解......
  • [模式识别复习笔记] 第7章 聚类
    1.聚类给定样本集\(D=\{\bm{x}_1,\bm{x}_2,...,\bm{x}_n\}\),\(\bm{x}_i\in\mathbb{R}^d\)。通过聚类将\(n\)个样本划分为\(k\)个簇划分\(\mathcalC=\{C_1,C_2,...,C_k\}\),使得:\[C_i\capC_j=\emptyset,\\foralli\not=j\且\\......
  • [模式识别复习笔记] 第6章 PCA
    1.主成分分析PCAPCA:寻找最能够表示原始数据的投影方法,对数据进行降维,除去冗余的信息。——不考虑类别1.1PCA主要步骤计算散布矩阵\(S\)(或者样本的协方差矩阵)\[S=\sum_{i=1}^{n}(\bm{x}_i-\bm{\mu})(\bm{x}_i-\bm{\mu})^{\text{T}}\]其中\(\bm{\mu}=\frac......
  • [模式识别复习笔记] 第5章 贝叶斯分类器
    1.贝叶斯分类器1.1贝叶斯公式假设有一个试验的样本空间为\(S\),记\(B_1,B_2,\ldots,B_c\)为\(S\)的一个划分,\(A\)为试验的条件,且\(P(A)\not=0\),则:\[P(B_i|A)=\frac{P(B_i)P(A|B_i)}{P(A)}=\frac{P(B_i)P(A|B_i)}{\sum_{j=1}^{c}P(B_j)P(A|B_j)}\]\(P(B_i)......
  • 代码随想录刷题复习day01
    day01数组-二分查找classSolution{publicintsearch(int[]nums,inttarget){//左闭右闭intleft=0;intright=nums.length-1;intmid=0;while(right>=left){mid=left+(right-le......
  • 计算机体系结构期末复习(一二章)
    计算机体系结构期末复习(一二章)由于内容比较多,分为两次发出注意:可能有部分考点遗漏,可能有部分例题没有匹配正确的知识点或被遗漏,欢迎各位补充第一章1.计算机系统的层次性知识点:​​例题:(单选题)在计算机系统层次结构中,从低层到高层,各层相对顺序正确的是()A.传统机......
  • Python期末复习题库(下)
    如果你对Python感兴趣,想要学习pyhton,这里给大家分享一份**Python全套学习资料**,都是我自己学习时整理的,希望可以帮到你,一起加油!1.(单选题)下列关于文件打开模式的说法,错误的是(C)。A.r代表以只读方式打开文件B.w代表以只写方式打开文件C.a代表以二进制形式打开......