利用Python怎么实现一个大整数乘法算法

  介绍

利用Python怎么实现一个大整数乘法算法?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

<强>介绍原理

karatsuba算法要求乘数与被乘数要满足以下几个条件,第,一乘数与被乘数的位数相同,第二,乘数与被乘数的位数应为,2次幂,即为2 ^ 2,,2 ^ 3、2 ^ 4、2 ^ n等数值。

下面我们先来看几个简单的例子,并以此来了解karatsuba算法的使用方法。

<强>两位数相乘

我们设被乘数=85,乘数B=41。下面来看我们的操作步骤:

将A、B一分为二,令p=一个的前半部分=8,问=的后半部分=5,r=B的前半部分=4 s=B的后半部分=,1,n=2。通过简单的数学运算:

A * B=pq * rs =(p * 10 +) * (r * 10 + s),=, p * r * 10 ^ 2 + (p r * q s + *) * 10 + q * s。

令u=p * r, v=(p - q) * (s - r), w=q * s,所以A * B=, u * 10 ^ 2 + (u + v + w) * 10 + w。

换成数值求解的过程如下:

A * B=85 * 41=(8 * 10 + 5) * (4 * 10 + 1)=8 * 4 * 10 * 10 + (8 * 1 + 5 * 4) * 10 + 5 * 1。

其中u=8 * 4=32, v=(8 - 5) (1 - 4)=9, w=5 * 1=5 .

所以,A * B=32 * 100 +(32 - 9 + 5) * 10 + 5=3485。与长乘法所得结果一致。

<强>四位数相乘

我们设被乘数=8537,乘数B=4123。下面来看我们的操作步骤:

将A、B一分为二,令p=一个的前半部分=85,问=的后半部分=37,r=B的前半部分=41岁的s=B的后半部分=,23日,n=4 .

==比;其中,u=85 * 41, v=(85 - 37) * (23 - 41), w=37 * 23。

==比;A * B=8537 * 4123=u * 10 ^ 4 + (u + v + w) * 10 ^ 2 + w=, 3485 _0000 + 34 _7200 + 851=35198051。

在我们计算u, v, w的过程中又会涉及两位数的乘法,我们继续使用Karatsuba算法得出两位数相乘的结果。

<强> N位数相乘

我们令N为乘数与被乘数的位数,令p=一个的前半部分,问=的后半部分,r=B的前半部分,s=B的后半部分。

==比;其中,u=p * r, v=(p - q) * (s - r), w=q * s。

所以A * B=, u * 10 ^ n + (u + v + w) * 10 ^ (n/2) + w。

而u, v, w则是两个n/2位的乘法运算。我们继续调用Karatsuba算法计算u, v, w的数值。接着,我们在计算n/2乘法的过程中又会遇到n/4位的乘法运算……以此类推,直到我们遇到两个个位数的乘法,我们就直接返回这两个个位数乘法的结果。层层返回,最终得到n位数的乘法结果。

<强>时间复杂度

我们平常使用的长乘法,是O (n ^ 2)的时间复杂度。比如两个n位数相乘,我们需要将每一位按规则相乘,所以需要计算,n * n次乘法。而使用,Karatsuba算法每层需要计算三次乘法,两次加法,以及若干次加法,每使用一次Karatsuba算法,乘法规模就下降一半。

所以,对于两个n=, 2 ^ K位数乘法运算,我们需要计算3 ^ K次乘法运算。而K=O (log n)(底数为2),3 ^ 3 ^ K=O (log n)=2, ^(日志3 * O (log n))=2 ^ (O (log n) *日志3)=n ^日志3(底数为2)。

代码实现

得到math  import  log2,装天花板   ,   def 垫(字符串:str, real_len:, int,, max_len:, int),→, str:   ,,pad_len: int =max_len 作用;real_len   return 才能;f" {& # 39; 0 & # 39;, *, pad_len}{}字符串“   ,   ,   def 卡拉(n1: int, n2:, int),→, int:   if 才能n1  & lt;, 10,趁机n2  & lt;, 10:   ,,,return  n1  *, n2   ,,n1_str: str =, str (n1)   ,,n2_str: str =, str (n2)   n1_len才能:int =, len (n1_str)   n2_len才能:int =, len (n2_str)   ,,real_len: int =,马克斯(n1_len, n2_len)   ,,max_len: int =, 2, * *,装天花板(log2 (real_len))   mid_len才能:int =, max_len 在祝辞,1   ,,n1_pad: str =,垫(n1_str, n1_len,, max_len)   ,,n2_pad: str =,垫(n2_str, n2_len,, max_len)   p:才能,int =, int (n1_pad [: mid_len])   ,,问:int =, int (n1_pad [mid_len:])   接待员:才能,int =, int (n2_pad [: mid_len])   s:才能,int =, int (n2_pad [mid_len:])   你才能:int =,卡拉(p, r)   v:才能,int =,卡拉(qp, r)   w:才能,int =,卡拉(q,, s)   return 才能;u  *, 10, * *, max_len  +, (u + v + w), *, 10, * *, mid_len  +, w

输出结果:

==比;卡拉(123456、9734)==123456 * 9734

==比;卡拉(1234233456756,32459734)==1234233456756 * 1234233456756

利用Python怎么实现一个大整数乘法算法