有没有人知道NTT/FFT的两种不同写法为什么时间差距那么大吗?
  • 板块学术版
  • 楼主xiaolilsq
  • 当前回复5
  • 已保存回复5
  • 发布时间2020/5/1 18:47
  • 上次更新2023/11/7 03:27:37
查看原帖
有没有人知道NTT/FFT的两种不同写法为什么时间差距那么大吗?
230249
xiaolilsq楼主2020/5/1 18:47

rt。

指的两种写法分别是:

第一种:

inline void NTT(int*f,int*p){
	for(int i=0;i<n;++i)
		if(rev[i]<i)
			swap(f[i],f[rev[i]]);
	for(int mid=1;mid<n;mid<<=1){
		const int len=mid<<1,Base=p[n/len];
		for(int i=0;i<n;i+=len){
			int tx=1;
			for(int j=0;j<mid;++j){
				int l=i+j,r=l+mid;
				int L=f[l],R=1ll*f[r]*tx%mod;
				f[l]=mo(L+R),f[r]=mo(mod-R+L);
				tx=1ll*tx*Base%mod;
			}
		}
	}
}

第二种:

inline void NTT(int*f,int*p){
	for(int i=0;i<n;++i)
		if(rev[i]<i)
			swap(f[i],f[rev[i]]);
	for(int mid=1;mid<n;mid<<=1){
		const int len=mid<<1,Base=p[n/len];
		int tx=1;
		for(int i=0;i<mid;++i){
			for(int j=0;j<n;j+=len){
				int l=i+j,r=l+mid;
				int L=f[l],R=1ll*f[r]*tx%mod;
				f[l]=mo(L+R),f[r]=mo(mod-R+L);
			}
			tx=1ll*tx*Base%mod;
		}
	}
}

其中两种写法唯一的区别在于里面两层循环的顺序的不同,按理来说,第二种写法的运算次数应该要少一些,但是第一种写法可以跑过【模板】A*B Problem升级版(FFT快速傅里叶),而第二种写法不能。(第二种写法跑第一个点本地测要3s)

有没有人可以解释一下吗?非常感谢!

2020/5/1 18:47
加载中...