【算法专题】多项式相关。

---恢复内容开始---

【快速傅里叶变换】

参考:从多项式乘法到快速傅里叶变换 by miskcoo

FFT 学习笔记 by Menci

特点:FFT用于O(n log n)解决多项式乘法。

(一)多项式的表示法

系数表示法:f(x)=a[n-1]*x^(n-1)+...+a[0],称为n-1次多项式。

点值表示法:一个n-1次多项式在复数域中有n个根,即n个(x,y)可以唯一确定一个n-1次多项式。

对于一个多项式,从其系数表示法到其点值表示法的变换称为离散傅里叶变换(DFT),反之称为傅里叶逆变换(IDFT)。

朴素的离散傅里叶变换,枚举实现的复杂度为O(n^2)。

快速傅里叶变换是指以O(n log n)的复杂度实现IDF和IDFT的算法,常用Cooley-Tukey算法。

(二)复数

复数是形如a+bi的数字,当b=0时为实数,b≠0时为虚数,a=0时为纯虚数。

定义一个平面为复平面,那么平面内的每个点(a,b)唯一对应一个复数a+bi,i可以理解为y轴上的单位长度,正如1是x轴上的单位长度。

i的本质是在数轴上定义旋转变换,i是1逆时针旋转90°,那么i^2=-1。

复数相加,遵循平行四边形定则。

复数相乘,模长相乘,幅角相加。

(三)单位根

以圆点为起点,以复平面单位圆的n等分点为终点,作n个向量,设所得幅角为正且最小的向量对应的复数为ω(1,n),即n次单位根。(括号左为上标,右为下标)。

图片来源:OI 中的 FFT by zball

其中B点是单位根ω(1,n),逆时针依次为ω(2,n),ω(3,n)...,ω(n,n)=ω(n,0)=1。

计算公式:ω(k,n)=cos ( 2kπ/n ) + i*sin ( 2kπ/n )

单位根的性质:

(1)消去:ω(2n,2k)=ω(n,k)

(2)折半:ω(n,k+n/2)=-ω(n,k)

将ω(n,0)~ω(n,n-1)这n个单位根作为代表n-1次多项式的n个点的横坐标,可以得到很好的性质。

(四)快速傅里叶变换(FFT解决DFA)

这部分因为不会操作数学公式,直接粘贴Menci博客QAQ。

我是图.jpg

将n-1次多项式A(x)的系数奇偶分成两个多项式A1(x)和A2(x),则A(x)=A1(x^2)+x*A2(x^2)。

对于k<n/2,有A(ω(n,k))=A1(ω(n/2,k)) + ω(n,k)*A2(ω(n/2,k))

同时,有A(ω(n,k+n/2))=A1(ω(n/2,k)) ω(n,k)*A2(ω(n/2,k))

对于一个k次多项式,通过奇偶分项得到两个k/2次多项式,分别计算后再调用其值解决k次多项式,即分治解决。

(五)傅里叶逆变换(IDFA)

对于n-1次多项式,其n-1维系数向量{a0,a1...an-1}通过DFA得到点值向量{b0,b1...bn-1},反之操作称为IDFA。

将点值向量作为系数,以单位根的倒数进行FFT,得到的每个数除以n,就是IDFA的结果。

(六)迭代实现FFT

---恢复内容结束---

原文地址:https://www.cnblogs.com/onioncyc/p/8410969.html

时间: 2024-08-30 14:31:31

【算法专题】多项式相关。的相关文章

样条之切比雪夫算法求多项式

核心代码: 1 // 使用切比雪夫算法求多项式 2 void YcChebyshevFitSpline::CalculateMultinomialValues(const void* valuesPtr, int stride, int n, int m, float* a) const 3 { 4 memset(a, 0, sizeof(float)*m); 5 6 float xStep = 1.0f/(n - 1); 7 8 int m1,i,j,l,ii,k,im,ix[21]; 9 f

样条之最小二乘算法求多项式

核心代码: 1 // 使用最小二乘算法求多项式 2 void YcLeastSquaresFitSpline::CalculateMultinomialValues(const void* valuesPtr, int stride, int n, int m, float* a) const 3 { 4 memset(a, 0, sizeof(float)*m); 5 6 float xStep = 1.0f/(n - 1); 7 8 int i,j,k; 9 float z,p,c,g,q,

