首页 > 其他分享 >快速数论变换NTT学习笔记

快速数论变换NTT学习笔记

时间:2023-07-02 20:56:50浏览次数:44  
标签:数论 text LL FFT 单位根 NTT 笔记 ans omega

前言

这篇文章中我介绍了什么是 \(\text{FFT}\) ,但是在文中我们也说了一嘴这玩意是有精度误差的,三角函数和复数导致我们不得不进行取整操作。

只要毒瘤出题人原因,那就可以 \(\text{Hack FFT}\)。

Tips:

根据《NOI大纲》的内容,卡精度和卡常数通常是不允许的。

所以 \(\text{FFT}\) 通常不会寄,不必过度焦虑。

但是 \(\text{NTT}\) 本身并不难。

这时候我们就需要引入快速数论变换 \(\text{NTT}\)(\(\text{Fast Number Theory Transform}\),不过我们通常省略那个 \(\text F\))。

首先我们要明确一个方向,就是 \(\text{FFT}\) 的原理是单位根的几个性质:

  • 消去原理: \(\omega_{tn}^{tk}=\omega_{n}^k\)
  • 对称原理:\(\omega_{n}^{k}=-\omega_n^{k+\frac n 2}\)
  • \(\omega_{n}^k=(\omega_n^1)^k\)
  • \(\omega_n^i\not=\omega_n^j(i\not=j)\)

也就是说,只要满足以上条件,也就可以用类似的方法实现。

我们发现,数论里的原根,和这个很像啊!所以直接使用即可。

代码实现

经典的模数 \(998244353\) 的原根为 \(3\),这是常用的组合。

直接替换 \(\omega\) 即可。

#include<bits/stdc++.h>
#define LL long long
using namespace std;
const LL N=1e6;
const LL mod=998244353;
const LL G=3;
LL ksm(LL x,LL y)
{
	LL ans=1;
	while(y)
	{
		if(y&1)ans=ans*x%mod;
		x=x*x%mod;
		y>>=1;
	}
	return ans;
}
LL n,m,Gi,lim,len=1,r[N],x,ans[N];
LL a[N],b[N];
void FFT(LL *a,LL inv)
{
	for(int i=0;i<=len-1;i++)
	{
		if(i<r[i])swap(a[i],a[r[i]]);
	}
	for(int l=2;l<=len;l*=2)
	{
		LL omg=ksm(G,(mod-1)/l);
		if(inv)omg=ksm(Gi,(mod-1)/l);
		LL m=l/2;
		for(int j=0;j<=len-1;j+=l)
		{
			LL x=1;
			for(int i=0;i<=m-1;i++)
			{
				LL t=x;
				t=a[i+j+m]*t%mod;
				a[i+j+m]=(a[i+j]-t+mod)%mod,a[i+j]=(a[i+j]+t)%mod;
				x=x*omg%mod;
			}
		}
	}
}
int main()
{
	scanf("%lld%lld",&n,&m);
	Gi=ksm(G,mod-2);
	while(len<=n+m)len*=2,lim++;
	for(int i=0;i<=len-1;i++)
	{
		LL sum=0;
		for(int j=0;j<=lim-1;j++)sum|=((i>>j)&1)<<(lim-j-1);
		r[i]=sum;
	}
	for(int i=0;i<=n;i++)
	{
		scanf("%lld",&a[i]);
	}
	for(int i=0;i<=m;i++)
	{
		scanf("%lld",&b[i]);
	}
	FFT(a,0),FFT(b,0);
	for(int i=0;i<=len-1;i++)
	{
		a[i]=a[i]*b[i]%mod;
	}
	FFT(a,1);
	LL inv=ksm(len,mod-2);
	for(int i=0;i<=n+m;i++)
	{
		ans[i]=a[i]*inv%mod;
		printf("%lld ",ans[i]);
	}
	return 0;
}

扩展

通常情况下在模意义都会使用原根来替换单位根,比如单位根反演就可以使用原根。

这里简单展示一下单位根反演的结论:

\[[n|k]=\frac 1 n \sum_{i=0}^{n-1}\omega_{n}^{ki} \]

