复数重载 与 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 && 复数重载的更多相关文章

  1. C++复数运算 重载

    近期整理下很久前写的程序,这里就把它放在博文中了,有些比较简单,但是很有学习价值. 下面就是自己很久前实现的复数重载代码,这里没有考虑特殊情况,像除法中,分母不为零情况. #include <i ...

  2. FFT算法小结

    都应该知道多项式是什么对吧(否则学什么多项式乘法) 我们用\(A(x)\)表示一个\(n-1\)次多项式,即\(A(x)=\sum_{i=0}^{n-1} {a_i}*x^i\) 例如\(A(x)=x ...

  3. 多项式相关&&生成函数相关&&一些题目(updating...)

    文章目录 多项式的运算 多项式的加减法,数乘 多项式乘法 多项式求逆 多项式求导 多项式积分 多项式取对 多项式取exp 多项式开方 多项式的除法/取模 分治FFT 生成函数 相关题目 多项式的运算 ...

  4. 【C++】类-多态

    类-多态 目录 类-多态 1. 基本概念 2. 运算符重载 2.1 重载为类的成员函数 2.2 重载为非成员函数 3. 虚函数 4. 抽象类 5. override与final 1. 基本概念 多态性 ...

  5. C++复数类对除法运算符 / 的重载

    C8-1 复数加减乘除 (100.0/100.0 points) 题目描述 求两个复数的加减乘除. 输入描述 第一行两个double类型数,表示第一个复数的实部虚部 第二行两个double类型数,表示 ...

  6. C++习题 复数类--重载运算符2+

    Description 定义一个复数类Complex,重载运算符"+",使之能用于复数的加法运算.参加运算的两个运算量可以都是类对象,也可以其中有一个是整数,顺序任意.例如,c1+ ...

  7. C++习题 复数类--重载运算符+

    Description 定义一个复数类Complex,重载运算符"+",使之能用于复数的加法运算.将运算符函数重载为非成员.非友元的普通函数.编写程序,求两个复数之和. Input ...

  8. F2833x 调用DSP函数库实现复数的FFT的方法

    转载自:http://blog.csdn.net/aeecren/article/details/67644363:个人觉得写的很详细,值得一看 在数字信号处理中,FFT变换是经常使用到的,在DSP中 ...

  9. 15.C++-操作符重载、并实现复数类

    首先回忆下以前学的函数重载 函数重载 函数重载的本质为相互独立的不同函数 通过函数名和函数参数来确定函数调用 无法直接通过函数名得到重载函数的入口地址 函数重载必然发生在同一个作用域中 类中的函数重载 ...

随机推荐

  1. 克隆虚拟机以及两台linux机器相互登录:linux学习第四篇

    克隆虚拟机 1.      克隆 之后自己命名克隆的虚拟机并自己选择存放位置,完成克隆 2.      克隆虚拟机之后对新的虚拟机修改网络配置,以免冲突(将配置文件里的UUID去掉,并修改IP地址) ...

  2. python进阶学习笔记(三)

    3.类的继承 3.1,python中什么是类的继承 答案是肯定的. 也就是说,如果一个实例是一个子类,那么它也是一个父类 总是从某各类继承,如果没有合适的类,就要从object类继承:super(). ...

  3. Centos/linux下的JDK安装

    1.连接到centos的远程主机上 #你的用户名 ssh root@xxxxx 2.输入密码登录 3.最好将镜像改为阿里云的镜像 http://mirrors.aliyun.com/help/cent ...

  4. PHP中::的使用

    访问静态变量,静态属性,const修饰的变量.

  5. Ubuntu搭建Hadoop的踩坑之旅(一)

    本文将介绍如何使用虚拟机一步步从安装Ubuntu到搭建Hadoop伪分布式集群. 本文主要参考:在VMware下安装Ubuntu并部署Hadoop1.2.1分布式环境 - CSDN博客 一.所需的环境 ...

  6. eclipse web and java ee development

    1.打开Eclipse ->help ->install new software 2.Work with:http://download.eclipse.org/releases/gan ...

  7. Git & github 使用指南

    Git的安装: 1.下载 Git for windows下载网址:https://git-for-windows.github.io/ 2.安装 选择安装路径: 选择组件:默认  是否修改环境变量 : ...

  8. Windows 7 蓝屏原因

    Windows 7 蓝屏 Microsoft (R) Windows Debugger Version 6.11.0001.404 X86 Copyright (c) Microsoft Corpor ...

  9. FusionCharts多数据验证饼图label是否重叠

    昨天,有人问我一个问题:由于饼图的数据太多,label标签上的汉字过多,导致重叠,该怎么解决? 今天我用大量的数据,label标签的字符也很多,但是通过验证没有发现有重叠的情况啊! 1.验证的JSP页 ...

  10. Java Web项目(Extjs)报错二

    1.Java Web项目(Extjs)报错二 具体报错如下: usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ...