多项式的相关定义

本文作者为 JustinRochester。

目录地址

上一篇

下一篇


多项式的相关定义

多项式的来源

算法竞赛中常说的多项式,其含义与数学上的表达有一些区别。

狭义上,我们一般认为多项式是一个形如 \(\displaystyle F(x)=\sum_{i=0}^n f_ix^i\) 的函数。我们可以用一个长为 \(n+1\) 的数组表示这个多项式的各项系数。

而广义上,我们认为多项式是一个形如 \(\displaystyle F(x)=\sum_i f_ix^{e_i}\) 的函数,无所谓 \(e_i\) 是否互不相同,也无所谓 \(e_i\) 是自然数还是负数(但一般会要求是整数),甚至无所谓这个求和到底是有限项的求和还是无限项的。

大部分情况下,我们并不关心这个多项式在各点的函数值,这往往不重要(这也是为什么我们不关心是否是无限项求和)。很大部分情况下,我们会将一些与组合计数有关的数列“编码”至多项式的系数。

例如对于斐波那契数列,\(fib_n= \begin{cases} \begin{aligned} n&,n\leq 1\\ fib_{n-1}+fib_{n-2}&,n>1\\ \end{aligned} \end{cases}(n\geq 0)\) ,我们可以将其编码至多项式的系数上:\(\displaystyle F(x)=\sum_{i=0}^\infty fib_i x^i\)

根据斐波那契数列的规则我们可以得到:\(\displaystyle F(x)=0+x+\sum_{i=2}^\infty (fib_{i-1}+fib_{i-2})x^i=x+\sum_{i=2}^\infty fib_{i-1}x^i+\sum_{i=2}^\infty fib_{i-2}x^i\)

\(\displaystyle \sum_{i=2}^\infty fib_{i-1}x^i=x\sum_{i=1}^\infty fib_i x^i=x(F(x)-0), \sum_{i=2}^\infty fib_{i-2}x^i=x^2\sum_{i=0}^\infty fib_ix^i=x^2F(x)\)

因此我们得到:\(F(x)=x+xF(x)+x^2F(x)\) 进而得到 \(\displaystyle F(x)={x\over 1-x-x^2}\)

于是我们将所有的斐波那契数列“编码”到了多项式上

还记得吗?我们并不关心多项式在各点的函数值,因此我们也不关心这个函数的敛散性,它只是个“形式”。因此,也有人称呼它为形式幂级数。

当然,上述斐波那契数列“编码”得到的多项式写成了一个很简洁的函数形式。但是对于大部分组合计数的数列,往往并不能写成这种“封闭”的形式。

好在,我们也对是否能写成“封闭”的形式没有要求,我们仅对是否能写成 \(\displaystyle \sum_i f_ix^i\) (这里的 \(i\) 可以是负数,下同)有要求。


多项式的基本概念

我们称,多项式 \(\displaystyle F(x)=\sum_i f_ix^i\) 中,次数最高的非零项次数为该多项式的度,记为 \(\deg F\)

\(\displaystyle F(x)=1+x+x^2, \deg F=2\)

特别的,我们认为 \(\displaystyle F(x)=\sum_{i=-\infty}^{+\infty} f_ix^i\)\(\displaystyle F(x)=\sum_{i=c}^{+\infty} f_ix^i\) 的多项式度为 \(+\infty\)

而对于 \(F(x)=0\) ,我们认为 \(\deg F=-\infty\)

由于计算资源的有限性,在题目中,我们一般不会对多项式计算其无穷多的系数。为此,我们对于题目所需系数的最大次数 \(n\) ,只会计算其前 \(n+1\) 项的非零系数。

形式化来说,我们计算多项式 \(F(x)\) 时,我们仅计算 \(F(x)\bmod x^{n+1}\) 意义下的结果。

显然,模多项式后,结果是唯一的。对于 \(F(x)\) ,我们可以写成 \(F(x)=R(x)+x^{n+1}Q(x)\) 的形式,其中 \(Q(x)\) 的各项次数均为自然数。

因此,有 \(F(x)\equiv R(x)\pmod {x^{n+1}}\)

而对于有负数次数的多项式,我们往往同乘一个足够大的 \(x^m\) ,使得各项系数转化为自然数,再进行求解。

因此,后续的篇章中,如无特殊说明,一般都认为多项式的各项次数均为自然数。


多项式的基础运算

对于两个多项式 \(\displaystyle F(x)=\sum_i f_ix^i, G(x)=\sum_i g_ix^i\) ,我们最先定义的是两者的取值运算:

\([x^n]F(x)=f_n\)\([x^n]F=f_n\)

对于部分人,习惯采用 \(F[n]\) 的表现方法。

