任意二次分式均可于 nlogn 时间复合

· · 算法·理论

本文最后更新于 2024 - 03 - 17。

云剪切板链接:https://www.luogu.com.cn/paste/7ahgr029。

零 · 引入

本文将介绍一种本人于五月底发现的算法(不清楚之前有没有被发现),可以在 \Theta(n\log n) 时间内右复合任意二次分式。具体问题为:

给定 n 次多项式 F(x) 及二次分式 \frac{ax^2+bx+c}{dx^2+ex+f},试求 F(\frac{ax^2+bx+c}{dx^2+ex+f}) 的前 n 次项。

传统的分治做法可以在 \Theta(n\log ^2n) 时间内解决。这事实上可以算是比较理想的做法了,但是利用一些技巧我们还可以加速至 \Theta(n\log n),且无需分治,只需要简单的多项式系数平移操作。

一 · 复合「二次函数」

这是后面所有复合的基础,我们可通过四步来复合任意二次函数 ax^2+bx+c

步骤 操作 说明 由上一步变为
1 右复合 x+\gamma 多项式平移 +\gamma F(x)\rightarrow F(x+\gamma)
2 右复合 \alpha x k 次系数乘上 \alpha^k F(\alpha x+\gamma)
3 右复合 x^2 k 次系数移动至 2k F(\alpha x^2+\gamma)
4 右复合 x+\beta 多项式平移 +\beta F(\alpha x^2+2\alpha\beta x+\alpha\beta^2+\gamma)

最后再解个方程:\begin{cases}a=\alpha\\b=2\alpha\beta\\c=\alpha\beta^2+\gamma\end{cases}\implies\begin{cases}\alpha=a\\\beta=\frac b{2a}\\\gamma=c-\frac {b^2}{4a}\end{cases}

这样我们就可以在 \Theta(n\log n) 时间内右复合二次函数了。

二 · 复合「常数除二次」

即复合 \frac{c}{dx^2+ex+f},是 a=b=0 的特殊情况,且保证 c,d,f\neq 0。以下不妨设 c=1

这里要用到一条极其关键的式子:

\displaystyle F_R(x)=x^{|F|}F\left(\frac 1x\right)

其中 F_R(x) 表示将 F(x) 系数翻转过后的多项式,|F| 是多项式 F(x) 的次数。通过这条式子我们可以得到:

\displaystyle\dfrac{F_R(dx^2+ex+f)}{(dx^2+ex+f)^n}=F\left(\frac 1{dx^2+ex+f}\right)

这样就可以把常数除二次转成复合二次函数了!于是我们通过以下步骤去复合常数除二次:

步骤 操作 说明 由上一步变为
1 翻转系数 k 次系数移动至 n-k F(x)\rightarrow F_R(x)
2\sim 5 右复合 dx^2+ex+f 按照第一小节的方法 F_R(dx^2+ex+f)
6 乘上 (dx^2+ex+f)^{-n} 卷就对了! \frac{F_R(dx^2+ex+f)}{(dx^2+ex+f)^n}\\=F(\frac 1{dx^2+ex+f})

6 步无需求逆,可以线性递推其系数。注意到:

