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

快速傅里叶离散变换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

相关文章:

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

声明:参考了 y y c yyc yyc 的 blog 和 PPT (from smwc) ,以及 w z r wzr wzr 的 blog 。 目录 Part 1 多项式Part 2 FFT概论Part 3 点值与插值Part 4 复数,单位根Part 5 Part 1 多项式 定义:对于有限数列 A 0 A_{0} A0​~ n…...

【从零开始入门unity游戏开发之——C#篇48】C#补充知识点——静态导入、异常捕获和异常筛选器、nameof运算符

考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的…...

8.PPT:小李-第二次世界大战【21】

目录 NO123 ​ NO4567 ​ NO8\9\10\11​ 图片→格式→大小对话框→锁定纵横比✔动画→飞入→效果选项:方向/序列→开始→持续时间→延迟时间持续时间:1s延迟:0.5s音频剪切时间:0.5s:00:00.500自动换片时间设置&…...

企业百科和品牌百科创建技巧

很多人比较困惑,创建百科词条需要注意哪些事情?为什么参考提交了权威新闻参考资料还是没有通过,下面小马识途营销顾问就为大家解答疑惑: 1、品牌词以及企业词提交 1)如果没有词条,我们可以通过平台提供的急…...

搭建集成开发环境PyCharm

1.下载安装Python(建议下载并安装3.9.x) https://www.python.org/downloads/windows/ 要注意勾选“Add Python 3.9 to PATH”复选框,表示将Python的路径增加到环境变量中 2.安装集成开发环境Pycharm http://www.jetbrains.com/pycharm/…...

【Rust自学】16.4. 通过Send和Sync trait来扩展并发

喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 16.4.1. Send和Sync trait Rust语言本身的并发特性较少,目前所提及的并发特性都来自于标准库,而不是语言本身。其…...

2025年02月05日Github流行趋势

项目名称:OCRmyPDF 项目地址url:https://github.com/ocrmypdf/OCRmyPDF项目语言:Python历史star数:15872今日star数:157项目维护者:jbarlow83, fritz-hh, apps/dependabot, mawi12345, mara004项目简介&…...

拉取本地的 Docker 镜像的三种方法

方法 1:通过 docker save 和 docker load 导出和导入镜像 在本地服务器上导出镜像: 使用 docker save 将镜像保存为一个 .tar 文件: docker save -o mysql-5.7.tar mysql:5.7 将镜像文件传输到其他服务器: 你可以通过 scp 或其他…...

springboot+vue+uniapp的校园二手交易小程序

开发语言:Java框架:springbootuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包&#…...

NeetCode刷题第21天(2025.2.4)

文章目录 114 Gas Station 加油站115 Hand of Straights 顺子之手116 Merge Triplets to Form Target 将 Triplelet 合并到 Form Target117 Partition Labels 分区标签118 Valid Parenthesis String 有效的括号字符串119 Insert Interval 插入间隔120 Merge Intervals 合并区间…...

人工智能|本地部署|ollama+chatbox快速Windows10下部署(初级篇)

一、 前言: 其实早一个月我已经使用过deepseek,并且也在自己的机器上通过ollama部署过,但一直没有太多动力,现在感觉还是的记录一下,省的自己给忘掉了 本文只是简单记录一下ollamaopen-webuichatbox部署通过网盘分享…...

chrome插件模板;使用 React 18 和 Webpack 5 的 Chrome 扩展样板

一、软件介绍(文末提供下载) 这是一个基本的 Chrome 扩展样板,可帮助您编写模块化和现代的 Javascript 代码,轻松加载 CSS,并在代码更改时自动重新加载浏览器。 github地址:https://github.com/lxieyang/c…...

大语言模型极速部署:Ollama 与 One-API 完美搭建教程

大语言模型极速部署:Ollama 与 One-API 完美搭建教程 本文将介绍如何通过命令行工具部署 Ollama 和 One-API,帮助你快速搭建私有化大模型。 一、安装 Ollama Ollama 是一个容器化的应用,方便部署和管理 AI 模型。以下是安装 Ollama 的步骤。…...

【C++】STL——list底层实现

目录 💕1.list的三个类介绍 💕2.list——节点类 (ListNode) 💕3.list——链表类 (List) 💕4.list——迭代器类(重点思考)(ListIterator) 💕5…...

Java 进阶day14XML Dom4j 工厂模式 Base64

目录 知识点1、XML 概念XML约束 知识点2、XML解析 Dom4j(Dom for java)XPath 知识点3、工厂模式知识点4、Base64 知识点1、XML 概念 XML的全称为(eXtensible Markup Language),是一种可扩展的标记语言。 XML的作用&…...

100.6 AI量化面试题:如何评估AI量化模型的过拟合风险?

目录 0. 承前1. 解题思路1.1 性能验证维度1.2 统计检验维度1.3 实践验证维度 2. 样本内外性能对比2.1 基础性能指标计算2.2 策略收益对比 3. 参数敏感性分析3.1 参数网格搜索3.2 稳定性评估 4. 白噪声测试4.1 随机数据测试 5. Deflated Sharpe Ratio5.1 DSR计算 6. 交易成本敏感…...

