首页 > 其他分享 >多项式乘法

多项式乘法

时间:2024-08-06 09:56:33浏览次数:13  
标签:+...+ frac 多项式 sum 表示法 乘法 2k

FFT主要用于快速求多项式的乘积。多项式的乘积就叫做卷积

对\(F\)和\(G\)来说,显然暴力算法的复杂度是\(O(nm)\),而FFT的时间复杂度为\(O(nlogn)\)

多项式的性质:用任意\(n+1\)个横坐标不同的点,可以唯一确定一个\(n\)次多项式。这个性质叫做多项式的点表示法

证明:设这个多项式\(f=a_nx^n+a_{n-1}x^{n-1}+...+a_1x+a_0\),那么我们代入\(n+1\)个点可以获得\(n+1\)个方程,这是\(n+1\)元一次方程,写出系数行列式就会发现是范德蒙德行列式,由于横坐标不同,所以行列式的值不为\(0\),于是方程有唯一解

设\(H=FG\),于是\(H\)为\(n+m\)次多项式,我们选取\(n+m+1\)个点代入\(F,G\)之后即可确定\(H\)。这就是点表示法的好处,时间复杂度从\(O(nm)\)降低到了\(O(n+m)\)

于是我们现在要解决的问题是如何快速将一个多项式的系数表示法(也就是我们通常写出来的多项式)与点表示法互相转换

下文的\(f(x)=a_{n-1}x^{n-1}+...+a_1x+a_0\)

系数表示法转点表示法:我们要在取\(n+1\)个特殊点上下功夫,我们取复数域上的单位根

假设\(n\)是偶数,画出复数域上的单位圆:

image

设\(w_n^k\)表示将单位圆等分成\(n\)份,将\(x\)轴逆时针旋转\(\frac{2πk}{n}\)所得到的复数,其中\(k\)的取值为\([0,n-1]\)。比如上图,\(w_n^0=1\),\(w_n^3=-i\)

\(w_n^k\)具有如下的性质:

1.\(\forall i\neq j,w_n^i\neq w_n^j\)

2.\(w_n^k=\cos(\frac{2kπ}{n})+i\sin(\frac{2kπ}{n})\)

3.\(w_{2n}^{2k}=w_n^k\)

4.\(w_n^{k+\frac{n}{2}}=-w_n^k\)

现在,我们将\(f\)奇数项和偶数项分开,有\(f=g+h\),其中\(g(x)=a_{n-2}x^{n-2}+a_{n-4}x^{n-4}+...+a_2x^2+a_0,h=a _ {n-1} x ^ {n-1} + a _ {n-3}x^{n-3}+...+a_1x\)

将\(g\)中每个\(x\)用\(x^2\)代替可设\(φ_1(x)=a_{n-2}x^{\frac{n}{2}-1}+a_{n-4}x^{\frac{n}{2}-2}+...+a_2x+a_0\),将\(h\)提取一个\(x\)并将剩下的式子的\(x\)用\(x^2\)代替可得\(φ_2(x)=a_{n-1}x^{\frac{n}{2}-1}+a_{n-3}x^{\frac{n}{2}-2}+...+a_1\),于是\(f(x)=φ_1(x^2)+xφ_2(x^2)\)

现在,设\(k∈[0,\frac{n}{2}-1]\),则\(f(w_n^k)=φ_1(w_n^{2k})+w_n^kφ_2(w_n^{2k})=φ_1(w_{\frac{n}{2}}^{k})+w_n^kφ_2(w_{\frac{n}{2}}^{k}),f(w_n^{k+\frac{n}{2}})=φ_1(w_n^{2k})-w_n^kφ_2(w_n^{2k})=φ_1(w_{\frac{n}{2}}^{k})-w_n^kφ_2(w_{\frac{n}{2}}^{k})\)

也就是说我们要求出将\(w_n^0,w_n^1,...,w_n^{n-1}\)代入\(f\)的值,只需要递归求解\(φ_1,φ_2\)即可;一共会划分\(O(\log n)\)层,每层的总复杂度为\(O(n)\),所以时间复杂度为\(O(n\log n)\)(如果某一次\(n\)为奇数,我们最开始提出一个\(x\)即可)

点表示法转换为系数表示法:设我们现在已经知道了\((w_n^0,f(w_n^0)),...,(w_n^{n-1},f(w_n^{n-1}))\),我们要求\(f(x)\),则有\(a_k=\frac{\sum_{i=0}^{n-1}f(w_n^{i})(w_n^{-k})^i}{n}\)

证明:

\[\sum_{i=0}^{n-1}f(w_n^{i})(w_n^{-k})^i\\=\sum_{i=0}^{n-1}(\sum_{j=0}^{n-1}a_j(w_n^{i})^j)(w_n^{-k})^i\\=\sum_{i=0}^{n-1}(\sum_{j=0}^{n-1}a_j(w_n^{j})^i)(w_n^{-k})^i\\=\sum_{i=0}^{n-1}\sum_{j=0}^{n-1}a_j(w_n^{j-k})^i\\=\sum_{j=0}^{n-1}a_j\sum_{i=0}^{n-1}(w_n^{j-k})^i\\=na_k \]

