From 61f7f94fde8dff80740ee5ef19b2998f192da8d2 Mon Sep 17 00:00:00 2001 From: Rishabh Kumar Date: Tue, 8 Oct 2019 17:55:50 +0530 Subject: [PATCH] Create karatsuba.py (#1309) * Create karatsuba.py Added karatsuba algorithm for multiplication of two numbers * Update karatsuba.py Added doctests and divmod * Update karatsuba.py --- maths/karatsuba.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 maths/karatsuba.py diff --git a/maths/karatsuba.py b/maths/karatsuba.py new file mode 100644 index 000000000..be4630184 --- /dev/null +++ b/maths/karatsuba.py @@ -0,0 +1,31 @@ +""" Multiply two numbers using Karatsuba algorithm """ + +def karatsuba(a, b): + """ + >>> karatsuba(15463, 23489) == 15463 * 23489 + True + >>> karatsuba(3, 9) == 3 * 9 + True + """ + if len(str(a)) == 1 or len(str(b)) == 1: + return (a * b) + else: + m1 = max(len(str(a)), len(str(b))) + m2 = m1 // 2 + + a1, a2 = divmod(a, 10**m2) + b1, b2 = divmod(b, 10**m2) + + x = karatsuba(a2, b2) + y = karatsuba((a1 + a2), (b1 + b2)) + z = karatsuba(a1, b1) + + return ((z * 10**(2*m2)) + ((y - z - x) * 10**(m2)) + (x)) + + +def main(): + print(karatsuba(15463, 23489)) + + +if __name__ == "__main__": + main()