From f06fa44c26a424e2c5ffb491ecc720bbd89e347a Mon Sep 17 00:00:00 2001 From: Rishabh Kumar Date: Tue, 8 Oct 2019 15:31:17 +0530 Subject: [PATCH 1/3] Create karatsuba.py Added karatsuba algorithm for multiplication of two numbers --- maths/karatsuba.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 maths/karatsuba.py diff --git a/maths/karatsuba.py b/maths/karatsuba.py new file mode 100644 index 000000000000..c61006ad5868 --- /dev/null +++ b/maths/karatsuba.py @@ -0,0 +1,27 @@ +""" Multiply two numbers using Karatsuba algorithm """ + +def karatsuba(a, b): + 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 = a // 10**(m2) + a2 = a % 10**(m2) + b1 = b // 10**(m2) + b2 = 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() From 458aa9b860d035fd36d1d540b5075140a3221353 Mon Sep 17 00:00:00 2001 From: Rishabh Kumar Date: Tue, 8 Oct 2019 16:22:31 +0530 Subject: [PATCH 2/3] Update karatsuba.py Added doctests and divmod --- maths/karatsuba.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/maths/karatsuba.py b/maths/karatsuba.py index c61006ad5868..4fe4bf8b2fbf 100644 --- a/maths/karatsuba.py +++ b/maths/karatsuba.py @@ -1,16 +1,19 @@ """ Multiply two numbers using Karatsuba algorithm """ def karatsuba(a, b): + """ + >>> karatsuba(15463, 23489) == 15463 * 23489 + True + >>> karatsuba(3, 9) == 3 * 9 + """ 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 = a // 10**(m2) - a2 = a % 10**(m2) - b1 = b // 10**(m2) - b2 = b % 10**(m2) + a1, a2 = divmod(a, 10**m2) + b1, b2 = divmod(b, 10**m2) x = karatsuba(a2, b2) y = karatsuba((a1 + a2), (b1 + b2)) From b4a940c582745244eee60b63b81657116304691d Mon Sep 17 00:00:00 2001 From: Rishabh Kumar Date: Tue, 8 Oct 2019 17:19:37 +0530 Subject: [PATCH 3/3] Update karatsuba.py --- maths/karatsuba.py | 1 + 1 file changed, 1 insertion(+) diff --git a/maths/karatsuba.py b/maths/karatsuba.py index 4fe4bf8b2fbf..be4630184933 100644 --- a/maths/karatsuba.py +++ b/maths/karatsuba.py @@ -5,6 +5,7 @@ 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)