基 础 多 项 式 与 基 础 生 成 函 数

news/2025/1/21 20:24:56/文章来源:https://www.cnblogs.com/q1uple/p/18684373

噔 噔 噔。

你说的对,但是确实挺基础的说。

很多东西避开了严谨的描述。

文章内容非常浅(che)显(dan)。

prework

卷积 :\(a,b\)为两个数列,两个数列的卷积 \(c\)\(c_k=\sum\limits_{i=1}^{k} a_{i}b_{k-i}\)

多项式的点值表示:\(n+1\) 个坐标确定一个 \(\le n\) 次的多项式,我们可以用这 \(n+1\) 个坐标表示。

注意到直接用点值表示出来的话,能快速的得到相乘的多项式的点值表示。

我们实际上是计算特殊的点值。

单位根:\(x^n-1 =0\) 我们称 \(x\)\(n\) 次单位根,其中 $n \in \mathbb{C} $。我们设 $ \omega $,根据代数基本定理,它在复数集下显然有 \(n\) 个解。我们分别记最小解为 $ \omega_1,\omega_2,\omega_3 \ldots \omega_n$,实际上就是每个角为 \(\frac{2\pi}{n}\),这个东西定义为 \(\omega_{n} = e^{\frac{2\pi i}{n}}\)

$ \because e^{i x } = \cos x+ i\sin x $(欧拉公式)

\(\therefore \omega_n = \cos \frac{2\pi}{n} + i\sin \frac{2\pi}{n}\)

FFT的推导过程

离散傅里叶变换(DFT)

是长这样的,\(a\)是一个数列,对于 \(0 \le k < n\),我们令

\[ b_k=\sum\limits_{i=0}^{n-1} a_i \omega_n^{ki} \]

我们记 \(b=F(a)\)

离散傅里叶变换的逆变换(IDFT)

顾名思义,直接给出式子

\[ a_k=\frac{1}{n}\sum\limits_{i=0}^{n-1} b_i \omega_n^{-ki}(0 \le k < n) \]

证明有点长,大概就是根据定义去推。

意思就是说如果我们知道单位根的点值,就能推出原多项式的系数了。

循环卷积

\(a,b\) 两个数列,

\(c_k=\sum\limits_{i+j \mod n=k} a_{i}b_{k-i}\)

我们记作 $ c = a * b$

我们有一个性质 \(F(a*b)=F(a) \times F(b)\)

补充单位根的两个性质

Lemma 1:\(({\omega_{2n}}^k)^2={\omega_{n}}^k\)

Lemma 2:\({\omega_{2n}}^{n+k}={\omega_{2n}}^{-k}\)

你把复平面建立出来证明式容易的。

我们对多项式 \(A(x)\) 开始进行操作,我们记 \(n=2m\)

\[A(x)=\sum\limits_{0\le i < n} a_ix^i = \sum\limits_{0\le i < m} a_{2i}x^{2i} +\sum\limits_{0\le i < m} a_{2i+1}x^{2i+1} \]

\[=\sum\limits_{0\le i < m} a_{2i}x^{2i} +x \sum\limits_{0\le i < m} a_{2i+1}x^{2i} \]

注意到有相同的,这是好事。

那我们定义\(A_0(x)=\sum\limits_{0\le i < m} a_{2i}x^{2i} ,A_1(x)= x\sum\limits_{0\le i < m} a_{2i+1}x^{2i}\)

蝴蝶变换

考虑将前面的东西结合一下?下面还是有 \(0 \le k < m\)

\[A(\omega{_n}^k) = A_0(\omega{_n}^k)+A_1(\omega{_n}^k) \]

\[A(\omega{_n}^k) = A_0(({\omega_{2n}}^k)^2)+A_1(({\omega_{2n}}^k)^2) \]

\[A(\omega{_n}^k) = A_0(({\omega_{n}}^k)^2)+ \omega{_n}^k A_1(({\omega_{n}}^k)^2) \]

\[A(\omega{_n}^k) = A_0({\omega_{m}}^{k})+ \omega{_n}^k A_1({\omega_{m}}^{k}) \]

