证明请参考算法概论的快速博立叶。

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(快速博立叶变换)相关推荐

  1. 浅谈FFT(快速博立叶变换)学习笔记

    0XFF---FFT是啥? FFT是一种DFT的高效算法,称为快速傅立叶变换(fast Fourier transform),它根据离散傅氏变换的奇.偶.虚.实等 特性,对离散傅立叶变换的算法进行改进 ...

  2. Python OpenCV学习笔记之:博立叶变换

    为什么80%的码农都做不了架构师?>>>    # -*- coding: utf-8 -*- # 博立叶变换import cv2 import numpy as np from m ...

  3. 【图像处理】二维付立叶变换和滤波 (Two-Dimensional Fourier Transform and Filtering)

    实验要求   该实验的目的是开发一个2-D FFT 程序包.要求程序能完成下面的功能:   (1.a) 用因子 (-1)x+y 乘以输入图像,以实现滤波的中心化变换:   (1.b) 计算付立叶变换: ...

  4. [hdu4609]3-idiots(快速傅利叶变换FFT)

    题目名字是三个制杖- [题意] 有T组数据 每组数据给出n条线段,问任意取三条,可以组成三角形的概率 [输入] 开头一行输入T(T<=10) 下来T组数据,每组数据第一行输入一个n(3<= ...

  5. fft快速傅利叶变的C实现

    //********************************************************** // 函数名: 快速傅立叶变换(来源<C常用算法集>) // 本函 ...

  6. 快速傅立叶变换(FFT)算法(原来这就是蝶形变换)

    快速傅立叶变换(FFT)算法(原来这就是蝶形变换) 为了实现FFT的海面模拟,不得不先撸个FFT算法实现. 离散傅立叶变换(DFT) 学习FFT之前,首先要先了解什么是DFT,我们都知道傅立叶变换是将 ...

  7. FFT快速傅立叶变换在示波器中的用法

    大多数示波器上都有个FFT功能,也叫快速傅立叶变换,但很多人不了解这个功能是做什么用的,百度以后又会遇到各种各样的高数公式,看的一头雾水,遂而放弃这块知识. 我们来看百度百科的解释: FFT,即为快速 ...

  8. CUDA并行算法系列之FFT快速卷积

    CUDA并行算法系列之FFT快速卷积 卷积定义 在维基百科上,卷积定义为: 离散卷积定义为: [ 0, 1, 2, 3]和[0, 1, 2]的卷积例子如下图所示: Python实现(直接卷积) 根据离 ...

  9. 【经典算法实现 44】理解二维FFT快速傅里叶变换 及 IFFT快速傅里叶逆变换(迭代法 和 递归法)

    [经典算法实现 44]理解二维FFT快速傅里叶变换 及 IFFT快速傅里叶逆变换(迭代法 和 递归法) 一.二维FFTFFTFFT快速傅里叶变换 公式推导 二.二维FFTFFTFFT 及 IFFTIF ...

最新文章

  1. (021)java后台开发之HttpServletRequest
  2. 分享几种绕过防注入的方法
  3. 【操作系统】输入输出系统(下下)-思维导图0.0
  4. 单一IP地址静态NAT实验环境
  5. LibSvm使用说明和LibSvm源码解析
  6. sklearn 学习实践之——基于自带数据集(波士顿房价、鸢尾花、糖尿病等)构建分类、回归模型
  7. Anaconda下载官网
  8. 盘口功夫——研判股价启动前的四种征兆----
  9. 电子通讯录(数据库版存储)
  10. 完美解决cannot import name ‘_validate_lengths‘ from ‘numpy.lib.arraypad‘错误
  11. 最大公约数(GCD)和最小公倍数(LCM)
  12. STM32F103的SPI口进行OLED屏的使用
  13. 遇到电脑显示器花屏是什么问题
  14. 加入AI考拉大家庭,是一种怎样的体验?--来自考拉码农的心声
  15. 歌评 Mondstadt Starlit 星光下的蒙德-陈致逸
  16. 解析复杂深度学习项目构建
  17. 核心路由器十项性能指标[ITAA网络实验室IT傻博士原创]
  18. ReactNative js 汉字转拼音
  19. 联想MIIX520笔记本电脑屏幕亮度无法调节问题
  20. 构造函数能否被继承,为什么?

热门文章

  1. 前后端分离Oauth2.0 - springsecurity + spring-authorization-server —授权码模式
  2. 操作系统最坏适应最优适应最先适应
  3. camera申请buf流程
  4. dw中css鼠标经过的时候,Dreamweaver鼠标经过出现效果 怎么操作
  5. 七步教你制定网站SEO整体优化方案
  6. 进制转化——十进制转二进制
  7. python替换所有标点符号 正则_Python处理中文标点符号大集合
  8. 操作系统实验六:作业调度算法模拟
  9. 分享132个ASP源码,总有一款适合您
  10. 机器学习——一元线性回归和多元线性回归