省选复习 - 多项式全家桶 (咕咕咕)

 


多项式全家桶

听起来很吓人的名字(在我学之前),慢慢知识积累上去,你会发现它就是一堆数学推导。

不断更新中...

当前进度:多项式exp / 常系数齐次线性递推

基础知识

微积分

(暂时)并不需要太高的水平,最基本的会即可。

基础求导:

C=0

(xn)=nxn1

(ex)=ex

ln(x)=1x

(Cf(x))=Cf(x)

(f±g)=f±g

(fg)=fg+fg

(fg)=fgfgg2

f(g(x))=f(g(x))g(x)

基础积分:

把上面这些反过来

FFT/NTT

这还要讲?

泰勒展开

现在已知一个函数 f(x)。要用一个多项式函数 g(x) 逼近它

考虑先选取一个起点 x0,以这个位置为参考 (一般这个位置要好算一些,或者有可以利用的数值)

然后我们的主体思路是,让 f,gx0 处的值,一阶导,二阶导,三阶导...都相同。

首先我们让 f,gx0 处相同。那 g 先加上一项 f(x0) 的常数。

然后我们让它的一阶导相同,那我们要给它来点多项式了。但是注意我们不能改变取值,于是我们只能加上 xx0 的若干倍。

gk 表示一个函数,它在 x0 处的 k 阶导和 f 相同。

考虑 g1

x=x0 时,g1(x)=f(x0)

同时积分,g1(x)=xf(x0)+C

为了凑 xx0,我们令 g1(x)=(xx0)f(x0)

考虑 g2

同时积分两次

g2(x0)=12f(x0)x02+C(x)C(x) 是任意至多一次的多项式。

同理,我们令 g2(x)=12f(x0)(xx0)2

这里出现了分数,容易发现这个分数是积分的时候积出来的,积了多少次,就会有多少个,所以是一个阶乘

所以 gk(x)=f(k)(x0)(xx0)kk!

然后把所有的 gk 和常数项加起来,得到:

g(x)=i=0f(i)(x0)(xx0)ii!

牛顿迭代

首先,我们对一个多项式 modxn,意思就是取前 n1 项,这个东西想想就明白了。

另外,因为同余 很不好打,后面 = 也表示同余 —— 这个写法很不好,但看到后面有 (mod...) 便可知这个 = 表示同余。

回到正题。现在我们要解一个多项式方程 E(f)=0,其中 f 是一个未知多项式,我们要找出来它。

而实际问题中我们一般只需要 f 的前 k 项,也就是 modxk 的解。

假设我们知道了 E(f0)=0(modxn),要找一个 E(f)=0(modx2n)

假设能这么求,那么求 log 次,就可以求出 modxk 的解了。

我们在 f0 处展开 E,并求 f 位置的值 (没错,展开结果是一个多项式套多项式,会有若干个 f 的若干次方)

E(f)=E(f0)+E(f0)(ff0)+E(f0)(ff0)22!+...

我们强制令 f=f0(modxn),容易证明,如果 E 有解,那这样一定能找到一个解。

证:

假设 E(g)=0(modxm),其中 m 是一个足够大的数 —— 比我们要用的所有 n

考虑 f=gmodxn

g 处展开 E,代入 f 求值

E(f)=E(g)+E(g)(fg)+...

由于 f=g(modxn),所以 fg=0(modxn) ,于是 E(f)=E(g)=0(modxn)

也就是我们要找的 modxn 的解,当然,m 再大一点,容易证明,把 n 换成 2n ,或者是我们想要的 k ,都是成立的,都能找到解

然后注意到 (ff0)2=0(modx2n),后面的次数更大,都包含这个因子 —— 所以从 2 开始我们全都不用要了。

然后 E(f)=E(f0)+E(f0)(ff0)

移项并整理:

f=f0E(f0)E(f0)

然后每次这么求一遍就可以了。关于如何算除法,后面再说。

牛顿迭代的代码实现

假设我们现在已经知道了多项式乘法,这里直接假设封装了 operator (实际上我并没有这么干,因为我试过一次,很慢,也不知如何优化)

相当于半个伪代码和C++

void solve(euqation E,poly& g,int n) 
// E 是那个方程
// 实际代码实现中, 通常是传一个方程的参数进来, 然后通过推式子手动求方程的值和求导之类的
// 另外, 一般这里的g是传数组进来, 就不用&了
{
	int len,lim;
	poly g=trival(); // 先瞪出来一个trival的边界值
	for(len=1;len<=(n<<1);len<<=1)
	{
		lim=len<<1; // 这个是 FFT/NTT 要用的

		E_=deri(E); // 求导
		// 实际上我们是需要手动求导的, 而且不会写成这样, 这里仅供示意
		g=g-E(g)*inv(E_(g)); // inv: 求逆, 后面讲, 乘以一个多项式的逆相当于除
        // 顺便, 一般这里求 E 啥的还要再来一堆辅助数组
	}
	return g;
}

