Hello, multivariate multiplication.
我们的目的是解决高维多项式乘法时的维度爆炸问题。也就是根据传统方法,我们在计算多项式乘法 f ( x 1 , … , x k ) ⋅ g ( x 1 , … , x k ) m o d ( x 1 n 1 , … , x k n k ) f(x_1,\dots,x_k)\cdot g(x_1,\dots,x_k)\bmod (x_1^{n_1},\dots,x_k^{n_k}) f(x1,…,xk)⋅g(x1,…,xk)mod(x1n1,…,xknk) 时,设 N = ∏ i n i N = \prod_i n_i N=∏ini,若要先计算整个值域,则值域是 Ω ( N 2 k ) \Omega(N2^k) Ω(N2k) 量级的,更无论适合 DFT 的值域了。这里,我们提出一种方法计算 Θ ( k N log N ) \Theta(kN\log N) Θ(kNlogN) 的多项式乘法方法。
接下来,我们将给出一个颇具构造性的算法,首先我们将一个下标 ( i 1 , … , i k ) (i_1,\dots,i_k) (i1,…,ik) 转化为一个「 ( n 1 , … , n k ) (n_1,\dots,n_k) (n1,…,nk) 进制数」,即 i = i 1 + i 2 ⋅ n 1 + ⋯ + i k ⋅ n 1 ⋯ n k − 1 i = i_1 + i_2\cdot n_1 + \cdots + i_k \cdot n_1\cdots n_{k-1} i=i1+i2⋅n1+⋯+ik⋅n1⋯nk−1。这个转化有一个至关重要的好处,那就是 ( i 1 , … , i k ) (i_1,\dots,i_k) (i1,…,ik) 下标的加法对应于 i i i 下标的加法。只不过现在我们需要去掉加法发生了进位部分的贡献。
一个直觉是,我们应当设置一个合适的占位多项式,也就是先考虑某个占位函数 χ ( i ) \chi(i) χ(i) 使得 i + j i+j i+j 不进位当且仅当 χ ( i + j ) = χ ( i ) + χ ( j ) \chi(i+j)=\chi(i)+\chi(j) χ(i+j)=χ(i)+χ(j)。那么我们进行一个 ∑ i f i x i t χ ( i ) \sum_i f_i x^i t^{\chi(i)} ∑ifixitχ(i) 的二元多项式乘法,其乘法就可以使得我们提取出实际的结果了。
那么问题来了,什么样的 χ ( i ) \chi(i) χ(i) 是较为合适的呢?借由子集卷积,容易想到的一者是 χ ( i ) = ∑ j i j \chi(i)=\sum_j i_j χ(i)=∑jij,但当 n j n_j nj 很大的时候,这会让 χ ( i ) \chi(i) χ(i) 的值域非常大。我们不妨转换思维,如果对于每一个 i i i,都保证 { χ ( i − j ) + χ ( j ) ∣ 0 ≤ j ≤ i } \{ \chi(i-j)+\chi(j) | 0\le j\le i \} {χ(i−j)+χ(j)∣0≤j≤i} 这个集合很小的话,我们就可以通过对某个阈值 D D D 进行取模 m o d ( t D − 1 ) \bmod (t^D-1) mod(tD−1),如果对每个 i i i,前面描述的集合中每个数 m o d D \bmod D modD 互不相同,那么我们所要求的信息就还是可以成功保留的。
而回顾衡量进位的单位,我们惊喜地发现 χ ( i ) = ⌊ i n 1 ⌋ + ⌊ i n 1 n 2 ⌋ + ⋯ + ⌊ i n 1 ⋯ n k − 1 ⌋ \chi(i) = \left\lfloor \frac{i}{n_1}\right\rfloor + \left\lfloor \frac{i}{n_1n_2}\right\rfloor + \dots + \left\lfloor \frac{i}{n_1\cdots n_{k-1}}\right\rfloor χ(i)=⌊n1i⌋+⌊n1n2i⌋+⋯+⌊n1⋯nk−1i⌋ 是一个很好的占位函数。由于 ⌊ i x ⌋ + ⌊ j x ⌋ − ⌊ i + j x ⌋ ∈ { − 1 , 0 } \left\lfloor \frac{i}{x}\right\rfloor + \left\lfloor \frac{j}{x}\right\rfloor - \left\lfloor \frac{i+j}{x}\right\rfloor\in \{-1,0\} ⌊xi⌋+⌊xj⌋−⌊xi+j⌋∈{−1,0},自然有 χ ( i ) + χ ( j ) − χ ( i + j ) ∈ [ − k + 1 , 0 ] \chi(i)+\chi(j)-\chi(i+j) \in [-k+1,0] χ(i)+χ(j)−χ(i+j)∈[−k+1,0]。因此,我们只需计算 ∑ i f i x i t χ ( i ) \sum_i f_i x^i t^{\chi(i)} ∑ifixitχ(i) 在 m o d ( t k − 1 ) \bmod (t^k-1) mod(tk−1) 下的多项式乘法。因为 k ≤ log 2 N k\le \log_2 N k≤log2N,比较有效的实现是做 k k k 个长为 2 N 2N 2N 的 DFT,然后在 t t t 维暴力进行卷积,复杂度有 Θ ( k N log N ) + Θ ( k 2 N ) = Θ ( k N log N ) \Theta(kN\log N) + \Theta(k^2N) = \Theta(kN\log N) Θ(kNlogN)+Θ(k2N)=Θ(kNlogN)。
对于牛顿迭代法,我们有一个非常简洁的实现方式。我们先通过特殊进制数的转化,套用在一元多项式上常见的牛顿迭代法,然后卷积全部替换成前述的 Θ ( k N log N ) \Theta(kN\log N) Θ(kNlogN) 的高维卷积即可。复杂度即为 Θ ( k N log N ) \Theta(kN\log N) Θ(kNlogN)。
其正确性亦不难解释,因为高维卷积已经被考虑为带有占位多项式的 ∑ i f i x i t χ ( i ) \sum_i f_i x^i t^{\chi(i)} ∑ifixitχ(i) 卷积,对其进行任何运算,只会产生一些 j < χ ( i ) j < \chi(i) j<χ(i) 的 x i t j x^it^j xitj 项,且这些项不会再对形如 x i t χ ( i ) x^it^{\chi(i)} xitχ(i) 项有贡献。因此我们实际上就是牛顿迭代的时候只维护这个多项式的 χ ( i ) \chi(i) χ(i) 所构成的上轮廓。
另一点巧妙的地方在于,我们可以直接考虑一个特殊的微分算子 D F \mathfrak DF DF 是 ∑ i i f i x i \sum_i if_ix^i ∑iifixi,不难检验它满足常见的导数性质(对多元幂级数 f , g f,g f,g 有 D ( f g ) = f D g + g D f \mathfrak D(fg)=f\mathfrak D g+g\mathfrak Df D(fg)=fDg+gDf,以及对幂级数 f f f 和多元幂级数 g g g 有 D ( f ∘ g ) = ( f ′ ∘ g ) ⋅ D g \mathfrak D(f\circ g)=(f'\circ g) \cdot \mathfrak Dg D(f∘g)=(f′∘g)⋅Dg),因此求导也可以保持一元多项式上的写法。
由此,我们得到了一种通用性极强的多元幂级数计算方法。而代价仅仅是乘以一个维数 k k k。
Hello, multivariate multiplication.相关推荐
- 向量、矩阵乘法的几何意义(二) 矩阵乘法(Matrix Multiplication)
一. 旋转( rotation ) 1. 矩阵与向量相乘 由向量内积(两个向量相乘)出发,考虑矩阵与向量相乘的情况.以二维平面空间为例,设X=(x1, x2, -, xn) ...
- CUDA Samples: matrix multiplication(C = A * B)
以下CUDA sample是分别用C++和CUDA实现的两矩阵相乘运算code即C= A*B,CUDA中包含了两种核函数的实现方法,第一种方法来自于CUDA Samples\v8.0\0_Simple ...
- C - Multiplication Table CodeForces - 448D
C - Multiplication Table CodeForces - 448D 题目: Problem Description Bizon the Champion isn't just cha ...
- 多元回归树分析Multivariate Regression Trees,MRT
作者:陈亮 单位:中国科学院微生物研究所 多元回归树分析 多元回归树(Multivariate Regression Trees,MRT)是单元回归树的拓展,是一种对一系列连续型变量递归划分成多个类群 ...
- R语言manova函数进行多元方差分析(Multivariate analysis of variance 、MANOVA)、如果多变量检验结果有显著性,summary.aov函数锦欣单变量方差分析
R语言使用manova函数进行多元方差分析(Multivariate analysis of variance (MANOVA)).如果多变量检验结果具有显著性,使用summary.aov函数获得单变 ...
- R语言单向多元方差分析MANOVA(one-way MANOVA)实战:multivariate analysis of variance
R语言单向多元方差分析MANOVA(one-way MANOVA)实战:multivariate analysis of variance 目录 R语言单向多元方差分析MANOVA(one-way M ...
- R多变量正态性检验(Multivariate Normality Tests)
R多变量正态性检验(Multivariate Normality Tests) 目录 R多变量正态性检验(Multivariate Normality Tests) Mardia's 检验 能量ene ...
- UVa-442-Matrix Chain Multiplication
题目:UVa 442 Matrix Chain Multiplication 题目分析: 关键是解析表达式,可以用栈来解决:遇到字母时入栈,遇到右括号时出栈并且计算,然后结果入栈.因为输入保证合法,括 ...
- 矩阵连乘积 ZOJ 1276 Optimal Array Multiplication Sequence
题目传送门 1 /* 2 题意:加上适当的括号,改变计算顺序使得总的计算次数最少 3 矩阵连乘积问题,DP解决:状态转移方程: 4 dp[i][j] = min (dp[i][k] + dp[k+1] ...
最新文章
- linux如何右键新建文件夹,在Ubuntu 18.04右键菜单中增加新文档(New Document)及其他类型选项...
- 11个显著提升 ASP.NET 应用程序性能的技巧——第1部分
- Invocation of init method failed; nested exception is org.hibernate.InvalidMappingException: Could n
- 运用 autoconf 和 automake 自动生成 Makefile 实例讲解
- Java实现MD5编码32位
- Python一行代码给儿子制作九九乘法表
- inotifypropertychanged接受不执行_scp客户端现多个漏洞,可执行恶意脚本
- 麻省理工线性代数第二讲
- python正弦波叠加方波_电赛初探(一)——正弦波、方波、锯齿波转换
- 负载均衡器ribbon和LoadBalancer
- 性能分析之响应时间拆分及 258 原则误区
- 什么是域名解析,A记录
- 如何向App Store提交应用
- powershell 启动时报错 profile.ps1 cannot be loaded because running scri
- JSP用户登录连接数据库
- python as f是什么意思_Python中 with open(file_abs,'r') as f: 的用法以及意义
- 从源码角度了解react工作原理
- 【ubuntu】htop命令详解
- 数学统计--标准分数
- 公司倒闭后不注销有什么后果?不注销公司的几大结果