快速傅里叶离散变换FFT (更新中)

声明:参考了 y y c yyc yycblogPPT (from smwc) ,以及 w z r wzr wzrblog

目录

  • Part 1 多项式
  • Part 2 FFT概论
  • Part 3 点值与插值
  • Part 4 复数,单位根
  • Part 5

Part 1 多项式

  • 定义:对于有限数列 A 0 A_{0} A0~ n _{n} n ,形如 A ( x ) = a 0 + a 1 x + a 2 x 2 + . . . + a n x n A(x)=a_0+a_1x+a_2x^2+ ... +a_nx^n A(x)=a0+a1x+a2x2+...+anxn (即 A ( x ) = ∑ i = 0 n A i x i A(x)= \sum_{i=0}^{n} A_ix^i A(x)=i=0nAixi) 的函数称为多项式。记 A ( x ) A(x) A(x) x n x^n xn 项系数为 [ x n ] A ( x ) [x^n]A(x) [xn]A(x) ,简写为 A [ n ] A[n] A[n]
  • 运算:
    • 加法: C ( x ) = A ( x ) + B ( x ) = ∑ i = 0 n ( A i + B i ) x i C(x)=A(x)+B(x) = \sum_{i=0}^{n}(A_i+B_i)x^i C(x)=A(x)+B(x)=i=0n(Ai+Bi)xi
    • 减法: C ( x ) = A ( x ) − B ( x ) = ∑ i = 0 n ( A i − B i ) x i C(x)=A(x)-B(x) = \sum_{i=0}^{n}(A_i-B_i)x^i C(x)=A(x)B(x)=i=0n(AiBi)xi
    • 乘法: C ( x ) = A ( x ) × B ( x ) = ∑ i = 0 n ∑ j = 0 m A i B j x i + j C(x)=A(x) \times B(x) = \sum_{i=0}^{n} \sum_{j=0}^{m} A_iB_jx^{i+j} C(x)=A(x)×B(x)=i=0nj=0mAiBjxi+j
  • 卷积:某二元运算 ⊕ \oplus 的定义域和值域均为 N \mathbb{N} N ,数列 A , B A,B A,B ⊕ \oplus 卷积 为一个新数列 C C C ,有 C [ k ] = ∑ i ⊕ j = k A [ i ] B [ j ] C[k]= \sum_{i \oplus j=k} A[i]B[j] C[k]=ij=kA[i]B[j] ⊕ \oplus 可以代表任意运算符)。容易发现,多项式乘法就是“加法卷积”。

Part 2 FFT概论

对于两个多项式的乘法,有简单粗暴的 O ( n 2 ) O(n^2) O(n2) 级别方法。但这只适用于少部分题目,于是某个天才就发明的一种新方法,叫 Fast Fourier Transformation(FFT)。利用卷积思想,化乘为加,快速计算多项式乘法,只需 O ( n l o g n ) O(nlogn) O(nlogn)


Part 3 点值与插值

  • 点值:将多项式 A ( x ) A(x) A(x) 视为函数,对于常数 t 0 t_0 t0 A ( t 0 ) = ∑ i = 0 + ∞ A [ i ] t 0 i A(t_0)=\sum_{i=0}^{+\infty} A[i]t_0^i A(t0)=i=0+A[i]t0i A ( x ) A(x) A(x) t 0 t_0 t0 处的点值。
    • 作用:已知 A ( x ) , B ( x ) , C ( x ) A(x),B(x),C(x) A(x),B(x),C(x),可以快速判断 C ( x ) = A ( x ) B ( x ) C(x)=A(x)B(x) C(x)=A(x)B(x)
    • 核心:通过选择具体的常数,将复杂的多项式乘法转换成数的乘法,提升效率。
  • 插值:已知 A ( x ) A(x) A(x) 的若干点,求 A ( x ) A(x) A(x) 的系数序列。