,最后一步成立是因为

\[\sum_{i=0}^{n-1}(w_n^{j-k})^i=\begin{cases} n,j=k \\ \frac{1-(w_n^{j-k})^n}{1-w_n^{j-k}}=\frac{1-(w_n^n)^{j-k}}{1-w_n^{j-k}}=\frac{1-1}{1-w_n^{j-k}}=0,j\neq k \end{cases} \]

于是我们设\(\rho(x)=\sum_{i=0}^{n-1}f(w_n^{i})x^{i}\),则我们求出\(\rho(w_n^{0}),\rho(w_n^{-1}),...,\rho(w_n^{-(n-1)})\)即可,这就是上文讲的傅里叶正变换(系数表示法转化为点表示法)

最后讲一下实现。实践证明,如果用递归来实现的话,常数是非常大的,所以我们一般利用迭代来实现

视频看到了2:08:00

标签:+...+,frac,多项式,sum,表示法,乘法,2k
From: https://www.cnblogs.com/dingxingdi/p/18344567

相关文章

  • 高精度乘法、除法(含代码)
    昨天给大家讲了高精度加法和减法,今天就来给大家讲讲高精度乘法和除法。首先,我们一起来看看高精度乘法,高精度乘法的计算方式和我们平时算乘法的方式不太一样,它不是一位一位的乘,而是把乘数看作一个整体,因为高精度乘法一般是大数乘以小数(例题在活动-AcWing)或者小数乘以小数(例......
  • 求助!C++使用Eigen求多项式根报错访问冲突
    本地环境:VS2022安装的NuGet包:Eigen版本3.3.9配置MKL头文件相关代码#include<cmath>#include<math.h>#include<stddef.h>#include<stdlib.h>#include<string.h>voidComputeTest();源文件相关代码#defineEIGEN_USE_MKL_ALL#defineEIGEN_VECTORIZ......
  • 【笔记】多项式全家桶
    【笔记】多项式全家桶https://www.cnblogs.com/Appleblue17/p/14360752.htmlWarning空间记得开两倍,因为有卷积,最后结果是两多项式长度之和。对于多项式\(F(x)\),Templatep.s.一般函数最开始是输出数组,后接输入数组,及其长度。namespaceNTT{ constintgen=3; intr......
  • 背包计数问题的多项式优化
    此优化针对以下计数问题:n件物品,背包容量为m,第i件物品体积为\(a_i\),求装满的方案数。(01背包)n种物品,背包容量为m,第i件物品体积为\(a_i\),数量无限,求装满的方案数。(完全背包)n种物品,背包容量为m,第i件物品体积为\(a_i\),数量为\(b_i\),求装满的方案数。(多重背包)\((1\l......
  • linux shell 写的一个小玩意(bash含99乘法表和计算器)
     esac.sh 主页面#!/bin/shwhile:do    echo"***********************************"    echo"*                *"    echo"*  输入你想要点的妹妹:1-3号 *"    echo"*    ......
  • 多项式学习笔记(一)(2024.7.6)
    声明:在本节范围内,所有同余号(多项式运算)均在\((\text{mod}x^n)\)意义下进行;所有等号(代数运算)均在模某个质数\(p\)意义下进行。暴力多项式计算加法\(H(x)=F(x)+G(x)\),求\(H(x)\)解:类比高精度加法\(h_i=f_i+g_i\),复杂度\(O(n)\)#include<bits/stdc++.h>usingnames......
  • 高精度加法、减法、乘法、除法(C++)
    1、引入在进行大整数运算中,因为在C++/C中整数,最大也就是unsignedlonglong也就才(1e19+8e18)位,如果要几百位的相加减就不行了,所以就要用高精度了,这里只在C++/C上使用有价值,在例如python、Java语言上无需写此算法,python可以无限大,Java里有相关库可以引入。2、入门的思路即为......
  • CPU上的快速多维矩阵乘法(草稿)
    CPU上的快速多维矩阵乘法(草稿)Numpy可以在大约8毫秒内将4核IntelCPU上的两个1024x1024矩阵相乘。考虑到这归结为18FLOPS/核心/周期,一个周期需要三分之一纳秒,这是非常快的。Numpy使用高度优化的BLAS实现来实现这一点。BLAS是BasicLinearAlgebra子程序的缩写。这些库提供快速实......
  • 最小二乘法拟合空间直线
    一、空间直线方程1.1一般方程空间直线可以看成成两个平面的交线,设两个平面方程分别为\(A_1x+B_1y+C_1z+D_1=0\)和\(A_2x+B_2y+C_2z+D_2=0\),则直线\(l\)的一般方程可以表示为:\(\left\{\begin{matrix}A_1x+B_1y+C_1+D_1=0\\A_2x+B_2y+C_2+D_2......
  • 多项式基础内容小记
    0.基础知识:关于多项式的定义:多项式:一个形如\(f(x)=\sum_{i=0}^na_ix^i\)的有限和式被称为多项式。系数:多项式第\(i\)项的系数在上面就表示为\(a_i\)。度(次数):多项式中最高次数的项的次数就被称为该多项式的度,也称次数。多项式表示法:多项式有两种表示法:......