技术有限,先第一版,Karatsuba乘法递归计算x*y
循环调用部分
a,b=x的前半部分,后半部分
c,d=y的前半部分,后半部分
a,b,c,d都长度为n/2
(x*y)可写成:(a+b)*(c+d)=ac+ad+bc+bd
x*y=ac*10**n+(ad+bc)*10**(n/2)+bd
递归核心在于把a*c当中x*y,写为
a,b=x的前半部分,后半部分
c,d=y的前半部分,后半部分
a,b,c,d都长度为n/4
(x*y)可写成:(a+b)*(c+d)=ac+ad+bc+bd
x*y=ac*10**n+(ad+bc)*10**(n/2)+bd
ad,bc,bd同理
import datetimeimport time'''假设x,y长度都是2的幂次方倍。'''def gui(i): # 递归测试 if i==1: return i else: return i+gui(i-1)x=12345678y=56784321n=len(str(x)) #x的长度def Karatsuba_digui(x,y,n): ''' 假设x、y的长度是2^n倍的整数 :param x: 被输入乘数 :param y: 乘数 :return: x*y ''' if n==1: return x*y else: midle_len = n / 2 a,b=x//(10**midle_len),x%(10**midle_len) c,d=y//(10**midle_len),y%(10**midle_len) h_a_c=Karatsuba_digui(a,c,midle_len) m_a_d=Karatsuba_digui(a,d,midle_len) m_b_c=Karatsuba_digui(b,c,midle_len) l_b_d=Karatsuba_digui(b,d,midle_len) return h_a_c*(10**n)+(m_a_d+m_b_c)*(10**midle_len)+ l_b_dt_start=datetime.datetime.now()print(Karatsuba_digui(x,y,n))t_end=datetime.datetime.now()print('Karatsuba乘法用时:',(t_start-t_end).microseconds)t_start=datetime.datetime.now()print('x*y=',x*y)t_end=datetime.datetime.now()print('乘数用时2:',(t_start-t_end).microseconds)# 微妙测试# t_start=datetime.datetime.now()# time.sleep(1)# t_end=datetime.datetime.now()# print('',(t_start-t_end).microseconds)
来源:https://www.cnblogs.com/jianzhujian/p/12536799.html