[大坑]FFT学习
[大坑]FFT学习
Macros
#define fon(i,s) for(int i=0;i<s; ++i)
#define fone(i,s) for(int i=0;i<=s;++i)
#define fox(i,f,t) for(int i=f;i<t; ++i)
#define foxe(i,f,t) for(int i=f;i<=t;++i)
#define don(i,s) for(int i=s;i; --i)
#define done(i,s) for(int i=s;~i; --i)
#define dox(i,f,t) for(int i=f;i>t; --i)
#define doxe(i,f,t) for(int i=f;i>=t;--i)
#define ifm(a,b) if((a)<(b))
#define _swp(a,b) std::swap(a,b)
#define lp while(1)
#define qlp break;
#define nlp continue;
#define maxp 30
#define odd(x) (x&1)
#define even(x) !(x&1)
#define _cl(x,f,t) fox(_CLEAR,f,t) x[_CLEAR]=0
template<class T> inline void _st(T* f,T* t,T p){
for(T* x=f;x<t;++x) *x=p;
}
Bit Reverse
inline void _BR(int* a,int r){
for(int i=0,j=1;i<r;++i,j<<=1){
for(int k=0,kx=j;k<j;++k,++kx){
a[k]=a[k]<<1;
a[kx]=a[k]|1;
}
}
}
inline void _BR_iter(int* a,int r){
int u=r;
fon(i,r){
a[i]=a[i]<<1;
a[u++]=a[i]|1;
}
}
inline void _BR_diter(int* a,int r){
fon(i,r) a[i]>>=1;
}
Fast power mod
wjz大爷说他的fpm只要一行吓cry.
经典沙茶zbt写法.
inline int fpm(int a,int b,int p){
int q=1;
while(b){
if(b&1) q=((long long)q*a)%p;
a=((long long)a*a)%p;
b>>=1;
}
return q;
}
NTT
感觉FFT和IFFT分开来写会好一些→ →
struct _NTT_base{
int mod,w1,wm;
int p[maxp],pi[maxp],d;
inline int inv(int p){
return fpm(p,mod-2,mod);
}
inline void init(int m,int w){
mod=m,p[0]=w1=w;
int u=m-1,u2=m-1;
d=0;
while(even(u2)) u2>>=1;
p[0]=fpm(p[0],u2,m);
pi[0]=inv(p[0]);
while(even(u)){
++d;
p[d]=((long long)p[d-1]*p[d-1])%m,pi[d]=((long long)pi[d-1]*pi[d-1])%m;
u>>=1;
}
}
inline void FFT(int* a,int* bitrev,int l){
fon(i,l) ifm(i,bitrev[i]) _swp(a[i],a[bitrev[i]]);
for(int i=2,h=1,xn=d-1;i<=l;i<<=1,h<<=1,--xn){
int u=p[xn];
for(int j=0;j<l;j+=i){
int w=1;
fox(k,j,j+h){
int A=a[k],B=(long long)a[k+h]*w%mod;
a[k]=(A+B)%mod,a[k+h]=(A-B+mod)%mod;
w=(long long)w*u%mod;
}
}
}
}
inline void IFFT(int* a,int* bitrev,int l){
fon(i,l) ifm(i,bitrev[i]) _swp(a[i],a[bitrev[i]]);
int invA=1,invB=(mod+1)>>1,invC=0;
for(int i=2,h=1,xn=d-1;i<=l;i<<=1,h<<=1,--xn){
int u=pi[xn];
invA=(long long)invB*invA%mod;
for(int j=0;j<l;j+=i){
int w=1;
fox(k,j,j+h){
int A=a[k],B=(long long)a[k+h]*w%mod;
a[k]=(A+B)%mod,a[k+h]=(A-B+mod)%mod;
w=(long long)w*u%mod;
}
}
}
fon(i,l) a[i]=(long long)a[i]*invA%mod;
}
inline void FFT(int* a,int* b,int* bitrev,int l){
fon(i,l) ifm(i,bitrev[i]) _swp(a[i],a[bitrev[i]]),_swp(b[i],b[bitrev[i]]);
for(int i=2,h=1,xn=d-1;i<=l;i<<=1,h<<=1,--xn){
int u=p[xn];
for(int j=0;j<l;j+=i){
int w=1;
fox(k,j,j+h){
int A=a[k],C=b[k],B=(long long)a[k+h]*w%mod,D=(long long)b[k+h]*w%mod;
a[k]=(A+B)%mod,a[k+h]=(A-B+mod)%mod,b[k]=(C+D)%mod,b[k+h]=(C-D+mod)%mod;
w=(long long)w*u%mod;
}
}
}
}
inline void IFFT(int* a,int* b,int* bitrev,int l){
fon(i,l) ifm(i,bitrev[i]) _swp(a[i],a[bitrev[i]]),_swp(b[i],b[bitrev[i]]);
int invA=1,invB=(mod+1)>>1;
for(int i=2,h=1,xn=d-1;i<=l;i<<=1,h<<=1,--xn){
int u=pi[xn];
invA=(long long)invA*invB%mod;
for(int j=0;j<l;j+=i){
int w=1;
fox(k,j,j+h){
int A=a[k],C=b[k],B=(long long)a[k+h]*w%mod,D=(long long)b[k+h]*w%mod;
a[k]=(A+B)%mod,a[k+h]=(A-B+mod)%mod,b[k]=(C+D)%mod,b[k+h]=(C-D+mod)%mod;
w=(long long)w*u%mod;
}
}
}
fon(i,l) a[i]=(long long)a[i]*invA%mod,b[i]=(long long)b[i]*invA%mod;
}
};
这个\(K^{-1}\bmod P\)求法比较诡异...先求出\(2^{-1}\bmod P\)就是\(\frac{P+1}{2}\)(这个非常显然> <,P得是\(2^k\cdot c+1\)所以是奇数),然后倍增,由于\(K=2^u\)...为了更好地运用循环资源> >...
坑点笔记
- in
fpm(): + b>>=1; - in
_NTT_base::init():intd error -> d - in
_NTT_base::IFFT(): calcinvAmethod +invA*=invB-invA=invB,invB=invB*invB
[大坑]FFT学习的更多相关文章
- 快速傅里叶变换(FFT)学习笔记
定义 多项式 系数表示法 设\(A(x)\)表示一个\(n-1\)次多项式,则所有项的系数组成的\(n\)维向量\((a_0,a_1,a_2,\dots,a_{n-1})\)唯一确定了这个多项式. 即 ...
- 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT)
再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT) 目录 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Blueste ...
- 快速傅里叶变换(FFT)学习笔记(其一)
再探快速傅里叶变换(FFT)学习笔记(其一) 目录 再探快速傅里叶变换(FFT)学习笔记(其一) 写在前面 为什么写这篇博客 一些约定 前置知识 多项式卷积 多项式的系数表达式和点值表达式 单位根及其 ...
- 快速傅里叶变换(FFT)学习笔记(其二)(NTT)
再探快速傅里叶变换(FFT)学习笔记(其二)(NTT) 目录 再探快速傅里叶变换(FFT)学习笔记(其二)(NTT) 写在前面 一些约定 前置知识 同余类和剩余系 欧拉定理 阶 原根 求原根 NTT ...
- 口胡FFT现场(没准就听懂了)&&FFT学习笔记
前言(不想听的可以跳到下面) OK.蒟蒻又来口胡了. 自从ZJOI2019上Day的数论课上的多项式听到懵逼了,所以我就下定决心要学好多项式.感觉自己以前学的多项式都是假的. 但是一直在咕咕,现在是中 ...
- FFT学习及简单应用(一点点详细)
什么是FFT 既然打开了这篇博客,大家肯定都已经对FFT(Fast Fourier Transformation)有一点点了解了吧 FFT即为快速傅里叶变换,可以快速求卷积(当然不止这一些应用,但是我 ...
- 【笔记篇】(理论向)快速傅里叶变换(FFT)学习笔记w
现在真是一碰电脑就很颓废啊... 于是早晨把电脑锁上然后在旁边啃了一节课多的算导, 把FFT的基本原理整明白了.. 但是我并不觉得自己能讲明白... Fast Fourier Transformati ...
- 快速傅里叶变换FFT学习小记
FFT学得还是有点模糊,原理那些基本还是算有所理解了吧,不过自己推这个推不动. 看的资料主要有这两个: http://blog.miskcoo.com/2015/04/polynomial-multi ...
- FFT学习笔记
快速傅里叶变换FFT(Fast Fourior Transform) 先说一下它能干嘛qwq 傅里叶变换有两种,连续傅里叶变换和离散傅里叶变换,OI中主要用来快速计算多项式卷积. 等一下,卷积是啥 ...
随机推荐
- wex5 开机图片时间长
作用: 控制刚打开图片 时间长 修改config.xml 地址:F:\wex\model\Native\templates\advanced 延迟的时间是在本地app的 config.xml中修改, ...
- MagicalRecord简单使用小记
一般采用pod安装,导入框架 #import <CoreData+MagicalRecord.h> - (BOOL)application:(UIApplication *)applica ...
- Hosts知多少?
Hosts知多少? 老D hosts 定期更新地址: http://laod.cn/hosts/2016-google-hosts.html 老Dhosts 页面长期更新最新Google.谷歌 ...
- Fork函数初识
fork函数用于创建子进程,典型的调用一次,返回两次的函数.其中调用进程返回子进程的PID,而子进程则返回0.但是两个进程的执行顺序是不定的. fork函数调用完成以后父进程的虚拟存储空间被拷贝给了子 ...
- centos 7.0 PHP 5.6.5 安装过程 (php+nginx)
php网址 http://php.net/downloads.php 首先下载 php-5.6.5.tar.gz [root@localhost src]# wget http://cn2.php.n ...
- iOS 在UILabel显示不同的字体和颜色(转)
转自:http://my.oschina.net/CarlHuang/blog/138363 在项目开发中,我们经常会遇到在这样一种情形:在一个UILabel 使用不同的颜色或不同的字体来体现字符串, ...
- NGINX将PHP带参数的URL地址重定向二级或多级域名访问
今天项目中有一个手机站点需要用*.m.domain.com的三级域名访问. 如手机站点的访问网址为m.domain.com,手机下面的会员实际访问地址为index.php?username=$user ...
- [Angularjs]asp.net mvc+angularjs+web api单页应用之CRUD操作
写在前面 前篇文章整理了angularjs学习目录,有园子里的朋友问我要这方面的demo,周末也没什么事,就在之前的单页应用的demo上面添加了增删改查的操作.代码比较简单,这里只列举比较重要的代码片 ...
- Sql Server作业
参考资料: http://jingyan.baidu.com/article/49ad8bce7287315834d8fab4.html
- dubbo框架----探索-大型系统架构设计(图解)
对于高并发系统的架构要求: 1. 负载均衡 2.高并发 3.高可用 4.面向服务架构 (Dubbo框架使用) 5.分布式缓存 (redis分布式缓存) 6.分布式全文检索 (solr分分布式全文检索) ...