当前位置: 首页 > news >正文

fft相关的复习

任意长度卷积 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;
}

转载于:https://www.cnblogs.com/foreverpiano/p/10502674.html

相关文章:

  • 010-cloudboot批量安装rancheros
  • Audacity 2.3.1 发布,恢复 Linux 支持
  • 本地vs云:大数据厮杀的最终幸存者会是谁?
  • Confluence 6 示例 - https://confluence.atlassian.com/
  • 没有网站,靠什么来吸引近9亿的互联网用户
  • 金融壹账通获人工智能杰出奖 微表情识别技术再获国际认可
  • Godot 3.1 发布,可用性提升,并带来大量新特性
  • spring boot 整合Mybatis
  • mysql b+ tree 3阶索引能存多少数据
  • Python进阶:如何将字符串常量转化为变量?
  • Spring Boot:快速入门(二)
  • 你可能不太会用的10个Git命令
  • 阿里巴巴复杂搜索系统的可靠性优化之路
  • roncoo-education 2.0.0 正式发布,分布式在线教育系统
  • 如何根据自己业务场景购买阿里云产品
  • 分享的文章《人生如棋》
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 2017届校招提前批面试回顾
  • Apache Pulsar 2.1 重磅发布
  • Apache Zeppelin在Apache Trafodion上的可视化
  • extjs4学习之配置
  • HTTP 简介
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 给github项目添加CI badge
  • 记一次删除Git记录中的大文件的过程
  • 强力优化Rancher k8s中国区的使用体验
  • 微信开放平台全网发布【失败】的几点排查方法
  • 我这样减少了26.5M Java内存!
  • 小程序 setData 学问多
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • #includecmath
  • #Ubuntu(修改root信息)
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (1)常见O(n^2)排序算法解析
  • (2022 CVPR) Unbiased Teacher v2
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (8)STL算法之替换
  • (Oracle)SQL优化技巧(一):分页查询
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • .bat批处理(一):@echo off
  • .CSS-hover 的解释
  • .NET CLR基本术语
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
  • [120_移动开发Android]008_android开发之Pull操作xml文件