Skip to content

Commit ace626a

Browse files
Add files via upload
Here is a small compilation of Karatsuba multiplication in various languages that I know. Karatsuba in Javascript isn't working but I believe the algorithm is correct. I just keep getting "max call stack exceeded".
1 parent 5029dbc commit ace626a

File tree

6 files changed

+144
-0
lines changed

6 files changed

+144
-0
lines changed

multiplication/karatsuba.c

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#include <stdio.h>
2+
#include <math.h>
3+
#include <string.h>
4+
5+
#define max(x,y) ((x) >= (y)) ? (x) : (y)
6+
7+
int intlen(int n){
8+
int count = 0;
9+
while(n != 0)
10+
{
11+
// n = n/10
12+
n /= 10;
13+
++count;
14+
}
15+
return count;
16+
}
17+
18+
int karatsuba(int x, int y){
19+
if (intlen(x)==1 || intlen(y)==1) {
20+
return x*y;
21+
}
22+
else{
23+
int n = max(intlen(x),intlen(y));
24+
int z = n / 2;
25+
int a = x / (int)pow(10,z);
26+
int b = x % (int)pow(10,z);
27+
int c = y / (int)pow(10,z);
28+
int d = y % (int)pow(10,z);
29+
int ac = karatsuba(a,c);
30+
int bd = karatsuba(b,d);
31+
int adbc = karatsuba(a+b,c+d) - ac - bd;
32+
return ac * pow(10,2*z) + (adbc * pow(10,z)) + bd;
33+
}
34+
}
35+
int main(void) {
36+
printf("%d",karatsuba (923,1723));
37+
return 0;
38+
}

multiplication/karatsuba.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#include <iostream>
2+
#include<string>
3+
#include <algorithm>
4+
#include <cmath>
5+
using namespace std;
6+
7+
int karatsuba(int x, int y){
8+
if ((to_string(x).length()==1) || (to_string(y).length()==1)) {
9+
return x*y;
10+
}
11+
else{
12+
int n = max(to_string(x).length(),to_string(y).length());
13+
int z = n / 2;
14+
int a = x / (int)pow(10,z);
15+
int b = x % (int)pow(10,z);
16+
int c = y / (int)pow(10,z);
17+
int d = y % (int)pow(10,z);
18+
int ac = karatsuba(a,c);
19+
int bd = karatsuba(b,d);
20+
int adbc = karatsuba(a+b,c+d) - ac - bd;
21+
return ac * pow(10,2*z) + (adbc * pow(10,z)) + bd;
22+
}
23+
}
24+
25+
int main() {
26+
cout << karatsuba (923,1723);
27+
}

multiplication/karatsuba.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Main {
2+
public static void main(String[] args) {
3+
System.out.print(karatsuba (923,1723));
4+
}
5+
private static int karatsuba(int x, int y){
6+
if (String.valueOf(x).length()==1 || (String.valueOf(y).length()==1)){
7+
return x*y;
8+
}
9+
else{
10+
int n = Math.max(String.valueOf(x).length(),String.valueOf(y).length());
11+
int z = n / 2;
12+
int a = x /(int) Math.pow(10, z);
13+
int b = x %(int) Math.pow(10, z);
14+
int c = y /(int) Math.pow(10, z);
15+
int d = y %(int) Math.pow(10, z);
16+
int ac = karatsuba(a,c);
17+
int bd = karatsuba(b,d);
18+
int adbc = karatsuba(a+b,c+d) - ac - bd;
19+
return ac * (int)Math.pow(10, (2*z)) + (adbc * (int)Math.pow(10, z)) + bd;
20+
}
21+
}
22+
}

multiplication/karatsuba.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
function karatsuba(x,y){
2+
if (x.toString().length==1 || y.toString().length==1){
3+
return x*y;
4+
}
5+
else{
6+
var n = Math.max(x.toString().length,y.toString().length)
7+
var z = n / 2
8+
var a = x / Math.pow(10, z)
9+
var b = x % Math.pow(10, z)
10+
var c = y / Math.pow(10, z)
11+
var d = y % Math.pow(10, z)
12+
var ac = karatsuba(a,c)
13+
var bd = karatsuba(b,d)
14+
var adbc = karatsuba(a+b,c+d) - ac - bd
15+
return ac * Math.pow(10, 2*z) + (adbc * Math.pow(10, z)) + bd
16+
}
17+
}
18+
19+
console.log(karatsuba (923,1723))

multiplication/karatsuba.kt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
fun main(args:Array<String>) {
2+
print(karatsuba(923, 1723))
3+
}
4+
fun karatsuba(x:Int, y:Int):Int {
5+
if ((x).toString().length == 1 || ((y).toString().length == 1))
6+
{
7+
return x * y
8+
}
9+
else
10+
{
11+
val n = Math.max((x).toString().length, (y).toString().length)
12+
val z = n / 2
13+
val a = x / Math.pow(10.0, z.toDouble()).toInt()
14+
val b = x % Math.pow(10.0, z.toDouble()).toInt()
15+
val c = y / Math.pow(10.0, z.toDouble()).toInt()
16+
val d = y % Math.pow(10.0, z.toDouble()).toInt()
17+
val ac = karatsuba(a, c)
18+
val bd = karatsuba(b, d)
19+
val adbc = karatsuba(a + b, c + d) - ac - bd
20+
return ac * Math.pow(10.0, (2 * z).toDouble()).toInt() + (adbc * Math.pow(10.0, z.toDouble()).toInt()) + bd
21+
}
22+
}

multiplication/karatsuba.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
def karatsuba(x,y):
2+
if len(str(x)) or len(str(y)) :
3+
return x*y
4+
else:
5+
n = max(len(str(x)),len(str(y)))
6+
z = n / 2
7+
a = x / 10**(z)
8+
b = x % 10**(z)
9+
c = y / 10**(z)
10+
d = y % 10**(z)
11+
ac = karatsuba(a,c)
12+
bd = karatsuba(b,d)
13+
adbc = karatsuba(a+b,c+d) - ac - bd
14+
return ac * 10**(2*z) + (adbc * 10**z) + bd
15+
16+
karatsuba (923,1723)

0 commit comments

Comments
 (0)