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

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

 

  1  引言

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

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

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

  2  分治算法简介

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

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

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

 

1 分治算法流程图

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

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

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

  3.1  实现正常的加法函数

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

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

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

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

  得到程序伪代码如下:

程序

大整数相乘分治算法

输入

AB的数值

输出

AB相乘

步骤

1:初始化字符串AB的值

 

2应用建立的分治函数mulab),传入数据AB

 

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

 

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

 

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

 

6:  直接输出 addmulXB+0*lenY),mulYB))

 

 

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

  4.1  原始算法

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

 

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

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

  4.2  优化降低复杂度

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

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

 

 

复杂度从n2降到n1.59

  4.3  优化降低时间复杂度

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

  (1) 大整数分为3

 

 

  (2) 大整数分为4

 

 

   (3) 大整数分为n

 

   5  结束语

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

 


__EOF__

本文作者Hollahpain
本文链接https://www.cnblogs.com/Hollahpain/p/17135874.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Hollahpain  阅读(988)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示