Javascript中的Karatsuba算法
Karatsuba Algorithm in Javascript
我用Javascript实现了Karatsuba的算法。
const multiply = (a, b) => {
let sizeA = numOfDigits(a);
let sizeB = numOfDigits(b);
if(sizeA < sizeB) {
a = '0'.repeat(sizeB-sizeA).concat(a);
}
else if(sizeB < sizeA) {
b = '0'.repeat(sizeA - sizeB).concat(b);
}
if (numOfDigits(a) === 1 && numOfDigits(b) === 1) {
return a * b;
} else {
let n = numOfDigits(a);
n = ( n % 2 === 0 ) ? n : n + 1;
let n_2 = parseInt(Math.ceil(n /2));
let splitA = reduceInHalf(a);
let splitB = reduceInHalf(b);
let p = splitA[0];
let q = splitA[1];
let r = splitB[0];
let s = splitB[1];
let u = multiply(p, r);
let v = multiply((q - p).toString(), (s - r).toString());
let w = multiply(q, s);
let product = u * Math.pow(10,n) + (u + w - v) * Math.pow(10, n_2) + w;
return product;
}
}
当我传递非常大的数字时,它会失败,比如2个64位的数字。我遇到了最大调用栈的问题。我还遇到了另一个返回错误结果的实现。
对于2个32位数的数字也可以正常工作。只要我输入2个64位的数字,它就会进入一个不终止的递归。这能实现吗?
看起来你依赖于JavaScript数字功能的各个部分(例如q - p
,和所有的u * Math.pow(10,n) + (u + w - v) * Math.pow(10, n_2) + w
);但是JavaScript数字是双精度浮点值。它们不能精确地表示超过16位的整数。(参见"可存储在双精度体中的最大整数")
如果你想用非常大的整数做数学,你需要找到一个大整数库,或者自己管理它(使用字符串或数组或诸如此类的东西)。
相关文章:
- 循环比赛位置算法
- javascript扫雷器floodfill算法不能正常工作
- Node JS中的排名系统算法
- 查找仅适用于原始图像的图像放大算法的名称
- 在数组的 2/3 上调用自身的排序算法
- Luhn算法的实现
- 算法:从数组(javascript/angular)中按当前日期获取上一个和下一个事件
- 加速单纯形算法
- 最短路径算法js错误
- 代码战争中的算法混乱
- 用于自动放置流程图形状的算法
- PHP或JavaScript的基本遗传算法开源代码
- 用Javascript实现算法
- 堆中for循环的奇怪行为's算法
- 一种从随机数的序列中查找值的简单算法
- Node.js上的高性能算法
- JavaScript排序算法不起作用 - 任何明显的我做错了
- 需要使用JavaScript实现我的算法
- 用于计算产品价格的JavaScript构建和算法
- Javascript中的Karatsuba算法