首页/文章/ 详情

基于Mathematica的多项式系数的位数之和的并行计算

8月前浏览7187

在学习Mathematica元编程和研究NP问题的过程中,本文所讨论的问题是一个很好的切入点。NP问题有多种类型,在密码学中,非对称密码算法都是基于NP问题这类困难问题设计的,但各种困难问题之间的差别也很大,例如,当密钥长度相同时,RSA算法就不如基于椭圆曲线的算法安全,这是因为基于椭圆曲线的离散对数问题看起来更加困难,尽管这两个算法都是基于NP问题设计的,而RSA算法又有多种漏洞可以利用,使得其复杂度降低到了亚指数级,而基于椭圆曲线的算法至少也有指数级的复杂度。本文所介绍的算法可以帮助您探索某种NP问题蕴含在多项式内的潜在规律。

多项式是一种常见的数学对象,多项式系数(又称组合数)是指多项式的n次方的展开式的各项系数,如下图所示,这是一个3项式的3次方的展开式。


有多种算法可以计算多项式系数(组合数)之和,但本文要求解的问题是求这个展开式的各项系数的位数之和(十进制),这就不得不把每一项系数的位数都计算出来,对于上图所示的多项式来说,因为展开式的每一项的系数都是一位十进制整数,所以位数之和是10,如下图所示,可以简单地用几个函数在不到1毫秒的时间内计算出来。


在这个简洁的问题中,蕴含了一个NP问题,由于所有NP问题都可以互相转换,故不再赘述是哪一个NP问题,只需知道本文要求解的问题目前还没有多项式级别的时间复杂度的求解算法,这也是NP(非确定性多项式)问题的含义。

若要求解7项式的30次方的多项式系数的位数之和(以下简称:位数之和),计算时间就来到了20秒,如下图所示:


考虑到多项式的结构的对称性,可以计算出系数相同的项的个数,再乘以对应的系数的位数,经过一系列计算就能在20毫秒内得到位数之和,比上图所示的快了近1000倍。这种算法将本文的问题提炼成一个NP问题,复杂度取决于有多少种不同的系数,对于每一种不同的系数,算法只需要一次计算就能求解出这种系数的位数之和与带有这种系数的项的个数。通过观察多项式展开式的每一项的幂,易知,对于3项式的3次方的展开式的项来说,只有三种系数。

但这只不过是把阶乘级的复杂度降低到指数级,而且这种算法的空间复杂度与其时间复杂度一样高!非常消耗内存,因为要穷举每一种系数。通过观察多项式展开式的每一项的幂的规律,可以得到一种生成循环的方法,使得该算法从基于递归变成基于循环,但是必须是动态生成的循环,于是利用一些Mathematica的元编程技巧,可以设计出一套基于Sum的代码,而Sum又有ParallelSum作为其并行版本,可以直接无缝移植。对于4项式的300次方,代码(已打码)如下图所示,可以在不到1秒内完成。


如下图所示,三种算法的计算时间有显著差异,但三种都呈现出指数级增长的态势,因为这是一个NP问题。


来源:320科技工作室
UMMathematica
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-03-03
最近编辑:8月前
320科技工作室
硕士 | 结构工程师 lammps/ms/vasp/
获赞 222粉丝 345文章 303课程 0
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