首页 > 其他分享 >多项式全家桶

多项式全家桶

时间:2024-10-17 21:43:23浏览次数:3  
标签:rev frac int 多项式 全家 len pmod equiv

每次复习完下一次都会忘,这次下定决心一定要记下来!!!

FFT 和 NTT

板子,直接拿过来(包括了其他的定义):

int n, m, rev[maxn];
int qpow(int x, int k, int p) {
	int res = 1;
	while(k) {
		if(k & 1)
			res = res * x % p;
		k >>= 1, x = x * x % p;
	}
	return res;
}
void prepare(int len) {
	for (int i = 0; i < len; i++) {
		rev[i] = rev[i >> 1] >> 1;
		if(i & 1)
			rev[i] |= len >> 1;
	}
}
struct Poly {
	vector<int> a;
	int size() {
		return a.size();
	}
	int& operator[](int x) {
		return a[x];
	}
	void resize(int N) {
		a.resize(N);
	}
	void NTT(int f) {
		for (int i = 1; i < a.size(); i++)
			if(i < rev[i])
				swap(a[rev[i]], a[i]);
		for (int h = 2; h <= a.size(); h <<= 1) {
			int d = qpow((f == 1 ? gb : gi), (mod - 1) / h, mod);
			for (int i = 0; i < a.size(); i += h) {
				int nw = 1;
				for (int j = i; j < i + h / 2; j++) {
					int a0 = a[j], a1 = a[j + h / 2] * nw % mod;
					a[j] = (a0 + a1) % mod, a[j + h / 2] = (a0 - a1 + mod) % mod;
					nw = nw * d % mod;
				}
			}
		}
		if(f == -1) {
			int inv = qpow(a.size(), mod - 2, mod);
			for (int i = 0; i < a.size(); i++)
				a[i] = a[i] * inv % mod;
		}
	}
	void read() {
		for (int i = 0; i < a.size(); i++)
			cin >> a[i];
	}
	void print() {
		for (int i = 0; i < a.size(); i++)
			cout << a[i] << " ";
		cout << endl;
	}
	friend Poly operator*(Poly f, Poly g) {
		int len = 1, t = f.size() + g.size() - 1;
		while(len < t)
			len <<= 1;
		prepare(len);
		f.resize(len), g.resize(len);
		f.NTT(1), g.NTT(1);
		for (int i = 0; i < len; i++)
			f[i] = f[i] * g[i] % mod;
		f.NTT(-1); f.resize(t);
		return f;
	}
}

多项式求逆

假设我们已经求出来了:

