[大坑]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()
:int
d error -> d - in
_NTT_base::IFFT()
: calcinvA
method +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中主要用来快速计算多项式卷积. 等一下,卷积是啥 ...
随机推荐
- Which hashing algorithm is best for uniqueness and speed?
http://programmers.stackexchange.com/questions/49550/which-hashing-algorithm-is-best-for-uniqueness- ...
- Why is applicationhost.config still being added to source control even thought it's in gitignore
Why is applicationhost.config still being added to source control even thought it's in gitignore g ...
- List.Sort用法
treeList.Sort((x, y) => x.SortIndex < y.SortIndex ? -1 : 0);
- MySQL注入
SQL Injection Tutorial by Marezzi (MySQL) SQL注入教程由Marezzi(MySQL的) In this tutorial i will describe h ...
- Python之路【第十二篇续】jQuery案例详解
jQuery 1.jQuery和JS和HTML的关系 首先了HTML是实际展示在用户面前的用户可以直接体验到的,JS是操作HTML的他能改变HTML实际展示给用户的效果! 首先了解JS是一门语言,他是 ...
- C# 操作mongodb子文档
var mongoString = "mongodb://jamesbing:123456@localhost:27017"; var host = new TMongodbHos ...
- 前端排版-使用inline-block且两端对齐
那天排遇到这样一个页面,每个logo紧挨着,而且两端对齐.尼玛,没招啊~ 今天终于找到了解决办法: <!DOCTYPE html> <html> <head> &l ...
- ctrl+c,ctrl+d,ctrl+z在linux中意义
ctrl+c,ctrl+d,ctrl+z在linux中意义 ctrl+c和ctrl+z都是中断命令,但是他们的作用却不一样. ctrl+c是强制中断程序的执行. ctrl+z的是将任务中断 ...
- weblogic 的安装和配置
一.安装 1.1安装weblogic8.1 首先从www.bea.com上下载安装文件platform816_linux32.bin,然后在安装文件所在目录下键入 ./platform816_linu ...
- c# 日期函数[string.Format----GetDateTimeFormats]格式 .【转帖备查】
DateTime dt = DateTime.Now;Label1.Text = dt.ToString();//2005-11-5 13:21:25Label2.Text = dt.ToFileTi ...