FFT(快速博立叶变换)
证明请参考算法概论的快速博立叶。
FFT递归:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 5005;
const double PI = acos ( -1.0 );
struct node
{double real, image;node ( double a = 0, double b = 0 ) : real ( a ), image ( b ) { }node operator + ( const node &b ){return node ( real+b.real, image+b.image );}node operator - ( const node &b ){return node ( real-b.real, image-b.image );}node operator * ( const node &b ){return node ( real*b.real-image*b.image,real*b.image+image*b.real );}
};
node a[maxn], b[maxn];
int re[maxn];
node * FFT ( node x[maxn], int n, int dft )
{node * ans = ( node * ) malloc ( sizeof ( node )*n );if ( n == 1 ){ans[0] = x[0];return ans;}node lf[maxn], rt[maxn];for ( int i = 0; i < n; i += 2 )lf[i/2] = x[i];for ( int i = 1; i < n; i += 2 )rt[i/2] = x[i];node * L = FFT ( lf, n/2, dft );node * R = FFT ( rt, n/2, dft );node nw = node ( cos ( dft*2*PI/n ), sin ( dft*2*PI/n ) );node w = node ( 1, 0 );for ( int i = 0; i < n/2; i ++ ){ans[i] = L[i]+w*R[i];ans[i+n/2] = L[i]-w*R[i];w = w*nw;}return ans;
}
void solve ( )
{int n;scanf ( "%d", &n );for ( int i = 0; i < n; i ++ ){scanf ( "%lf", &a[i].real );a[i].image = 0;}for ( int i = 0; i < n; i ++ ){scanf ( "%lf", &b[i].real );b[i].image = 0;}int p = 1;while ( p < 2*n )p <<= 1;for ( int i = n; i < p; i ++ )a[i].real = a[i].image = b[i].real = b[i].image = 0;node * pa = FFT ( a, p, 1 );node * pb = FFT ( b, p, 1 );for ( int i = 0; i < p; i ++ )a[i] = pa[i]*pb[i];pa = FFT ( a, p, -1 );for ( int i = 0; i < p; i ++ )re[i] = pa[i].real/p+0.5;for ( int i = 0; i < p; i ++ )printf ( "%d ", re[i] );printf ( "\n" );
}
int main ( )
{solve ( );return 0;
}
FFT迭代代码(HDU1402):
#include <bits/stdc++.h>
using namespace std;
const int maxn = 500005;
const double PI = acos ( -1.0 );
struct node
{double real, image;node ( double a = 0, double b = 0 ) : real ( a ), image ( b ) { }node operator + ( const node &b ){return node ( real+b.real, image+b.image );}node operator - ( const node &b ){return node ( real-b.real, image-b.image );}node operator * ( const node &b ){return node ( real*b.real-image*b.image,real*b.image+image*b.real );}
};
node a[maxn], b[maxn], W[maxn];
int re[maxn];
char x[maxn], y[maxn];
void change ( node a[], int n )
{int p = 1;while ( ( 1 << p ) < n )p ++;for ( int i = 0; i < n; i ++ ){int j = 0, k = i, t = p;while ( t -- ){j <<= 1;j |= k&1;k >>= 1;}if ( j > i )swap ( a[i], a[j] );}
}
void FFT ( node a[], int n, int dft )
{change ( a, n );for ( int i = 1; i < n; i *= 2 ){node nw ( cos ( dft*PI*2/2/i ), sin ( dft*PI*2/2/i ) );for ( int j = 0; j < n; j += 2*i ){node w ( 1, 0 );for ( int k = 0; k < i; k ++ ){node tmp = a[j+k];node res = w*a[j+k+i];a[j+k] = tmp+res;a[j+k+i] = tmp-res;w = w*nw;}}}if ( dft == -1 ){for ( int i = 0; i < n; i ++ )a[i].real /= n;}
}
void solve ( )
{int lenx, leny;while ( ~ scanf ( "%s%s", x, y ) ){lenx = strlen ( x );for ( int i = 0; i < lenx; i ++ ){a[i].real = x[lenx-1-i]-'0';a[i].image = 0;}leny = strlen ( y );for ( int i = 0; i < leny; i ++ ){b[i].real = y[leny-1-i]-'0';b[i].image = 0;}int p = 1;while ( p < 2*lenx || p < 2*leny )p <<= 1;for ( int i = lenx; i < p; i ++ )a[i].real = a[i].image = 0;for ( int i = leny; i < p; i ++ )b[i].real = b[i].image = 0;FFT ( a, p, 1 );FFT ( b, p, 1 );for ( int i = 0; i < p; i ++ )a[i] = a[i]*b[i];FFT ( a, p, -1 );for ( int i = 0; i < p; i ++ )re[i] = a[i].real+0.5;for ( int i = 0; i < p; i ++ ){re[i+1] += re[i]/10;re[i] %= 10;}int h = 0;for ( int i = p-1; i >= 0; i -- )if ( re[i] ){h = i;break ;}for ( int i = h; i >= 0; i -- )printf ( "%d", re[i] );printf ( "\n" );}
}
int main ( )
{solve ( );return 0;
}
FFT(快速博立叶变换)相关推荐
- 浅谈FFT(快速博立叶变换)学习笔记
0XFF---FFT是啥? FFT是一种DFT的高效算法,称为快速傅立叶变换(fast Fourier transform),它根据离散傅氏变换的奇.偶.虚.实等 特性,对离散傅立叶变换的算法进行改进 ...
- Python OpenCV学习笔记之:博立叶变换
为什么80%的码农都做不了架构师?>>> # -*- coding: utf-8 -*- # 博立叶变换import cv2 import numpy as np from m ...
- 【图像处理】二维付立叶变换和滤波 (Two-Dimensional Fourier Transform and Filtering)
实验要求 该实验的目的是开发一个2-D FFT 程序包.要求程序能完成下面的功能: (1.a) 用因子 (-1)x+y 乘以输入图像,以实现滤波的中心化变换: (1.b) 计算付立叶变换: ...
- [hdu4609]3-idiots(快速傅利叶变换FFT)
题目名字是三个制杖- [题意] 有T组数据 每组数据给出n条线段,问任意取三条,可以组成三角形的概率 [输入] 开头一行输入T(T<=10) 下来T组数据,每组数据第一行输入一个n(3<= ...
- fft快速傅利叶变的C实现
//********************************************************** // 函数名: 快速傅立叶变换(来源<C常用算法集>) // 本函 ...
- 快速傅立叶变换(FFT)算法(原来这就是蝶形变换)
快速傅立叶变换(FFT)算法(原来这就是蝶形变换) 为了实现FFT的海面模拟,不得不先撸个FFT算法实现. 离散傅立叶变换(DFT) 学习FFT之前,首先要先了解什么是DFT,我们都知道傅立叶变换是将 ...
- FFT快速傅立叶变换在示波器中的用法
大多数示波器上都有个FFT功能,也叫快速傅立叶变换,但很多人不了解这个功能是做什么用的,百度以后又会遇到各种各样的高数公式,看的一头雾水,遂而放弃这块知识. 我们来看百度百科的解释: FFT,即为快速 ...
- CUDA并行算法系列之FFT快速卷积
CUDA并行算法系列之FFT快速卷积 卷积定义 在维基百科上,卷积定义为: 离散卷积定义为: [ 0, 1, 2, 3]和[0, 1, 2]的卷积例子如下图所示: Python实现(直接卷积) 根据离 ...
- 【经典算法实现 44】理解二维FFT快速傅里叶变换 及 IFFT快速傅里叶逆变换(迭代法 和 递归法)
[经典算法实现 44]理解二维FFT快速傅里叶变换 及 IFFT快速傅里叶逆变换(迭代法 和 递归法) 一.二维FFTFFTFFT快速傅里叶变换 公式推导 二.二维FFTFFTFFT 及 IFFTIF ...
最新文章
- (021)java后台开发之HttpServletRequest
- 分享几种绕过防注入的方法
- 【操作系统】输入输出系统(下下)-思维导图0.0
- 单一IP地址静态NAT实验环境
- LibSvm使用说明和LibSvm源码解析
- sklearn 学习实践之——基于自带数据集(波士顿房价、鸢尾花、糖尿病等)构建分类、回归模型
- Anaconda下载官网
- 盘口功夫——研判股价启动前的四种征兆----
- 电子通讯录(数据库版存储)
- 完美解决cannot import name ‘_validate_lengths‘ from ‘numpy.lib.arraypad‘错误
- 最大公约数(GCD)和最小公倍数(LCM)
- STM32F103的SPI口进行OLED屏的使用
- 遇到电脑显示器花屏是什么问题
- 加入AI考拉大家庭,是一种怎样的体验?--来自考拉码农的心声
- 歌评 Mondstadt Starlit 星光下的蒙德-陈致逸
- 解析复杂深度学习项目构建
- 核心路由器十项性能指标[ITAA网络实验室IT傻博士原创]
- ReactNative js 汉字转拼音
- 联想MIIX520笔记本电脑屏幕亮度无法调节问题
- 构造函数能否被继承,为什么?