\begin{aligned}G(x)&=(dx^2+ex+f)^{-n}\\\ln G(x)&=-n\ln(dx^2+ex+f)\\\frac{G'(x)}{G(x)}&=\dfrac{-2ndx-ne}{dx^2+ex+f}\\(dx^2+ex+f)G'(x)&=(-2ndx-ne)G(x)\\\end{aligned}

两边各自提取 k 次项系数整理成递推式就好了。

三 · 复合「分子或分母为完全平方式的分式」

以下以分子为完全平方式为例,分母是平方式的做法与其类似(甚至更简单)。假设我们要复合 \frac{(x+b)^2}{dx^2+ex+f},相当于将下面这个东西平移 +b

\displaystyle\dfrac{x^2}{dx^2+(e- 2db)x+(f-be+db^2)}

e'=e-2db,f'=f-be+db^2,上式相当于复合 \frac {x^2}{dx^2+e'x+f'},再用那条翻转公式:

\displaystyle F_R\left(\dfrac{f'}{x^2}+\frac {e'}{x}+d\right)\left(\frac {x^2}{dx^2+e'x+f'}\right)^n=F\left(\frac {x^2}{dx^2+e'x+f'}\right)

G(x)=F_R(f'x^2+e'x+d),|G|=2n,故技重施:

\displaystyle G_R(x)=x^{2n}G\left(\frac 1x\right)=x^{2n}F_R\left(\dfrac{f'}{x^2}+\frac {e'}{x}+d\right)

也就是说:F(\frac {x^2}{dx^2+e'x+f'})={G_R(x)}\times {(dx^2+e'x+f')^{-n}}。整理一下步骤:

步骤 操作 说明 由上一步变为
1 翻转系数 k 次系数移动至 n-k F(x)\rightarrow F_R(x)
2\sim 5 右复合 f'x^2+e'x+d 按照第一小节的方法 F_R(f'x^2+e'x+d)=G(x)
6 翻转系数 k 次系数移动至 2n-k G_R(x)
7 右复合 x+b 多项式平移 +b F\Big(\frac{(x+b)^2}{dx^2+ex+f}\Big)\times (dx^2+ex+f)^{n}
8 乘上 (dx^2+ex+f)^{-n} 卷!可以线性递推 F(\frac{(x+b)^2}{dx^2+ex+f})

欸?这里为什么不先卷积再平移呢?因为复合 \frac{x^2}{dx^2+ex+f} 原本应该得到一个无穷项的多项式,但是先卷积会导致更高次项的系数被扔了。此时再平移,就没法考虑到更高次项平移对低次项的影响,导致结果错误。因此应当先平移后卷积。

四 · 复合「一般二次分式」

注:这里的一般二次分式是排除了上面几种特殊情况后的二次分式,记为 \frac{ax^2+bx+c}{dx^2+ex+f}

ae=bd,先平移 +\frac ad 再按上文去右复合 \frac{c-af/d}{dx^2+ex+f} 即可。以下设:ae\neq bd

考虑消去分子的一次项和常数项,有如下分式:

\displaystyle \dfrac{a(x+\lambda)^2+b(x+\lambda)+c}{d(x+\lambda)^2+e(x+\lambda)+f}

令分子分母一次系数及常数项比值相同:\frac{2a\lambda+b}{a\lambda^2+b\lambda+c}=\frac{2d\lambda+e}{d\lambda^2+e\lambda+f},整理有:

\displaystyle (ae-bd)\lambda^2+2(af-cd)\lambda+(bf-ce)=0

任取一根 \lambda(若无解则需扩域),并记:\mu=\frac{2a\lambda+b}{2d\lambda+e}。可以证明,\mu 值存在且非 0

F\Big(\dfrac{ax^2+bx+c}{dx^2+ex+f}\Big) 相当于将 F\Big(\mu+\dfrac{(a-\mu d)x^2}{d(x+\lambda)^2+e(x+\lambda)+f}\Big) 平移 -\lambda,那么步骤很显然就出来了。

但是直接套用第三小节的方法是不行的,原因和第三小节最后一段话类似。所以要稍做修改,具体看下面的步骤表:

步骤 操作 说明
1 右复合 x+\mu 多项式平移 +\mu
2 翻转系数 k 次系数移动至 n-k
3\sim 6 右复合 \frac{d(1+\lambda x)^2+ex(1+\lambda x)+fx^2}{a-\mu d} 按照第一小节的方法
7 翻转系数 k 次系数移动至 2n-k
8 右复合 x-\lambda 多项式平移 -\lambda
9 乘上 (\frac{dx^2+ex+f}{a-\mu d})^{-n} 想保留前几项就保留前几项

五 · 简单的实战

以此题为例 P8561 送别(Farewell),此题最后要求我们复合 x+x^{-1}-2,也就是复合 \frac {(x-1)^2}{x}。这是一个分子为完全平方式的实例,让我们使用成套的方法解决:

此题中:b=-1,d=0,e=1,f=0

计算得:e'=1,f'=1,需要复合二次函数 x^2+x

计算得:\alpha=1,\beta=\frac 12,\gamma=-\frac 14,那么我们就可以写出如下步骤啦:

步骤 操作 说明 由上一步变为
1 翻转系数 k 次系数移动至 n-k F(x)\rightarrow F_R(x)
2 右复合 x-\frac 14 多项式平移 -\frac 14 F_R(x-\frac 14)
3 右复合 x^2 k 次系数移动至 2k F_R(x^2-\frac 14)
4 右复合 x+\frac 12 多项式平移 +\frac 12 F_R(x^2+x)
5 翻转系数 k 次系数移动至 2n-k x^{2n}F_R\left(\frac 1{x^2}+\frac 1x\right)\\=(x+1)^{n}F\left(\frac{x^2}{x+1}\right)
6 右复合 x-1 多项式平移 -1 x^nF\left(\frac {(x-1)^2}{x}\right)

仅用了三次多项式平移就完成,效率上显著快于分治!同时也将此题最优时间复杂度降至 \Theta(k\log k+\log n)

此处给一道复杂点的复合:\dfrac{x}{1+x+\frac 12x^2},来自 P7857 「EZEC-9」Meltel,解法可参考 Meltel 复合计算笔记。但此题有别的 \Theta(n\log n) 解法,原因是 F(x) 有特殊性质。

六 · 推论及其他问题

综上,我们可以得到:任意二次分式的右复合均可在不多于 4 次多项式平移时间内完成

此外,与二次分式相关的复合也可以在优于暴力的时间内完成,例如(双曲)三角函数。而当 F(G) 有高效的复合方法时,翻转公式本身也可以用于复合 F(\frac 1G)

目前看来,如果仍用翻转这种操作,无论在第四部分进行怎样的变形,扩域都是无法避免的。

至于超脱于二次分式以外的复合问题,例如复合 ax^3+bx^2+cx+d, e^x+x,xe^x,\ln(1+x) 等等,我就不知道怎么办了。(三次函数复合见文末)

七 · 后记

一开始我是在搞 Meltel 这道题时想到要去找一种复合任意二次分式的算法,当初想的是只要比 \Theta(n^2) 快就算成功,就冥思苦想出个分治,然后就走人了。那时候也有往这块想,但是没注意到翻转公式这个关键的东西,所以没搞出来。

后来有天尝试复合 \frac 1{1-x},突然从脑子里蹦出了翻转公式,就顺利搞出了复合 \frac 1{1-x}\Theta(n\log n)。那时想乘胜追击,扩展到二次分式,又失败了。

直到后面想冲击一下 Farewell 这题的 \Theta(n\log n) 解法,没想到当天下午真被我搞出来了。隔天顺势把任意二次分式的算法整出来了,也就是上面那些东西。不过后来,实操时又发现有小 BUG,就是先卷积还是先平移的问题,很快就修复了。算法也就此成型。

话说我去网上搜都没找到这方面的算法,顶多分治,那么我就是第一个解决这个问题的人辣!也有可能这玩意价值不大,没人往这块想。 看来前人已经探索过这类问题了,只不过没那么广为人知而已。

23.9.19 upd:

看了 EI 的 这篇注记,终于明白怎么复合三次函数了。简单来讲,先将任意三次函数的复合归约到 x^3-3x 上,再利用 x^3-3x=(x^3-x^{-3})\circ(x+x^{-1})^{\langle-1\rangle} 进行转化。前者只需利用 (x-1/x)\circ x^3,可以做到 \Theta(n\log n);后者则需注意到这步关键:

\displaystyle \Big(\dfrac{x+x^{-1}}2\Big)=\Big(\frac{x+1}{x-1}\Big)\circ x^2\circ\Big(\frac{x+1}{x-1}\Big)

那么复合的逆就是各部分求逆后倒序复合:

\displaystyle \Big(\dfrac{x+x^{-1}}2\Big)^{\langle-1\rangle}=\Big(\frac{x+1}{x-1}\Big)\circ \sqrt x\circ\Big(\frac{x+1}{x-1}\Big)

然后就可以 \Theta(n\log n) 做了!这个复合的逆的想法可以说是十分巧妙!

24.3.17 upd:

这是否太日新月异了?(多项式复合(逆)的 O(nlog^2n) 做法)

9 个月前 esquigybcu 的评论“加油,争取在 polylog 内解决模任意多项式复合”居然成为了现实。那时候的我是无论如何都不敢想象的。

以我自己的理解,这里转述一下做法。

[x^k]F(G(x))=\sum_{}f_i[x^k]G^i

其转置问题为:

a_k=\sum_{}f_i[x^i]G^k

F_r(x)=\sum_{}f_{n-i}x^i,即求:

a_k=\sum_{}[x^{n-i}]F_r[x^i]G^k=[x^n]F_rG^k

故有:

\sum a_ky^k=[x^n]\dfrac {F_r}{1-yG}

对此应用 Bostan-Mori 算法,即:

[x^n]\dfrac{P(x,y)}{Q(x,y)}=[x^n]\dfrac{P(x,y)Q(-x,y)}{Q(x,y)Q(-x,y)}=[x^n]\dfrac{P_0(x^2,y)+xP_1(x^2,y)}{R(x^2,y)}

于是可以递归到:

[x^n]\dfrac{P(x,y)}{Q(x,y)}=[x^{[n/2]}]\dfrac{P_{n\bmod 2}(x,y)}{R(x,y)}

注意到第 t 层的递归中 x,y 的次数约是 n/2^t,2^t 的,所以 P,Q 的项数约是 n 项,这保证了次数不会膨胀。

一共递归了 \log n 层,故总时间复杂度为 \Theta(n\log ^2n)

一开始面对复合问题时,我更倾向于建立 EGF,即:

\sum_{}\dfrac{a_k}{k!}y^k=[x^n]F_r\exp(yG)

因为我认为 \exp 的性质要远优于 \frac 1{1-x}。现今看来,在 Bostan-Mori 算法的加持之下,\frac 1{1-x} 的可操作性极强,反而在这个问题上发挥了重要作用。