首页 > 编程语言 >分治算法解决大整数乘法方案

分治算法解决大整数乘法方案

时间:2023-02-19 23:02:02浏览次数:37  
标签:分治 相乘 整数 问题 算法 乘法

分治算法解决大整数乘法方案

 

  1  引言

  对于输入规模为n的两个大整数相乘,按照普通乘法显然需要O(n2)次“位”运算。若把输入的二个大整数各分为大小相同的二个部分,按照分治算法,只需要大约O(n1.59)次“位”的运算[1-3].

具体的,设X(大于Y)和Y是两个进行乘法的大整数,不妨假设将数字X拆成长度相同的两个字符串,第一个字符串因为是要大于后面第二个字符串的,所以在计算的时候在其转化成整数之前要将其加上相对于长度的“0”,然后通过递归的方式来将其进行位数化简,化为正常乘法三位数及以下之间的相乘,以至于解决在计算机上处理一些大数据相乘时,由于计时间硬件的限制,不能直接进行相乘得到想要的结果。 

基于此,本文提出在基于Pyhton语言上利用分治算法来对大整数之间相乘进行分析,根据将大的整数乘法分而治之,将大问题变成小问题,变成简单的小数乘法,再进行合并,从而解决大整数之间相乘的问题。

  2  分治算法简介

  字面上的理解就是“分而治之”,即将一个复杂的大问题分为二个甚至更多的同样或者类似的小问题,然后再将小问题分为更小的子问题,直至最后小问题都能够很简单的进行解决,接着再将小问题分成较小的一个问题,直至最后小问题都可以很简单的进行解决,而该问题的真值也就是每个小问题的全部解法的总数。这种技巧也是很多高效方法的基础,比如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……

  二分法,所需要时间取决于划分后问题的数量、问题的规模大小等原因,但二分法因为其分类的简便和均匀的优点,是目前常常使用的一个很有效的方式,如二分法检索。

  分治算法在每一个递归阶段中都包括以下三个步骤:1.分解:把原有的大问题分解成若干个用户规模较小且彼此独立,但和原有问题结构上差不多一样的各种较小问题;2.处理:如果小问题规模较小且易于得到处理就可以解开,否则递归地解开各个小问题;3.合并:把所有同一个问题的回答结合在一起,就是该题的解法。分治算法流程图如图1所示。

 

图 1 分治算法流程图

  一般在实际的计算当中,分治算法所能够处理的问题,通常具备如下四种性质:1.该问题的范围减小,到了一定的范围内就能够简单的处理;2.该问题能够划分成若干个规模相对较小的相同问题,即该问题具备最优子结构特征;3.从该问题中划分出来的一个问题的解被合并为该问题的子解;4.从该问题中被分解除的所有子问题都是彼此独立的,亦即子问题间不存在共同的一个子问题。由此不难看出,在分治算法中,因为子问题与原问题之间存在着结构与技术上的关联性,所以采用分治递归技术处理的子问题,也大多使用了递归的方式。在各种排序技术中,如归并排列、堆排序、快速排序等,也包含了分治递归的方式。有大多算法的遍历解答和利用分治算法相较,分治算法的有效性可能更小一点,如果加大了数量规模之后,分治算法可能会更加的慢,许多问题分治算法不是最好的解法,但是如果符合了上面四个特征,那分治算法是一个很好的选择。

  3  基于分治算法的大整数相乘的实现

  大数据算法是一个比较复杂的算术运算,所以尽管我们所实现的只是乘法类计算,但仍然非常有必要运用模块化方法和层次结构来设计规划和设计一些其它的辅助方法,即不要将它们置于散发方法中,因为这样既可以防止分治算法函数的算法程序过于复杂、使程序更加清晰明了、因为这样既可以突出计算方法,也可以使程序更易于调试、排错、改进和复用。

  3.1  实现正常的加法函数

  在通过int()函数的转换方式将其进行运算,str(int(a)+int(b))从而建立其加法函数add(a,b)。

  3.2  建立应用分治法实现大整数乘法的函数

  本文利用的是将位数长的整数依次进行其分割,同时也可以选择将两位数同时进行分割,在递归的作用下分割到正常乘法三位数及以下的乘法,相对于两个大整数直接相乘来说要快的许多。

  先通过比较两个字符串A和B的长度,来比较两个数之间的大小关系,如果两个字符串的长度相同的话,随便分割一位数即可。分割即通过对位数稍微多的大整数进行二分法切割,切割为字符串的前该大整数对2取整位数的X和字符串其他部分的Y,同时X实在字符串的前几位所以在计算的时候需要在后面填上Y长度的“0”,最后直接输出X与B相乘补上零之后和Y与B相乘结果的加法函数,于此同时X与B和Y与B相乘也是运用递归的方式来循环运用该分治算法,以至于达到正常乘法的位数三位数及以下。

  得到程序伪代码如下:

程序

大整数相乘分治算法

输入

A与B的数值

输出

A与B相乘

步骤

1:初始化字符串A与B的值

 

2:应用建立的分治函数mul(a,b),传入数据A与B

 

3:  比较A和B两个字符串之间的长度,将位数多的字符串传入A,少的传入B,若是相等就不动

 

4:  判断位数长的长度是否低于或等于三位,若是之间返回将A与B传入加法函数的值

 

5:  将A通过A的长度整除2之后的得到的数切割为X(计算需补Y长度的“0”)和Y两部分

 

