利用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
引用>