省选复习 - 多项式全家桶 (咕咕咕)
多项式全家桶
听起来很吓人的名字(在我学之前),慢慢知识积累上去,你会发现它就是一堆数学推导。
不断更新中...
当前进度:多项式exp / 常系数齐次线性递推
基础知识
微积分
(暂时)并不需要太高的水平,最基本的会即可。
基础求导:
基础积分:
把上面这些反过来
FFT/NTT
这还要讲?
泰勒展开
现在已知一个函数 。要用一个多项式函数 逼近它
考虑先选取一个起点 ,以这个位置为参考 (一般这个位置要好算一些,或者有可以利用的数值)
然后我们的主体思路是,让 在 处的值,一阶导,二阶导,三阶导...都相同。
首先我们让 在 处相同。那 先加上一项 的常数。
然后我们让它的一阶导相同,那我们要给它来点多项式了。但是注意我们不能改变取值,于是我们只能加上 的若干倍。
设 表示一个函数,它在 处的 阶导和 相同。
考虑 :
当 时,
同时积分,
为了凑 ,我们令
考虑 :
同时积分两次
, 是任意至多一次的多项式。
同理,我们令
这里出现了分数,容易发现这个分数是积分的时候积出来的,积了多少次,就会有多少个,所以是一个阶乘
所以
然后把所有的 和常数项加起来,得到:
牛顿迭代
首先,我们对一个多项式 ,意思就是取前 项,这个东西想想就明白了。
另外,因为同余 很不好打,后面 也表示同余 —— 这个写法很不好,但看到后面有 便可知这个 表示同余。
回到正题。现在我们要解一个多项式方程 ,其中 是一个未知多项式,我们要找出来它。
而实际问题中我们一般只需要 的前 项,也就是 的解。
假设我们知道了 ,要找一个
假设能这么求,那么求 次,就可以求出 的解了。
我们在 处展开 ,并求 位置的值 (没错,展开结果是一个多项式套多项式,会有若干个 的若干次方)
我们强制令 ,容易证明,如果 有解,那这样一定能找到一个解。
证:
假设 ,其中 是一个足够大的数 —— 比我们要用的所有 大
考虑
在 处展开 ,代入 求值
由于 ,所以 ,于是
也就是我们要找的 的解,当然, 再大一点,容易证明,把 换成 ,或者是我们想要的 ,都是成立的,都能找到解
然后注意到 ,后面的次数更大,都包含这个因子 —— 所以从 开始我们全都不用要了。
然后
移项并整理:
然后每次这么求一遍就可以了。关于如何算除法,后面再说。
牛顿迭代的代码实现
假设我们现在已经知道了多项式乘法,这里直接假设封装了 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 直接上
多项式求逆
已知 ,求 使
记 。由于逆元的对称性,
牛顿迭代需要用除法,而多项式求逆就是用来解决除法的,所以牛顿迭代比多项式求逆高 —— 换句话说我们没法用牛顿迭代算多项式求逆。这就好比你没法生下来你妈,因为你是你妈生的 超 级 加 辈
但是这个思路值得借鉴。假设有 使 ,求 使 。还是令前 项相同,然后考虑 ,显然它 。
展开它,变成
同时乘以
我们设 ,所以可以代入一下变成
移项得:
然后迭代即可。上面提到,除相当于乘以逆元。于是就可以算除法了。
多项式对数函数(ln)
要求
以 为主元来导,
然后积回去:
(为啥打中间是因为这样的积分好看,打在行间就是 )
多项式指数函数(exp)
非常好听的名字:exp。它也有很完美的性质,一切都是 这个神秘数字的魅力。
先回到正题。要求:
相当于
设 。易得 (这里设 为主元,然后 就是常数,也不用链式法则了)
换句话说求的是
整理一下就是
然后它的完美性质是甚么?
假设我们知道一个东西 ,它的数量的的生成函数是
然后有另一个东西 ,它的数量的生成函数是
然后 是由若干个 无序拼起来的。
这样的例子很多,比如说置换是由循环置换拼起来的,任意图是由若干连通图拼起来的,森林是由树拼起来的...
然后
为什么呢?枚举 用了多少个,假设是 个。然后它们的大小的和要等于 ,也就是一个多元卷积的形式。又因为是无序的,所以要除以
于是有
然后这玩意就是 在 处的展开 (容易验证)。于是
当然它还有更多完美的性质,此处略
不太有用的东西
指多项式开根/三角函数
题目里没见到过,只有板子里有。 也可能是我too young too simple
反正牛迭随便推一下就行了
多项式快速幂
先开 ,然后乘以 (我们要的幂),然后再 回来。一个 ,比倍增快速幂快。
多项式带余除法
给定 ,次数分别是 。
求 使得 ,其中 的次数必须小于 —— 容易证明存在唯一的 。
(其中我们称 为商, 为余数)
考虑模 这个操作,它可以去掉多项式从 开始的更高的次数,只保留 次。换句话说,它体现在数组上去掉了一个 后缀。
然后现在比较不好处理的就是这个 。我们希望用一个类似取模的东西,去掉一个 前缀,直接多项式乘法逆就可以求出 了。
那这不是很好办么,前缀反过来就是后缀了。但是请注意, 的次数很小,反过来的时候注意补项。
于是得到了问题的解决办法:
- 做一遍 ,设得到了 。然后
- ,直接乘然后减就完了
常系数齐次线性递推
单独出来写吧,有点长
见 ko↑ko↓
多项式多点求值 / 快速插值
咕咕咕~
多项式复合 / 多项式复合逆
咕咕咕~
普通多项式和下降幂多项式的转化
斯特林数瞎搞一番就行了
(本质上也是咕咕咕)
鸽 王 争 霸 赛
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 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】