FFT剖析
快速傅里叶变换 (fast Fourier transform)
xn={x0,x1,…xn-1} (num:N)
旋转因子系数:
d=2pik/N
旋转因子
wk(n)=(cos(dn)+isin(dn)) n=[0,N-1]
y(k)= sum(x(n)wk(n),0,N-1)
y(k)={y(0),y(1),…y(N-1)} 傅里叶级数
x(n)wk(n)的级数是:
1.d=2pik/N 这个系数决定转动圈数,不懂看第二个再说
2.y(k)=x(0)wk(0)+x(1)wk(2)+…+x(n-1)wk(n-1)
旋转因子:cos(t)+isin(t)
t=2pikn/N
T=2pi就是一圈,那么可以得出步进量:2pi*k/N, 圈数:k
在一圈中:wk(n)的单位圆上t<=pi/2,是他的展开区 t<=pi是他的对称区
#include <bits/stdc++.h>
#define fu(x , y , z) for(int x = y ; x <= z ; x ++)
#define fd(x , y , z) for(int x = y ; x >= z ; x --)
#define LL long long
using namespace std;
const int N = 4e6 + 5;
const double pi = acos (-1.0);
struct node {double x , y;
} a[N] , b[N];
int n , m , len = 1 , r[N] , l;
node operator + (node a, node b) { return (node){a.x + b.x , a.y + b.y};}
node operator - (node a, node b) { return (node){a.x - b.x , a.y - b.y};}
node operator * (node a, node b) { return (node){a.x * b.x - a.y * b.y , a.x * b.y + a.y * b.x};}
int read () {int val = 0 , fu = 1;char ch = getchar ();while (ch < '0' || ch > '9') {if (ch == '-') fu = -1;ch = getchar ();}while (ch >= '0' && ch <= '9') {val = val * 10 + (ch - '0');ch = getchar ();}return val * fu;
}
void fft (node *A , int inv) {for (int i = 0 ; i < len ; i ++)if (i < r[i]) swap (A[i] , A[r[i]]);for (int mid = 1 ; mid < len ; mid <<= 1) { //mid={1,2,4,8,16,32,64,...}node wn = (node){cos (1.0 * pi / mid) , inv * sin (1.0 * pi / mid)};for (int R = mid << 1 , j = 0 ; j < len ; j += R) {node w = (node){1 , 0};for (int k = 0 ; k < mid ; k ++ , w = w * wn) {node x = A[j + k] , y = w * A[j + mid + k];A[j + k] = x + y;A[j + mid + k] = x - y;}}}
}
int main () {n = read () , m = read ();fu (i , 0 , n) a[i].x = read ();fu (i , 0 , m) b[i].x = read ();while (len <= n + m) len <<= 1 , l ++;for (int i = 0 ; i < len ; i ++)r[i] = (r[i >> 1] >> 1) | ((i & 1) << (l - 1));fft (a , 1);fft (b , 1);fu (i , 0 , len) a[i] = a[i] * b[i];fft (a , -1);// for (int i = 0 ; i <= n + m ; i ++) cout << a[i].x << " " << a[i].y << "\n";fu (i , 0 , n + m) printf ("%d " , (int)(a[i].x / len + 0.5));return 0;
}
计算2^n的逆排长度:2的6次方:64=0b100-0000;逆排长度0b11-1111
while (len <= n + m) len <<= 1 , l ++;
产生逆排:0,32,
for (int i = 0 ; i < len ; i ++)
r[i] = (r[i >> 1] >> 1) | ((i & 1) << (l - 1));
逆排交换数据
for (int i = 0 ; i < len ; i ++)
if (i < r[i])
swap (A[i] , A[r[i]]);
#include <bits/stdc++.h>
#define fu(x , y , z) for(int x = y ; x <= z ; x ++)
using namespace std;
const int N = 4e6 + 5;
const double pi = acos (-1.0);
int n , m1 , m2 , rev[N];
complex<double> a[N] , b[N];
void fft (complex<double> *a , int type) {fu (i , 0 , n - 1) if (i < rev[i]) swap (a[i] , a[rev[i]]);for (int j = 1 ; j < n ; j <<= 1) {complex<double> W(cos (pi / j) , sin (pi / j) * type);for (int k = 0 ; k < n ; k += (j << 1)) {complex<double> w(1.0 , 0.0);fu (i , 0 , j - 1) {complex<double> ye , yo;ye = a[i + k] , yo = a[i + j + k] * w;a[i + k] = ye + yo;a[i + k] = ye + yo;a[i + j + k] = ye - yo;w *= W;}}}
}
int main () {scanf ("%d%d" , &m1 , &m2);fu (i , 0 , m1) cin >> a[i];fu (i , 0 , m2) cin >> b[i];n = m1 + m2;int t = 0;while (n >= (1 << t)) t ++;n = (1 << t);fu (i , 0 , n - 1) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) ? (n >> 1) : 0);fft (a , 1) , fft (b , 1);fu (i , 0 , n) a[i] *= b[i];fft (a , -1);fu (i , 0 , m1 + m2) printf ("%d " , (int)(a[i].real() / (double)n + 0.5));return 0;
}
f0=(a0,a1,…an-2)
f1=(a1,a3,…an-1)
f(wnk)=f0(wnk/2)+wnkf1(wkn/2)
f(wn(k+n/2)=f0(wnk/2)-wnkf1(wkn/2)
#include<cstdio>2 #include<iostream>3 #include<cmath>4 #include<cstring>5 #include<algorithm>6 #include<cstdlib>7 using namespace std;8 const int mod=1e9+7;9 const double pi=acos(-1);
10 struct cn
11 {
12 double x,y;
13 cn (double x=0,double y=0):x(x),y(y) {}
14 }a[300005],b[300005],c[300005];
15 cn operator + (const cn &a,const cn &b) {return cn(a.x+b.x,a.y+b.y);}
16 cn operator - (const cn &a,const cn &b) {return cn(a.x-b.x,a.y-b.y);}
17 cn operator * (const cn &a,const cn &b) {return cn(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
18 void fft(cn a[],int n,int l,int f)
19 {
20 int rev[n+5];
21 rev[0]=0;
22 for (int i=1; i<n; i++){
23 rev[i]=(rev[i>>1]>>1)|((i&1)<<l-1);
24 if (i<rev[i]) swap(a[i],a[rev[i]]);
25 }
26 for (int i=1; i<n; i<<=1){
27 cn wi(cos(pi/i),f*sin(pi/i));
28 for (int j=0; j<n; j+=i*2){
29 cn w(1,0);
30 for (int k=0; k<i; k++){
31 cn x=a[j+k],y=w*a[j+k+i];
32 a[j+k]=x+y;
33 a[j+k+i]=x-y;
34 w=w*wi;
35 }
36 }
37 }
38 if (f==-1)
39 for (int i=0; i<n; i++){
40 a[i].x/=n; a[i].y/=n;
41 }
42 }
43 int main()
44 {
45 int n,m;
46 scanf("%d%d",&n,&m); n++; m++;
47 for (int i=0; i<n; i++) scanf("%lf",&a[i].x);
48 for (int i=0; i<m; i++) scanf("%lf",&b[i].x);
49 int l=0,N=1;
50 while (N<n+m-1) N<<=1,l++;
51 fft(a,N,l,1);
52 fft(b,N,l,1);
53 for (int i=0; i<N; i++) c[i]=a[i]*b[i];
54 fft(c,N,l,-1);
55 for (int i=0; i<n+m-1; i++) printf("%d ",(int)(c[i].x+0.5));
56 return 0;
57 }
相关文章:
FFT剖析
快速傅里叶变换 (fast Fourier transform) xn{x0,x1,…xn-1} (num:N) 旋转因子系数: d2pik/N 旋转因子 wk(n)(cos(dn)isin(dn)) n[0,N-1] y(k) sum(x(n)wk(n),0,N-1) y(k){y(0),y(1),…y(N-1)} 傅里叶级数 x(n)wk(n)的级数是: 1.d2pik/N 这个系数决…...
git clone报错RPC failed; curl 92 HTTP/2 stream 7 was not closed cleanly
问题描述 git clone github上的项目报错: RPC failed; curl 92 HTTP/2 stream 7 was not closed cleanly: CANCEL (err 8) 4796 bytes of body are still expected fetch-pack: unexpected disconnect while reading sideband packet early EOF fetch-pack: invalid index-pac…...

Apispec,一个用于生成 OpenAPI(Swagger)规范的 Python 库
目录 01什么是 Apispec? 为什么选择 Apispec? 安装与配置 02Apispec 的基本用法 生成简单的 API 文档 1、创建 Apispec 实例 2、定义 API 路由和视图 3、添加路径到 Apispec 集成 Flask 和 Apispec 1、安装…...
SpringBoot 自定义异常返回数据格式
Spring Boot 默认异常处理 当我们用 spring boot 开发接口是,当遇到异常时返回的数据格式是如下形式的 {"timestamp": "2024-07-06T02:48:55.79100:00","status": 404,"error": "Not Found","path":…...

【xinference】(15):在compshare上,使用docker-compose运行xinference和chatgpt-web项目,配置成功!!!
视频演示 【xinference】(15):在compshare上,使用docker-compose运行xinference和chatgpt-web项目,配置成功!!! 1,安装docker方法: #!/bin/shdistribution$(…...

【Unity 3D角色移动】
【Unity 3D角色移动】 在Unity 3D中实现角色移动通常涉及到几个关键步骤,包括设置角色的物理属性、处理输入、更新角色的位置以及动画同步。下面是实现基本3D角色移动的步骤和示例代码: 步骤1:设置角色的物理属性 角色通常使用Character Co…...

个人视角,社会影响力:自媒体的魅力所在
随着数字化时代的到来,自媒体正成为信息传播领域的一场革命。个人视角与社会影响力的结合,赋予了自媒体独特的魅力。在传统媒体受限制的同时,自媒体为每个人提供了表达自己观点和思想的自由。个体的真实视角使得自媒体在信息传播中发挥着重要…...
算法训练营day70
题目1:108. 冗余连接 (kamacoder.com) #include<iostream> #include<vector>using namespace std;int n; vector<int> father(10001, 0);void init() {for(int i 1;i < n;i) father[i] i; }int find(int u) {return u father[u] ? u : fa…...

EtherCAT转Profinet网关配置说明第二讲:上位机软件配置
EtherCAT协议转Profinet协议网关模块(XD-ECPNS20),不仅可以实现数据之间的通信,还可以实现不同系统之间的数据共享。EtherCAT协议转Profinet协议网关模块(XD-ECPNS20)具有高速传输的特点,因此通…...

日志自动分析-Web---360星图GoaccessALBAnolog
目录 1、Web-360星图(IIS/Apache/Nginx) 2、Web-GoAccess (任何自定义日志格式字符串) 源码及使用手册 安装goaccess 使用 输出 3-Web-自写脚本(任何自定义日志格式字符串) 4、Web-机器语言analog(任何自定义日…...

【面试八股文】java基础知识
引言 本文是java面试时的一些常见知识点总结归纳和一些拓展,笔者在学习这些内容时,特地整理记录下来,以供大家学习共勉。 一、数据类型 1.1 为什么要设计封装类,Integer和int区别是什么? 使用封装类的目的 对象化:…...

ssrf结合redis未授权getshell
目录 漏洞介绍 SSRF Redis未授权 利用原理 环境搭建 利用过程 rockylinux cron计划任务反弹shell 写公钥免密登录 ubuntu 写公钥免密登录 漏洞介绍 SSRF SSRF(server side request forgrey)服务端请求伪造,因后端未过滤用户输入&…...
魔法自如:精通 IPython %automagic 命令的切换艺术
魔法自如:精通 IPython %automagic 命令的切换艺术 在 IPython 的神奇世界里,魔术命令是其强大交互功能的核心。这些以 % 或 %% 开头的命令,能够执行一系列特殊的操作,从而增强用户的编程体验。但是,你是否知道&#…...

基于CentOS Stream 9平台搭建MinIO以及开机自启
1. 官网 https://min.io/download?licenseagpl&platformlinux 1.1 下载二进制包 指定目录下载 cd /opt/coisini/ wget https://dl.min.io/server/minio/release/linux-amd64/minio1.2 文件赋权 chmod x /opt/coisini/minio1.3 创建Minio存储数据目录: mkdi…...
shell-awk语法整理
shell-awk语法整理 前言基本语法内置变量1. $02. NF3. NR4. FS5. RS6. OFS7. ORS8. FILENAME9. FNR10. ARGV11. ENVIRON12. IGNORECASE13. RSTART 和 RLENGTH示例解释 内置函数循环语句(后面的;可不加)条件语句高级特性示例 特殊模式BEGINEND组合示例BEG…...

关于忠诚:忠于自己的良知、理想、信念
关于忠诚: 当我们面对公司、上司、爱人、恋人、合作伙伴还是某件事,会纠结离开还是留下,这里我们要深知忠诚的定义,我们不是忠诚于某个人、某件事、或者某个机构,而是忠诚于自己的良知,忠诚于自己的理想和…...

探索Linux:开源世界的无限可能
Linux是一款开源操作系统,它的起源可以追溯到上世纪90年代初。这个故事始于一个名叫Linus Torvalds的芬兰大学生,他在1983年开始编写一个用于个人电脑的操作系统内核。在他的努力下,Linux逐渐发展成为一个稳定而强大的操作系统。 然而&#…...

深度学习之半监督学习:一文梳理目标检测中的半监督学习策略
什么是半监督目标检测? 传统机器学习根据训练数据集中的标注情况,有着不同的场景,主要包括:监督学习、弱监督学习、弱半监督学习、半监督学习。由于目标检测任务的特殊性,在介绍半监督目标检测方法之前,我…...

Hive 高可用分布式部署详细步骤
目录 系统版本说明 hive安装包下载及解压 上传mysql-connector-java的jar包 配置环境变量 进入conf配置文件中,将文件重命名 在hadoop集群上创建文件夹 创建本地目录 修改hive-site.xml文件 同步到其他的节点服务器 修改node02中的配置 hive-site.xml 修改…...

ubuntu下运行程序时提示缺库问题的有效解决方法
目录 一、问题现象二、解决方式三、总结 一、问题现象 当我们平时在ubuntu上运行一个程序时时长会遇到如下情况,含义为本机缺少执行程序需要的库 这时候我们可能会根据缺少的库使用apt install 库名的模糊名字 进行安装,然后再去运行,此时可…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...