[大坑]FFT学习

Macros

  1. #define fon(i,s) for(int i=0;i<s; ++i)
  2. #define fone(i,s) for(int i=0;i<=s;++i)
  3. #define fox(i,f,t) for(int i=f;i<t; ++i)
  4. #define foxe(i,f,t) for(int i=f;i<=t;++i)
  5. #define don(i,s) for(int i=s;i; --i)
  6. #define done(i,s) for(int i=s;~i; --i)
  7. #define dox(i,f,t) for(int i=f;i>t; --i)
  8. #define doxe(i,f,t) for(int i=f;i>=t;--i)
  9. #define ifm(a,b) if((a)<(b))
  10. #define _swp(a,b) std::swap(a,b)
  11. #define lp while(1)
  12. #define qlp break;
  13. #define nlp continue;
  14. #define maxp 30
  15. #define odd(x) (x&1)
  16. #define even(x) !(x&1)
  17. #define _cl(x,f,t) fox(_CLEAR,f,t) x[_CLEAR]=0
  18. template<class T> inline void _st(T* f,T* t,T p){
  19. for(T* x=f;x<t;++x) *x=p;
  20. }

Bit Reverse

  1. inline void _BR(int* a,int r){
  2. for(int i=0,j=1;i<r;++i,j<<=1){
  3. for(int k=0,kx=j;k<j;++k,++kx){
  4. a[k]=a[k]<<1;
  5. a[kx]=a[k]|1;
  6. }
  7. }
  8. }
  9. inline void _BR_iter(int* a,int r){
  10. int u=r;
  11. fon(i,r){
  12. a[i]=a[i]<<1;
  13. a[u++]=a[i]|1;
  14. }
  15. }
  16. inline void _BR_diter(int* a,int r){
  17. fon(i,r) a[i]>>=1;
  18. }

Fast power mod

wjz大爷说他的fpm只要一行吓cry.

经典沙茶zbt写法.

  1. inline int fpm(int a,int b,int p){
  2. int q=1;
  3. while(b){
  4. if(b&1) q=((long long)q*a)%p;
  5. a=((long long)a*a)%p;
  6. b>>=1;
  7. }
  8. return q;
  9. }

NTT

