首页 > 其他分享 >FFT 学习笔记

FFT 学习笔记

时间:2023-10-31 18:22:05浏览次数:25  
标签:系数 const comp sum FFT 笔记 学习 多项式

\(FastFuristTransformation\):快速傅立叶变换
——快速求两个多项式的乘积

多项式的点表示法

多项式的性质:用任意\(n+1\)个函数上的不同点均可唯一确定一个多项式。

证明:方程组为一个\(Vandermonder\)行列式,矩阵满秩有唯一解。

截屏2023-10-27 08.07.20
当我们需要多项式 \(A\) 与多项式 \(B\) 的积 \(C\) 的时候,我们只要在 \(A\) 和 \(B\) 中取 \((n+m+1)\) 个点然后直接相乘就可以得到 \(C\) 的点表示法,这个复杂度就是 \(O(n+m+1)\) 。

复数单位根

将复数域上的单位圆等分成 \(n\) 份,每一份叫做 \(n\)次单位根。
截屏2023-10-30 12.46.37

离散傅立叶正变换

\(DFT\) —— 将系数表示的多项数变为点表示的多项式。

\[ d_k=\sum_{i=0}^{n-1}a_iw_n^{ik} \]

将多项式的奇偶次数分类,变化 \(x\rightarrow x^2\) ,利用复数单位根上的性质作变换后发现,多项式可以由两个 \(\frac{n}{2}\) 长度的多项式得到。然后递归求解的复杂度是 \(O(nlogn)\) 。

截屏2023-10-30 13.00.46

离散傅立叶逆变换

\(IDFT\) —— 当已知点表示法的一个多项式,得到该多项式系数表示法。

\[ a_k=\frac{1}{n}\sum_{i=0}^{n-1}d_iw_n^{-ki} \]

推导如下:即 \(C_k\)(积多项式的第 \(k\) 项的系数)为 \(\sum{A_iw_n^k{(w_n^{-k})}^i}\)。可得 \(C_k=n*a_k\) ,因为别的项系数都为 \(0\) ,只有 \(k=0\) 这一项系数为 \(n\) 。
IMG_4106
IMG_4107
然后我们使用 \(FFT\) 优化式子可得:

\[ a_k=\frac{1}{n}\sum_{i=0}^{n}B(w_{n}^{n-k}) \]

这里我们注意到,比较正逆变化的式子只有 \(w_n^k\) 这个 \(k\) 的系数不同,所以几乎是一样的(还有就是多了个系数 \(n\))。

struct comp{
    double r,i;
    comp(double _r=0,double _i=0){r=_r;i=_i;}
    comp operator+ (const comp x){return comp(r+x.r,i+x.i);}
    comp operator- (const comp x){return comp(r-x.r,i-x.i);}
    comp operator* (const comp x){return comp(r*x.r-i*x.i,r*x.i+i*x.r);}
}a[N],b[N];
const double pi=acos(-1.0); 
void FFT(comp a[],int n,int t){
    for(int i=1,j=0;i<n-1;i++){ 
        for(int s=n;j^=s>>=1,~j&s;); 
        if(i<j)swap(a[i],a[j]);
    }
    for(int d=0;(1<<d)<n;d++){
        int m=1<<d,m2=m<<1;
        double o=pi/m*t;
        comp _w(cos(o),sin(o)); 
        for(int i=0;i<n;i+=m2){
            comp w(1,0);
            for(int j=0;j<m;j++){
                comp &A=a[i+j+m],&B=a[i+j],t=w*A;
                A=B-t;B=B+t;w=w*_w; 
            }
        } 
    }
    if(t==-1)for(int i=0;i<n;i++)a[i].r/=n; 
}
int bit=0;
while((1<<bit)<n+m+1)bit++;
bit=(1<<bit);
for(int i=0;i<=n+m;i++){
    cout<<(int)(a[i].r+0.5)<<' ';
}

标签:系数,const,comp,sum,FFT,笔记,学习,多项式
From: https://www.cnblogs.com/edgrass/p/17800950.html

相关文章

  • 《信息安全系统设计与实现》第九周学习笔记
    第五章定时器及时钟服务硬件定时器定时器是由时钟源和可编程计数器组成的硬件设备。时钟源通常是一个晶体振荡器,会产生周期性电信号,以精确的频率驱动计数器。使用一个倒计时值对计数器进行编程,每个时钟信号减1。当计数减为0时,计数器向CPU生成一个定时器中断,将计数值重新加载到......
  • 【学习】绪论
    绪论,化学学科的简介。1.化学的研究对象化学物质"chemicalsubstances"宏观上:物体微观上:原子:亚分子:其变化为原子的化合与分解分子:原子以强相互作用力(化学键)组合形成的原子聚集体,核-电子体系。超分子:若干分子以弱相互作用(范德华力/氢键),并通过所谓"自组装"构筑......
  • android ebpf中的CO-RE学习
    CO-RE原理因为不同的内核版本的系统内部结构体会有差异,例如structuser_arg_ptr,当内核编译配置中存在CONFIG_COMPAT=y的时候,会在native成员之前增加一个布尔变量is_compat,这样native的偏移就发生的变化。如果编写的ebpf内核程序需要访问structuser_arg_ptr类型的变量就需要考......
  • React学习笔记15-13-setState同步异步问题
    先说结论:setState处在同步的逻辑中会异步更新状态,更新真实dom。连续调用setState不会连续进行虚拟dom的对比和页面的更新setState处在异步的逻辑中,同步更新状态,更新真实dom。 1.同步状态先看同步状态/*eslint-disablereact/no-direct-mutation-state*/importRea......
  • NOIP 2022 考前学习日记
    前言学习记录本写太乱了,所以在这里打个草稿顺便记录一下学习过程,后面总结的时候康康有没有问题11月2日(今日运势:中平)上午:再次做了一下CSP-S2022的题,除了T4以外的都订正完了听yjy讲了一下kruskal重构树,还没做练习下午:看线性代数看的想睡觉;尝试做了一下【模板】矩阵快速......
  • 第五章学习笔记
    一、硬件定时器硬件定时器是计算机内部的硬件组件,用于生成定时中断信号。它通常由CPU或主板集成,可用于测量时间和执行定时操作。以下是一个简单的示例,演示如何在Linux上使用硬件定时器:include<stdio.h>include<stdlib.h>include<signal.h>include<sys/time.h>voidtimer......
  • 【笔者感悟】笔者的学习感悟【十】
    写在前面  今天笔者想来和大家讨论一下,刷算法题的一些心得  说到算法题想必很多同学都会有许许多多的讨论,有的同学认为刷算法题是必修课,有的同学认为算法不实用,工作中用不到。  那么笔者的态度是什么,以前其实已经说过了,还是那句话:必须刷  至于为什么,后面会解释,并且笔......
  • linux用户管理学习感悟与笔记
    Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提......
  • -bash: java: command not found笔记
    文章目录场景解决方案找java的方法find命令进行查找根据java进程找寻具体位置场景linux系统执行java命令时报错:-bash:java:commandnotfound。解决方案可能是没有安装java(这种情况比较少)或者安装了java但是没有设置环境变量(一般是这种情况)。找java的方法find命令进行查找......
  • spring发送邮件笔记
    文章目录引入依赖配置代码附件url地址为空会不会报错接收方邮件地址错误会不会报错引入依赖推荐用spring集成依赖,不用一个包一个包找了。<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>配......