复数重载 与 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. Sublime编辑器的使用

    Sublime编辑器的使用 我的本地使用环境是Win7下安装的Sublime3编辑器(提取码:nzuw). 1. 新建index.html,在代码编辑区输入<html,然后按下Tab键,可以快速 ...

  2. yum安装man命令程序错误

    第一次安装CentOS后,man命令无法使用,查了一下,发现没有安装man命令程序.尝试安装man yum install man 结果如下: Loaded plugins: fastestmirro ...

  3. Oracle批量操作数据库

    1:批量插入 <insert id="insertBatch" parameterType="Java.util.List" > insert in ...

  4. Window Server 布署 WCF 服务 , 权限配置问题

    起因: 客户服务器运行环境要求提高安全性,建议数据连接串采取 加密措施 ,或改用 Window 验证 连接数据库服务 .于是我们打算选择后着,将后台服务(Window Server)数据库连接串调整为 ...

  5. 【剑指offer28:字符串的排列】【java】

    题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. import ja ...

  6. Elasticsearch-深入理解索引原理

    最近开始大面积使用ES,很多地方都是知其然不知其所以然,特地翻看了很多资料和大牛的文档,简单汇总一篇.内容多为摘抄,说是深入其实也是一点浅尝辄止的理解.希望大家领会精神. 首先学习要从官方开始地址如下 ...

  7. 【转载】什么是Windows USB设备路径,它是如何格式化的?

    http://blog.csdn.net/kingmax54212008/article/details/77837210 用于接口的复合USB设备路径格式 \?usb#vid_ vvvv&p ...

  8. 合唱团 (线性dp)

    题意:有 n 个学生站成一排,每个学生有一个能力值,牛牛想从这 n 个学生中按照顺序选取 k 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 k 个学生的能力值的乘积最大,你能返回最大的乘积 ...

  9. SIFT解析(三)生成特征描述子

    以上两篇文章中检测在DOG空间中稳定的特征点,lowe已经提到这些特征点是比Harris角点等特征还要稳定的特征.下一步骤我们要考虑的就是如何去很好地描述这些DOG特征点. 下面好好说说如何来描述这些 ...

  10. eclipse hadoop1.2.0配置及wordcount运行

    "error: failure to login"问题 http://www.cnblogs.com/xia520pi/archive/2012/05/20/2510723.htm ...