6:  直接输出 add(mul(X,B)+“0”*len(Y),mul(Y,B))

 

 

  4  基于分治算法对大整数相乘的分析

  4.1  原始算法

  我们可以把n位数(为方便讨论简化问题,我们假设n是二的幂)十进制整数(二进制也可以)X、Y都分成二段,每一段的边长均为n/2位,如图三所示。

 

如果之间用递归或分治算法进行编程,其算法复杂度为如图3所示。

  其中:T(n)代表大整数有n位数的计算问题,系数四表示大整数问题缩小到T(n/2)时,包含四次乘法(上式中AC/AD/BC/BD四次),这是在没有进行优化情况下的算法复杂度(注意,此处虽然用了分治思想,但分治算法并不会降低算法复杂度,反而增加了算法的空间复杂度)。

  4.2  优化降低复杂度

  因为大整数乘法之间因为有着许多的乘法从而增加了时间复杂度和空间复杂度,所以可以通过减少乘法的次数来降低算法复杂度,如图4所示:

  从公式中可以看出,以前只有四种乘法式子:AC、AD、BC、BD,而现在有三种乘法式子:(A-B)(C-D)、AC、BD。乘法运算的数量也由四个调整到了三个,如图五所显示:

 

 

复杂度从n2降到n1.59

  4.3  优化降低时间复杂度

  我们将大整数乘法当中的两个相乘数X、Y都分为两段,第一段和第二段的长度都为n/2位,那分若把X和Y都分为成3段4段会有什么不一样:

  (1) 大整数分为3段

 

 

  (2) 大整数分为4段

 

 

   (3) 大整数分为n段

 

   5  结束语

  本文在Python语言的基础上面实现次分治算法对大整数乘法的解决,同时也在对其更优的方法进行其讨论,虽然没又更多解释的说明,但本此次算法已经算是优化之后的版本,相对于直接相乘来说还是快速的,在大整数乘法当中,当把大整数分为2段时,算法时间复杂度最低n1.59,随着段数逐渐增加算法复杂度也随之增加,当分段增加到n段时,算法时间复杂度也将退化到n2

 

标签:分治,相乘,整数,问题,算法,乘法
From: https://www.cnblogs.com/Hollahpain/p/17135874.html

相关文章

  • 代码随想录算法训练营第三十五天 | 435. 无重叠区间,763.划分字母区间,56. 合并区间
    一、参考资料无重叠区间https://programmercarl.com/0435.%E6%97%A0%E9%87%8D%E5%8F%A0%E5%8C%BA%E9%97%B4.html划分字母区间https://programmercarl.com/0763.%E......
  • 算法题——我在哪
    题目分析题意,寻找最小的K值,使得任意连续K个邮箱序列都是唯一的,也即寻找最小的K值,使得字符串中所有长度为K的子串都是唯一的。由于n最大为100,可以直接暴力求解。先遍历K......
  • 算法刷题-放苹果-JAVA
    0x00引言为获取一个良好的算法思维,以及不再成为一个脚本小子,争取每天一道算法题,培养自己的逻辑思维,温顾各类型语言语法知识。题解只写自己理解的解法,其他解法不再增加。......
  • 算法刷题-尼科彻斯定理-JAVA
    0x00引言为获取一个良好的算法思维,以及不再成为一个脚本小子,争取每天一道算法题,培养自己的逻辑思维,温顾各类型语言语法知识。题解只写自己理解的解法,其他解法不再增加。......
  • 各大排序算法的优缺点以及实现方法
    这篇文章,我们来谈谈一些关于排序的东西注意!这篇文章在写的时候混淆了一个概念,“稳定”本义指的是能保证两个相等的数,经过排序之后,序列的前后位置顺序不变。在本文中理解成......
  • 考研算法辅导课笔记:第十四章--模拟,递推,bfs
    这节课完全是上机题,机试内容。想要保持排名靠前吗?那就多在上面投入时间,一般来说投入时间与排名成正比模拟题先讲一下做过的题目类型。比如说dfs,dp,贪心,从一堆方案中涨到......
  • 算法刷题-字符串最后一个单词的长度-JAVA
    0x00引言为获取一个良好的算法思维,以及不再成为一个脚本小子,争取每天一道算法题,培养自己的逻辑思维,温顾各类型语言语法知识。题解只写自己理解的解法,其他解法不再增加。......
  • 第十章 泛型算法
    第十章泛型算法泛型算法因为它们实现共同的操作,所以称之为“算法”;而“泛型”、指的是它们可以操作在多种容器类型上。泛型算法本身不执行容器操作,只是单独依赖迭代器......
  • m基于GA遗传优化的多因素加权竞价博弈频谱分配算法matlab仿真
    1.算法描述假设有M个用户均为MIMOFullDuplex,N个频率,1<N<M,设计算法实现M个用户与N个频率的匹配。由于在一个MIMO系统中,用户数量M大于可用的频谱个数N,因此,必有一部分用......
  • m基于LMMSE+turbo算法的信道估计均衡器误码率仿真,对比LS,DEF以及LMMSE三种均衡算法误
    1.算法描述本文推导了符号间干扰(ISI)信道的矢量形状因子图表示。结果图具有树形结构,避免了现有图方法中的短周期问题。基于联合高斯近似,我们在LLR(对数似然比)之间建立了联系......