技术有限,先第一版,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 datetime
import time
'''
假设xy长度都是2的幂次方倍。
'''

def gui(i):
# 递归测试
if i==1:
return i
else:
return i+gui(i-1)

x=12345678
y=56784321
n=len(str(x)) #x的长度
def Karatsuba_digui(x,y,n):
'''
假设xy的长度是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_d


t_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)