[大坑]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中主要用来快速计算多项式卷积. 等一下,卷积是啥 ...
随机推荐
- HTTP2.0介绍
HTTP2.0的所有通信都是在一个TCP连接上完成的. 1.信息传输术语 1.1 流 虚拟信道,可以承载双向消息,每个流都有一个唯一的整数标识符(1.2....N); 1.2 消息 逻辑上的HTTP消 ...
- JS实现的一个query字符串转Json格式数据的方法
输入字符串的格式是 a=1&b=2&c=3 $.par2Json = function (string, overwrite) { var obj = {}, pairs = stri ...
- 在Nginx服务器中设置多个站点
这里以配置1个站点(1个域名)为例,n 个站点可以相应增加调整, 假设:IP地址: 127.0.0.1域名1 phpmyadmin.zhengwen.cn 放在 /www/phpmyadmin.zhe ...
- getElement的几中属性介绍
1.getElementById("a"); 获取div的id (注意:getElementById 是没有s的,getElementsByTagName()是带s的) 这种 ...
- lazyload.js实现图片异步载入
所谓图片异步加载,意思是不用一次把图片全部加载完,你可以叫它延迟加载,缓冲加载都行. 看看你有没有这种需求:某篇文章图片很多,如果在载入文章时就载入所有图片,无疑会延缓载入速度,让用户等更久,所以,我 ...
- 【转】七年IT经验的七个总结
http://www.unitymanual.com/thread-30000-1-1.html?_dsign=ebe6a043 1.分享第一条经验:“学历代表过去.能力代表现在.学习力代表未来.” ...
- VC亲自教你写BP
2015年5月24日下午,腾讯开放平台“创业ABC”沙龙在腾讯众创空间(上海)举行.活动以“创业融资实战——从计划书到如何估值到如何花钱”为主题,险峰华兴投资负责人徐建海先生现场分享<如何写BP ...
- Mongodb的Samus驱动
最近开始学习Mongodb方面的东西.. 看到有很多博主都说MongoDB的第三方驱动 Samus 对Linq的支持比较好..能够降低学习的成本..所以就想从这里开始.. 但是弊端在我学习了一半的时候 ...
- Kafka入门经典教程
本帖最后由 desehawk 于 2015-5-3 00:45 编辑问题导读 1.Kafka独特设计在什么地方?2.Kafka如何搭建及创建topic.发送消息.消费消息?3.如何书写Kafka程 ...
- virtualbox 中的linux 共享文件 发生文件系统类型错误的解决办法
转自:http://blog.csdn.net/ls1160/article/details/24913391 最近在研究linux下的安卓源代码编译,遇到了一些问题,在虚拟机的共享文件上. 因为联网 ...