将上面两种表示法组合起来,就有一个 “求值-插值法” ,得到多项式乘法一个新想法。即,把系数表达转换为点值表达 (DFT) -> 点值表达相乘 -> 把点值表达转换为系数表达 (IDFT)
这就是 F F T FFT FFT 的思路:

  1. 选择一个足够大的 n n n,选定 n n n 个不同的数 x 1 , x 2 , x 3 , . . . , x n x_1,x_2,x_3, ... ,x_n x1,x2,x3,...,xn
  2. 求出点值 A ( x 1 ) , A ( x 2 ) , . . . , A ( x n ) A(x_1),A(x_2),... ,A(x_n) A(x1),A(x2),...,A(xn) B ( x 1 ) , B ( x 2 ) , . . . , B ( x n ) B_(x_1),B(x_2),...,B(x_n) B(x1),B(x2),...,B(xn)
  3. 根据 C ( x i ) = A ( x i ) B ( x i ) C(x_i)=A(x_i)B(x_i) C(xi)=A(xi)B(xi) 得到 C ( x 1 ) , C ( x 2 ) , . . . , C ( x n ) C(x_1),C(x_2),...,C(x_n) C(x1),C(x2),...,C(xn) :
  4. 插值求出 C ( x ) C(x) C(x) 的系数;

Part 4 复数,单位根

考虑如何做 FFT 的第一步(即选择 n n n 个不同的数),一般直觉会选正整数等一些熟悉的数,但这没什么性质(加速不了多项式乘法)。于是单位根就登场了……

  • 复数:令虚单位 i i i 满足 i 2 = − 1 i^2=-1 i2=1,形如 a + b i a+bi a+bi ( a , b ∈ R a,b \in \mathbb{R} a,bR) 的数称为复数。
    将复数 z = a + b i z=a+bi z=a+bi 看作平面直角坐标系中的点 P ( a , b ) P(a,b) P(a,b) ,原点 O ( 0 , 0 ) O(0,0) O(0,0),称表示复数的平面直角坐标系为复平面 r = ∣ O P ∣ r=|OP| r=OP z z z模长,射线 O P OP OP x x x轴正半轴的夹角 θ \theta θ z z z辐角。有 z = r ( c o s θ + i z=r(cos \theta + i z=r(cosθ+i s i n θ ) sin \theta) sinθ)
    • 复数加法: ( a + b i ) + ( c + d i ) = ( a + c ) + ( b + d ) i (a+bi)+(c+di) = (a+c) + (b+d)i (a+bi)+(c+di)=(a+c)+(b+d)i
    • 复数减法: ( a + b i ) − ( c + d i ) = ( a − c ) + ( b − d ) i (a+bi)-(c+di) = (a-c) + (b-d)i (a+bi)(c+di)=(ac)+(bd)i
    • 复数乘法: ( a + b i ) × ( c + d i ) = a c − b d + ( a d + b c ) i (a+bi) \times (c+di) = ac-bd+(ad+bc)i (a+bi)×(c+di)=acbd+(ad+bc)i
    • 复数除法: ( a + b i ) (a+bi) (a+bi) / / / ( c + d i ) = a c + b d c 2 + d 2 + b c − a d c 2 + d 2 i (c+di)= \frac{ac+bd}{c^2+d^2} + \frac{bc-ad}{c^2+d^2}i (c+di)=c2+d2ac+bd+c2+d2bcadi
    • 复数的共轭: a + b i a+bi a+bi 的共轭为 a − b i a-bi abi
  • 单位根 n n n 次本原单位根记为 ω n \omega ^n ωn ( n ∈ N n \in \mathbb{N} nN),单位根为复数,满足 ω n = 1 \omega ^n=1 ωn=1 ,且 ω 0 , ω 1 , ω 2 , . . . , ω n − 1 \omega ^0,\omega ^1,\omega ^2 ,...,\omega ^{n-1} ω0,ω1,ω2,...,ωn1 互不相同。
    引入 单位圆(圆心在原点且半径为 1 1 1 的圆):单位圆
    记第 n n n n n n 次单位根为 ω n n − 1 。 \omega _n^{n-1}。 ωnn1 ω n k = k ( c o s 2 π n + i \omega _n^k=k(cos\frac{2\pi}{n}+i ωnk=k(cosn2π+i s i n 2 π n ) sin \frac{2\pi}{n}) sinn2π)
    ω n \omega _n ωn 是模长为 1 1 1 ,圆上的点所表示的复数模长都为 1 1 1 ,所以单位根一定在单位圆上。又有 ω n \omega _n ωn 的辐角为 2 π n \frac{2\pi}{n} n2π (即 1 n \frac{1}{n} n1 圆周),乘一次 ω n \omega _n ωn 相当于绕原点逆时针旋转 1 n \frac{1}{n} n1 圆周,乘 n n n 次恰好转完一圈回到原地,满足 “ ω n = 1 \omega ^n=1 ωn=1 ,且 ω 0 , ω 1 , ω 2 , . . . , ω n − 1 \omega ^0,\omega ^1,\omega ^2 ,...,\omega ^{n-1} ω0,ω1,ω2,...,ωn1 互不相同” 这一条件。
    w
  • 单位根的一些性质:
    1. ω n 0 = 1 \omega _n^0 =1 ωn0=1
    2. ω n k = ( ω n 1 ) k \omega _n^k = (\omega _n^1)^k ωnk=(ωn1)k
    3. ω n i × ω n j = ( ω n 1 ) i × ( ω n 1 ) j = ω n i + j \omega _n^i \times \omega_n^j =(\omega_n^1)^i \times (\omega_n^1)^j = \omega_n^{i+j} ωni×ωnj=(ωn1)i×(ωn1)j=ωni+j
    4. ω n − k = ω n n − k \omega_n^{-k} = \omega_n^{n-k} ωnk=ωnnk
    5. ω 2 n 2 k = ω n k = ω p n p k \omega_{2n}^{2k} = \omega_n^k = \omega_{pn}^{pk} ω2n2k=ωnk=ωpnpk
    6. ω n ( k + n / 2 ) = − ω n k \omega_{n}^{(k+n/2)} = - \omega_{n}^{k} ωn(k+n/2)=ωnk

