Karatsuba乘法递归计算

吃可爱长大的小学妹 提交于 2020-03-21 10:40:02

技术有限,先第一版,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)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!