Skip to content

Commit b6c05be

Browse files
committed
Added implmentation for the Karatsuba Algorithm
1 parent 8035d8d commit b6c05be

File tree

4 files changed

+93
-0
lines changed

4 files changed

+93
-0
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
//: Playground - noun: a place where people can play
2+
3+
import Foundation
4+
5+
infix operator ^^ { associativity left precedence 160 }
6+
func ^^ (radix: Int, power: Int) -> Int {
7+
return Int(pow(Double(radix), Double(power)))
8+
}
9+
10+
// Long Multiplication - O(n^2)
11+
func multiply(num1: Int, _ num2: Int, base: Int = 10) -> Int {
12+
let num1Array = String(num1).characters.reverse().map{ Int(String($0))! }
13+
let num2Array = String(num2).characters.reverse().map{ Int(String($0))! }
14+
15+
var product = Array(count: num1Array.count + num2Array.count, repeatedValue: 0)
16+
17+
for i in num1Array.indices {
18+
var carry = 0
19+
for j in num2Array.indices {
20+
product[i + j] += carry + num1Array[i] * num2Array[j]
21+
carry = product[i + j] / base
22+
product[i + j] %= base
23+
}
24+
product[i + num2Array.count] += carry
25+
}
26+
27+
return Int(product.reverse().map{ String($0) }.reduce("", combine: +))!
28+
}
29+
30+
// Karatsuba Multiplication - O(nlogn)
31+
func karatsuba(num1: Int, _ num2: Int) -> Int {
32+
let num1Array = String(num1).characters
33+
let num2Array = String(num2).characters
34+
35+
guard num1Array.count > 1 && num2Array.count > 1 else {
36+
return multiply(num1, num2)
37+
}
38+
39+
let n = max(num1Array.count, num2Array.count)
40+
let nBy2 = n / 2
41+
42+
let a = num1 / 10^^nBy2
43+
let b = num1 % 10^^nBy2
44+
let c = num2 / 10^^nBy2
45+
let d = num2 % 10^^nBy2
46+
47+
let ac = karatsuba(a, c)
48+
let bd = karatsuba(b, d)
49+
let adPluscd = karatsuba(a+b, c+d) - ac - bd
50+
51+
let product = ac * 10^^(2 * nBy2) + adPluscd * 10^^nBy2 + bd
52+
53+
return product
54+
}
55+
56+
print(multiply(236742342, 1231234224))
57+
print(karatsuba(236742342, 1231234224))
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2+
<playground version='5.0' target-platform='ios' executeOnSourceChanges='false'>
3+
<timeline fileName='timeline.xctimeline'/>
4+
</playground>

Karatsuba Multiplication/KaratsubaMultiplication.playground/playground.xcworkspace/contents.xcworkspacedata

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Karatsuba Multiplication/KaratsubaMultiplication.swift

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,28 @@
77
//
88

99
import Foundation
10+
11+
func karatsuba(num1: Int, _ num2: Int) -> Int {
12+
let num1Array = String(num1).characters
13+
let num2Array = String(num2).characters
14+
15+
guard num1Array.count > 1 && num2Array.count > 1 else {
16+
return num1 * num2
17+
}
18+
19+
let n = max(num1Array.count, num2Array.count)
20+
let nBy2 = n / 2
21+
22+
let a = num1 / 10^^nBy2
23+
let b = num1 % 10^^nBy2
24+
let c = num2 / 10^^nBy2
25+
let d = num2 % 10^^nBy2
26+
27+
let ac = karatsuba(a, c)
28+
let bd = karatsuba(b, d)
29+
let adPluscd = karatsuba(a+b, c+d) - ac - bd
30+
31+
let product = ac * 10^^(2 * nBy2) + adPluscd * 10^^nBy2 + bd
32+
33+
return product
34+
}

0 commit comments

Comments
 (0)