[学习笔记 #?] Bostan-Mori 算法和 常系数齐次线性递推

news/2024/12/14 17:09:48/文章来源:https://www.cnblogs.com/huangkxQwQ/p/18606948

目录
  • [学习笔记 #?] Bostan-Mori 算法和 常系数齐次线性递推
    • Bostan-Mori 算法
    • 常系数齐次线性递推(使用此算法)

[学习笔记 #?] Bostan-Mori 算法和 常系数齐次线性递推

Bostan-Mori 算法

它本身用来求 $[x ^ k] \frac { f(x) } { g(x) } $,其中 \(f(x), g(x)\) 的次数分别为 \(n, m\)\(n, m \leq 10 ^ 5, k \leq 10 ^ 9\)

而实际应用时,它可以用于常系数齐次线性递推。

发现 \(g(x)g(-x)\) 有一个良好的性质:由于 \(g(x)\)\(g(-x)\) 的奇次项系数互为相反数,所以 \(g(x)g(-x)\) 的奇次项系数为 \(0\)。因此我们不妨把 \(g\) 这个多项式的奇数次项都去掉(这些项没有了,剩下的高次往低次挪,相当于系数全部 \(/2\)),得到多项式 \(H\),那么 \(g(x)g(-x)=H(x^2)\)

我们考虑怎么把这个东西放到上面的式子里,于是上下同乘一个 \(g(-x)\)。现在我们要求 \([x ^ k]\frac {f(x)g(-x)} {g(x)g(-x)}\),即 \([x^k]\frac { f(x)g(-x) }{ H(x^2) }\)。我们发现上面这个东西没法用刚才的方式变化,但是我们出于两个原因仍然把它按次数奇偶划分,两个原因如下:

  1. 为了契合分母的变化。
  2. 我们要求的仅仅是一项的系数,而这一项在这一轮要么由奇数次的项贡献而来,要么由偶数次的项贡献而来(感性理解,分母只有偶数次的有值,而分子现在分成两部分,一部分只有奇数次的有值,一部分只有偶数次的有值)。

类比上面的 \(H\),把 \(f(x)g(-x)\) 拆成 \(( F(x^2) + x G(x^2) )\) 那么我们现在要求的就变成了 \([x ^ k]\frac{F(x^2)+xG(x^2)}{H(x^2)}\)。现在各个 [函数](?)里都是 \(x^2\) 的形式了。根据 \(k\) 的奇偶性分类讨论:

  1. \(2 \mid k\),则答案为 \([x^{\lfloor k/2 \rfloor}]\frac{F(x)}{H(x)}\)
  2. \(2 \nmid k\),则答案为 \([x ^ { \lfloor k / 2 \rfloor }] \frac {G(x)} {H(x)}\)

递归下去计算即可。边界:若 \(k = 0\),则返回常数项。

假设 \(n = m\)。不管计算常数项的时间复杂度。每次减半,那么直接写暴力多项式乘法的时间复杂度 似乎(我不太确定)\(O(n^2\log k)\)。如果用 FFT 或 NTT,则时间复杂度 似乎(我不太确定)\(O(n \log n \log k)\)

看网上博客说使用限制是模数要是质数,我还不懂

常系数齐次线性递推(使用此算法)

\(a_n = \sum _ { i = 1 } ^ k F _ i \times a _ { n - i }\),已知 \(n, k, F_{1\ldots k}, a_{0\ldots k-1}\),求 \(a_n \bmod 998244353\)。(来自洛谷上的模板题)

使用生成函数把它变成 Bostan-Mori 算法求的东西的形式,即构造函数 \(f(x),g(x)\) 使得 \(a _ n = [x^n]\frac {f(x)} {g(x)}\)。其实就是要 \(f = g a\)

\(i\) 特别大时 \(f_i=0\),我们令 \(i \geq k\)\(f_i=0\),从 \(\geq k\)\(i\) 入手。

\[f _ { i } = \sum _ { j = 0 } ^ i g _ j a _ { i - j } \\ \therefore 0 = \sum _ { j = 0 } ^ i g _ j a _ { i - j } \\ \therefore g _ 0 a _ i = - \sum _ { j = 1 } ^ i g _ j a _ { i - j } \\ \]

此时我们强制让 \(i > k\)\(g _ i\) 也为 \(0\)。那么就有:

\[g _ 0 a _ i = - \sum _ { j = 1 } ^ k g _ j a _ { i - j } \]

我们令 \(g _ 0 = 1\)。那么就有 \(a _ i = - \sum _ { j = 1 } ^ k g _ j a _ { i - j }\)

对于 \(1 \leq i \leq k\),令 \(g _ i = - F _ i\)

发现现在的 \(a\)\(g\) 满足了递推 \(a\) 的关系。

想更简单地表示 \(g\),发现 \(g = 1 - F\),其中 \(F\) 中没给的项都认为系数为 \(0\)

而根据前面的构造,\(f = (g a) \bmod x ^ k\),可以直接用 FFT 或 NTT 算出来。

那么现在有了 \(f,g\),直接用 Bostan-Mori 求 \(a _ n\) 即可。

\(f\) 的次数最大是 \(k - 1\)\(g\) 的次数最大是 \(k\)。在 Bostan-Mori 算法中使用 FFT 或 NTT,并且有上面 Bostan-Mori 算法的时间复杂度的条件,那么时间复杂度为 \(O(k\log k\log n)\)我还是不太确定)。

2024.12.14

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/852575.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P6599 「EZEC-2」异或

写数学时发现的好题 给出n和l,构造一个数组,数组长度为l,满足数组中的数字在 1-n 之间贪心的想,直接放n会发生什么。不难发现,最终的答案其实是两两异或之和 放一个n,答案就是1(l-1)n; 放一个n,答案就是2(l-2)n; 其实就是x(l-x)n; 还可以更大吗? n写成二进制就…

使用AOP防止请求重复提交

使用AOP防止请求重复提交首先定义注解NoPepeatSubmit@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface NoRepeatSubmit {long value() default 1000*10; }定义AOP相关方法public class RepeatSubmitAspect {@Autowiredprivate StringRedisS…

三门峡知识付费系统服务热线

关于三门峡地区的知识付费系统及教育服务,虽然直接与三门峡地区的本地资源相关的信息比较有限,我们可以提供一些更宽广的信息和资源链接以帮助相关从业人员更好地了解知识付费系统和服务相关的背景信息与技术细节。例如,如果您在寻求构建或选择一个适合自身需求的知识付费系…

2024-2025-1 20241305《计算机基础与程序设计》第十二周学习总结

------------恢复内容开始------------ 作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计(https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP))这个作业要求在哪里 2024-2025-1计算机基础与程序设计第十二周作业这个作业的目标 指针和数组作业正文 本博客…

微信小程序商城构建全栈应用

D:\PanDownload\【微信小程序】\微信小程序商城构建全栈应用 第1章 前言:不同的时代,不同的Web 1-1 前言与导语 导语 好的课程需要包含俩方面: 一:整体的思路与编程思想(大局观,AOP ,10~20%) 二:具体的编程知识与技巧(TP5,小程序,数据库等80%) books+code 1-2 产品所使用的技…

龍兄虎弟 综艺 All In One

龍兄虎弟 综艺 All In One 主持人:張菲、費玉清龍兄虎弟 综艺 All In One主持人:張菲、費玉清精彩片段 https://www.youtube.com/watch?v=fD1MxE9e3Bg&list=PLtww_vcpAB8pJn3goLppo42EDqjt8t1kh完整版 https://www.youtube.com/watch?v=67MJj22yMp0&list=PLRWrniKO…

UWB物理层实现-特殊汉明码纠错

根据802.15.4协议,chapter15.2.7,PHR部分的编码,除了一些控制参数外,在后面添加了6位单错纠正双错检测码(SECDED),用于纠错能力的提升,这6位汉明码为PHR部分提供了至少1bit的纠错能力,以及至少2bit的检错能力。此码块由汉明码构成,与一般汉明码不同的是,改码并没有穿…

NestJS导出API文档

在NestJS中,你可以使用@nestjs/swagger包来定义你的API文档,并且可以很容易地将这些文档转换为API调用。以下是一个简单的例子,展示如何使用NestJS和Swagger来创建一个API文档,并且如何生成API调用。 首先,安装@nestjs/swagger和swagger-ui-express:npm install @nestjs/…

python版本切换

1、搜索框输入:环境变量2、在下面的系统变量:选择path -> 点击:编辑3、将需要的python版本上移到上面,调整好后,一路点击确定关闭几个打开的窗口,保存环境变量配置。3、打开cmd,输入:python --version 确认版本是否切换成功

机器学习期末复习笔记

机器学习期末复习机器学习期末复习笔记 简介 主要注重决策树的计算,朴素贝叶斯,PCA降维的计算 笔记

07相关软件的安装以及HTML介绍

一、内容回顾这个软件从1.0就开始收费了,这里使用这个版本这里将侧边栏打开 这个typora软件支持Markdown的格式,markdown格式是我们经常会使用到的笔记格式的形式,后缀名是md 这种语法在整理笔记是比较方便的 1、标题 加上#号表示是标题,这个和H1,H2...标签类似 加上不同的…

Threejs教程,2024全新系统threejs入门教程

Threejs教程,2024全新系统threejs入门教程 https://www.bilibili.com/video/BV1Zm421g7oi/?spm_id_from=333.999.0.0 2 4 01-theejs三要素 WebGL 顶点数据 顶点索引 矩阵 三要素 场景 Scene 容器 相机 Camera 观察 渲染器Renderer 组合 透视相机(PerspectiveCamera) htt…