fft相关的复习
任意长度卷积 CZT
就是一波推导
b_i &= \sum_{j=0}^{n-1} \omega^{ij}a_j \\
&= \sum_{j=0}^{n-1} \omega^{\frac{i^2+j^2-(i-j)^2}{2}}a_j \\
&= \omega^{\frac{i^2}{2}} \sum_{j=0}^{n-1}\omega^{\frac{-(i-j)^2}{2}} a_j \omega^{j^2}
\end {aligned}
\]
后面是一个减法卷积,就可以扩展到2的幂次直接fft就好了。
2次dft计算卷积
考虑有两个长度为\(n = 2^k\)的序列\(a(x), b(x)\),我们要计算他们的dft。
构造序列\(p_k = a_k + ib_k, \; q_k = a_k - ib_k\),
有结论\(dft_q(k) = conj(dft_p((n - k) \mod n))\)。展开,考虑几何意义???
我们可以解出\(dft_a, dft_b\)。
再做一遍idft就可以了
拆系数fft
记\(M = \sqrt {mod}\),把\(x\)表示成\(x = a \times M + b, b < M\)。
\((a \times M + b)(c \times M + d) = ac \times M^2 + (ad + bc) \times M + bd\)
对每一项分开算,做7次dft就可以了。
套用上述介绍做法4次dft就够了。
实现上注意在idft的时候,直接把一个序列放在real,另一个放在imag,idft回来直接/N后计算贡献就好了。
以及我们可以直接在一个for里面做解出AB,reverse序列的事情。
下面是关键部分的代码。
poly realmain(poly a, poly b) {
int n = a.size(), m = b.size();
prepare(n + m - 1);
for (int i = 0; i < n; i++) A[i] = cpx(a[i] & 32767, a[i] >> 15);
for (int i = 0; i < m; i++) B[i] = cpx(b[i] & 32767, b[i] >> 15);
dft(A, fft_n); dft(B, fft_n);
for (int i = 0; i < fft_n; i++) {
int j = (fft_n - i) % fft_n;
cpx ax, ay, bx, by;
ax = (A[i] + A[j].conj()) * cpx(0.5, 0);
ay = (A[i] - A[j].conj()) * cpx(0, -0.5);
bx = (B[i] + B[j].conj()) * cpx(0.5, 0);
by = (B[i] - B[j].conj()) * cpx(0, -0.5);
C[j] = ax * bx + ay * by * cpx(0, 1.0);
D[j] = ay * bx + ax * by * cpx(0, 1.0);
}
dft(C, fft_n); dft(D, fft_n);
poly ans(n + m - 1, 0);
for (int i = 0; i < ans.size(); i++) {
lo ax = lo(C[i].x / fft_n + 0.5) % mod;
lo ay = lo(C[i].y / fft_n + 0.5) % mod;
lo bx = lo(D[i].x / fft_n + 0.5) % mod;
lo by = lo(D[i].y / fft_n + 0.5) % mod;
ans[i] = ax + ((by + bx) << 15) + (ay << 30);
ans[i] = (ans[i] % mod + mod) % mod;
}
return ans;
}
fft相关的复习的更多相关文章
- 多项式FFT相关模板
自己码了一个模板...有点辛苦...常数十分大,小心使用 #include <iostream> #include <stdio.h> #include <math.h& ...
- 快速傅里叶变换(FFT)相关内容汇总
(原稿:https://paste.ubuntu.com/p/yJNsn3xPt8/) 快速傅里叶变换,是求两个多项式卷积的算法,其时间复杂度为$O(n\log n)$,优于普通卷积求法,且根据有关证 ...
- awk 相关的复习
1. awk 引用外部变量: aa=666 echo "." | awk -v GET_A=$aa '{print GET_A}' . sort -n fuxi.awk |awk ...
- sed 等相关的复习
sed相打印两行之间的内容: sed -n '/111/,/aad/p' fuxi.txt grep -n ".*" fuxi.txt sed -n '2,9'p fuxi.txt ...
- 用于ARM上的FFT与IFFT源代码(C语言,不依赖特定平台)(转)
源:用于ARM上的FFT与IFFT源代码(C语言,不依赖特定平台) 代码在2011年全国电子大赛结束后(2011年9月3日)发布,多个版本,注释详细. /*********************** ...
- STM32F4使用FPU+DSP库进行FFT运算的测试过程一
测试环境:单片机:STM32F407ZGT6 IDE:Keil5.20.0.0 固件库版本:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0 第一部分:使用源码文件的方式,使 ...
- 洛谷.3803.[模板]多项式乘法(FFT)
题目链接:洛谷.LOJ. FFT相关:快速傅里叶变换(FFT)详解.FFT总结.从多项式乘法到快速傅里叶变换. 5.4 又看了一遍,这个也不错. 2019.3.7 叕看了一遍,推荐这个. #inclu ...
- DSP5509项目之用FFT识别钢琴音调(4)之麦克风输入和Line in输入
1. 麦克风输入需要修改的内容,之前的版本是LINE IN的输入.实现功能,检测麦克风的输入,并且同时在耳机里面播放. #include <csl.h> #include <csl_ ...
- DSP5509项目之用FFT识别钢琴音调(1)
1. 其实这个项目难点在于,能不能采集到高质量的钢琴音调.先看一下FFT相关程序. FFT 并不是一种新的变换,它是离散傅立叶变换(DFT)的一种快速算法.由于我们在计算 DFT 时一次复数乘法需用四 ...
随机推荐
- [SOJ #538]好数 [CC]FAVNUM(2019-8-6考试)
题目大意:给定$n$个正整数,求$[l,r]$中第$k$小的”好数“.$l,r\leqslant10^{18},n\leqslant62$,出现的其他数均$\leqslant10^{50}$ 好数定义 ...
- Spring Cloud Alibaba学习笔记(20) - Spring Cloud Gateway 内置的全局过滤器
参考:https://cloud.spring.io/spring-cloud-static/Greenwich.SR2/single/spring-cloud.html#_global_filter ...
- 修改Mysql 字符集,支持Emoji表情
插入失败 java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1 at ...
- CentOS 6.5本地yum源、局域网离线yum仓库(断网情况下轻松安装各种依赖包)
在工作中, 公司的服务器大部分都禁止连接外网的,初始化系统,测试某些产品时,往往缺一些软件或依赖包,一个个上传到机器,如此浪费时间,浪费金钱,en...yum能够自动查找并解决rpm包之间的依赖关系, ...
- MySQL Binlog--PURGE MASTER LOGS失败
问题背景: 在我们磁盘空间维护策略中,BINLOG的默认保留期限为7天,但当磁盘空间不足时,会根据磁盘空间使用率自动清理超过一定数量的BINLOG. 问题原因: 某服务器上报磁盘空间不足,登录服务器发 ...
- MySQL Binlog--基于ROW模式的binlog event大小限制
参数binlog-row-event-max-size:Specify the maximum size of a row-based binary log event, in bytes. Rows ...
- redis键过期 (redis 2.6及以上)
EXPIRE key seconds 用来对一个键设置一个过期时间,第二个参数表示经过多少秒后键过期. 一个键过期后, 这个键将会被自动删除. 在Redis术语中,带有过期时间的键经常被称作volat ...
- Bash基础——减号-
参考:Bash基础——pipe pipe命令在 bash 的连续的处理程序中相当重要.在pipe命令当中,常常会使用到前一个命令的 stdout 作为这次的 stdin , 某些命令需要用到文件名 ( ...
- 走迷宫(bfs, 最短路)
Input 10 10 #S######.# ......#..# .#.##.##.# .#........ ##.##.#### ....#....# .#######.# ....#..... ...
- java基础(10)---stream流
一.stream的应用场景 for遍历的冗余场景: stream的写法: 二.获取Stream流的常用方式 三.Stream的map映射方法 更简单的写法: 四.Stream的filter过滤方法 ...