\[A\times B'\equiv 1 \pmod {x^{\lceil\frac{n}{2}\rceil}} \]

那么我们要求:

\[A\times B\equiv 1\pmod {x^{n}} \]

我们先做差,得到:

\[(B - B')\equiv 0\pmod {x^{\lceil\frac{n}{2}\rceil}} \]

然后平方,得到:

\[(B-B')^2\equiv 0\pmod {x^n} \]

\[B^2 - 2BB' + B'^2 \equiv 0\pmod {x^n} \]

左右同时乘 \(A\),得到:

\[B-2B'+AB'^2\equiv 0\pmod {x^n} \]

\[B\equiv-AB'^2+2B' \pmod {x^n} \]

按这个柿子计算即可,注意没有必要把 NTT 出来的结果直接 NTT 回来,可以直接乘起来加起来。

Poly get_inv(Poly f, int lim) {
	if(lim == 1) {
		Poly ans; ans.resize(1);
		ans[0] = qpow(f[0], mod - 2, mod);
		return ans;
	}
	Poly ans = get_inv(f, lim + 1 >> 1);
	int len = 1;
	while(len < lim * 2)
		len <<= 1;
	prepare(len);
	f.resize(lim), f.resize(len), ans.resize(len);
	f.NTT(1), ans.NTT(1);
	for (int i = 0; i < len; i++)
		ans.a[i] = ans.a[i] * (2 - f.a[i] * ans.a[i] % mod + mod) % mod;
	ans.NTT(-1);
	ans.resize(lim);
	return ans;
}

注意,这里需要先 f.resize(lim),因为我们需要排除多余的位。

多项式除法

我们记 \(F_R(x) = x^nF(\frac{1}{x})\),那么就有:

\[F(x) = G(x)Q(x)+R(x) \]

\[F(\frac{1}{x})=G(\frac{1}{x})Q(\frac{1}{x})+R(\frac{1}{x}) \]

\[x^nF(\frac{1}{x}) = x^mG(\frac{1}{x})x^{n-m}Q(\frac{1}{x})+x^{n-m+1}\times x^{m-1}R(\frac{1}{x}) \]

\[\]

标签:rev,frac,int,多项式,全家,len,pmod,equiv
From: https://www.cnblogs.com/LUlululu1616/p/18473185

相关文章

  • 多项式
    多项式,OI的魅力,OIer的噩梦。多项式这个大家应该都会。对于式子\(\sum\limits_{i=0}^{k}a_{i}x^i\),且\(a_k\ne0\),那么我们称它是关于\(x\)的\(k\)次多项式。\(k\)为次数。就是这么简单生成函数定义:对于序列\(a_0,a_1,a_2,a_3,...\),其生成函数为\[f(x)=a_{0}+a_{......
  • IntelliJ IDEA 快捷键大全(也适用全家桶其他编辑器)
    以下是IntelliJIDEA的常用功能快捷键大全,适用于Windows/Linux系统(Mac用户可将Ctrl替换为Cmd,Alt替换为Option):功能分类功能描述快捷键(Windows/Linux)基本操作显示所有快捷键Ctrl+J显示主菜单Alt+Home全局搜索(任何内容)DoubleShift打开设置Ctrl+Alt+S保存所......
  • 密码学承诺之原理和应用 - Kate多项式承诺
    主页微信公众号:密码应用技术实战博客园首页:https://www.cnblogs.com/informatics/GIT地址:https://github.com/warm3snow简介多项式承诺是一种实用性比较强的密码学承诺方案,允许一个方(承诺者)向另一个方(验证者)承诺一个多项式的值,而不泄露多项式的具体形式。在零知识证明、可......
  • 基础多项式
    基础组合多项式多项式定义:普通多项式定义\(x^n\)为\(x\)的\(n\)次普通幂:\[x^n=\prod_{i=0}^{n-1}x\]则定义一个普通多项式\(F(x)\)为:\[F(x)=\sum_{i=0}A_ix^i\]变种:下降幂多项式定义\(x^{\underline{n}}\)为\(x\)的\(n\)次下降幂:\[......
  • 电能质量Python实现全家桶
    往期精彩内容:Python-电能质量扰动信号数据介绍与分类-CSDN博客Python电能质量扰动信号分类(一)基于LSTM模型的一维信号分类-CSDN博客Python电能质量扰动信号分类(二)基于CNN模型的一维信号分类-CSDN博客Python电能质量扰动信号分类(三)基于Transformer的一维信号分类模型......
  • spring全家桶使用教程
    成长路上不孤单......
  • 全家桶 win激活教程
            ......
  • 南沙C++信奥赛陈老师解一本通题:1945:【09NOIP普及组】多项式输出
    ​ 【题目描述】一元 nn 次多项式可用如下的表达式表示: f(x)=anxn+an−1xn−1+...+a1x+a0,an≠0f(x)=anxn+an−1xn−1+...+a1x+a0,an≠0 其中,aixii 称为i次项,ai称为ii次项的系数。给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式:1.多项式中......
  • 多项式点值表示
    多项式点值表示的存在性对\(n\)阶多项式\(F(x)=\sum_{i=0}^{n}a_ix^{i}\),存在一组\(n\)阶互异点值\([p_i,p_1,\cdots,p_n]\)满足\(F(x.p_i)=y.p_i,\foralli,j,p_i\neqp_j\)。其中横坐标是自变量,纵坐标是多项式的结果。存在性显然。任意一组\(n\)阶......
  • 从零开始学机器学习——线性和多项式回归
    首先给大家介绍一个很好用的学习地址:https://cloudstudio.net/columns在之前的学习中,我们已经对数据的准备工作以及数据可视化有了一定的了解。今天,我们将深入探讨基本线性回归和多项式回归的概念与应用。如果在过程中涉及到一些数学知识,大家也不必感到畏惧,我会逐步为大家进行详......