FFT && 复数重载
复数重载 与 FFT
1.复数重载:
重载了复数的运算,即重载了复数的加减乘以及赋初值。
struct Complex{ //复数的重载
double r,i;
IL Complex(){r = 0; i = 0;}
IL Complex(RG double a,RG double b){r = a; i = b;}
IL Complex operator +(Complex B){ return Complex(r+B.r,i+B.i); }
IL Complex operator -(Complex B){ return Complex(r-B.r,i-B.i); }
IL Complex operator *(Complex B){
return Complex(r*B.r-i*B.i , r*B.i+i*B.r);
}
};
其中\(f.r\)为实部 ,\(f.i\)为虚部。
2.FFT算法:
计算多项式\(f_1\)*\(f_2\) == \(f_3\)的算法,
时间复杂度\(O(n\ logn)\) , 空间最好开\(O(3n)\)到\(O(4n)\)左右;
Complex f1[_],f2[_],X,Y; int f3[_]; //f3储存卷积的系数.
const double PI = acos(-1);
IL void Init(){ //读入数据,预处理.
cin >> n >> m;
for(RG int i = 0; i <= n; i ++)cin >> f1[i].r;
for(RG int j = 0; j <= m; j ++)cin >> f2[j].r; //读入两个多项式
m += n; l = 0;
for(n = 1; n <= m; n<<=1)l++;
//此时m保存卷积的长度,n等于二进制补全后 数列长度+1 .
//Rader预处理:
for(RG int i = 0; i < n; i ++)R[i] = (R[i>>1]>>1) | ((i&1)<<(l-1));
}
IL void FFT(Complex *P , int opt){
for(RG int i = 0; i < n; i ++)
if(i < R[i]) swap(P[i] , P[R[i]]); //Rader 排序
for(RG int i = 1; i < n; i<<=1){
Complex W(cos(PI/i),opt*sin(PI/i));
for(RG int p = i<<1 , j = 0; j < n; j += p){
Complex w(1,0);
for(RG int k = 0; k < i; k ++,w = w*W){
X = P[j + k] , Y = w*P[j + k + i];
P[j + k] = X + Y; P[j + k + i] = X - Y;
}
}
}
if(opt == -1) for(RG int i = 0; i < n; i ++)P[i].r /= n;
}
int main(){
Init();
//计算f1*f2
FFT(f1,1); FFT(f2,1);
for(RG int i = 0; i <= n; i ++)f1[i] = f1[i]*f2[i];
FFT(f1,-1);
//最后结果存在f1中.
for(RG int i = 0; i <= m; i ++)f3[i] = (int)(f1[i].r+0.5));
return 0;
}
FFT && 复数重载的更多相关文章
- C++复数运算 重载
近期整理下很久前写的程序,这里就把它放在博文中了,有些比较简单,但是很有学习价值. 下面就是自己很久前实现的复数重载代码,这里没有考虑特殊情况,像除法中,分母不为零情况. #include <i ...
- FFT算法小结
都应该知道多项式是什么对吧(否则学什么多项式乘法) 我们用\(A(x)\)表示一个\(n-1\)次多项式,即\(A(x)=\sum_{i=0}^{n-1} {a_i}*x^i\) 例如\(A(x)=x ...
- 多项式相关&&生成函数相关&&一些题目(updating...)
文章目录 多项式的运算 多项式的加减法,数乘 多项式乘法 多项式求逆 多项式求导 多项式积分 多项式取对 多项式取exp 多项式开方 多项式的除法/取模 分治FFT 生成函数 相关题目 多项式的运算 ...
- 【C++】类-多态
类-多态 目录 类-多态 1. 基本概念 2. 运算符重载 2.1 重载为类的成员函数 2.2 重载为非成员函数 3. 虚函数 4. 抽象类 5. override与final 1. 基本概念 多态性 ...
- C++复数类对除法运算符 / 的重载
C8-1 复数加减乘除 (100.0/100.0 points) 题目描述 求两个复数的加减乘除. 输入描述 第一行两个double类型数,表示第一个复数的实部虚部 第二行两个double类型数,表示 ...
- C++习题 复数类--重载运算符2+
Description 定义一个复数类Complex,重载运算符"+",使之能用于复数的加法运算.参加运算的两个运算量可以都是类对象,也可以其中有一个是整数,顺序任意.例如,c1+ ...
- C++习题 复数类--重载运算符+
Description 定义一个复数类Complex,重载运算符"+",使之能用于复数的加法运算.将运算符函数重载为非成员.非友元的普通函数.编写程序,求两个复数之和. Input ...
- F2833x 调用DSP函数库实现复数的FFT的方法
转载自:http://blog.csdn.net/aeecren/article/details/67644363:个人觉得写的很详细,值得一看 在数字信号处理中,FFT变换是经常使用到的,在DSP中 ...
- 15.C++-操作符重载、并实现复数类
首先回忆下以前学的函数重载 函数重载 函数重载的本质为相互独立的不同函数 通过函数名和函数参数来确定函数调用 无法直接通过函数名得到重载函数的入口地址 函数重载必然发生在同一个作用域中 类中的函数重载 ...
随机推荐
- egametang框架服务端运行流程
et框架的构建块主要由entity和componet组成,类似unity的组件.一个Entity可以挂载多个不同Component.Entity和Component的共同基类Disposer用于提供对 ...
- 对html语义化的理解
所有人都知道html即超文本标记语言或超文本链接标示语言,是目前网络上应用最为广泛的语言,也是构成网页文档的主要语言. html标签中的大部分都是由"语义化"标签所担任 那么,它有 ...
- python并发编程之线程(一):线程&守护线程&全局解释器锁
一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 官网链接:https://docs.pyth ...
- asp.net core 一 Centos 环境部署
.netcore的运行环境,创建asp.net core 项目 CentOS 7 ,dotnet-sdk-2.0.0-2.0.0-1.x86_64 直接在liunx创建项目并运 ...
- 用Composer获取第三方资源总是失败咋办?
凉拌!!! 不不不,哥可是一个有追求的人,没那么容易放弃的! 所以我选择用中国全量镜像,https://pkg.phpcomposer.com/ 使用方法: 对,就是命令行方法,我最喜欢的方法!!! ...
- php的ob函数实现页面静态化
首先介绍一下php中ob缓存常用到的几个常用函数ob_start():开启缓存机制ob_get_contents():获取ob缓存中的内容ob_clean()清除ob缓存中的内容,但不关闭缓存ob_e ...
- DxPackNet 5.视频高质量的压缩和传输
DxPackNet 对视频的压缩和解压也提供了很好的支持,且系统不需要装第三方解码器哦~ 主要用到了 IxVideoEncoder 视频编码器 和 IxVideoDecoder 两个接口 这里只做简 ...
- CNN 卷积层输入Map大小计算
对于输出的size计算: out_height=((input_height - filter_height + padding_top+padding_bottom)/stride_height ) ...
- 如何使用 libqr 库生成二维码?
使用 libqr 库只需 4 步即可生成二维码 1.初始化 QRCode 结构体 QRCode *qrInit(int version, int mode, int eclevel, int mask ...
- yaf框架刚开始遇到的问题
2016-10-17 17:54:13遇到的这个问题,这个问题算是比较综合性的问题,我也是查阅了很多的资料才大概明白的.这里就简单记录一下: 1.首先查看日志记录,结果如下: 根据错误日志:找寻到 ( ...