# Karatsuba Multiplication # Uses Python3 def split(number, side = 0): '''Helper function that returns either the first(0) or second(1) half of an integer, divided at index''' assert type(number) == int, "non-integer passed to split()" assert side in [0,1], "split() passed side not in [0,1]" num_string = str(number) length = len(num_string) index = int(length/2) if side == 0: return int(num_string[:index]) else: return int(num_string[index:]) def karatsuba_mult(x,y): '''Takes input of two numbers of length Nx, Ny; Computes the product recursively using Karatsuba method.''' #Uses following expression for product: # x*y = [10^(P_x)a+b]*[10^(P_y)c+d] # x*y = 10^(P_x + P_y)ac + 10^(P_x)ad + 10^(P_y)bc + bd # where P_x = len(x)-len(a) and P_y = len(y)-len(c) #initialization assert type(x) == int, "First Input Wrong Type" assert type(y) == int, "Second Input Wrong Type" #find the actual lengths of x and y Nx = int(len(str(x))) Ny = int(len(str(y))) #check for base case if Nx<=2 and Ny <=2: print("answer: ", x*y) return x*y #recursive computation a = split(x,0) b = split(x,1) c = split(y,0) d = split(y,1) Px = Nx - len(str(a)) Py = Ny - len(str(c)) return ( (10**(Px+Py))*karatsuba_mult(a,c) + (10**(Px))*karatsuba_mult(a,d) + (10**(Py))*karatsuba_mult(b,c) + karatsuba_mult(b,d) )