标签:数论,text,LL,FFT,单位根,NTT,笔记,ans,omega
From: https://www.cnblogs.com/dengduck/p/NTT.html

相关文章

  • Android:倒计时、定时器、定时执行次数使用笔记
    原文:https://blog.csdn.net/weixin_40420578/article/details/103876900一.倒计时(3、2、1)CountDownTimer() //一共3秒,每隔1秒执行一次 CountDownTimertimer=newCountDownTimer(3000,1000){ @Override publicvoidonTick(longmillisUntilFi......
  • C语言笔记:第10章 数组和指针
    数组:https://www.cnblogs.com/mjios/archive/2013/03/15/2961147.html指针:https://www.cnblogs.com/mjios/archive/2013/03/16/2963645.html ......
  • HDMI笔记2-HDMI接口类型
    HDMI的规格书中规定四种HDMI接口,分别是:HDMIAType应用于HDMI1.0版本,总共有19pin,规格为4.45mm×13.9mm,为最常见的HDMI接头规格,相点对点于DVISingle-Link传输。在HDMI1.2a之前,最大能传输165MHz的TMDS,所以最大传输规格只能在于1600×1200(TMDS162.0MHz)。PinPin定义......
  • es 笔记二之基础查询
    本文首发于公众号:Hunter后端原文链接:es笔记二之基础查询这一篇笔记介绍es的基础查询。基础查询包括很多,比如排序,类似数据库limit的操作,like操作,与或非等,对于这些操作,我会在介绍他们的用法之后加上对应的数据库sql便于理解。注意:下面的操作都在kibana中实现以下是......
  • 【学习笔记】Bostan-Mori 算法
    其实是用于常系数齐次线性递推,只不过本篇博文只讲解如何求分式的高次项系数。已知多项式\(f(x),g(x)\),要求:\([x^k]\dfrac{f(x)}{g(x)}\),其中\(f(x),g(x)\)的次数为\(n,m\),\(n,m\le10^5,k\le10^9\)。算法流程如下:分式上下同乘\(g(-x)\),也就是\(g\)的奇次项都取反的多项......
  • HDMI笔记
    关键词:TMDS:最小化传输差分信号(TransitionMinimizedDifferentialSignaling,简称TMDS)是美国SiliconImage公司开发的一项高速传输数据技术,可用于DVI与HDMI的视频传输接口。TMDS差分传输技术是一种利用2个引脚间电压差来传送信号的技术,TMDS具备4个Channel,前3条缆线分是YU(Pb)V(Pr......
  • c#学习笔记---------------------事件
    一、事件的原理事件(Event)定义:类 或对象可以通过事件向其他类或对象通知发生的相关事情。发送(或引发)事件的类称为“发布者”,接收(或处理)事件的类称为“订阅者”。在典型的C#Windows窗体或Web应用程序中,可订阅由按钮和列表框等控件引发的事件。可以使用VisualC#集成开......
  • 二分算法学习笔记与总结
    二分算法学习笔记与总结目录二分二分原理整数二分二分查找原理二分查找模板模板一模板二二分查找用法题目1(模板)(二分查找)题目大意题目分析CODE题目2(运用)(二分查找)题目大意题目分析CODESTL中的二分查找lower_bound()upper_bound()浮点二分浮点数二分模板浮点数二分答案模板题目......
  • C语言笔记:第8章 字符输入输出
    字符函数getchar()、putchar()与EOF详解:https://www.cnblogs.com/52php/p/5723666.html缓冲区:https://www.cnblogs.com/xkdn/p/14580178.htmlhttps://www.cnblogs.com/buyizhiyou/p/5505280.html ......
  • C语言笔记:第5章 运算符,表达式和语句
    基本运算符算术运算符+加法运算符-减法运算符,或负值运算符*乘法运算符/除法运算符%模运算符,或称取余运算符,要求%两侧均为整型关系运算符<小于运算符<=小于等于运算符>大于运算符>=大于等于运算符==等于运算符!=不等于运算符关系运算的结果成立就为"......