ACM&amp;OI 基础数学算法专题

[前言] 本人学习了一定时间的算法,主要精力都花在数学类的算法上面 而数学类的算法中,本人的大部分精力也花费在了数论算法上 此类算法相对抽象,证明过程比较复杂 网络上的博客有写得非常好的,但也有写得不明所以的 因此,本人特此开一个新的专题,专门负责讲解一些比较基础的数学类算法 但本人知识面也有限,部分算法也还未掌握.因此,希望本专题也能促进本人学习这些算法 下面做出对更新的一些规定: 基本上保持每日更新一贴 对标注(已完结)的贴子,表明本贴子已完结 对标注(正在更新)的贴子,表明正在更新本贴 对

Android基础入门教程——10.10 传感器专题(1)——相关介绍

Android基础入门教程--10.10 传感器专题(1)--相关介绍 标签(空格分隔): Android基础入门教程 1.传感器相关介绍: 说到传感器,相信大家都不会陌生吧,比如微信的摇一摇就用到了加速度传感器: 传感器的定义:一种物理设备或者生物器官,能够探测.感受外界的信号,物理条件(如光,热, 适度)或化学组成(如烟雾),并将探知的信息传递给其他的设备或者器官! 传感器的种类:可以从不同的角度对传感器进行划分,转换原理(传感器工作的基本物理或化学 效应):用途:输出信号以及制作材料和工艺

秦九韶算法求解多项式

秦九韶算法是中国南宋时期的数学家秦九韶提出的一种多项式简化算法.在西方被称作霍纳算法.它是一种将一元n次多项式的求值问题转化为n个一次式的算法. 一般地,一元n次多项式的求值需要经过[n(n+1)]/2次乘法和n次加法,而秦九韶算法只需要n次乘法和n次加法.其大大简化了计算过程,即使在现代,利用计算机解决多项式的求值问题时,秦九韶算法依然是最优的算法. 题目:写程序计算给定多项式在给定点x处的值 f(x) = a0 + a1x + … + an-1xn-1 + anxn 分析:对比使用常规算法和

[算法专题] LinkedList

前段时间在看一本01年出的旧书<effective Tcp/Ip programming>,这个算法专题中断了几天,现在继续写下去. Introduction 对于单向链表(singly linked list),每个节点有?个next指针指向后一个节点,还有一个成员变量用以储存数值:对于双向链表(Doubly LinkedList),还有一个prev指针指向前一个节点.与数组类似,搜索链表需要O(n)的时间复杂度,但是链表不能通过常数时间读取第k个数据.链表的优势在于能够以较?的效率在任意位

【枚举算法Day1】20170529-2枚举算法专题练习

20170529-2枚举算法专题练习 青岛二中日期 序号 题目名称 输入文件名 输出文件名 时限 内存 算法 难度 分类 081113 1 最大矩形 rectangle.in rectangle.out 1s 256MB 枚举 1 02枚举 081031 2 回文 palin.in palin.out 1s 256MB 枚举.优化 1 02枚举 081008 3 问题的设置 problemsetter.in problemsetter.out 1s 256MB 排序+枚举 1 02枚举 0810

图的算法专题——最短路径

概要: Dijkstra算法 Bellman-Ford算法 SPFA算法 Floyd算法 1.Dijkstra算法用于解决单源最短路径问题,严格讲是无负权图的最短路径问题. 邻接矩阵版 1 const int maxv=1000; 2 const int INF=1000000000; 3 int n,G[maxv][maxv]; 4 int d[maxv]; //起点到各点的最短路径长度 5 bool vis[maxv]={false}; 6 7 void Dijkstra(int s){ /

【算法专题】多项式相关

[快速傅里叶变换] 参考:从多项式乘法到快速傅里叶变换 by miskcoo FFT 学习笔记 by Menci 特点:FFT用于O(n log n)解决多项式乘法. (一)多项式的表示法: 系数表示法:f(x)=a[n-1]*x^(n-1)+...+a[0],称为n-1次多项式. 点值表示法:一个n-1次多项式在复数域中有n个根,即n个(x,y)可以唯一确定一个n-1次多项式. 对于一个多项式,从其系数表示法到其点值表示法的变换称为离散傅里叶变换(DFT),反之称为傅里叶逆变换(IDFT).