感觉FFT和IFFT分开来写会好一些→ →

  1. struct _NTT_base{
  2. int mod,w1,wm;
  3. int p[maxp],pi[maxp],d;
  4. inline int inv(int p){
  5. return fpm(p,mod-2,mod);
  6. }
  7. inline void init(int m,int w){
  8. mod=m,p[0]=w1=w;
  9. int u=m-1,u2=m-1;
  10. d=0;
  11. while(even(u2)) u2>>=1;
  12. p[0]=fpm(p[0],u2,m);
  13. pi[0]=inv(p[0]);
  14. while(even(u)){
  15. ++d;
  16. p[d]=((long long)p[d-1]*p[d-1])%m,pi[d]=((long long)pi[d-1]*pi[d-1])%m;
  17. u>>=1;
  18. }
  19. }
  20. inline void FFT(int* a,int* bitrev,int l){
  21. fon(i,l) ifm(i,bitrev[i]) _swp(a[i],a[bitrev[i]]);
  22. for(int i=2,h=1,xn=d-1;i<=l;i<<=1,h<<=1,--xn){
  23. int u=p[xn];
  24. for(int j=0;j<l;j+=i){
  25. int w=1;
  26. fox(k,j,j+h){
  27. int A=a[k],B=(long long)a[k+h]*w%mod;
  28. a[k]=(A+B)%mod,a[k+h]=(A-B+mod)%mod;
  29. w=(long long)w*u%mod;
  30. }
  31. }
  32. }
  33. }
  34. inline void IFFT(int* a,int* bitrev,int l){
  35. fon(i,l) ifm(i,bitrev[i]) _swp(a[i],a[bitrev[i]]);
  36. int invA=1,invB=(mod+1)>>1,invC=0;
  37. for(int i=2,h=1,xn=d-1;i<=l;i<<=1,h<<=1,--xn){
  38. int u=pi[xn];
  39. invA=(long long)invB*invA%mod;
  40. for(int j=0;j<l;j+=i){
  41. int w=1;
  42. fox(k,j,j+h){
  43. int A=a[k],B=(long long)a[k+h]*w%mod;
  44. a[k]=(A+B)%mod,a[k+h]=(A-B+mod)%mod;
  45. w=(long long)w*u%mod;
  46. }
  47. }
  48. }
  49. fon(i,l) a[i]=(long long)a[i]*invA%mod;
  50. }
  51. inline void FFT(int* a,int* b,int* bitrev,int l){
  52. fon(i,l) ifm(i,bitrev[i]) _swp(a[i],a[bitrev[i]]),_swp(b[i],b[bitrev[i]]);
  53. for(int i=2,h=1,xn=d-1;i<=l;i<<=1,h<<=1,--xn){
  54. int u=p[xn];
  55. for(int j=0;j<l;j+=i){
  56. int w=1;
  57. fox(k,j,j+h){
  58. int A=a[k],C=b[k],B=(long long)a[k+h]*w%mod,D=(long long)b[k+h]*w%mod;
  59. a[k]=(A+B)%mod,a[k+h]=(A-B+mod)%mod,b[k]=(C+D)%mod,b[k+h]=(C-D+mod)%mod;
  60. w=(long long)w*u%mod;
  61. }
  62. }
  63. }
  64. }
  65. inline void IFFT(int* a,int* b,int* bitrev,int l){
  66. fon(i,l) ifm(i,bitrev[i]) _swp(a[i],a[bitrev[i]]),_swp(b[i],b[bitrev[i]]);
  67. int invA=1,invB=(mod+1)>>1;
  68. for(int i=2,h=1,xn=d-1;i<=l;i<<=1,h<<=1,--xn){
  69. int u=pi[xn];
  70. invA=(long long)invA*invB%mod;
  71. for(int j=0;j<l;j+=i){
  72. int w=1;
  73. fox(k,j,j+h){
  74. int A=a[k],C=b[k],B=(long long)a[k+h]*w%mod,D=(long long)b[k+h]*w%mod;
  75. a[k]=(A+B)%mod,a[k+h]=(A-B+mod)%mod,b[k]=(C+D)%mod,b[k+h]=(C-D+mod)%mod;
  76. w=(long long)w*u%mod;
  77. }
  78. }
  79. }
  80. fon(i,l) a[i]=(long long)a[i]*invA%mod,b[i]=(long long)b[i]*invA%mod;
  81. }
  82. };

这个\(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. Which hashing algorithm is best for uniqueness and speed?

    http://programmers.stackexchange.com/questions/49550/which-hashing-algorithm-is-best-for-uniqueness- ...

  2. 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 ...

  3. List.Sort用法

    treeList.Sort((x, y) => x.SortIndex < y.SortIndex ? -1 : 0);

  4. MySQL注入

    SQL Injection Tutorial by Marezzi (MySQL) SQL注入教程由Marezzi(MySQL的) In this tutorial i will describe h ...

  5. Python之路【第十二篇续】jQuery案例详解

    jQuery 1.jQuery和JS和HTML的关系 首先了HTML是实际展示在用户面前的用户可以直接体验到的,JS是操作HTML的他能改变HTML实际展示给用户的效果! 首先了解JS是一门语言,他是 ...

  6. C# 操作mongodb子文档

    var mongoString = "mongodb://jamesbing:123456@localhost:27017"; var host = new TMongodbHos ...

  7. 前端排版-使用inline-block且两端对齐

    那天排遇到这样一个页面,每个logo紧挨着,而且两端对齐.尼玛,没招啊~ 今天终于找到了解决办法: <!DOCTYPE html> <html> <head> &l ...

  8. ctrl+c,ctrl+d,ctrl+z在linux中意义

    ctrl+c,ctrl+d,ctrl+z在linux中意义   ctrl+c和ctrl+z都是中断命令,但是他们的作用却不一样.   ctrl+c是强制中断程序的执行.   ctrl+z的是将任务中断 ...

  9. weblogic 的安装和配置

    一.安装 1.1安装weblogic8.1 首先从www.bea.com上下载安装文件platform816_linux32.bin,然后在安装文件所在目录下键入 ./platform816_linu ...

  10. c# 日期函数[string.Format----GetDateTimeFormats]格式 .【转帖备查】

    DateTime dt = DateTime.Now;Label1.Text = dt.ToString();//2005-11-5 13:21:25Label2.Text = dt.ToFileTi ...