我们的目的是解决高维多项式乘法时的维度爆炸问题。也就是根据传统方法,我们在计算多项式乘法 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=∏i​ni​,若要先计算整个值域,则值域是 Ω ( 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)} ∑i​fi​xitχ(i) 的二元多项式乘法,其乘法就可以使得我们提取出实际的结果了。

那么问题来了,什么样的 χ ( i ) \chi(i) χ(i) 是较为合适的呢?借由子集卷积,容易想到的一者是 χ ( i ) = ∑ j i j \chi(i)=\sum_j i_j χ(i)=∑j​ij​,但当 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)=⌊n1​i​⌋+⌊n1​n2​i​⌋+⋯+⌊n1​⋯nk−1​i​⌋ 是一个很好的占位函数。由于 ⌊ 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)} ∑i​fi​xitχ(i) 在 m o d ( t k − 1 ) \bmod (t^k-1) mod(tk−1) 下的多项式乘法。因为 k ≤ log ⁡ 2 N k\le \log_2 N k≤log2​N,比较有效的实现是做 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)} ∑i​fi​xitχ(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 ∑i​ifi​xi,不难检验它满足常见的导数性质(对多元幂级数 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.相关推荐

  1. 向量、矩阵乘法的几何意义(二) 矩阵乘法(Matrix Multiplication)

    一.             旋转( rotation ) 1.   矩阵与向量相乘 由向量内积(两个向量相乘)出发,考虑矩阵与向量相乘的情况.以二维平面空间为例,设X=(x1, x2, -, xn) ...

  2. CUDA Samples: matrix multiplication(C = A * B)

    以下CUDA sample是分别用C++和CUDA实现的两矩阵相乘运算code即C= A*B,CUDA中包含了两种核函数的实现方法,第一种方法来自于CUDA Samples\v8.0\0_Simple ...

  3. C - Multiplication Table CodeForces - 448D

    C - Multiplication Table CodeForces - 448D 题目: Problem Description Bizon the Champion isn't just cha ...

  4. 多元回归树分析Multivariate Regression Trees,MRT

    作者:陈亮 单位:中国科学院微生物研究所 多元回归树分析 多元回归树(Multivariate Regression Trees,MRT)是单元回归树的拓展,是一种对一系列连续型变量递归划分成多个类群 ...

  5. R语言manova函数进行多元方差分析(Multivariate analysis of variance 、MANOVA)、如果多变量检验结果有显著性,summary.aov函数锦欣单变量方差分析

    R语言使用manova函数进行多元方差分析(Multivariate analysis of variance (MANOVA)).如果多变量检验结果具有显著性,使用summary.aov函数获得单变 ...

  6. R语言单向多元方差分析MANOVA(one-way MANOVA)实战:multivariate analysis of variance

    R语言单向多元方差分析MANOVA(one-way MANOVA)实战:multivariate analysis of variance 目录 R语言单向多元方差分析MANOVA(one-way M ...

  7. R多变量正态性检验(Multivariate Normality Tests)

    R多变量正态性检验(Multivariate Normality Tests) 目录 R多变量正态性检验(Multivariate Normality Tests) Mardia's 检验 能量ene ...

  8. UVa-442-Matrix Chain Multiplication

    题目:UVa 442 Matrix Chain Multiplication 题目分析: 关键是解析表达式,可以用栈来解决:遇到字母时入栈,遇到右括号时出栈并且计算,然后结果入栈.因为输入保证合法,括 ...

  9. 矩阵连乘积 ZOJ 1276 Optimal Array Multiplication Sequence

    题目传送门 1 /* 2 题意:加上适当的括号,改变计算顺序使得总的计算次数最少 3 矩阵连乘积问题,DP解决:状态转移方程: 4 dp[i][j] = min (dp[i][k] + dp[k+1] ...

最新文章

  1. linux如何右键新建文件夹,在Ubuntu 18.04右键菜单中增加新文档(New Document)及其他类型选项...
  2. 11个显著提升 ASP.NET 应用程序性能的技巧——第1部分
  3. Invocation of init method failed; nested exception is org.hibernate.InvalidMappingException: Could n
  4. 运用 autoconf 和 automake 自动生成 Makefile 实例讲解
  5. Java实现MD5编码32位
  6. Python一行代码给儿子制作九九乘法表
  7. inotifypropertychanged接受不执行_scp客户端现多个漏洞,可执行恶意脚本
  8. 麻省理工线性代数第二讲
  9. python正弦波叠加方波_电赛初探(一)——正弦波、方波、锯齿波转换
  10. 负载均衡器ribbon和LoadBalancer
  11. 性能分析之响应时间拆分及 258 原则误区
  12. 什么是域名解析,A记录
  13. 如何向App Store提交应用
  14. powershell 启动时报错 profile.ps1 cannot be loaded because running scri
  15. JSP用户登录连接数据库
  16. python as f是什么意思_Python中 with open(file_abs,'r') as f: 的用法以及意义
  17. 从源码角度了解react工作原理
  18. 【ubuntu】htop命令详解
  19. 数学统计--标准分数
  20. 公司倒闭后不注销有什么后果?不注销公司的几大结果

热门文章

  1. 使用微波雷达传感器都有那些优势呢?
  2. 利用GeoServer发布地理空间数据服务示例
  3. 微信小程序——章节自测六
  4. 双机位摄像机视频直播(多机位摄像机视频直播)时硬件连接示意图
  5. jQuery 混淆加密无法反编译的分享
  6. JAVA我的世界给op_mc我的世界op指令大全
  7. 技术会议 | 推荐广告技术的应用和未来
  8. VIM文本编辑器基本操作
  9. Android 自定义钟表
  10. 一个开发工程师,真的需要了解业务吗?