技术有限,先第一版,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
'''
假设x,y长度都是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):
'''
假设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_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)