\[A(\omega{_n}^{m+k}) = A_0(({\omega_{n}}^{m+k})^2)+ \omega{_n}^{m+k} A_1(({\omega_{n}}^{m+k})^2) \]

\[A(\omega{_n}^{m+k}) = A_0({\omega_{m}}^{k})- \omega{_n}^k A_1({\omega_{m}}^{k}) \]

通过蝴蝶操作的过程可以看出,如果我们得到了 \(A_0(x),A_1(x)\)

在点\({\omega_{m}}^0,{\omega_{m}}^1 \ldots {\omega_{m}}^{m-1}\),我们可以在 \(O(n)\) 时间内
计算出 \(A(x)\)\({\omega_{m}}^0,{\omega_{m}}^1 \ldots {\omega_{m}}^{m-1}\),我们可以在 \(O(n)\)处的点值。

而计算 \(A_0,A_1\) 的点值的过程可以递归分治进行。
根据主定理,我们可以在 \(O(n\log n)\) 的时间内求出所要的 \(A(x)\) 的点值表示。

为了快速的进行 IDFT,对比 DFT与 IDFT的表达式,可以发
现我们只需要将FFT过程中用到的 \(\omega_{n}\) 全部替换为 \({\omega_{n}}^{-1}\),最后再乘以 \(\frac{1}{n}\) 即可。

\(rev(x)\) 表示将x的二进制位的顺序反转之后得到的数字,我们每次 将 \(a_i = a_{rev(i)}\) 则每次需要对a进行的蝴蝶操作在a′中变成了对两个相邻的序列的操作。方便多了。我觉得你记忆模板就行

#include<bits/stdc++.h>
using namespace std;
const int N=2e6+6,mod=1e9+7,INF=2e9;
// 省略了缺省源,想看找我要就行了
struct CP{db x,y;CP(db X=0.0,db Y=0.0){x=X,y=Y;}inline CP operator +(const CP &p){return CP(x+p.x,y+p.y);}inline CP operator -(const CP &p){return CP(x-p.x,y-p.y);}inline CP operator *(const CP &p){return CP(x*p.x-y*p.y,y*p.x+x*p.y);}
}f[N<<1],g[N<<1];
int rev[N<<1];
int n,m;
const db pi=acos(-1);
void FFT(CP *f,db opt){rep(i,0,n-1)  if(i<rev[i])    swap(f[i],f[rev[i]]);for(int p=2;p<=n;p<<=1){int len=(p>>1);CP wd(cos(2*pi/p),sin(2*pi/p)*opt);static CP w[N];w[0]={1,0};rep(i,1,len)    w[i]=w[i-1]*wd;for(int k=0;k<n;k+=p){rep(l,k,k+len-1){CP now=f[l+len]*w[l-k];f[l+len]=f[l]-now,f[l]=f[l]+now;}}}
}
int main(){cin>>n>>m;rep(i,0,n)  cin>>f[i].x;rep(i,0,m)  cin>>g[i].x;for(m+=n,n=1;n<=m;n<<=1);rep(i,0,n)  rev[i]=(rev[i>>1]>>1)|((i&1)?(n>>1):0);FFT(f,1);FFT(g,1);rep(i,0,n)  f[i]=f[i]*g[i];FFT(f,-1);rep(i,0,m)  cout<<(int)(fabs(f[i].x)/(n*1.0)+0.5)<<" ";
}

NTT

咕咕。

生成函数

一些题目

P1919 【模板】高精度乘法 | A*B Problem 升级版

注意到高精度乘法本身就是一个卷积,直接把每一位当系数卷积即可,要处理一下进位。

P3338[ZJOI2014]力

咕咕。

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

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

相关文章

【模拟电子技术】11-放大电路的性能指标

【模拟电子技术】11-放大电路的性能指标通过输入,输出侧的各一个电容来到输入纯交流,输出纯交流Ui变化引起UBE变化,UBE变化引起IB变化,IB变化引起IC变化,IC变化引起UCE变化,UCE变化引起Uo变化关于输入,输出等效电路的问题: 输入电阻Ri越大越好还是越小越好?当然是越大…

