Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 78ce8cd

Browse files
author
Amogh Singhal
authored
Create karatsuba.py
1 parent 086a1f0 commit 78ce8cd

File tree

1 file changed

+55
-0
lines changed

1 file changed

+55
-0
lines changed

‎karatsuba.py‎

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import random
2+
from math import ceil
3+
from math import log10
4+
5+
6+
def get_digits(n):
7+
if n > 0:
8+
digits = int(log10(n)) + 1
9+
elif n == 0:
10+
digits = 1
11+
else:
12+
digits = int(log10(-n)) + 2
13+
return digits
14+
15+
16+
def karatsuba(x, y):
17+
# the base case for recursion
18+
if x < 10 and y < 10:
19+
return x * y
20+
21+
# n is the number of digits in the highest input number
22+
n = max(get_digits(x), get_digits(y))
23+
24+
n_2 = int(ceil(n / 2.0))
25+
n = n if n % 2 == 0 else n + 1
26+
27+
# split the input numbers
28+
a, b = divmod(x, 10 ** n_2)
29+
c, d = divmod(y, 10 ** n_2)
30+
31+
# applying the recursive steps
32+
ac = karatsuba(a, c)
33+
bd = karatsuba(b, d)
34+
ad_bc = karatsuba((a + b), (c + d)) - ac - bd
35+
36+
# performs the multiplication
37+
z2 = (10 ** n) * ac
38+
z1 = (10 ** n_2) * ad_bc
39+
z0 = bd
40+
return z2 + z1 + z0
41+
42+
43+
def test():
44+
for i in range(1000):
45+
x = random.randint(1, 10**5)
46+
y = random.randint(1, 10**5)
47+
expected = x*y
48+
result = karatsuba(x, y)
49+
if result != expected:
50+
return print("failed")
51+
return print("ok")
52+
53+
54+
if __name__ == '__main__':
55+
test()

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /