Loading

多元多项式杂谈

前言

引言:经过众多文章的洗礼,我们对于 一维多项式全家桶 与 集合幂级数全家桶 已经比较熟悉了。

这分别是 \(1\) 元多项式 \(\bmod\ x^n\) 与 \(n\) 元多项式 \(\bmod\ (x_1^2,x_2^2,\cdots ,x_n^2)\) 的特殊情况。

接下来更广泛地讨论 \(n\) 元多项式处理手法。

  • 请确保阅读前熟悉 一维多项式全家桶 与 集合幂级数全家桶。

  • 讨论涉及的多项式操作包括:乘法(卷积),乘法逆,\(\ln,\exp\),多项式复合 等。

一些记号:

讨论 \(k\) 元多项式 \(f(x_1,x_2,\cdots,x_k)\bmod(x_1^{n_1},x_2^{n_2},\cdots ,x_k^{n_k})\) 的时,称其为 \(k\) 元 \(n_1n_2\cdots n_k\) 多项式。记 \(N=\prod_i n_i\)。

注意下列任何操作均默认了多项式 \(\bmod(x_1^{n_1},x_2^{n_2},\cdots ,x_k^{n_k})\) 截断。

二元多项式卷积

给定二元 \(n\times m\) 多项式 \(F(x,y),G(x,y)\),求 \(H=F\times G\)。

热身一下,熟悉操作。

首先任意二元多项式操作,完全可以对两维分别(扩一定倍后)DFT 操作完再 IDFT 回去。

但这东西常数大的一匹,有时候扩的不止两倍不止三倍。下面不赘述此类做法,详见 参考文献\(^{\scriptstyle{\bf[1]}}\)。


尝试 将二元多项式映射成一元多项式。

由于 \(F\times G\) 实际会贡献到的最大范围为 \([x^{2n-2}y^{2m-2}]\),为了避免冲突,可用 \(2n\times 2m\) 的矩阵映射:\(\boxed{x^ay^b\to x^{2na+b}}\,.\)

此后 正常做 FFT 多项式乘法 即可。

复杂度 \(\mathcal{O}(N\log N)\),有个 四倍常数。

二元多项式求逆 / ln / exp

给定二元 \(n\times m\) 多项式 \(F(x,y),[x^0y^0]F\neq 0\),求 \(G=F^{-1}\)。

和上一题有什么区别?

因为多项式乘法最终的结果是 有限多项式,但 求逆 最终结果是无限多项式,即可以任意倍数地贡献:\(x^ay^b\to x^{ka}y^{ka},k\in \N\)。

于是 \(\tau(n,m)=an+m\) 的映射在充分大时总是会冲突。

考虑二元映射成一元的指数映射 \(\tau(n,m)\to l\) 应该满足,\([x^ny^m]\) 内对应的 映射具有唯一性,具体地:

\[\forall 0\le a\le n,0\le b\le m,c,d\in \N;\quad\tau(c,d)=\tau(a,b)\Longleftrightarrow (c,d)=(a,b) \]

考虑构造 \(p>n,q>m,(p,q)=1,\tau(n,m)=qn+pm\)。则 \(\tau(a,b)=\tau(c,d)\Longleftrightarrow (c,d)=(a+kp,b-kq)\)。

由于 \(a<p,b<q\),于是 \((c,d)=(a,b)\) 是唯一的 非负整数解。


一言以蔽之:取 \(p>n,q>m,(p,q)=1\),做映射 \(x^ay^b\to x^{qa+pb}\) 后正常一元多项式操作即可。

对于 \(\ln,\exp\),和求逆没有本质区别,不再赘述。


根据经典 \(\dfrac{6}{\pi^2}\) 的互素密度估计,可以认为 \(p,q\) 分别相对 \(n,m\) 只加了常数,即 \(qn+pm\approx 4nm\)。

复杂度 \(\mathcal{O}(N\log N)\),仍仅为 四倍常数。

此思路由 GPT6 Astra 启发。

而对每一位分别 DFT 的做法不仅 细节繁杂,常数还是十几倍。可以被淘汰了。

多元多项式卷积与其他操作

给定 \(k\) 元 \(n_1n_2\cdots n_k\) 多项式 \(F(x_1,x_2,\cdots ,x_k),G(x_1,x_2,\cdots ,x_k)\),求 \(H=F\times G\)。

摘录自 参考文献\(^{\scriptstyle{\bf[2]}}\)。

我们将下标 \((i_1,i_2,\cdots,i_n)\) 转化为一个「\((n_1,n_2,\cdots,n_k)\) 进制数」:

\[i=i_1+i_2\cdot n_1+\cdots+i_n\cdot n_1n_2\cdots n_{k-1}:\quad [x^{i_1}x^{i_2}\cdots x^{i_n}]f=f_i \]

这个转化有一个至关重要的好处,那就是 \((i_1,i_2,\cdots,i_n)\) 下标的加法对应于 \(i\) 下标的加法。只不过现在我们需要去掉加法发生了进位部分的贡献。

参考文献

posted @ 2026-10-06 14:16  HaHeHyt  阅读(24)  评论(0)    收藏  举报