C++模板:泛型编程的魔法钥匙

前言 本篇博客将详细介绍C的模板 💖 个人主页:熬夜写代码的小蔡 🖥 文章专栏:C 若有问题 评论区见 🎉欢迎大家点赞👍收藏⭐文章 ​ 一:引言:为什么需要模板? 1.复杂代码…...

unordered_map/set的哈希封装

【C笔记】unordered_map/set的哈希封装 🔥个人主页:大白的编程日记 🔥专栏:C笔记 文章目录 【C笔记】unordered_map/set的哈希封装前言一. 源码及框架分析二.迭代器三.operator[]四.使用哈希表封装unordered_map/set后言 前言 哈…...

机器学习专业毕设选题推荐合集 人工智能

目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光,一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整理…...

软件工程导论三级项目报告--《软件工程》课程网站

《软件工程》课程网站 摘要 本文详细介绍了《软件工程》课程网站的设计与实现方案,包括可行性分析、需求分析、总体设计、详细设计、测试用例。首先,通过可行性分析从各方面确认了该工程的可实现性,接着需求分析明确了系统的目标用户群和功能…...

AI编程工具的内卷:Copilot、Cursor、通义灵码,谁能笑到最后?

当“内卷”的风吹到AI编程工具2026年,AI编程工具已不再是新鲜事物,而是开发者工具箱中的标配。从最初的代码补全,到如今的全栈智能体,这个赛道正经历着一场前所未有的“内卷”。GitHub Copilot、Cursor、通义灵码三足鼎立&#xf…...

号卡系统后台一键生图换图添加随心ai密钥教程

号卡产品全新上线随心ai一键生图、智能换图功能,操作极简,秒出优质素材,告别手动作图。 1.登录号卡系统后台首页先更新版本2.到号卡系统设置——系统系统设置——号卡设置——下滑就可以看到随心AI密钥入口需要填写密钥3.随心ai密钥申请入口h…...

RootlessJamesDSP:无Root环境下的Android全局音频处理方案解析

1. 项目概述:在无根环境中驯服音频的“魔法师”如果你是一个对手机音质有追求的安卓用户,或者是一个喜欢折腾音频处理插件的玩家,那么你很可能听说过或者用过 JamesDSP。它是一款功能强大的音频处理引擎,能够通过复杂的算法&#…...

DLP Pico技术与近眼显示系统设计解析

1. DLP Pico技术解析:微镜阵列如何重塑显示未来 在2014年,德州仪器(TI)推出了一项颠覆性的显示技术——基于DLP TRP架构的Pico芯片组。这项技术的核心是一块布满微小铝镜的芯片,每个微镜尺寸仅5.4微米,比人类头发直径的十分之一还…...

告别单调!用LVGL Button控件打造3种高级交互动效(附完整C代码)

用LVGL Button控件实现高级交互动效的实战指南 在嵌入式设备上打造流畅、生动的用户界面一直是开发者的挑战。LVGL作为轻量级图形库,其Button控件的基础功能虽然简单,但通过巧妙运用样式和动画API,可以实现媲美移动端的高级交互效果。本文将深…...

构建离线文档ETL管道:用Python实现PDF/Word智能转Markdown优化LLM输入

1. 项目概述:为什么我们需要一个离线的文档转换工具?如果你和我一样,经常需要把一堆PDF、Word文档甚至扫描件喂给本地的大语言模型(比如Ollama、LM Studio),那你肯定遇到过这个痛点:模型宝贵的上…...

Python ORM实战:SQLAlchemy深度解析

Python ORM实战:SQLAlchemy深度解析 引言 在Python后端开发中,ORM(对象关系映射)是连接应用程序和数据库的重要桥梁。作为一名从Rust转向Python的后端开发者,我深刻体会到SQLAlchemy在处理数据库操作方面的强大能力。S…...

ARM PMU性能监控架构与寄存器详解

1. ARM PMU性能监控架构概述 性能监控单元(Performance Monitoring Unit, PMU)是现代处理器中用于硬件级性能分析的关键模块。作为ARM架构的重要组成部分,PMU通过一组可编程计数器来记录处理器运行过程中发生的各类微架构事件,为系统性能分析和优化提供数…...

Vellium:基于Electron与RAG的本地AI创作工作台架构解析

1. 项目概述:Vellium,一个全能的本地AI创作与对话工作台如果你和我一样,既沉迷于与AI进行深度角色扮演对话,又需要它协助进行严肃的写作、整理知识库,并且对数据隐私和本地化运行有执念,那么你一定会对Vell…...

为AI智能体构建自动化RSS信息管道:agent-rss工具详解与实践

1. 项目概述:为AI智能体打造的RSS信息管道 如果你正在构建或使用AI智能体(比如Claude Code、OpenClaw这类工具),并且希望它们能像人类一样,定时、定向地获取互联网上的最新信息,那么你很可能需要一个专门为…...