Part 5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/70173.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】STL——list的使用

目录 💕1.带头双向链表List 💕2.list用法介绍 💕3.list的初始化 💕4.size函数与resize函数 💕5.empty函数 💕6.front函数与back函数 💕7.push_front,push_back,pop_front,pop_back函数…

2021Java面试-基础篇

文章目录 前言一: Java概述 1、何为编程2、JDK1.5之后的三大版本3、JVM,JRE和JDK的关系4、什么是跨平台?原理是什么5、Java语言有哪些特点6、什么是字节码?采用字节码的最大好处是什么7、什么是Java程序的主类?应用程序和小程序的…

MapStruct工具类的使用

文章目录 1.简介2.作用2.1 属性拷贝2.2 类型安全2.3 性能高效2.4 自定义转换 3.如何使用3.1 创建一个maven工程项目并引入mapstruct的坐标依赖:3.2 源对象类3.3 目标对象类(和源对象类中的字段属性名相同)3.4 创建接口SyncMapper(…

FPGA| 使用Quartus II报错Top-level design entity ““ is undefined

1、使用FPGA准备点亮LED测试下板子,发现这个报错Error (12007): Top-level design entity "LEDLED" is undefined 工程如上图 报错如下图 2、分析到原因是因为工程名称和顶层模块里面的module名称不一样导致 解决办法:修改module名称和顶层模…

Window获取界面空闲时间

‌GetLastInputInfo‌是一种Windows API函数,用于获取上次输入操作的时间。 该函数通过LASTINPUTINFO结构返回最后一次输入事件的时间。 原型如下 BOOL WINAPI GetLastInputInfo(PLASTINPUTINFO plii);那么可以利用GetLastInputInfo来得到界面没有操作的时长 uint…

LeetCode - #198 打家劫舍

网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…

验证工具:SVN版本控制

1-SVN概念 SVN(Subversion)是一种集中式版本控制系统,它用于文件和目录的版本管理,允许多个用户协同工作,同时追踪每个文件和目录的历史修改记录。以下是关于SVN版本控制的详细介绍: 一、SVN的基本概念 仓库(Repository):SVN的仓库是一个集中存储所有文件和目录的地…

【DeepSeek】本地私有化部署 DeepSeek 模型教程

一、引言 DeepSeek 模型是一种强大的语言模型,本地私有化部署可以让用户在自己的环境中安全、高效地使用该模型,避免数据传输到外部带来的安全风险,同时也能根据自身需求进行定制化配置。本教程将详细介绍如何在本地进行 DeepSeek 模型的私有…

【玩转 Postman 接口测试与开发2_016】第13章:在 Postman 中实现契约测试(Contract Testing)与 API 接口验证(上)

《API Testing and Development with Postman》最新第二版封面 文章目录 第十三章 契约测试与 API 接口验证1 契约测试的概念2 契约测试的工作原理3 契约测试的分类4 DeepSeek 给出的契约测试相关背景5 契约测试在 Postman 中的创建方法6 API 实例的基本用法7 API 实例的类型实…

为什么“记住密码”适合持久化?

✅ 特性 1:应用重启后仍需生效 记住密码的本质是长期存储用户的登录凭证(如用户名、密码、JWT Token),即使用户关闭应用、重启设备,仍然可以自动登录。持久化存储方案: React Native 推荐使用 AsyncStorag…

echarts、canvas这种渲染耗时的工作能不能放在webworker中做?

可以将 ECharts、Canvas 等渲染耗时的工作放在 Web Worker 中进行处理。Web Worker 允许在后台线程中运行 JavaScript,从而将计算密集型任务从主线程中分离出来,避免阻塞用户界面。以下是一些关键点: 优势 性能提升:将耗时的渲染…

proxmox通过更多的方式创建虚拟机

概述 作为一名资深运维工程师,我们经常需要在 Proxmox 虚拟化平台上创建和管理虚拟机。本文将介绍三种不同的方式在 Proxmox 上创建 Ubuntu 虚拟机: 通过 Proxmox 命令创建虚拟机通过 Shell 脚本自动化创建虚拟机使用 Proxmox API 创建虚拟机 每种方式…

【分布式架构理论3】分布式调用(2):API 网关分析

文章目录 一、API 网关的作用1. 业务层面:简化调用复杂性2. 系统层面:屏蔽客户端调用差异3. 其他方面: 二、API 网关的技术原理1. 协议转换2. 链式处理3. 异步请求机制1. Zuul1:同步阻塞处理2. Zuul2:异步非阻塞处理 三…

使用线性回归模型逼近目标模型 | PyTorch 深度学习实战

前一篇文章,计算图 Compute Graph 和自动求导 Autograd | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 使用线性回归模型逼近目标模型 什么是回归什么是线性回归使用 PyTorch 实现线性回归模型代码执行结…

20250205——Windows系统基于ollama的DeepSeek-R1本地安装

1、安装ollama 1.1 Windows系统 打开ollama官网链接Download Ollama on Windows,根据自己的系统下载安装包,如果是Windows系统,下载Windows版本。 1.1 Linux系统 (这个是因为运行遇到报错了,想自己记录一下解决方法&a…

VSCode中使用EmmyLua插件对Unity的tolua断点调试

一.VSCode中搜索安装EmmyLua插件 二.创建和编辑launch.json文件 初始的launch.json是这样的 手动编辑加上一段内容如下图所示: 三.启动调试模式,并选择附加的进程

java-关键字(final,static)

关键字 final 和 static 是两个常用的关键字,它们分别用于不同的场景,具有不同的作用。 final final 关键字用于表示某个实体是不可变的。它可以应用于变量、方法和类。 final 变量 当 final 用于变量时,表示该变量一旦被初始化后&#…

pytorch基于FastText实现词嵌入

FastText 是 Facebook AI Research 提出的 改进版 Word2Vec,可以: ✅ 利用 n-grams 处理未登录词 比 Word2Vec 更快、更准确 适用于中文等形态丰富的语言 完整的 PyTorch FastText 代码(基于中文语料),包含&#xff1…

JVS低代码逻辑引擎多种业务场景触发案例配置:涵盖列表页按钮、表单数据、流程审批、外部API接口调用等

逻辑引擎作为JVS低代码开发套件的核心组件,专注于业务逻辑的快速构建与实现,它扮演着程序配置与执行的核心角色,适用于多样化的应用场景。该逻辑引擎设计灵活,能够通过多种配置方式被触发,以精准响应各类业务需求并实现…

文字加持:让 OpenCV 轻松在图像中插上文字

前言 在很多图像处理任务中,我们不仅需要提取图像信息,还希望在图像上加上一些文字,或是标注,或是动态展示。正如在一幅画上添加一个标语,或者在一个视频上加上动态字幕,cv2.putText 就是这个“文字魔术师”,它能让我们的图像从“沉默寡言”变得生动有趣。 今天,我们…