[大坑]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中主要用来快速计算多项式卷积. 等一下,卷积是啥 ...
随机推荐
- centos 安装 svn-1.9.4
wget http://mirrors.cnnic.cn/apache/subversion/subversion-1.9.4.tar.gzwget http://mirror.bit.edu.cn/ ...
- MySql避免重复插入记录
今天用python抓取数据入库需要避免重复数据插入,在网上找了一些方法: 方案一:使用ignore关键字 如果是用主键primary或者唯一索引unique区分了记录的唯一性,避免重复插入记录可以使用 ...
- CocoaLumberjack
刚学iOS时候,调试找问题的时候一般就两种方式. 1.输出NSLog日志. 2.打断点,一步一步查看问题,查找崩溃点所在的方法,再进一步查看崩溃具体原因,稍微高级一点的就在控制台用命令打印各种参数. ...
- android自定义控件(2)-拖拽实现开关切换
在这里,我们的主要工作就是在原有代码的基础上,增加一个重写的onTouchEvent方法,刚添加上来的时候是这个样子的: @Override public boolean onTouchEvent(M ...
- 深入浅出的javascript的正则表达式学习教程
深入浅出的javascript的正则表达式学习教程 阅读目录 了解正则表达式的方法 了解正则中的普通字符 了解正则中的方括号[]的含义 理解javascript中的元字符 RegExp特殊字符中的需要 ...
- 清北学堂模拟day4 捡金币
[问题描述]小空正在玩一个叫做捡金币的游戏.游戏在一个被划分成 n行 n列的网格状场地中进行.每一个格子中都放着若干金币,并且金币的数量会随着时间而不断变化. 小空的任务就是在网格中移动,拾取尽量多的 ...
- No enclosing instance of type E is accessible. Must qualify the allocation with an enclosing
在Java中,类中的静态方法不能直接调用动态方法.只有将某个内部类修饰为静态类,然后才能够在静态类中调用该类的成员变量与成员方法.所以在不做其他变动的情况下,最简单的解决办法是将public clas ...
- oracle 使用ID关键字作列名导致索引失效
oracle表空间变更导致主键索引失效,重建索引即可
- zstu.2512. Moving Tables(贪心)
Moving Tables Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1182 Solved: 563 Description The famo ...
- XH
1. 又到父亲节,那就给老爹做顿饭呗,让他开心开心. 老爸吃了一口我炒的菜,流露出感动的泪花说:儿呀,你能为爸爸做饭,爸爸感到特别开心,但是你这个菜,看在今天是父亲节 我能不能不吃呀! 2. 一哥 ...