解决 WebSocket 连接断开问题:前端心跳机制的实现与优化

在开发过程中,我们经常会遇到需要实时通信的场景,而 WebSocket 是一种非常合适的技术选择。然而,在实际使用 WebSocket 的过程中,我们可能会遇到连接频繁断开的问题。最近,我在一个项目中就遇到了这样的问题,经过一番探索和优化,终于找到了解决方案,现在与大家分享一下…

图片内存变大

平时我们会经常遇到压缩图片内存的情况,但是需要把图片内存变大的情况有人遇到过吗,接下来就是图片变大术的详细教程!将需要处理的图片放在一个文件夹内(例:图片a.png放在D盘根目录下)win+R输入cmd打开命令控制行在命令控制行输入cd+图片所在的目录,如果是在磁盘根目录直…

paddleocr图片文字识别

介绍:PaddleOCR是由百度开发的一个OCR库,基于深度学习框架PaddlePaddle。PaddleOCR支持多语言文本识别,特别适合中文场景,同时它还提供了丰富的预训练模型。 1、安装pip3 install paddlepaddle pip3 install paddleocr2、使用from paddleocr import PaddleOCRdef paddle_im…

picoctf_2018_rop chain

main里面有个gets溢出函数,再点开flag函数看可以看到传入了一个a1参数,如果win1和win2都是1且a1为-559039827时会输出flag的值用十六进制比较,该数的十六进制可以直接再ida里面看到看到win1函数设置了win1为1,win2函数需要再传入一个参数为-1163220307那么win2就是1了这个参…

whuwc 游记

whuwc 游记whuwc 游记Star Sky Here we are 我们在此地 Riding the sky 翱翔于天际 Painting the night with sun 绘夜空以晨旭 You and I, Mirrors of night 你和我 交相辉映 Twin flames of fire 如两团火焰 Lit in another time and place 闪亮在彼时彼地 I knew your name …

nvm自动切换node版本

1、nvm常用命令nvm off //禁用node.js版本管理(不卸载任何东西) nvm on //启用node.js版本管理 nvm install <version> //安装node.js的命名 version是版本号 例如:nvm install 8.12.0 nvm uninstall <version> …

业财一体化与业财融合的联系与区别

业财一体化与业财融合比较相似,许多人把二者混为一谈,甚至概念搞反了,他俩有何异同呢?1 从定义来看,业财一体化(Integrated Business and Finance)是指将企业的业务活动与财务活动进行信息化、系统化的统一管理,通过先进技术手段,将业务流程、财务流程、管理流程有机整…

[docker] 部署 Seata 分布式事务

docker 部署 Seata 分布式事务在使用 Docker 部署 Seata 并与 Nacos 配置中心结合时,你可以通过以下步骤来实现。Seata 是一个开源的分布式事务解决方案,而 Nacos 是阿里巴巴开源的一个动态服务发现、配置和服务管理平台。 一、环境准备部署好 mysql 服务 部署好 nacos 服务二…

微信 Callkit 扩大测试范围;DeepSeek-R1 模型发布,性能对标 OpenAI o1 正式版丨 RTE 开发者日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…

《操作系统真象还原》第九章 线程(一) 在内核中实现线程

本文是对《操作系统真象还原》第九章(一)学习的笔记,欢迎大家一起交流。第九章 线程(一) 在内核中实现线程 本文是对《操作系统真象还原》第九章(一)学习的笔记,欢迎大家一起交流。 我们在本节的任务:创建并初始化PCB 模拟pthread_create函数创建线程并执行线程函数首…

1.21 javaweb学习

今天学习了html中onsubmit的使用 onsubmit事件处理器是专门用于表单(form)的提交事件,所以要注意div标签是不能直接使用onsubmit的 今天在作业项目中出现了这样的问题,将onsubmit放在了div标签中,导致数据无法被正常处理,上传数据有误,修改至form后问题解决 修改前数据提…