[大坑]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(): calc invA method + invA*=invB - invA=invB,invB=invB*invB

[大坑]FFT学习的更多相关文章

  1. 快速傅里叶变换(FFT)学习笔记

    定义 多项式 系数表示法 设\(A(x)\)表示一个\(n-1\)次多项式,则所有项的系数组成的\(n\)维向量\((a_0,a_1,a_2,\dots,a_{n-1})\)唯一确定了这个多项式. 即 ...

  2. 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT)

    再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT) 目录 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Blueste ...

  3. 快速傅里叶变换(FFT)学习笔记(其一)

    再探快速傅里叶变换(FFT)学习笔记(其一) 目录 再探快速傅里叶变换(FFT)学习笔记(其一) 写在前面 为什么写这篇博客 一些约定 前置知识 多项式卷积 多项式的系数表达式和点值表达式 单位根及其 ...

  4. 快速傅里叶变换(FFT)学习笔记(其二)(NTT)

    再探快速傅里叶变换(FFT)学习笔记(其二)(NTT) 目录 再探快速傅里叶变换(FFT)学习笔记(其二)(NTT) 写在前面 一些约定 前置知识 同余类和剩余系 欧拉定理 阶 原根 求原根 NTT ...

  5. 口胡FFT现场(没准就听懂了)&&FFT学习笔记

    前言(不想听的可以跳到下面) OK.蒟蒻又来口胡了. 自从ZJOI2019上Day的数论课上的多项式听到懵逼了,所以我就下定决心要学好多项式.感觉自己以前学的多项式都是假的. 但是一直在咕咕,现在是中 ...

  6. FFT学习及简单应用(一点点详细)

    什么是FFT 既然打开了这篇博客,大家肯定都已经对FFT(Fast Fourier Transformation)有一点点了解了吧 FFT即为快速傅里叶变换,可以快速求卷积(当然不止这一些应用,但是我 ...

  7. 【笔记篇】(理论向)快速傅里叶变换(FFT)学习笔记w

    现在真是一碰电脑就很颓废啊... 于是早晨把电脑锁上然后在旁边啃了一节课多的算导, 把FFT的基本原理整明白了.. 但是我并不觉得自己能讲明白... Fast Fourier Transformati ...

  8. 快速傅里叶变换FFT学习小记

    FFT学得还是有点模糊,原理那些基本还是算有所理解了吧,不过自己推这个推不动. 看的资料主要有这两个: http://blog.miskcoo.com/2015/04/polynomial-multi ...

  9. FFT学习笔记

    快速傅里叶变换FFT(Fast Fourior Transform) 先说一下它能干嘛qwq ​ 傅里叶变换有两种,连续傅里叶变换和离散傅里叶变换,OI中主要用来快速计算多项式卷积. 等一下,卷积是啥 ...

随机推荐

  1. centos6.5分区简易操作

    fdisk /dev/sdb --->n--->p---->输入分区大小(回车就默认全部大小) mkfs.ext4 /dev/sdb1 mkdir /data 在根目录下新建data ...

  2. (转)JS Date格式化为yyyy-MM-dd类字符串

    Date.prototype.format = function(format){ var o = { "M+" : this.getMonth()+1, //month &quo ...

  3. PHP任意文件包含绕过截断新姿势

    前言 此方法是@l3m0n叔叔给我分享的,原文已经发布在90sec 我没有90sec的账号,所以自己实践一下,顺道安利给访问我博客的小伙伴. 适用情况 可以控制协议的情况下,如果%00无法截断包含,可 ...

  4. SSL、OPENSSL、SSH、OPENSSH

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议.TLS与 ...

  5. Android中Java与JavaScript之间交互(转)

    Android代码: package com.fyfeng.testjavascript; import android.app.Activity; import android.content.In ...

  6. C# 表达式树demo

    class Program { static void Main(string[] args) { //创建Expression参数 var left = System.Linq.Expression ...

  7. 解决子元素margin让父辈元素位置一起改变的问题

    1.在父元素内添加内容,并且要在子元素块前面添加,后面添加内容无效. 内容可以是文字.图片甚至是空格,源代码里直接按空格无效,可以用占位符  2.让子元素或父元素浮动float:left. 缺点:在元 ...

  8. java.util.Date和java.sql.Date的区别和相互转化

    java.util.Date是在除了SQL语句的情况下面使用的.java.sql.Date是针对SQL语句使用的,它只包含日期而没有时间部分它 们都有getTime方法返回毫秒数,自然就可以直接构建. ...

  9. AjaxAnywhere+struts用法

    AjaxAnywhere的用法 1,简介 AjaxAnywhere被设计成能够把任何一套现存的JSP组件转换成AJAX感知组件而不需要复杂的JavaScript编码.它利用标签把Web页面简单地划分成 ...

  10. python 爬虫1

    简单访问有道词典的翻译界面,将页面翻译功能简单呈现 import urllib.request import urllib.parse import json content = input(&quo ...