多项式乘法快速算法

多项式乘法优化算法:

设有如下两个多项式:

把它们的系数分别做成向量X=[x0,x1,x2,x3,......]的形式,得

  F=[2,3,1]  G=[5,2,0]

那么根据卷积公式

可以求得向量F和G的卷积S=[10,19,11,2]

而由多项式乘法可算出

各项系数和上面的卷积结果正好一一对应。

所以说,多项式相乘,相当于系数向量的卷积.

再仔细观察一下这个多项式:每个系数正好对应的就是频域

Reference:

http://www.cnblogs.com/bigcat/archive/2009/11/24/2004760.html

时间: 2024-10-13 07:15:46

多项式乘法快速算法的相关文章

多项式相乘快速算法原理及相应C代码实现---用到fft

最近认真研究了一下算法导论里面的多项式乘法的快速计算问题,主要是用到了FFT,自己也实现了一下,总结如下. 1.多项式乘法 两个多项式相乘即为多项式乘法,例如:3*x^7+4*x^5+1*x^2+5与8*x^6+7*x^4+6*x^3+9两个式子相乘,会得到一个最高次数项为13的多项式.一般来说,普通的计算方法是:把A多项式中的每一项与B中多项式中的每一项相乘,得到n个多项式,再把每个多项式相加到一起,得到最终的结果,不妨假设A,B的最高次项都为n-1,长度都为n,那么计算最终的结果需要o(n^

乘法快速算法

1.十几乘十几: 口诀:头乘头,尾加尾,尾乘尾. 例:12×14=? 解: 1 x 1 = 1 2 + 4 = 6 2 x 4 = 8 12 x 14 = 169 注:个位相乘,不够两位数要用0占位. 2.头相同,尾互补(尾相加等于10): 口诀:一个头加1后,头乘头,尾乘尾. 例:23×27=? 解: 2 + 1 = 3 2 x 3 = 6 3 x 7 = 21 23 x 27 = 621 注:个位相乘,不够两位数要用0占位. 3.第一个乘数互补,另一个乘数数字相同: 口诀:一个头加1后,头乘

快速傅里叶变换(FFT)求解多项式乘法

在我还会FFT的时候赶快写下一篇博客留着以后看...... FFT是用来求解多项式乘法,那么首先我们要知道多项式是啥. \[A(x) = a_0+a_1x^1+a_2x^2+···+a_{n-1}x^{n-1} \] 这是个n-1次多项式(最高项是\(x^{n-1}\)),\(a_0,a_1,···a_{n-1}\)是它各项的系数,该多项式可以写成: \[A(x) = \sum_{j=0}^{n-1}a_jx^j \] 一个多项式可以通过一组系数所确定,而这组系数所组成的向量也叫做系数向量(如\

[学习笔记] 多项式与快速傅里叶变换(FFT)基础

引入 可能有不少OIer都知道FFT这个神奇的算法, 通过一系列玄学的变化就可以在 $O(nlog(n))$ 的总时间复杂度内计算出两个向量的卷积(或者多项式乘法/高精度乘法), 而代码量却非常小. 博主一年半前曾经因COGS的一道叫做"神秘的常数 $\pi$"的题目而去学习过FFT, 但是基本就是照着板子打打完并不知道自己在写些什么鬼畜的东西OwO 不过...博主这几天突然照着算法导论自己看了一遍发现自己似乎突然意识到了什么OwO然后就打了一道板子题还1A了OwO再加上午考试差点AK

FFT多项式乘法学习笔记

??其实我不知道我是否真的理解了FFT,但是我会用FFT优化多项式乘法了QAQ.. (以下大多摘自算导 前置知识 1. 多项式 ??在一个代数域F上,关于变量x的多项式定义为形式和形式表示的函数 A(x)=∑j=0n?1ajxj,其中a0-an?1为多项式各项的系数 2. 多项式的次数界 ??若多项式有非零系数的最高次项为xk,则称k为该多项式的次数,任何严格大于k的整数都是这个多项式的次数界. 3. 多项式的表示 (1)系数表示法 ??对于一个次数界为n的多项式A(x)来说,其系数表示法可以看

UOJ #34 多项式乘法

题目链接:多项式乘法 保存一发FFT与NTT板子. 学习链接:从多项式乘法到快速傅里叶变换 FFT NTT 注意差值回来的时候不取反也是可以的,只不过需要把数组\(reverse\)一下(根据单位复数根的性质应该不难理解) 代码(FFT): #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<co

【UOJ】【34】多项式乘法

快速傅里叶变换模板题 算法理解请看<算法导论>第30章<多项式与快速傅里叶变换>,至于证明插值唯一性什么的看不懂也没关系啦-只要明白这个过程是怎么算的就ok. 递归版:(4252ms  23468kb) 1 //UOJ 34 递归版 2 #include<cmath> 3 #include<vector> 4 #include<cstdio> 5 #include<cstring> 6 #include<cstdlib>

乘方快速幂 OR 乘法快速幂

关于快速幂这个算法,已经不想多说,很早也就会了这个算法,但是原来一直靠着模板云里雾里的,最近重新学习,发现忽视了一个重要的问题,就是若取模的数大于int型,即若为__int64的时候应该怎么办,这样就得用到乘法快速幂+乘方快速幂了. 快速幂一般是为了解决乘方取模问题的,显然思想就是二分,下面贴上快速幂模板: 1 __int64 mulpow(__int64 a,__int64 p,__int64 m) 2 { 3 __int64 ans = 1; 4 while(p) 5 { 6 if(p&1)

洛谷.3803.[模板]多项式乘法(FFT)

题目链接:洛谷.LOJ. FFT相关:快速傅里叶变换(FFT)详解.FFT总结.从多项式乘法到快速傅里叶变换. #include <cmath> #include <cctype> #include <cstdio> #include <algorithm> #define gc() getchar() const int N=1e6+5; const double PI=acos(-1); int n,m; struct Complex { double