任意长度卷积 CZT

就是一波推导

\[\begin{aligned}
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相关的复习的更多相关文章

  1. 多项式FFT相关模板

    自己码了一个模板...有点辛苦...常数十分大,小心使用 #include <iostream> #include <stdio.h> #include <math.h& ...

  2. 快速傅里叶变换(FFT)相关内容汇总

    (原稿:https://paste.ubuntu.com/p/yJNsn3xPt8/) 快速傅里叶变换,是求两个多项式卷积的算法,其时间复杂度为$O(n\log n)$,优于普通卷积求法,且根据有关证 ...

  3. awk 相关的复习

    1. awk 引用外部变量: aa=666  echo "." | awk -v GET_A=$aa '{print GET_A}' . sort -n fuxi.awk |awk ...

  4. sed 等相关的复习

    sed相打印两行之间的内容: sed -n '/111/,/aad/p' fuxi.txt grep -n ".*" fuxi.txt sed -n '2,9'p fuxi.txt ...

  5. 用于ARM上的FFT与IFFT源代码(C语言,不依赖特定平台)(转)

    源:用于ARM上的FFT与IFFT源代码(C语言,不依赖特定平台) 代码在2011年全国电子大赛结束后(2011年9月3日)发布,多个版本,注释详细. /*********************** ...

  6. STM32F4使用FPU+DSP库进行FFT运算的测试过程一

    测试环境:单片机:STM32F407ZGT6   IDE:Keil5.20.0.0  固件库版本:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0 第一部分:使用源码文件的方式,使 ...

  7. 洛谷.3803.[模板]多项式乘法(FFT)

    题目链接:洛谷.LOJ. FFT相关:快速傅里叶变换(FFT)详解.FFT总结.从多项式乘法到快速傅里叶变换. 5.4 又看了一遍,这个也不错. 2019.3.7 叕看了一遍,推荐这个. #inclu ...

  8. DSP5509项目之用FFT识别钢琴音调(4)之麦克风输入和Line in输入

    1. 麦克风输入需要修改的内容,之前的版本是LINE IN的输入.实现功能,检测麦克风的输入,并且同时在耳机里面播放. #include <csl.h> #include <csl_ ...

  9. DSP5509项目之用FFT识别钢琴音调(1)

    1. 其实这个项目难点在于,能不能采集到高质量的钢琴音调.先看一下FFT相关程序. FFT 并不是一种新的变换,它是离散傅立叶变换(DFT)的一种快速算法.由于我们在计算 DFT 时一次复数乘法需用四 ...

随机推荐

  1. Js学习01--基础知识

    一. JavaScript有三种书写格式 1.行内式 <button onclick = 'alert('nice day!');'>Nice Day</button> 2. ...

  2. Junit5中实现参数化测试

    从Junit5开始,对参数化测试支持进行了大幅度的改进和提升.下面我们就一起来详细看看Junit5参数化测试的方法. 部署和依赖 和Junit4相比,Junit5框架更多在向测试平台演进.其核心组成也 ...

  3. Kafka 初识

    1.Kafka 是什么? 用一句话概括一下:Apache Kafka 是一款开源的消息引擎系统. 倘若“消息引擎系统“这个词对你来说有点陌生的话,那么“消息队列“.“消息中间件”的提法想必你一定是有所 ...

  4. Java 平衡二叉树和AVL

      与BST<> 进行对比 import java.util.ArrayList; import java.util.Collections; public class Main { pu ...

  5. django路由的反向解析

    什么是路由的反向解析 我们的路由都是一个匹配关系,对应一个处理的视图函数, 如果我们的匹配关系发生了变化,那么与之对应的访问地址(可能前端直接url链接, 也可能是后端的redrict跳转)都需要跟着 ...

  6. 字符串导出xml文件并弹出下载对话框

    转自:https://blog.csdn.net/zhandingfeng/article/details/53887354 导出单个xml文件:[java] view plain copy      ...

  7. [LeetCode] 581. 最短无序连续子数组 ☆

    描述 给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序. 你找到的子数组应是最短的,请输出它的长度. 示例 1: 输入: [2, 6, 4, 8 ...

  8. mac中git flow使用

    初始化 git flow init   最后就一路回车选择默认的就ok了 常用命令以及分支:分支介绍:1.master.只有一个,并且不会在master上进行代码的操作.2.develop.只有一个, ...

  9. 迷你商城后台管理系统————stage1需求分析

    PS:迷你商城后台管理系统---需求分析.docx下载~click me 迷你商城后台管理系统-- 需求分析 1. 引言 作为互联网热潮的崛起,消费者们的普遍差异化,实体商城要想在互联网的浪潮中继续发 ...

  10. 数据库类型对应Java语言类型表

    下表列出了基本 SQL Server.JDBC 和 Java 编程语言数据类型之间的默认映射: SQL Server 类型 JDBC 类型 (java.sql.Types) Java 语言类型 big ...