但本人并不推荐该表示方法,尤其涉及到多维度的多项式 \(\displaystyle F(x,y)=\sum_i\sum_j f_{i, j}x^iy^j\)

那么,对于我想表达 \(f_{n,m}\)\(\displaystyle \sum_j f_{i, j}x^iy^j\) 我们可以很轻松的写成 \(F[n][m]\)\(F[i]\)

但对于表达 \(\displaystyle \sum_i f_{i, j}x^iy^j\) ,就可能得比较别扭的写成 \(F[\cdot][j]\) 以防止和 \(F[j]\) 歧义。

然而上述三者,皆可通过 \([x^ny^m]F, [x^i]F, [y^j]F\) 来精确表达。

对于加减运算,我们可以很轻松地定义得 \(\displaystyle (F\pm G)(x)=\sum_i (f_i\pm g_i)x^i\)

而乘法运算,若为特殊说明,我们采用中学中对于多项式乘法的定义:\(\displaystyle (FG)(x)=\sum_i\sum_j f_ix^i\cdot g_jx^j=\sum_i\sum_j f_ig_jx^{i+j}\)

而通过变换枚举顺序,我们枚举 \(i+j\) 的和 \(k\) 时,我们可以得到乘法的另一种写法:\(\displaystyle (FG)(x)=\sum_k x^k\sum_i\sum_jf_ig_j[i+j=k]\)

对此,我们经常直接简写为:\(\displaystyle (FG)(x)=\sum_k x^k\sum_{i+j=k}f_ig_j\) ,这个形式实际上就是上一行形式的简写。

而关于除法和取模,我们类比小学对于除法的定义:若 \(f=qg+r(0\leq r<g)\) 我们称 \(f\) 除以 \(g\) 的商为 \(q\) 且余数为 \(r\)

因此,我们在多项式中,用度数进行定义:若 \(F(x)=Q(x)G(x)+R(x)(0\leq \deg R<\deg G)\) 我们称 \(F(x)\) 除以 \(G(x)\) 的商和余数分别为 \(Q(x), R(x)\)


多项式的复合运算

对于函数 \(f(x)\) 和多项式 \(\displaystyle F(x)=\sum_i f_ix^i\),我们称 \(f[F(x)]\) 是多项式 \(F(x)\) 复合函数 \(f\) 的运算结果,可记为 \((F\circ f)(x)\)

然而,很多时候,外层的函数并不是多项式函数,如 \(\displaystyle f(x)={1\over x}\)

为了解决这个问题,我们定义复合结果 \(f[F(x)]\) 的多项式为该函数无穷项麦克劳林展开(即在 \(x=0\) 处泰勒展开)的结果。

例如 \(\displaystyle F(x)=1-x, f(x)={1\over x}, (F\circ f)(x)={1\over 1-x}=1+x+x^2+\cdots+x^n+\cdots=\sum_{i=0}^{+\infty} x^i\)

当然,在题目中,我们并不会维护无穷项的多项式。同上文一样,我们会模去一个多项式,来保证可计算性。即:

\(\displaystyle (F\circ f)(x)={1\over 1-x}=\sum_{i=0}^{+\infty} x^i\equiv \sum_{i=0}^n x^i\pmod {x^{n+1}}\)

或可以简记为 \(\displaystyle {1\over 1-x}\equiv \sum_{i=0}^n x^i\pmod {x^{n+1}}\)

此外,当 \(f(x)\) 是多项式函数,且 \(\displaystyle f(x)=\sum_{i=0}^{\deg f}f_ix^i \equiv r(x)=\sum_{i=0}^{\deg r}r_ix^i\pmod {x^n}\) 时;

由于 \(\displaystyle f[F(x)]=r[F(x)]+\sum_{i=n}^{\deg f}f_i F^i(x)\equiv r[F(x)]+\sum_{i=n}^{\deg f}f_i [x^0]F^i\pmod {x^n}\)

非常数项的 \(F(x)\) 项次数,在幂次后均超过了 \(n\) 次。

此时,若 \([x^0]F=0\) ,我们可以直接得到 \(\displaystyle f[F(x)]\equiv r[F(x)]\pmod {x^n}\)

也就是说,当 \(F(x)\) 常数项为 \(0\) 时,先复合再麦克劳林展开的结果,与先麦克劳林展开再复合的结果,是完全一致的。

而当常数项不为 \(0\) 时,我们只需要先麦克劳林展开,再复合,最后将常数项修正为 \(f[F(0)]\),就得到了正确的结果。

这再后续的篇章中,我们计算多项式的复合时,通常就是先麦克劳林展开,再复合,最后根据常数项是否为 \(0\) 决定是否修正常数项。避免了先复合再展开,这一计算量复杂的复合办法。

posted @ 2023-01-18 13:08  JustinRochester  阅读(307)  评论(1编辑  收藏  举报