Skip to content

Commit ab53bac

Browse files
authored
Merge pull request #563 from shabirjan/KaratsubaMultiplication-Swift4
Karatsuba multiplication Swift4
2 parents 6dabe99 + 69edcb4 commit ab53bac

File tree

2 files changed

+19
-16
lines changed

2 files changed

+19
-16
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
//: Playground - noun: a place where people can play
22

33
import Foundation
4-
4+
// last checked with Xcode 9.0b4
5+
#if swift(>=4.0)
6+
print("Hello, Swift 4")
7+
#endif
58
precedencegroup ExponentiativePrecedence {
69
higherThan: MultiplicationPrecedence
710
lowerThan: BitwiseShiftPrecedence
@@ -17,9 +20,9 @@ func ^^ (radix: Int, power: Int) -> Int {
1720
func multiply(_ num1: Int, by num2: Int, base: Int = 10) -> Int {
1821
let num1Array = String(num1).characters.reversed().map { Int(String($0))! }
1922
let num2Array = String(num2).characters.reversed().map { Int(String($0))! }
20-
23+
2124
var product = Array(repeating: 0, count: num1Array.count + num2Array.count)
22-
25+
2326
for i in num1Array.indices {
2427
var carry = 0
2528
for j in num2Array.indices {
@@ -29,32 +32,32 @@ func multiply(_ num1: Int, by num2: Int, base: Int = 10) -> Int {
2932
}
3033
product[i + num2Array.count] += carry
3134
}
32-
35+
3336
return Int(product.reversed().map { String($0) }.reduce("", +))!
3437
}
3538

3639
// Karatsuba Multiplication - O(n^log2(3))
3740
func karatsuba(_ num1: Int, by num2: Int) -> Int {
3841
let num1Array = String(num1).characters
3942
let num2Array = String(num2).characters
40-
43+
4144
guard num1Array.count > 1 && num2Array.count > 1 else {
4245
return multiply(num1, by: num2)
4346
}
44-
47+
4548
let n = max(num1Array.count, num2Array.count)
4649
let nBy2 = n / 2
47-
50+
4851
let a = num1 / 10^^nBy2
4952
let b = num1 % 10^^nBy2
5053
let c = num2 / 10^^nBy2
5154
let d = num2 % 10^^nBy2
52-
55+
5356
let ac = karatsuba(a, by: c)
5457
let bd = karatsuba(b, by: d)
5558
let adPlusbc = karatsuba(a+b, by: c+d) - ac - bd
56-
59+
5760
let product = ac * 10^^(2 * nBy2) + adPlusbc * 10^^nBy2 + bd
58-
61+
5962
return product
6063
}

Karatsuba Multiplication/KaratsubaMultiplication.swift

+6-6
Original file line numberDiff line numberDiff line change
@@ -22,24 +22,24 @@ func ^^ (radix: Int, power: Int) -> Int {
2222
func karatsuba(_ num1: Int, by num2: Int) -> Int {
2323
let num1Array = String(num1).characters
2424
let num2Array = String(num2).characters
25-
25+
2626
guard num1Array.count > 1 && num2Array.count > 1 else {
2727
return num1 * num2
2828
}
29-
29+
3030
let n = max(num1Array.count, num2Array.count)
3131
let nBy2 = n / 2
32-
32+
3333
let a = num1 / 10^^nBy2
3434
let b = num1 % 10^^nBy2
3535
let c = num2 / 10^^nBy2
3636
let d = num2 % 10^^nBy2
37-
37+
3838
let ac = karatsuba(a, by: c)
3939
let bd = karatsuba(b, by: d)
4040
let adPlusbc = karatsuba(a+b, by: c+d) - ac - bd
41-
41+
4242
let product = ac * 10^^(2 * nBy2) + adPlusbc * 10^^nBy2 + bd
43-
43+
4444
return product
4545
}

0 commit comments

Comments
 (0)