别问我为啥要贴这个,我初学的时候尝试自己想怎么写,但是一直不知道lim和len咋搞

如果您自己想出来了,恭喜你,把我吊打了

多项式正题

多项式乘法

FFT/NTT 直接上

多项式求逆

已知 f,求 g 使 fg=1(modxk)

g=f1。由于逆元的对称性,f=g1

牛顿迭代需要用除法,而多项式求逆就是用来解决除法的,所以牛顿迭代比多项式求逆高 —— 换句话说我们没法用牛顿迭代算多项式求逆。这就好比你没法生下来你妈,因为你是你妈生的 超 级 加 辈

但是这个思路值得借鉴。假设有g0 使 fg0=1(modxn),求 g 使 fg=1(modx2n)。还是令前 n 项相同,然后考虑 (gg0)2,显然它 =0(modx2n)

展开它,变成

g22gg0+g02=0(modx2n)

同时乘以 f

fg22fgg0+fg02=0(modx2n)

我们设 fg=1(modx2n),所以可以代入一下变成

g2g0+fg02=0(modx2n)

移项得:

g=2g0fg02

然后迭代即可。上面提到,除相当于乘以逆元。于是就可以算除法了。

多项式对数函数(ln)

要求 g(x)=ln(f(x))(modxk)

x 为主元来导,g(x)=1f(x)f(x)

然后积回去:

g(x)=f(x)f(x)

(为啥打中间是因为这样的积分好看,打在行间就是

多项式指数函数(exp)

非常好听的名字:exp。它也有很完美的性质,一切都是 e 这个神秘数字的魅力。

先回到正题。要求:g=exp(f)=ef(modxn)

相当于 ln(g)f=0

E(g)=ln(g)f。易得 E(g)=1g(这里设 g 为主元,然后 f 就是常数,也不用链式法则了)

换句话说求的是 dE(g)dg

g=g0E(g0)E(g0)=g0ln(g0)f1g0

整理一下就是

g=g0(1ln(g0)+f)

然后它的完美性质是甚么?

假设我们知道一个东西 A ,它的数量的的生成函数是 F

然后有另一个东西 B,它的数量的生成函数是 G

然后 B 是由若干个 A 无序拼起来的。

这样的例子很多,比如说置换是由循环置换拼起来的,任意图是由若干连通图拼起来的,森林是由树拼起来的...

然后 G=exp(F)

为什么呢?枚举 A 用了多少个,假设是 i 个。然后它们的大小的和要等于 n,也就是一个多元卷积的形式。又因为是无序的,所以要除以 i!

于是有 G=i=1Fii!

然后这玩意就是 exp(x)x0=0 处的展开 (容易验证)。于是 G=exp(F)

当然它还有更多完美的性质,此处略

不太有用的东西

指多项式开根/三角函数

题目里没见到过,只有板子里有。 也可能是我too young too simple

反正牛迭随便推一下就行了

多项式快速幂

先开 ln,然后乘以 k (我们要的幂),然后再 e 回来。一个 log,比倍增快速幂快。

多项式带余除法

给定 F,G,次数分别是 n,m

Q,R 使得 F=QG+R,其中 R 的次数必须小于 m —— 容易证明存在唯一的 G,R

(其中我们称 Q 为商,R 为余数)

考虑模 xn 这个操作,它可以去掉多项式从 n 开始的更高的次数,只保留 [0,n1] 次。换句话说,它体现在数组上去掉了一个 后缀

然后现在比较不好处理的就是这个 R 。我们希望用一个类似取模的东西,去掉一个 前缀,直接多项式乘法逆就可以求出 Q 了。

那这不是很好办么,前缀反过来就是后缀了。但是请注意,R 的次数很小,反过来的时候注意补项。

于是得到了问题的解决办法:

  • F,G 做一遍 reverse,设得到了 Fr,Gr。然后 Q=Fr×(Gr)1
  • R=FQG,直接乘然后减就完了

常系数齐次线性递推

单独出来写吧,有点长

ko↑ko↓

多项式多点求值 / 快速插值

咕咕咕~

多项式复合 / 多项式复合逆

咕咕咕~

普通多项式和下降幂多项式的转化

斯特林数瞎搞一番就行了

本质上也是咕咕咕

鸽 王 争 霸 赛

posted @   Flandre-Zhu  阅读(155)  评论(2编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示