Skip to content

Commit 13cbba3

Browse files
committed
Add divide and conquer multiplication algorithm
1 parent adf0aa4 commit 13cbba3

File tree

1 file changed

+87
-0
lines changed

1 file changed

+87
-0
lines changed

divide&conquer.py

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
def classic_multiplication(num1, num2):
2+
n, m = len(num1), len(num2)
3+
result = [0] * (n + m + 1)
4+
5+
for i in range(n):
6+
for j in range(m):
7+
result[i + j] += num1[n - 1 - i] * num2[m - 1 - j]
8+
result[i + j + 1] += result[i + j] // 10
9+
result[i + j] %= 10
10+
11+
while len(result) > 1 and result[-1] == 0:
12+
result.pop()
13+
14+
return result[::-1]
15+
16+
def operator_add(num1, num2):
17+
result_size = max(len(num1), len(num2))
18+
result = [0] * (result_size + 1)
19+
carry = 0
20+
21+
for i in range(result_size):
22+
num1_digit = num1[-(i + 1)] if i < len(num1) else 0
23+
num2_digit = num2[-(i + 1)] if i < len(num2) else 0
24+
25+
_sum = carry + num1_digit + num2_digit
26+
result[-(i + 1)] = _sum % 10
27+
carry = _sum // 10
28+
29+
result[0] = carry
30+
31+
# Remove leading zeros
32+
while len(result) > 1 and result[0] == 0:
33+
result.pop(0)
34+
35+
return result
36+
37+
38+
39+
def dq_prod(u, v, threshold):
40+
n = max(len(u), len(v))
41+
42+
if n <= threshold:
43+
return classic_multiplication(u, v)
44+
45+
else:
46+
m = n // 2
47+
48+
x = u[:m]
49+
y = u[m:]
50+
w = v[:m]
51+
z = v[m:]
52+
53+
p1 = dq_prod(x, w, threshold)
54+
p2 = dq_prod(y, z, threshold)
55+
p3 = dq_prod(x, z, threshold)
56+
p4 = dq_prod(w, y ,threshold)
57+
p5 = operator_add(p3, p4)
58+
59+
p1 = p1 + [0] * (2 * m)
60+
p5 = p5 + [0] * m
61+
62+
result = operator_add(operator_add(p1, p5), p2)
63+
return result
64+
65+
66+
67+
def main():
68+
69+
num1 = [1,2,3,4]
70+
print("num 1:", num1)
71+
72+
num2 = [3,2,1,3]
73+
print("num 2:", num2)
74+
75+
classic_result = classic_multiplication(num1, num2)
76+
dq_result = dq_prod(num1, num2, 1)
77+
78+
print("Classic Result: ")
79+
print(classic_result)
80+
81+
print("Divide and Conquer Result: ")
82+
print(dq_result)
83+
84+
85+
if __name__ == "__main__":
86+
main()
87+

0 commit comments

Comments
 (0)